通过 Retrieve 接口检索知识库内容,支持向量检索、全文检索和混合检索,可配置 Rerank 排序策略。
前提条件
检索配置优先级
Retrieve 接口的检索配置(retrievalConfiguration)按以下优先级确定最终生效的参数:
|
优先级 |
来源 |
说明 |
|
1(最高) |
Retrieve 接口参数 |
本次请求中传入的 |
|
2 |
知识库级别配置 |
创建知识库时设定,可通过 UpdateKnowledgeBase 随时修改 |
|
3(最低) |
系统默认值 |
向量 + 全文混合检索,WEIGHT 加权融合(向量 0.7 : 全文 0.3),返回 20 条结果 |
最简单的检索请求只需传 knowledgeBaseName 和 retrievalQuery,系统自动使用知识库配置或默认值。
检索类型
|
类型 |
说明 |
适用场景 |
|
|
向量检索,基于语义相似度 |
用自然语言描述需求,需要理解语义。如"怎么安装"能匹配到"部署步骤" |
|
|
全文检索,基于关键词匹配 |
输入精确关键词、专有名词或编号 |
向量检索和全文检索在召回上具有互补能力:向量检索擅长语义理解,全文检索擅长精确匹配。建议同时开启两种检索类型,通过 Rerank 融合结果。
Rerank 排序策略
Rerank 将向量检索和全文检索的结果融合排序,返回最终结果。
WEIGHT(加权融合)
按比例加权向量与全文检索得分。适合需要精细控制两路检索贡献比例的场景。推荐作为默认选择。
|
参数 |
类型 |
默认值 |
说明 |
|
|
double |
0.7 |
向量检索加权比例 |
|
|
double |
0.3 |
全文检索加权比例 |
RRF(Reciprocal Rank Fusion)
按排名倒数加权融合多路检索结果。无需额外模型调用,延迟低,效果稳定。
|
参数 |
类型 |
默认值 |
说明 |
|
|
double |
1.0 |
向量检索权重 |
|
|
double |
1.0 |
全文检索权重 |
|
|
int |
60 |
RRF 算法参数,必须大于 0 |
配置示例:
{
"rerankingConfiguration": {
"type": "RRF",
"numberOfResults": 5,
"rrfConfiguration": {
"denseVectorSearchWeight": 0.6,
"fullTextSearchWeight": 0.4,
"k": 20
}
}
}
MODEL(模型 Rerank)
调用 Rerank 模型(如 gte-rerank-v2)对候选结果重排序。排序质量最高,但会引入额外延迟和计算成本。
|
参数 |
类型 |
默认值 |
说明 |
|
|
string |
|
Rerank 模型提供方,当前仅支持百炼 |
|
|
string |
|
Rerank 模型名称 |
策略选择建议
|
场景 |
推荐策略 |
|
通用场景,对延迟敏感 |
RRF |
|
需要精细控制向量与全文检索的比例 |
WEIGHT |
|
对排序质量要求极高,可接受额外延迟 |
MODEL |
元数据过滤
在检索时通过 filter 参数按元数据条件过滤结果,缩小候选范围。过滤字段必须在创建知识库时通过 metadata 定义。完整算子列表参见检索知识。
比较算子
|
算子 |
符号 |
说明 |
适用类型 |
|
|
= |
等于 |
所有类型 |
|
|
≠ |
不等于 |
所有类型 |
|
|
> |
大于 |
long, double, date |
|
|
≥ |
大于等于 |
long, double, date |
|
|
< |
小于 |
long, double, date |
|
|
≤ |
小于等于 |
long, double, date |
集合与匹配算子
|
算子 |
说明 |
适用类型 |
|
|
值在给定集合中 |
所有类型 |
|
|
值不在给定集合中 |
所有类型 |
|
|
字符串前缀匹配 |
string |
|
|
字符串包含匹配 |
string |
|
|
列表字段包含指定元素 |
list 类型 |
逻辑组合算子
|
算子 |
说明 |
|
|
所有条件同时满足 |
|
|
任一条件满足 |
|
|
所有条件都不满足 |
andAll、orAll 和 notAll 支持嵌套,可构建复杂的组合过滤逻辑。
过滤示例
查询 category 为 "technology" 或 "science",且 score ≥ 60,且 title 以"产品"开头的文档:
{
"filter": {
"andAll": [
{"in": {"key": "category", "value": ["technology", "science"]}},
{"greaterThanOrEquals": {"key": "score", "value": 60}},
{"startsWith": {"key": "title", "value": "产品"}}
]
}
}
使用 orAll 实现"或"逻辑,查询 status 为 "active" 或 score > 90 的文档:
{
"filter": {
"orAll": [
{"equals": {"key": "status", "value": "active"}},
{"greaterThan": {"key": "score", "value": 90}}
]
}
}
执行检索
-
检索文本
text最长 128 字符或汉字,超过会报错;如有业务需求请提交工单或加入表格存储技术交流群 36165029092 后联系技术支持。
-
过滤字段必须在创建知识库时已定义为 metadata,否则过滤条件不生效。
-
RRF 的
k必须大于 0,否则报VALIDATION_ERROR。 -
Pending或Indexing状态的文档无法被检索,须等状态变为Completed。 -
知识库开启 subspace 后必须传
subspace,否则报错。
控制台
登录Agent Storage控制台,打开目标知识库,选择左侧检索测试,按以下步骤验证检索效果:
-
在内容输入框输入检索文本;若知识库启用了子空间,还需填写子空间名称。
-
在搜索类型中勾选向量检索 或 全文检索。
-
设置向量 TopK、全文 TopK 和 Rerank TopK(保持默认即可)。
-
选择 Rerank 策略:Model、Weight 或 RRF;选择 Weight 时可设置向量/全文检索权重(保持默认即可)。
-
如知识库定义了元数据字段,可增加元数据过滤条件。
-
点击执行检索,在召回段落中查看命中的切片内容、来源和相关性得分。
首次调试建议先使用默认参数,确认能召回目标内容后再逐步调整 TopK 与 Rerank 策略。
SDK
Python
最简示例:不传检索参数,使用知识库级别配置或系统默认值:
from tablestore_agent_storage import AgentStorageClient
client = AgentStorageClient(
api_key="<your-api-key>",
ots_endpoint="https://<instance>.<region>.ots.aliyuncs.com",
ots_instance_name="<instance-name>",
)
resp = client.retrieve({
"knowledgeBaseName": "product_docs_kb",
"retrievalQuery": {"type": "TEXT", "text": "产品的安装步骤是什么"}
})
for r in resp["data"]["retrievalResults"]:
print(f"[{r['score']:.4f}] {r['content'][:80]}...")
完整示例:在请求中设置检索参数,覆盖知识库级别配置:
resp = client.retrieve({
"knowledgeBaseName": "product_docs_kb",
"subspace": ["default"],
"retrievalQuery": {"type": "TEXT", "text": "产品的安装步骤是什么"},
"retrievalConfiguration": {
"searchType": ["DENSE_VECTOR", "FULL_TEXT"],
"denseVectorSearchConfiguration": {"numberOfResults": 10},
"fullTextSearchConfiguration": {"numberOfResults": 10},
"rerankingConfiguration": {
"type": "RRF",
"numberOfResults": 5,
"rrfConfiguration": {
"denseVectorSearchWeight": 0.6,
"fullTextSearchWeight": 0.4,
"k": 60
}
},
"filter": {
"andAll": [
{"in": {"key": "category", "value": ["产品文档"]}}
]
}
}
})
for result in resp["data"]["retrievalResults"]:
print(f"[score={result['score']:.4f}] {result['content'][:100]}...")
print(f" 来源: {result['ossKey']}, chunkId: {result['chunkId']}")
使用 Model 类构建请求,获得更好的 IDE 代码补全和类型检查:
from tablestore_agent_storage import AgentStorageClient
from tablestore_agent_storage.models import (
RetrieveRequest, RetrievalQuery, RetrievalQueryType
)
client = AgentStorageClient(
api_key="<your-api-key>",
ots_endpoint="https://<instance>.<region>.ots.aliyuncs.com",
ots_instance_name="<instance-name>",
)
resp = client.retrieve(RetrieveRequest(
knowledge_base_name="product_docs_kb",
retrieval_query=RetrievalQuery(
text="产品的安装步骤是什么",
type=RetrievalQueryType.TEXT
)
))
TypeScript
import { AgentStorageClient } from '@tablestore/agent-storage';
const client = new AgentStorageClient({
apiKey: '<your-api-key>',
endpoint: 'https://<instance>.<region>.ots.aliyuncs.com',
instanceName: '<instance-name>',
});
const resp = await client.retrieve({
knowledgeBaseName: 'product_docs_kb',
retrievalQuery: { type: 'TEXT', text: '产品的安装步骤是什么' },
});
for (const r of resp.data.retrievalResults) {
console.log(`[${r.score.toFixed(4)}] ${r.content.slice(0, 80)}...`);
}
API
调用 Retrieve 执行检索。完整请求字段、响应字段与 filter 算子说明参见检索知识。
检索调优
numberOfResults 参数关系
检索流程中有三层 numberOfResults,理解它们的关系是调优的关键:
denseVectorSearchConfiguration.numberOfResults = N1 ← 向量检索召回数
fullTextSearchConfiguration.numberOfResults = N2 ← 全文检索召回数
rerankingConfiguration.numberOfResults = N3 ← Rerank 后最终返回数
-
N1 和 N2 决定候选池大小,越大召回率越高,但计算成本也越高。
-
N3 决定最终返回的结果数,通常 N3 < N1 且 N3 < N2。
-
推荐起始配置:N1 = N2 = 20,N3 = 5--10。根据实际效果逐步调整。
检索类型选择
|
场景 |
推荐检索类型 |
说明 |
|
用自然语言提问 |
|
向量捕捉语义,全文保障关键词命中 |
|
输入精确关键词或编号 |
优先 |
向量检索对精确匹配不敏感 |
|
纯语义理解场景 |
优先 |
如"怎么安装"匹配"部署步骤" |
Metadata Filter 使用建议
-
Filter 在检索前缩小候选范围,同时提升检索精度和性能。
-
过滤字段必须在创建知识库时定义为 metadata,运行时无法新增。
-
对于日期范围过滤,使用
date类型而非string类型,以支持范围比较算子。