本节摘要:模型的参数记忆不可信也不可控,生产级程序必须把事实锚定在外部知识源上。本节讲三类知识源——向量检索、知识图谱、结构化数据库——的接入形态、各自的证据契约写法,以及"检索质量与提示词质量分离排查"的工程方法。知识边界划得清,程序才立得住。
三类知识源对应三种证据形态。向量检索(文档库)给"文段证据":按语义相似度捞回若干文本块,适合开放领域的问答与摘要,证据是自然语言,模型消费成本最低,但证据粒度粗、可能包含噪声。知识图谱给"关系证据":实体与关系的结构化路径,适合多跳事实("某公司创始人的母校在哪座城市")、需要精确关系推理的场景,证据确定性强,但图谱的构建与维护成本高、覆盖面有限。结构化数据库给"记录证据":把模型难以精确计算的部分(数值、日期、统计)交给查询,程序里最典型的形态是 3.2 节讲过的 ProgramOfThought——模型生成查询语句,数据库执行后返回确定结果。
三类源常常混用:一个企业知识助手可能同时接文档检索(政策原文)、知识图谱(组织结构与审批链)、业务数据库(订单与工单数据)。混用时设计要点是证据路由:先用一个轻量预测器判断问题需要哪类证据(或全要),再分路取证据、统一编号后交给作答器。路由虽然多花一次小调用,但换来证据的相关性与准确性,多数生产场景划算。
检索源接入只需配置检索底座,Module 里的 dspy.Retrieve 就会走它:
# 检索底座指向向量检索服务后,Retrieve 模块自动可用 rm = dspy.ColBERTv1(url="http://检索服务地址", index_name="kb_docs") dspy.settings.configure(rm=rm)
图谱与数据库没有内置模块,用自定义模块包一层——关键是保持"证据统一形态"的约定:
import dspy class GraphLookup(dspy.Module): """把知识图谱查询包装成与 Retrieve 同构的证据模块。""" def __init__(self, graph_client): super().__init__() self.client = graph_client def forward(self, entity_query: str): triples = self.client.lookup(entity_query) # 返回三元组列表 passages = [f"{s} -{r}-> {o}" for s, r, o in triples] return dspy.Prediction(passages=passages) class SQLLookup(dspy.Module): """把数据库取数包装成证据模块:模型产查询语句,执行后回填。""" def __init__(self, db_executor): super().__init__() self.executor = db_executor self.write_query = dspy.Predict(SQLQuery) # 签名描述表结构与只读纪律 def forward(self, question: str): sql = self.write_query(question=question).sql rows = self.executor.run_readonly(sql) # 只读通道执行 passages = [str(row) for row in rows] return dspy.Prediction(passages=passages, sql=sql)
同构的好处是下游作答器完全不用改:三类证据都进 passages 字段,签名与编译全部照旧。这也让证据路由、证据合并成为纯粹的 Module 组合问题,而不是三套并行的代码风格。
知识源集成的质量核心不在接得上,而在"证据契约"——程序对证据的使用规则。三条纪律必须写进签名与指标。纪律一,只用给定证据:作答签名的描述明确"仅依据给定上下文回答,证据不足时如实说明",并配一个建议检查(5.3 节的 grounded 断言),拦截脱离证据的发挥。纪律二,引用可追溯:答案要求标注证据编号(P1、P2),编号体系由证据合并模块统一生成——这既是给用户看的可信度,也是给排查用的定位器。纪律三,无证据即认输:"依据不足"是合法输出且应当得分(4.3 节讲过),把"编造"的收益降到零,模型才没有动机编造。
混用知识源后,失败排查的最大陷阱是把两类问题搅在一起:"答错了"到底是检索没捞到,还是模型没用好证据?分离排查的标准做法是给检索层单独建一套不依赖生成模型的评估:构造"问题加应命中内容"的对照集,直接评估检索模块的命中率、排序质量与噪声率。生成层的评估则固定输入证据、只测作答能力(把证据人工构造好喂给作答器)。两层分数分开看:检索分数低,去调检索(查询改写、切块粒度、索引质量);检索达标而总分不行,病在作答——再动签名、示范与编译。这套分离法是 5.1 节四层定位法在知识源场景的具体化,也是多知识源系统排障的第一原则:先证明证据管道是对的,再审判模型。
一个实测数据点的量级参考:企业知识库场景中,检索命中率从七成提到九成,往往能把端到端准确率拉动十几个百分点——比任何提示词层面的优化都狠。这一直是知识源工程被低估的原因:它朴素,但它占大头。