createVectorQueryTool()
createVectorQueryTool()
関数は、ベクトルストアに対するセマンティック検索のためのツールを作成します。フィルタリング、リランキング、データベース固有の設定をサポートし、さまざまなベクトルストアバックエンドと統合できます。
基本的な使い方
import { openai } from "@ai-sdk/openai";
import { createVectorQueryTool } from "@mastra/rag";
const queryTool = createVectorQueryTool({
vectorStoreName: "pinecone",
indexName: "docs",
model: openai.embedding("text-embedding-3-small"),
});
Parameters
パラメータ要件: ほとんどのフィールドは作成時にデフォルトとして設定できます。
一部のフィールドは、ランタイムコンテキストまたは入力を介してランタイム時にオーバーライドできます。必須フィールドが作成時とランタイム時の両方で欠落している場合、エラーがスローされます。なお、model
、id
、description
は作成時にのみ設定できます。
id?:
description?:
model:
vectorStoreName:
indexName:
enableFilter?:
includeVectors?:
includeSources?:
reranker?:
databaseConfig?:
DatabaseConfig
DatabaseConfig
タイプを使用すると、クエリ操作に自動的に適用されるデータベース固有の設定を指定できます。これにより、異なるベクトルストアが提供する独自の機能と最適化を活用できます。
pinecone?:
namespace?:
sparseVector?:
pgvector?:
minScore?:
ef?:
probes?:
chroma?:
where?:
whereDocument?:
RerankConfig
model:
options?:
weights?:
topK?:
戻り値
このツールは以下のオブジェクトを返します:
relevantContext:
sources:
QueryResult オブジェクトの構造
{
id: string; // Unique chunk/document identifier
metadata: any; // All metadata fields (document ID, etc.)
vector: number[]; // Embedding vector (if available)
score: number; // Similarity score for this retrieval
document: string; // Full chunk/document text (if available)
}
デフォルトツールの説明
デフォルトの説明は以下に重点を置いています:
- 保存された知識から関連情報を見つけること
- ユーザーの質問に答えること
- 事実に基づく内容を取得すること
結果の処理
このツールは、ユーザーのクエリに基づいて返す結果の数を決定し、デフォルトでは10件の結果を返します。これはクエリの要件に応じて調整することができます。
フィルター付きの例
const queryTool = createVectorQueryTool({
vectorStoreName: "pinecone",
indexName: "docs",
model: openai.embedding("text-embedding-3-small"),
enableFilter: true,
});
フィルタリングが有効になっている場合、このツールはクエリを処理し、セマンティック検索と組み合わせるメタデータフィルターを構築します。プロセスは次のように動作します:
- ユーザーが「‘version’ フィールドが2.0より大きいコンテンツを探す」など、特定のフィルター条件を含むクエリを行います。
- エージェントがクエリを解析し、適切なフィルターを構築します:
{ "version": { "$gt": 2.0 } }
このエージェント駆動型のアプローチは以下のことを行います:
- 自然言語のクエリをフィルター仕様に変換
- ベクトルストア固有のフィルター構文を実装
- クエリ用語をフィルター演算子に変換
詳細なフィルター構文やストア固有の機能については、Metadata Filters のドキュメントをご覧ください。
エージェント駆動型フィルタリングの動作例については、Agent-Driven Metadata Filtering の例をご参照ください。
リランキング付きの例
const queryTool = createVectorQueryTool({
vectorStoreName: "milvus",
indexName: "documentation",
model: openai.embedding("text-embedding-3-small"),
reranker: {
model: openai("gpt-4o-mini"),
options: {
weights: {
semantic: 0.5, // Semantic relevance weight
vector: 0.3, // Vector similarity weight
position: 0.2, // Original position weight
},
topK: 5,
},
},
});
リランキングは、以下を組み合わせることで結果の品質を向上させます:
- セマンティック関連性:LLMベースのテキスト類似度スコアを使用
- ベクトル類似度:元のベクトル距離スコア
- ポジションバイアス:元の結果の順序を考慮
- クエリ分析:クエリの特徴に基づく調整
リランカーは初期のベクトル検索結果を処理し、関連性を最適化した順序でリストを返します。
カスタム説明付きの例
const queryTool = createVectorQueryTool({
vectorStoreName: "pinecone",
indexName: "docs",
model: openai.embedding("text-embedding-3-small"),
description:
"Search through document archives to find relevant information for answering questions about company policies and procedures",
});
この例では、情報検索という基本的な目的を維持しつつ、特定のユースケースに合わせてツールの説明をカスタマイズする方法を示しています。
データベース固有の設定例
databaseConfig
パラメータを使用すると、各ベクトルデータベース固有の機能と最適化を活用できます。これらの設定は、クエリ実行時に自動的に適用されます。
Pinecone
Pinecone設定
const pineconeQueryTool = createVectorQueryTool({
vectorStoreName: "pinecone",
indexName: "docs",
model: openai.embedding("text-embedding-3-small"),
databaseConfig: {
pinecone: {
namespace: "production", // 環境別にベクトルを整理
sparseVector: { // ハイブリッド検索を有効化
indices: [0, 1, 2, 3],
values: [0.1, 0.2, 0.15, 0.05]
}
}
}
});
Pineconeの機能:
- Namespace: 同一インデックス内で異なるデータセットを分離
- Sparse Vector: 密ベクトルと疎ベクトルを組み合わせて検索品質を向上
- 使用例: マルチテナントアプリケーション、ハイブリッドセマンティック検索
実行時設定のオーバーライド
異なるシナリオに適応するために、実行時にデータベース設定をオーバーライドできます:
import { RuntimeContext } from '@mastra/core/runtime-context';
const queryTool = createVectorQueryTool({
vectorStoreName: "pinecone",
indexName: "docs",
model: openai.embedding("text-embedding-3-small"),
databaseConfig: {
pinecone: {
namespace: "development"
}
}
});
// 実行時にオーバーライド
const runtimeContext = new RuntimeContext();
runtimeContext.set('databaseConfig', {
pinecone: {
namespace: 'production' // 本番環境のネームスペースに切り替え
}
});
const response = await agent.generate(
"デプロイメントに関する情報を検索",
{ runtimeContext }
);
このアプローチにより、以下が可能になります:
- 環境間の切り替え(開発/ステージング/本番)
- 負荷に基づくパフォーマンスパラメータの調整
- リクエストごとの異なるフィルタリング戦略の適用
例: ランタイムコンテキストの使用
const queryTool = createVectorQueryTool({
vectorStoreName: "pinecone",
indexName: "docs",
model: openai.embedding("text-embedding-3-small"),
});
ランタイムコンテキストを使用する場合、実行時にランタイムコンテキスト経由で必要なパラメータを提供します:
const runtimeContext = new RuntimeContext<{
vectorStoreName: string;
indexName: string;
topK: number;
filter: VectorFilter;
databaseConfig: DatabaseConfig;
}>();
runtimeContext.set("vectorStoreName", "my-store");
runtimeContext.set("indexName", "my-index");
runtimeContext.set("topK", 5);
runtimeContext.set("filter", { category: "docs" });
runtimeContext.set("databaseConfig", {
pinecone: { namespace: "runtime-namespace" }
});
runtimeContext.set("model", openai.embedding("text-embedding-3-small"));
const response = await agent.generate(
"Find documentation from the knowledge base.",
{
runtimeContext,
},
);
ランタイムコンテキストの詳細については、以下を参照してください:
ツールの詳細
このツールは以下のように作成されています:
- ID:
VectorQuery {vectorStoreName} {indexName} Tool
- 入力スキーマ: queryText と filter オブジェクトが必要
- 出力スキーマ: relevantContext 文字列を返す