模型的三种知识来源

分清参数中的一般知识、你临时提供的材料与外部检索三者的差别,并说明向量检索与 RAG 实际解决了什么、没有解决什么。

  • 检索
  • RAG
  • 来源核验
  • 文献整理

Reading Guide

先问一个问题

模型回答我的问题时,所依据的东西是从哪里来的,这三种来源各自可靠到什么程度?

适合读者
需要用 AI 查考资料、整理文献的读者
阅读基础
what-language-models-do;context-and-memory

Key Points

先记住这些

  1. 参数中的一般知识来自训练材料,覆盖广但有时间截止点,且无法追溯到具体出处。
  2. 你临时贴进上下文的材料是当次最可靠的依据,因为出处由你掌握,但它受窗口限制且用完即弃。
  3. 外部检索是在回答前先从资料库里找出相关片段再一并送入上下文,本质上是把第二种来源自动化。
  4. 向量检索按语义相近程度取材,擅长找到说法不同而意思相近的段落,也因此容易取回「像但不是」的内容。
  5. 检索能显著减少凭空编造,但不能保证答案正确:取回的片段可能不相关、不完整或本身有误。
  6. 关键是把「模型说的」与「材料里写的」在流程上分开,让每一条结论都能回到一段可核对的原文。

Terms

几个必要概念

参数知识

训练过程沉淀在模型参数中的一般性知识。

它没有出处、没有版本、有截止日期,因此不适合作为书目、年份、条文这类需要精确的依据。
嵌入

把一段文字转成一串数字,使意思相近的文字在数值上也彼此接近。

它让检索可以按意思而非字面匹配,也让「意思接近但事实不同」的段落更容易被误取。
检索增强生成

先从外部资料库检索相关片段,再连同问题一起交给模型作答的做法,常简称 RAG。

这是让模型回答有据可依、可注明出处的主要工程手段。
关键词检索

按词项出现与否及其权重排序的传统检索方法,BM25 是其中的代表。

在人名、书名、年份、专名这类必须字面精确的场合,它往往比向量检索更可靠,两者宜并用。

三种来源,三种可靠性

第一种是参数中的一般知识。它的好处是随取随用、覆盖面广,缺点是既无出处也无版本,而且训练材料有截止时间。用它来判断一个论证的大致走向、一个术语的通常含义,通常没有问题;用它来确认某书某年某版某页,则相当危险,因为模型给出错误细节时的语气与给出正确细节时完全一样。S1

第二种是你在当次交互中亲手贴进去的材料。这是三者中最可靠的一种,因为出处由你掌握,内容由你选定。它的限制是窗口容量与用完即弃,而且如前一篇所说,材料在上下文中的位置会影响它被利用的程度。S2

第三种是外部检索。它并没有引入新的原理,只是把第二种来源自动化了:先根据问题从一个资料库里挑出若干最可能相关的片段,把它们连同问题一起送进上下文,再让模型作答。这一做法在研究上被称为检索增强生成,最初的动机正是让模型在知识密集型任务上能够依据可指认的文本,而不是凭参数里的印象作答。S3

向量检索实际在做什么

要让机器判断哪段材料与问题相关,一种办法是看词是否对得上,这是关键词检索的思路,BM25 是这一路的经典方法。另一种办法是把每段文字都转成一串数字,使意思相近的文字在数值空间中彼此靠近,再看哪些段落离问题最近,这就是向量检索。前者精于字面,后者精于意思。S4S5

对文献工作来说,两者的分工相当清楚。查「李嘉图在哪一章讨论级差地租」,意思相近就够用,向量检索占优;查「某书 1817 年初版的出版者」,则必须字面精确,关键词检索更稳。实践中常把两者结果合并再排序,这样既不漏掉换了说法的段落,也不至于把年份、人名匹配错。S4

还有一个容易被忽略的环节是切分。资料库里的长文必须先切成小段才能检索,切得太碎会丢失上下文,切得太大会把无关内容一并带入。校勘记、注疏这类文体尤其麻烦,因为一条注与它所注的正文分开之后,各自都不完整。切分方式往往比选哪种检索算法更影响最终效果。S3

