
LayerXのAi Workforce事業部で検索エンジニアをしている鷹取(@takatorisatoshi)です。
この記事はLayerX AI Agentブログリレー43日目の記事です。
昨日は@po3rinさんのRepeated Samplingを使ったLLM推論時スケーリングで麻雀点数計算問題生成タスクを解くぞ!でした。
この記事ではベクトルデータベースであるWeaviateを使って、AIエージェントを使った高度な検索を簡単に実現する方法を紹介します。
はじめに
LLM(大規模言語モデル)の普及により、検索のあり方が大きく変わりつつあります。
ユーザーの入力は従来のキーワード検索から、チャット形式による自然言語での質問、いわゆる質問応答型の検索へと移行しています。
さらに、これまでは人間のユーザーが中心だった検索行為に、最近ではエージェントも参加するようになりました。これにより、より長く複雑なクエリが発行されるケースが増え、従来のRAG(Retrieval-Augmented Generation)だけでは対応が難しい質問への検索ニーズが生まれています。
こうした背景のもとで、検索プロセスにエージェントを組み込む「Agentic RAG」のような手法が提案されています。
しかし、エージェントを組み込んだ検索システムを構築・運用するには、複数のコンポーネントを連携させる必要があり、開発・運用コストが高くなるという課題もあります。
このような課題を解決するために、各社の検索ソフトウェアプロダクトが「Agenticな検索」をより簡単に実現できる機能を次々と提供し始めています。
たとえば、以下のようなものがあります。
今回は、この中でもWeaviateを使って、簡単にエージェントを活用した検索を実現する方法を紹介します。
Weaviateとは
Weaviateは、オープンソースのベクトルデータベースです。
Go言語で実装されており、自分でホスティングして動かすことも、クラウド環境で利用することもできます。
豊富な機能を備えており、MUVERA に代表されるような最新の検索技術も実装されています。
今回取り上げるのは、その中でも Query Agent と呼ばれる機能です。
Weaviate Query Agentとは
Query Agent は、Weaviate に保存されたデータを活用し、自然言語による質問に自動で回答するためのエージェントサービスです。
ユーザーは単に自然言語で質問や指示(プロンプト)を入力するだけで、エージェントが背後で必要な検索や処理を自動的に実行し、最終的な回答を返してくれます。
Query Agentの動作ステップ

