createVectorQueryTool()
createVectorQueryTool() 函数会创建一个在 vector store 上运行语意搜索的 Tool。它支持筛选、重新排序、数据库特定设置,以及与 vector store backend 集成。
基本用法基本用法的直接链接
import { createVectorQueryTool } from '@mastra/rag'
import { ModelRouterEmbeddingModel } from '@mastra/core/llm'
const queryTool = createVectorQueryTool({
vectorStoreName: 'pinecone',
indexName: 'docs',
model: new ModelRouterEmbeddingModel('openai/text-embedding-3-small'),
})
参数参数的直接链接
参数需求: 大多数字段都可在创建时设为默认值。部分字段可在运行阶段通过 request context 或输入覆写。若创建时与运行阶段都未提供必要字段,系统将掷回错误。请注意,model、id 与 description 只能在创建时设置。
id?:
description?:
model:
vectorStoreName:
indexName:
enableFilter?:
includeVectors?:
includeSources?:
reranker?:
model:
options?:
weights?:
topK?:
databaseConfig?:
pinecone?:
namespace?:
sparseVector?:
pgvector?:
minScore?:
ef?:
probes?:
chroma?:
where?:
whereDocument?:
providerOptions?:
vectorStore?:
vectorStoreName 会变成选填。回传值回传值的直接链接
此 Tool 会回传具有下列字段的对象:
relevantContext:
sources:
QueryResult 对象结构queryresult-object-structure的直接链接
{
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)
}
缺省 Tool 说明缺省 Tool 说明的直接链接
缺省说明着重于:
- 从保存的知识中找出相关信息
- 回答用户问题
- 截取事实内容
结果处理结果处理的直接链接
此 Tool 会根据用户的查找决定回传的结果数量,缺省为 10 笔。可依查找需求调整此数量。
使用 filter 的范例使用 filter 的范例的直接链接
const queryTool = createVectorQueryTool({
vectorStoreName: 'pinecone',
indexName: 'docs',
model: new ModelRouterEmbeddingModel('openai/text-embedding-3-small'),
enableFilter: true,
})
激活筛选后,此 Tool 会处理查找以建构中继数据 filter,再与语意搜索结合。进程如下:
- 用户提出具有特定筛选需求的查找,例如「寻找
version字段大于 2.0 的内容」 - Agent 分析查找并建构适当的 filter:
{"version": { "$gt": 2.0 }}
这种由 Agent 驱动的方法会:
- 将自然语言查找处理成 filter 规格
- 实作 vector store 特定的 filter 语法
- 将查找词汇转换为 filter operator
如需 filter 语法与 store 特定功能的详细信息,请参阅 Metadata filter 文档。
如需 Agent 驱动筛选的运作范例,请参阅 Agent 驱动的中继数据筛选范例。
重新排序范例重新排序范例的直接链接
const queryTool = createVectorQueryTool({
vectorStoreName: 'milvus',
indexName: 'documentation',
model: new ModelRouterEmbeddingModel('openai/text-embedding-3-small'),
reranker: {
model: 'openai/gpt-5.6-sol',
options: {
weights: {
semantic: 0.5, // Semantic relevance weight
vector: 0.3, // Vector similarity weight
position: 0.2, // Original position weight
},
topK: 5,
},
},
})
重新排序会结合下列因素,以提升结果品质:
- 语意相关性:使用以 LLM 为基础的文本相似度评分
- 矢量相似度:原始矢量距离分数
- 位置偏差:考量原始结果排序
- 查找分析:根据查找特性进行调整
Reranker 会处理初始矢量搜索结果,并回传针对相关性优化后重新排序的清单。
自订说明范例自订说明范例的直接链接
const queryTool = createVectorQueryTool({
vectorStoreName: 'pinecone',
indexName: 'docs',
model: new ModelRouterEmbeddingModel('openai/text-embedding-3-small'),
description:
'Search through document archives to find relevant information for answering questions about company policies and procedures',
})
此范例示范如何针对特定使用情境自订 Tool 说明,同时保留信息截取的内核用途。
数据库特定设置范例数据库特定设置范例的直接链接
databaseConfig 参数让你能使用各矢量数据库的特定功能与优化。这些设置会在运行查找时自动套用。
- Pinecone
- pgVector
- Chroma
- Turbopuffer
- 多项设置
Pinecone 设置Pinecone 设置的直接链接
const pineconeQueryTool = createVectorQueryTool({
vectorStoreName: 'pinecone',
indexName: 'docs',
model: new ModelRouterEmbeddingModel('openai/text-embedding-3-small'),
databaseConfig: {
pinecone: {
namespace: 'production', // Organize vectors by environment
sparseVector: {
// Enable hybrid search
indices: [0, 1, 2, 3],
values: [0.1, 0.2, 0.15, 0.05],
},
},
},
})
Pinecone 功能:
- Namespace:在同一个索引中隔离不同数据集
- Sparse Vector:结合 dense 与 sparse embedding,以提升搜索品质
- 使用情境:多租户应用程序、混合语意搜索
pgVector 设置pgVector 设置的直接链接
const pgVectorQueryTool = createVectorQueryTool({
vectorStoreName: 'postgres',
indexName: 'embeddings',
model: new ModelRouterEmbeddingModel('openai/text-embedding-3-small'),
databaseConfig: {
pgvector: {
minScore: 0.7, // Only return results above 70% similarity
ef: 200, // Higher value = better accuracy, slower search
probes: 10, // For IVFFlat: more probes = better recall
},
},
})
pgVector 功能:
- minScore:筛除低品质的相符结果
- ef (HNSW):控制 HNSW 索引的准确度与速度取舍
- probes (IVFFlat):控制 IVFFlat 索引的召回率与速度取舍
- 使用情境:性能调校、品质筛选
Chroma 设置Chroma 设置的直接链接
const chromaQueryTool = createVectorQueryTool({
vectorStoreName: 'chroma',
indexName: 'documents',
model: new ModelRouterEmbeddingModel('openai/text-embedding-3-small'),
databaseConfig: {
chroma: {
where: {
// Metadata filtering
category: 'technical',
status: 'published',
},
whereDocument: {
// Document content filtering
$contains: 'API',
},
},
},
})
Chroma 功能:
- where:依中继数据字段筛选
- whereDocument:依文档内容筛选
- 使用情境:高端筛选、内容式搜索
Turbopuffer 设置Turbopuffer 设置的直接链接
const turbopufferQueryTool = createVectorQueryTool({
vectorStoreName: 'turbopuffer',
indexName: 'docs',
model: new ModelRouterEmbeddingModel('openai/text-embedding-3-small'),
databaseConfig: {
turbopuffer: {
consistency: 'eventual', // Lower latency, recently written data may not be visible yet
},
},
})
Turbopuffer 功能:
- consistency:选择
strong(缺省,可读取自己的写入)或eventual(延迟较低) - 使用情境:可接受数据稍旧、但对延迟敏感的查找
多数据库设置多数据库设置的直接链接
// Configure for multiple databases (useful for dynamic stores)
const multiDbQueryTool = createVectorQueryTool({
vectorStoreName: 'dynamic-store', // Will be set at runtime
indexName: 'docs',
model: new ModelRouterEmbeddingModel('openai/text-embedding-3-small'),
databaseConfig: {
pinecone: {
namespace: 'default',
},
pgvector: {
minScore: 0.8,
ef: 150,
},
chroma: {
where: { type: 'documentation' },
},
},
})
多项设置的优点:
- 使用单一 Tool 支持多个 vector store
- 自动套用数据库特定优化
- 弹性的部署情境
覆写运行阶段设置覆写运行阶段设置的直接链接
你可以在运行阶段覆写数据库设置,以配合不同情境:
import { RequestContext } from '@mastra/core/request-context'
const queryTool = createVectorQueryTool({
vectorStoreName: 'pinecone',
indexName: 'docs',
model: new ModelRouterEmbeddingModel('openai/text-embedding-3-small'),
databaseConfig: {
pinecone: {
namespace: 'development',
},
},
})
// Override at runtime
const requestContext = new RequestContext()
requestContext.set('databaseConfig', {
pinecone: {
namespace: 'production', // Switch to production namespace
},
})
const response = await agent.generate('Find information about deployment', {
requestContext,
})
此方法可让你:
- 在不同环境间切换(dev/staging/prod)
- 根据负载调整性能参数
- 为每个请求套用不同的筛选策略
范例:使用 request context范例:使用 request context的直接链接
const queryTool = createVectorQueryTool({
vectorStoreName: 'pinecone',
indexName: 'docs',
model: new ModelRouterEmbeddingModel('openai/text-embedding-3-small'),
})
使用 request context 时,请在运行阶段通过 request context 提供必要参数:
const requestContext = new RequestContext<{
vectorStoreName: string
indexName: string
topK: number
filter: VectorFilter
databaseConfig: DatabaseConfig
}>()
requestContext.set('vectorStoreName', 'my-store')
requestContext.set('indexName', 'my-index')
requestContext.set('topK', 5)
requestContext.set('filter', { category: 'docs' })
requestContext.set('databaseConfig', {
pinecone: { namespace: 'runtime-namespace' },
})
requestContext.set('model', 'openai/text-embedding-3-small')
const response = await agent.generate('Find documentation from the knowledge base.', {
requestContext,
})
如需 request context 的详细信息,请参阅:
不使用 Mastra server不使用 Mastra server的直接链接
此 Tool 可单独使用,以截取符合查找的文档:
import { RequestContext } from '@mastra/core/request-context'
import { createVectorQueryTool } from '@mastra/rag'
import { PgVector } from '@mastra/pg'
const pgVector = new PgVector({
id: 'pg-vector',
connectionString: process.env.POSTGRES_CONNECTION_STRING!,
})
const vectorQueryTool = createVectorQueryTool({
vectorStoreName: 'pgVector', // optional since we're passing in a store
vectorStore: pgVector,
indexName: 'embeddings',
model: new ModelRouterEmbeddingModel('openai/text-embedding-3-small'),
})
const requestContext = new RequestContext()
const queryResult = await vectorQueryTool.execute({ queryText: 'foo', topK: 1 }, { requestContext })
console.log(queryResult.sources)
多租户应用程序的动态 vector store多租户应用程序的动态 vector store的直接链接
若多租户应用程序会隔离各租户的数据(例如各自使用不同 PostgreSQL schema),你可以传入 resolver function,而不是静态 vector store instance。此函数会接收 request context,并可回传目前租户适用的 vector store:
import { createVectorQueryTool, VectorStoreResolver } from '@mastra/rag'
import { PgVector } from '@mastra/pg'
// Cache for tenant-specific vector stores
const vectorStoreCache = new Map<string, PgVector>()
// Resolver function that returns the correct vector store based on tenant
const vectorStoreResolver: VectorStoreResolver = async ({ requestContext }) => {
const tenantId = requestContext?.get('tenantId')
if (!tenantId) {
throw new Error('tenantId is required in request context')
}
// Return cached instance or create new one
if (!vectorStoreCache.has(tenantId)) {
vectorStoreCache.set(
tenantId,
new PgVector({
id: `pg-vector-${tenantId}`,
connectionString: process.env.POSTGRES_CONNECTION_STRING!,
schemaName: `tenant_${tenantId}`, // Each tenant has their own schema
}),
)
}
return vectorStoreCache.get(tenantId)!
}
const vectorQueryTool = createVectorQueryTool({
indexName: 'embeddings',
model: new ModelRouterEmbeddingModel('openai/text-embedding-3-small'),
vectorStore: vectorStoreResolver, // Dynamic resolution!
})
// Usage with tenant context
const requestContext = new RequestContext()
requestContext.set('tenantId', 'acme-corp')
const result = await vectorQueryTool.execute(
{ queryText: 'company policies', topK: 5 },
{ requestContext },
)
此模式类似 Agent.memory 支持运行阶段定义设置的方式,并提供下列能力:
- Schema 隔离:将各租户的数据放在不同 PostgreSQL schema 中
- 数据库隔离:将各租户路由至不同的 database instance
- 动态设置:根据 request context 调整 vector store 设置
Tool 详细信息Tool 详细信息的直接链接
此 Tool 会使用下列设置创建:
- ID:
VectorQuery {vectorStoreName} {indexName} Tool - 输入 schema:需要 queryText 与 filter 对象
- 输出 schema:回传 relevantContext 字符串