跳到正文
Elaine Blog
返回

找到资料以后怎样回答:上下文、证据与引用

更新于:
RAG 从入门到 Agentic RAG

检索第一名是正确条款,模型却回答“十天内商家一定承担运费”。条款实际要求质量问题先核实。检索没有找错,生成阶段把条件删掉了,这类问题不能靠继续提高向量分数解决。

本篇研究候选到答案之间发生什么:读哪些材料,如何排列,结论依赖什么,引用能核验到哪一层。仍使用虚构售后政策,所有示意回答由作者编写。

候选集合不等于最终阅读上下文

检索可能返回二十个小片段,重排保留八个,父块回填后却变成三份大段落。每一步都改变了生成模型实际看到的内容。日志不能只保留最初的候选 ID,还应保存最终上下文版本和截取范围。

小片段负责匹配,较大阅读单元负责恢复条件。若两个子片段来自同一条款,可以回填一次父条款,减少重复;若属于不同版本,必须保留版本区别。不能按相似文本直接合并新旧规则。

上下文预算应扣除问题、固定指令、消息格式和输出预留。假设窗口 8000 Token,固定与问题共 1000,输出留 1500,模板和工具信息 500,资料预算就是 5000。资料实际长度用生成模型的 Tokenizer 计量,不能用向量编码器长度替代。

放得下还不够,还要让关系清楚

每份资料带稳定 ID、标题、适用范围、版本和正文,比裸文本拼接更容易使用。产品规则和通用政策应分别标注,不让“三十天”与另一产品的“十五天”混在一起。模型需要知道它们是两条规则,不是一条规则的两个数字。

排序可以优先核心证据,再放必要补充,但不能假定排第一就一定被正确采用。重复、互相矛盾和缺乏来源的内容会增加解释负担。需要比较上下文设计对固定问题的影响,而不是不断复制一句“不要幻觉”。

上下文压缩可以删掉与当前问题无关的发票段落,却不能把“经核实属于质量问题”压成“质量问题”。抽取式压缩保留原文片段,生成式压缩会重写,后者还需要检查事实保持。无论哪种方式,都记录压缩结果到原始来源的对应。

把一句回答拆成需要证据的主张

“订单 A100 可免费退回”至少依赖:订单归属正确、产品适用条款、签收期限满足、质量问题已核实、承担方规则适用。只找到“质量退货运费由商家承担”不足以证明所有前提。

可以把中间状态列成主张与依据:期限事实来自订单系统,质量条款来自政策,核实状态来自业务记录。客户说“有质量问题”是客户陈述,不能直接填进“已核实”字段。模型可以组织说明,却不能通过措辞把证据缺口消掉。

对于只问一般政策的用户,不必查询个人订单。此时正确回答可以是有条件的政策说明。是否需要个人事实取决于问题,而不是固定每次查完整业务链。

引用要检查三层

第一层是身份:引用 ID 是否在本次允许使用的证据集合里。第二层是位置:引文或定位能否回到原文。第三层是支持关系:原文是否真的支持该主张,并保留了适用条件。

下面故意构造一条“引用真实但结论过强”的回答。程序只检查前两层,不伪装成完整事实核验器。citation_check.py下载可独立阅读。

"""检查教学回答的引用身份与原文片段;不声称完成自然语言蕴含判断。"""
evidence = {
    "quality-v1": "签收三十天内,经核实属于质量问题,退货运费由商家承担。",
    "normal-v1": "普通退货签收七天内,商品未使用且包装完好,运费由买家承担。",
}
# 主张和引文由作者编写,故意使第一条结论比引文支持范围更强。
claims = [
    {"text": "任何质量问题都由商家承担运费", "source": "quality-v1", "quote": "退货运费由商家承担"},
    {"text": "海外维修费可报销", "source": "overseas-v1", "quote": "可报销"},
]
for claim in claims:
    source = evidence.get(claim["source"])
    if source is None:
        print("拒绝未知引用:", claim["source"])
        continue
    if not claim["quote"] or claim["quote"] not in source:
        print("引文不在来源中")
        continue
    # 身份与片段匹配通过后,仍需核对结论是否遗漏期限、核实条件或例外。
    print("引用可定位,语义支持待检查:", claim["text"], "完整来源:", source)

第一条引文确实存在,仍不能支持“任何质量问题”。它遗漏了期限和核实要求。第二条引用根本不在资料集里,程序可以直接拒绝。分层后就知道哪种错误适合确定性检查,哪种需要语义判断。

语义支持可以结合规则、人工和模型评审。模型评审应看到完整条款、问题与主张,不能只看回答是否写得专业。它也会出错,特别是条件、否定和跨资料推导,因此重要任务应使用针对性样本校准。

资料冲突时,不按分数投票

旧政策说七天,新政策说三十天,不一定真正冲突,可能适用订单日期不同。先确认版本、生效区间、产品和地域,再判断是否同一条件下结论相斥。更新得更晚不自动意味着适用于历史订单。

同条件下确实冲突时,应该指出两份来源和冲突点,按业务规定决定优先级,或进入人工复核。不断检索直到找到自己想要的答案,只是在选择证据。相似度更高也不赋予某份政策更高效力。

“不支持肯定答案”也不等于“支持否定答案”。三十天条款不能覆盖四十天,不代表其他售后权利都不存在。回答应限定为“当前条款未支持此结论,需查看其他规则”,而不是泛化成绝对拒绝。

证据不足可以部分回答

如果已知期限符合但缺质量核实,可以解释已找到的条款和仍缺的事实。若完全没有海外维修政策,应说明当前资料未覆盖。两种情况需要不同的下一步,不能统一输出“抱歉无法回答”。

澄清问题应具体,例如“是否已有质量核实结果”或“产品型号是哪一个”。如果缺的是系统内部资料,不能把所有问题都推给客户;应在授权范围内补查或说明资料缺失。

可以在应用输出中区分 answered、partial、insufficient、conflict 等状态,并附证据与缺口。状态字段不自动保证模型判断正确,仍需与实际依据核对。不要在流式答案还没完成时就触发业务操作。

外部条款中的命令也只是资料。Prompt 系列已解释注入边界,这里新增的要求是来源、权限和派生内容都要一起传递,不能因材料被检索或摘要过就升级为可信指令。

下一篇进入评测与错误诊断。检索相关性、答案正确性与引用支持性需要分别度量,才能知道修改真正改善了什么。


分享这篇文章:

上一篇
用户的问题怎样变成检索任务:改写、分解与多跳
下一篇
怎样判断 RAG 真的变好了:评测与错误诊断