检索和排序

更新时间:
复制 MD 格式

通过 Retrieve 接口检索知识库内容,支持向量检索、全文检索和混合检索,可配置 Rerank 排序策略。

前提条件

  • 已创建知识库并导入文档,且文档状态为 Completed(Pending 或 Indexing 状态的文档无法被检索)。

  • 若知识库开启了子空间(subspace),检索时必须传 subspace。

检索配置优先级

Retrieve 接口的检索配置(retrievalConfiguration)按以下优先级确定最终生效的参数:

优先级

来源

说明

1(最高)

Retrieve 接口参数

本次请求中传入的 retrievalConfiguration,仅对当次生效

2

知识库级别配置

创建知识库时设定,可通过 UpdateKnowledgeBase 随时修改

3(最低)

系统默认值

向量 + 全文混合检索,WEIGHT 加权融合(向量 0.7 : 全文 0.3),返回 20 条结果

最简单的检索请求只需传 knowledgeBaseName 和 retrievalQuery,系统自动使用知识库配置或默认值。

检索类型

类型

说明

适用场景

DENSE_VECTOR

向量检索,基于语义相似度

用自然语言描述需求,需要理解语义。如"怎么安装"能匹配到"部署步骤"

FULL_TEXT

全文检索,基于关键词匹配

输入精确关键词、专有名词或编号

向量检索和全文检索在召回上具有互补能力:向量检索擅长语义理解,全文检索擅长精确匹配。建议同时开启两种检索类型,通过 Rerank 融合结果。

Rerank 排序策略

Rerank 将向量检索和全文检索的结果融合排序,返回最终结果。

WEIGHT(加权融合)

按比例加权向量与全文检索得分。适合需要精细控制两路检索贡献比例的场景。推荐作为默认选择。

参数

类型

默认值

说明

denseVectorSearchWeight

double

0.7

向量检索加权比例

fullTextSearchWeight

double

0.3

全文检索加权比例

RRF(Reciprocal Rank Fusion)

按排名倒数加权融合多路检索结果。无需额外模型调用,延迟低,效果稳定。

参数

类型

默认值

说明

denseVectorSearchWeight

double

1.0

向量检索权重

fullTextSearchWeight

double

1.0

全文检索权重

k

int

60

RRF 算法参数,必须大于 0

配置示例:

{
  "rerankingConfiguration": {
    "type": "RRF",
    "numberOfResults": 5,
    "rrfConfiguration": {
      "denseVectorSearchWeight": 0.6,
      "fullTextSearchWeight": 0.4,
      "k": 20
    }
  }
}

MODEL(模型 Rerank)

调用 Rerank 模型(如 gte-rerank-v2)对候选结果重排序。排序质量最高,但会引入额外延迟和计算成本。

参数

类型

默认值

说明

provider

string

bailian

Rerank 模型提供方,当前仅支持百炼

model

string

gte-rerank-v2

Rerank 模型名称

策略选择建议

场景

推荐策略

通用场景,对延迟敏感

RRF

需要精细控制向量与全文检索的比例

WEIGHT

对排序质量要求极高,可接受额外延迟

MODEL

元数据过滤

在检索时通过 filter 参数按元数据条件过滤结果,缩小候选范围。过滤字段必须在创建知识库时通过 metadata 定义。完整算子列表参见检索知识。

比较算子

算子

符号

说明

适用类型

equals

=

等于

所有类型

notEquals

≠

不等于

所有类型

greaterThan

>

大于

long, double, date

greaterThanOrEquals

≥

大于等于

long, double, date

lessThan

<

小于

long, double, date

lessThanOrEquals

≤

小于等于

long, double, date

集合与匹配算子

算子

说明

适用类型

in

值在给定集合中

所有类型

notIn

值不在给定集合中

所有类型

startsWith

字符串前缀匹配

string

stringContains

字符串包含匹配

string

listContains

列表字段包含指定元素

list 类型

逻辑组合算子

算子

说明

andAll

所有条件同时满足

orAll

任一条件满足

notAll

所有条件都不满足

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控制台,打开目标知识库,选择左侧检索测试,按以下步骤验证检索效果:

  1. 在内容输入框输入检索文本;若知识库启用了子空间,还需填写子空间名称。

  2. 在搜索类型中勾选向量检索 或 全文检索。

  3. 设置向量 TopK、全文 TopK 和 Rerank TopK(保持默认即可)。

  4. 选择 Rerank 策略:Model、Weight 或 RRF;选择 Weight 时可设置向量/全文检索权重(保持默认即可)。

  5. 如知识库定义了元数据字段,可增加元数据过滤条件。

  6. 点击执行检索,在召回段落中查看命中的切片内容、来源和相关性得分。

首次调试建议先使用默认参数,确认能召回目标内容后再逐步调整 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。根据实际效果逐步调整。

检索类型选择

场景

推荐检索类型

说明

用自然语言提问

DENSE_VECTOR + FULL_TEXT

向量捕捉语义,全文保障关键词命中

输入精确关键词或编号

优先 FULL_TEXT

向量检索对精确匹配不敏感

纯语义理解场景

优先 DENSE_VECTOR

如"怎么安装"匹配"部署步骤"

Metadata Filter 使用建议

  • Filter 在检索前缩小候选范围,同时提升检索精度和性能。

  • 过滤字段必须在创建知识库时定义为 metadata,运行时无法新增。

  • 对于日期范围过滤,使用 date 类型而非 string 类型,以支持范围比较算子。