检索解决了什么,没解决什么

  • 解决了:让回答有可指认的依据,使「这句话出自哪里」成为一个能回答的问题。
  • 解决了:让超出训练截止时间的材料、私人材料、未公开材料也能被使用。
  • 没解决:取回的片段本身可能有误,模型忠实地复述一段错误材料,仍然是错的。
  • 没解决:该取的没取到时,模型往往不会声明材料不足,而是用参数知识补上,这类错误最难发现。
  • 没解决:模型在概括多段材料时可能引入原文没有的推论,注明了出处不等于出处支持这句话。
S1S3

自建一个小型资料库要注意什么

对个人项目而言,做一个可检索的私人资料库并不需要多大工程。真正决定成败的是三件事:收什么、怎么切、怎么标。收什么最容易被忽视。一个混杂了原文、译文、他人研究、自己札记的库,检索时会不断把不同层级的材料混在一起返回,而模型并不会替你区分哪一段是原始文献、哪一段是转述。稳妥的做法是分库或至少分层标注,检索时能限定只在原始文献层里找。S3

怎么切前面已经提过,这里补充一条经验:切分的单位应当与你日后提问的粒度一致。如果你日常的问题是「某人在哪一篇文章里讨论过某事」,那么以篇为单位就够;如果问题是「某个术语在全书中出现过几种用法」,就必须切到段甚至句,并保留段落在原书中的位置信息。切分时把位置信息一并存进每一段的元数据,是日后能不能回到原文的关键,补做的成本远高于当初随手记下。S3

  • 每段至少记录四项元数据:来源标识、在原书中的位置、材料层级、录入日期。
  • 原始文献、译文、研究、自撰札记分层标注,检索时可分别限定。
  • 关键词检索与向量检索并用,人名书名年份一类优先看关键词结果。
  • 把检索本身的结果也存档,日后复核时才知道当时模型看到的是哪几段。
  • 定期抽查检索质量:拿几个已知答案的问题去问,看该取回的有没有取回。
  • 资料库有版本,增删材料时记一笔,否则同一个问题在不同时间得到不同答案将无从解释。

最后一条提醒与检索本身无关,却最容易出事:检索不到,不等于不存在。资料库里没有的材料,模型不会告诉你「库里没有」,它会用参数中的一般知识补上一段听起来合理的话。因此任务定义里必须明确规定,凡未能在检索结果中找到依据的,一律标为材料不足并列出缺什么,而不是给出一个答案。这条规定要写进验收标准,并且抽样核对时专门检查有没有被违反。S1

Conclusion

结语

把三种来源在流程上分清楚,是使用 AI 做文献工作的最低要求。凡结论必有出处,凡出处必可回到原文,凡回不到原文的一律存疑,这个次序比选用哪种检索技术重要得多。

仍可追问

  • 对古籍与注疏一类文体,如何切分才能既保留注文与正文的关联又便于检索,目前没有成熟的公开方案。
  • 混合检索中关键词与向量结果的权重如何设定,多依赖经验调参,缺少针对中文文献的公开评测。
  • 检索是否显著降低了幻觉率,不同任务上的实测结论差异较大,本文只作定性表述。

参考资料

  1. S1

    Ziwei Ji, Nayeon Lee, Rita Frieske, Tiezheng Yu, Dan Su, Yan Xu, 等.Survey of Hallucination in Natural Language Generation.2023

    DOI / ISBN:10.1145/3571730查看来源
  2. S2

    Nelson F. Liu, Kevin Lin, John Hewitt, Ashwin Paranjape, Michele Bevilacqua, Fabio Petroni, Percy Liang.Lost in the Middle: How Language Models Use Long Contexts.2024

    DOI / ISBN:arXiv:2307.03172查看来源
  3. S3

    Patrick Lewis, Ethan Perez, Aleksandra Piktus, Fabio Petroni, Vladimir Karpukhin, Naman Goyal, 等.Retrieval-Augmented Generation for Knowledge-Intensive NLP Tasks.2020

    DOI / ISBN:arXiv:2005.11401查看来源
  4. S4

    Stephen Robertson, Hugo Zaragoza.The Probabilistic Relevance Framework: BM25 and Beyond.2009

    DOI / ISBN:10.1561/1500000019查看来源
  5. S5

    Vladimir Karpukhin, Barlas Oğuz, Sewon Min, Patrick Lewis, Ledell Wu, Sergey Edunov, Danqi Chen, Wen-tau Yih.Dense Passage Retrieval for Open-Domain Question Answering.2020

    DOI / ISBN:10.18653/v1/2020.emnlp-main.550查看来源