クエリエージェントは、次のようなステップで処理を行います:
-
タスク分析とクエリ生成
まず、生成モデル(LLM)を用いてユーザーからの入力内容を解析し、どのような情報を取得すべきかを判断します。
その上で、実行するクエリを生成します。 -
ベクトル検索の実行
生成されたクエリは、Weaviateのベクトルデータベースに送られます。
必要に応じてクエリ文自体をベクトル化し、類似度検索を実施します。 -
最終回答の生成
検索結果を受け取った後、再び生成モデルを用いて結果を要約・整理し、ユーザーにとって自然でわかりやすい最終的な回答を生成します。
このように、WeaviateのQuery Agentを利用することで、開発者はクエリ生成・検索・応答生成といった複雑な処理フローを自前で実装することなく、“質問に答えるエージェント” を簡単に構築できます。
以降では、実際にQuery Agentを使う方法を紹介します。
使用例
Query Agentを使うための準備
Query Agentは、現在 Weaviate Cloudでのみ提供となっています。
従って、最初にWeaviate Cloudのアカウントを作成する必要があります。
Weaviate Cloudでは利用目的に応じて従量課金、前払い契約の両方が提供されています。
ただし、初回は14日間の無料トライアル期間が存在するため、今回の実験にはお金がかかっておりません。
準備として、Weaviate Cloudに接続し、Clusterを作成した後、接続先URLとAPI KEYを保存しておきます。
Weaviate Cloudのはじめかたは公式ドキュメントのクイックスタートを参照すると良いでしょう。
環境の準備ができたら、まず最初に、取得したURLとAPI KEYを使ってWeaviate Cloudへアクセスするためのクライアントを生成します。
import weaviate from weaviate.classes.init import Auth import os weaviate_url = os.environ["WEAVIATE_URL"] weaviate_api_key = os.environ["WEAVIATE_API_KEY"] client = weaviate.connect_to_weaviate_cloud( cluster_url=weaviate_url, auth_credentials=Auth.api_key(weaviate_api_key), ) print(client.is_ready())
次に、スキーマを定義します。Weaviateではスキーマをcollectionという単位で定義します。
今回はブログ記事を扱うことを想定してcollectionを作成します。
vector_configではベクトルを作成するモデルについての設定ができます。
今回は何も指定しないのでデフォルトのSnowflake/snowflake-arctic-embed-l-v2.0モデルが使用されます。
from weaviate.classes.config import Configure, Property, DataType CLASS_NAME = "BLOG_cloud" client.collections.create( name=CLASS_NAME, vector_config=Configure.Vectors.text2vec_weaviate(), properties=[ Property(name="title", data_type=DataType.TEXT), Property(name="path", data_type=DataType.TEXT), Property(name="content", data_type=DataType.TEXT), ], )
検索対象となるデータを登録します。今回は過去自分が書いたブログ記事を登録してみました。
データの埋め込みはWeaviate上で行われるため、リクエストする前に埋め込みを作る必要はありません。
from tqdm import tqdm docs = [ { "title": "「機械学習による検索ランキング改善ガイド」をVespaでやってみる", "path": "takatori_blog_1.md", "content": "この記事では機械学習による検索ランキング改善ガイドの内容をVespaで実施しました。...", }, { "title": "WeaviateでAgentを利用した検索", "path": "takatori_blog_2.md", "content": "LLMの普及により、検索のワークロードが大きく変わりつつあります..." }, ... ] col = client.collections.get(CLASS_NAME) with col.batch.dynamic() as batch: for row in tqdm(docs): batch.add_object( properties={ "title": row.get("title"), "path": row.get("path"), "content": row.get("content"), } )
また、上記に加えて、適切なcollectionをQuery Agentが選択できるかを確認するため、JQaRAデータセットも別のcollectionとして定義し、データを投入してみました。
最後に、Query Agentの定義を行います。clientと検索対象とするcollectionを指定するだけです。
from weaviate.agents.query import QueryAgent qa = QueryAgent(client=client, collections=["JQaRA", "My_BLOG"])
Query Agentを使って検索する
ここまでで準備は整いました。実際に検索を実行して結果を見ていきます。
Query Agentは、次の2つのクエリタイプをサポートします。
- Search: 検索のみを実行する(回答生成は行わない)
- Ask: 検索した結果から回答を生成する
まずは、Searchクエリタイプを試します。
search_response = qa.search("絶対零度とは?") print(f"Query Agentが発行したquery:{search_response.searches[0].query}") print(f"Query Agentが検索したcollection:{search_response.searches[0].collection}") for obj in search_response.search_results.objects: print(f"id:{obj.properties["q_id"]}, explan_score:{obj.metadata["explain_score"]}")
結果は以下です。Query Agentが入力したクエリを解釈し適切な形に書き換えていることが確認できます。
また、検索対象となったcollectionはJQaRAとなっています。
Query Agentが発行したquery:絶対零度とは 温度の定義 基本概念 絶対温度 ゼロケルビン 極低温の物理的意味 Query Agentが検索したcollection:JQaRA id:QA20CAPR-1004, explan_score: Hybrid (Result Set vector,hybridVector) Document 729a82ae-fa6f-498b-9dcd-d19b2fe02494: original score 0.7352022, normalized score: 0.68195397 id:QA20CAPR-1004, explan_score: Hybrid (Result Set vector,hybridVector) Document 26b007dd-2714-4dcd-8169-ead737cd7b80: original score 0.74868655, normalized score: 0.7
次に、Askクエリタイプを試してみます。
response = qa.ask("Weaviateって何?Vespaとの違いは?")
response.display()
まず、Ask Mode Response セクションには、Query Agentが生成した回答が表示されます。
さらに、Search セクションでは、Query Agentが3つのクエリを発行して検索していることが分かります。
今回は、検索対象のcollectionがJQaRAではなくブログ記事になっています。
Sourcesセクションで参照したデータのIDが表示されています。
╭───────────────────────────────────────────── 💬 Ask Mode Response ──────────────────────────────────────────────╮ │ │ │ WeaviateとVespaはどちらも検索やデータ探索に使われる技術ですが、特徴や目的に違いがあります。 │ │ │ │ 【Weaviateとは】 │ │ - オープンソースのベクトルデータベースで、Go言語で実装。 │ │ - ベクトル検索を中心に、自然言語による高度な検索をエージェント(Query Agent)を使って簡単に実装可能。 │ │ - LLM(大規模言語モデル)と連携し、自然言語クエリを解析・実行し、回答を生成する仕組みが提供されている。 │ │ - クラウドでも自ホストでも利用でき、テキストの類似検索や質問応答などAIを活用した先進的な検索用途に強みがある。 │ │ │ │ 【Vespaとは】 │ │ - Yahooが開発したオープンソースの検索エンジンプラットフォーム。 │ │ - 大規模データセットの高速・スケーラブルな探索が可能。 (中略) ╭───────────────────────────────────────────────── 🔭 Search 1/3 ─────────────────────────────────────────────────╮ │ │ │ QueryResultWithCollectionNormalized( │ │ query='Weaviate vector database description features vector search agent usage', │ │ filters=None, │ │ collection='BLOG_cloud', │ │ sort_property=None │ │ ) │ │ │ ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ ╭───────────────────────────────────────────────── 🔭 Search 2/3 ─────────────────────────────────────────────────╮ │ │ │ QueryResultWithCollectionNormalized( │ │ query='Vespa search engine description features machine learning ranking improvement', │ │ filters=None, │ │ collection='BLOG_cloud', │ │ sort_property=None │ │ ) │ │ │ ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ ╭───────────────────────────────────────────────── 🔭 Search 3/3 ─────────────────────────────────────────────────╮ │ │ │ QueryResultWithCollectionNormalized( │ │ query='WeaviateとVespaの違い 利用方法 技術 面 比較 用途', │ │ filters=None, │ │ collection='BLOG_cloud', │ │ sort_property=None │ │ ) │ │ │ ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ ╭────────────────────────────────────────────────── 📚 Sources ───────────────────────────────────────────────────╮ │ │ │ - object_id='97d062d1-abe5-4264-84e1-ad45bc6744fd' collection='BLOG_cloud' │ │ - object_id='066850da-213e-4bd6-88ef-9558f6c97543' collection='BLOG_cloud' │ │ - object_id='ec6c8fe4-a018-491f-819a-fb861b8f62b0' collection='BLOG_cloud' │ │ │ ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
まとめ
本記事では、WeaviateのQuery Agent機能を活用し、エージェントを組み込んだ検索(Agentic Search)を簡単に実現する方法を紹介しました。わずか数十行のコードで、自然言語による質問応答や高度な検索体験を構築できる点は非常に魅力的です。
Query Agent 機能は、私がこれまで利用してきた他のサービスのエージェント検索機能と比べても、より手軽にエージェントを検索に組み込めるようになっていると感じました。
また、今回は紹介しきれませんでしたが、モジュールを活用して機能を容易に拡張でき、高いカスタマイズ性を備えているため、幅広いユースケースに対応できそうです。
近年、Weaviateをはじめ、Azure AI SearchやVertex AI Searchなど、各社がこぞってエージェント機能を標準搭載し始めています。これにより、シンプルなQAシステムであれば、誰でも短時間で実装できる時代になりつつあります。
一方で、実際のユースケースに最適化するためには、データ構造や検索戦略のチューニングが不可欠です。
いくら検索エンジンが高性能でも、検索対象のデータが整備されていなければ十分な成果は得られません。
今後は、検索技術の進化を活かしつつ、ビジネスにおける重要な知識をどのように構造化し、活用できる状態にするかがより重要になってくるでしょう。
ここまでお読みいただきありがとうございました。LayerXではAI時代の検索・データ基盤を一緒に作ってくれる方を絶賛募集中です。興味を持っていただけた方がいたら、ぜひ一度お話しましょう!