知识库问答里的问题大致有三类:换个说法问同一件事,按文号、型号这类精确字符串找,或者顺着人、部门、制度之间的关系去找。没有哪一种索引能把三类都答好,所以 ApeMind 为每篇文档同时建三套索引,查询时并行召回,再合成一份证据列表交给智能体。
读完这篇,你应该能判断一个知识库该开哪些索引,以及某次回答没找到资料时,问题出在哪一路。
三条通道各管什么
向量
意思相近就能找到
- 擅长
- 同义改写、口语提问、跨表述的概念匹配。“住得比标准贵能报吗”能找到“住宿超标须审批”。
- 不擅长
- 文号、型号、编号这类必须逐字一致的内容;数字差一位,向量上几乎看不出差别。
- 依赖
- 建库时绑定的 Embedding 模型,换模型需要重建向量。
全文
字面一致就能找到
- 擅长
- 文号、条款号、产品型号、人名和专有名词。“财务〔2024〕17号”只会精确命中那份通知。
- 不擅长
- 换了说法的问题。用户说“报销”,原文写“费用核销”,字面上就对不上。
- 依赖
- 不需要模型,按 BM25 计算相关度。
图谱
顺着关系就能找到
- 擅长
- “谁审批”“归哪个部门”“A 和 B 什么关系”这类答案分散在多篇文档里、需要串起来的问题。
- 不擅长
- 纯描述性的段落;没有被抽取成实体或关系的内容,图谱看不见。
- 依赖
- 大语言模型从片段里抽取实体和关系,建图成本最高。
召回实验台
下面是一个模拟的差旅制度知识库。选一个问题,看三条通道各自召回了什么、融合后的顺序是什么。点通道标题可以开关这一路,悬停任何一个片段,可以看到它在各路中的名次和最终得分是怎么算出来的。
示例数据为演示用途;融合公式与产品一致(weighted_rrf_v1,k = 60,三路权重均为 1)。
为什么按名次,不按分数
三条通道的分数根本不在一个尺度上:向量余弦相似度落在 0 到 1 之间,BM25 没有上限,常见值在 1 到 20 多;图谱命中则是按实体和关系路径排出来的顺序,没有可比的分数。如果直接按分数排序,全文结果会压过所有向量结果——在实验台里切到“原始分数”就能看到,一条只是字面沾边的“出差安全须知”会排到第一。
所以 ApeMind 用
- rank片段在这一路里的名次,从 1 开始
- 60平滑常数 k,让第 1 名和第 5 名的差距不至于悬殊
- w通道权重,当前三路都是 1
- Σ被几路命中就累加几次,这就是“共识加成”
这个设计有两个直接的结果。第一,三路里只要有一路把某个片段排在前面,它就有机会进入证据列表,不会被另一路的高分淹没。第二,同时被两三路命中的片段几乎总是排在最前,因为它们在语义、字面和关系上都站得住。融合后不再经过额外的重排模型,每一路自己的排序语义被完整保留下来。
图谱通道如何落回片段
图谱里存的是实体和关系,智能体最终要读的却是原文片段。图谱通道的工作是把“命中的实体”沿着
- 问题进入图谱通道
和另外两路并行发出,单独设有超时,图谱慢不会拖住整次检索。
- 先找实体
用实体向量找到语义上最接近的
规范实体 。直接命中的实体权重为 1.0。 - 再扩一跳
沿关系向外扩展一跳,把相邻实体也带进来。扩展出来的实体权重降为 0.6,离问题越远,说服力越弱。
- 沿血缘回到原文
每个实体都记得自己来自哪些片段。证据片段按名次做 1/√n 衰减,单个实体最多贡献有限条来源,避免一个高频实体刷屏,然后和向量、全文一起进入融合。
图谱结果在这里是“线索”而不是“结论”:智能体最终引用的永远是原文片段,而不是模型抽取出来的一条关系。关系抽错了,最多是多召回一个不相关的片段;不会出现一个查无出处的事实。
图片是第四条路
开启图片索引后,默认的向量检索会共享同一次问题向量化,并行召回文字片段和图片。两者分别返回,文字进入 items,图片进入 image_items,不拿文字分数和图片分数互相比较。跨模态的原始分数和跨通道的原始分数一样不可比。
该开哪些索引
向量 + 全文是底线,图谱建议开启。制度类问题经常问“谁审批”“归谁管”,答案分散在组织架构、权限表、管理办法几份文档里,图谱能把它们串起来。
向量 + 全文必开。型号、错误码、参数名只有全文能精确命中;概念解释靠向量。图谱按需:产品之间依赖关系复杂时再开。
全文最关键,条款号、法规文号、金额都要逐字匹配。向量用于“类似条款”的查找。图谱对“甲方、乙方、担保方之间的关系”有帮助。
图谱的建图成本最高,因为每个片段窗口都要调用一次大语言模型。资料量大、关系简单时可以先只开向量和全文,确认问题集确实需要关系推理后再开图谱,已有文档可以从解析产物直接补建,不用重新解析。
边界
- 融合只决定顺序,不决定对错。排在第一的片段最可能相关,但智能体仍会读原文、核对后再回答。
- 每次检索会给出整体的匹配强度(强、中、弱、无),智能体据此判断证据是否充分;查无结果时会收到明确提示,而不是被引导去猜。
- 没开启的索引不会被查询;请求了却不可用的通道会在结果里明确标出被跳过的原因,而不是静默返回空结果。
出问题时查哪一环
问编号、型号查不到,换个说法却能查到
全文通道没有生效。先确认知识库开启了全文索引,再看这篇文档的全文索引状态是否已完成。只开向量时,精确字符串的召回本来就不可靠。
措辞稍微不同就查不到
向量通道没有生效或模型不合适。确认向量索引已完成;如果知识库内容是专业领域,考虑换一个更贴近领域的 Embedding 模型并重建向量索引。
“谁负责”“归哪个部门”这类问题总答不全
答案分散在多篇文档里,需要图谱把它们串起来。确认图谱索引已开启并完成;如果显示“部分完成”,说明少数片段窗口抽取失败,可以对该文档重建图谱索引。
给想深入的读者:融合的细节
每个片段在自己所属的通道里按分数确定名次;同一片段被多路召回时,合并去重,并记下它在其他通道里的名次,各自贡献一份 1/(60+rank)。得分相同时,单路名次更靠前的排在前面,再相同则保持原有顺序。图谱通道内部先按实体来源权重(直接命中 1.0、一跳扩展 0.6)和证据名次衰减算出图谱得分,再以名次身份参与最终融合。