让AI基于自有文档作答:RAG如何运作
企业里的大多数AI项目都基于同一种技术:先在组织的文档中找出相关段落,再让模型依据这些段落作答。本文说明它如何运作、会在哪里出错,以及为什么敏感文档更适合留在本地。
来源正确,回答却错了
一位乘客向加拿大航空网站的对话助手询问丧亲出行的专属票价。助手告诉他,可以先按正常票价购票,事后在90天内申请减免。同一条消息里,助手还附上了该公司官方页面的链接。而那个页面说的恰恰相反:丧亲票价不适用于出行之后提交的申请。
不列颠哥伦比亚省民事纠纷解决法庭于2024年2月作出裁决。加拿大航空主张其助手类似于一个独立实体,应对自己的言论负责;法庭认为这一论点“令人瞠目”,予以驳回。该公司须补足已付票价与丧亲票价之间的差额。在法庭看来,信息来自固定页面还是来自助手并不重要:企业须对其网站上出现的内容负责。
这个事件概括了检索增强生成(RAG,即retrieval-augmented generation)所要解决的问题。正确的文档是存在的。缺少的是一个依据它作答、并说明每项陈述出处的系统。
原理:开卷考试
这个术语出现于2020年,见于Patrick Lewis及另外十一位合著者发表、并在NeurIPS会议上报告的一篇论文。作者区分了两种记忆。参数记忆是模型在训练期间吸收的,写在它的参数里。非参数记忆是外部索引,在他们的实验中是维基百科的一个版本,系统在作答时查阅它。他们的结论是:两者结合产生的文本比单独的模型更准确、更符合事实。
最直观的比喻是考试。一个全凭背诵的学生答得很快,但在记错的地方会出错,也不知道复习之后发生的任何变化。一个获准翻阅资料夹的学生,会先找到正确的那一页,再根据所读内容作答。RAG让语言模型处于后一种学生的位置。
法国国家信息与自由委员会(CNIL)概括了这种方法的价值:它产生由外部数据充实的回答,比模型本身更具针对性,也更容易更新。这对企业是决定性的一点。用自己的文档重新训练模型成本高昂,每次更新都要重做。法国国家网络安全局(ANSSI)补充了一条安全方面的理由:数据一旦被纳入训练,就无法再对其施加访问权限;而存放在模型之外的文档,仍可遵循通常的“谁能看什么”的规则。
具体来说,RAG依次执行四项操作:准备文档,把它们转换为坐标,找出有用的段落,再写出引用这些段落的回答。
第一步:准备并切分文档
一切始于提取文本。文字处理文件或网页容易读取;扫描的PDF需要字符识别,表格或图示则需要专门处理。这项不起眼的工作在很大程度上决定最终质量:文本提取得不好,无论模型多强,回答都会出错。
随后,文本被切分成几个段落大小的片段,业内称为chunks。切分是必要的,因为检索必须指向一个具体的段落,而不是一份两百页的报告。切分也会带来一个陷阱,Anthropic在2024年9月的一篇文章中对此有清楚的描述:孤立的片段会丢失上下文。文中的例子是一份财务报告的摘录,只写着季度营业额增长了3%,却没有说明是哪家公司、哪个季度。
应对办法是众所周知的。让片段之间略有重叠;遵循标题和条款的边界,而不是在句子中间截断;并为每个片段添加一段简短的上下文说明:来源文档、章节、日期。这些元数据之后将用于筛选、引用和控制访问。
第二步:把语义转换为坐标
随后,每个片段会经过一个嵌入模型,它不同于负责写出回答的模型。它的作用是把一段文本转换成一列数字,即一个向量,用来表示它的含义。两个谈论同一件事的段落,即使用词不同,得到的向量也很接近。
最贴切的比喻是地图。每个段落都获得坐标,但不是像经纬度那样的两个轴,而是几百甚至几千个维度。在这张地图上,“辞职预告期”会落在“离开公司前须遵守的期限”附近,尽管这两种说法几乎没有共同的词。这正是语义检索区别于传统内部搜索引擎的关键词检索之处。
这些向量看上去很抽象,但并没有想象的那么抽象。在EMNLP 2023会议上发表的一篇论文中,研究人员证明,仅凭嵌入向量就能精确还原92%的短文本(32个token),从而在临床记录中找回完整的姓名。因此,向量索引应当与其所源自的文档受到同等程度的保护。
第三步:存储,然后检索
向量连同原始文本及其元数据,一起存储在向量数据库中。用户提问时,问题由同一个嵌入模型转换为向量,数据库随后查找坐标最接近的片段。这有点像图书管理员:不在书名里查找确切的词,而是直接走到存放该主题书籍的书架。
单靠语义检索有其弱点。它可能漏掉确切的引用、合同编号或条款代码,而关键词检索可以轻松找到。因此,严谨的系统会把两者结合起来,往往再加上一个重排序步骤:由第二个模型重读入选的候选片段,按其与所提问题的实际相关性排序。
Anthropic在自己的测试集上量化了这些改进的效果。使用简单的向量检索,在前二十条结果中缺少正确信息的情形占5.7%。给每个片段添加上下文后,这一比例降到3.7%。与BM25类的关键词检索结合后降到2.9%,加入重排序后降到1.9%。这是供应商在自己的数据上得到的测量结果,但其数量级表明,决定RAG质量的是检索,而不是写作。
第四步:写出回答并注明来源
入选的几个段落被插入发给语言模型的指令中,连同问题和明确的要求:只依据所提供的摘录作答,为每项陈述注明文档和页码,信息不在其中时要明确说明。模型随后用通俗语言写出回答,界面则显示指向被引段落的链接。
引用改变了这个工具的性质。没有引用,用户只能凭空相信机器。有了引用,用户一键即可核查,组织事后也能追溯一条有争议回答的出处。在加拿大航空的案例中,链接是有的,但与文字相矛盾;调校良好的系统应当给出忠实于其所引来源的回答,而用户也应养成打开来源的习惯。
也不能让摘录淹没模型。2023年发表于《Transactions of the Association for Computational Linguistics》、题为“Lost in the Middle”的研究表明,模型对放在所给文本开头或结尾的信息利用得更好,对位于中间的信息则明显更差。与其堆上一大批近似的段落,不如只给几个相关的段落。
此外,RAG也并非总是必要。Anthropic指出,在大约20万个token(约500页)以下,把整个资料库直接放入指令可能更简单,前提是模型接受这样长的上下文窗口。对于一份内部规章和几项流程,这个问题值得考虑。对于一家事务所的档案,则不存在这个问题。
为什么几乎所有项目都从这里开始
语言模型即使再出色,也不了解企业的内部流程、合同、产品资料,或案卷的历史。RAG是让它接触这些知识而无需修改模型的最直接方式。添加一份文档就是为它建立索引;撤下一个过时版本就是将它从索引中删除。这一操作属于文档管理,而不是新的训练。
各行业的用法相似。人力资源部门回答员工关于集体协议或休假的常见问题。客服找到正确的技术资料。法务部门查询合同库,找出解约条款。地方政府帮助工作人员在多年积累的决议和条例中找到方向。在每种情形中,价值与其说在于写作,不如说在于找到正确段落的能力。
幻觉会减少,但不会消失
RAG常被说成是治疗虚构回答的良方。斯坦福大学RegLab与HAI研究所于2024年5月发表的一项研究,针对200多个法律问题,对这一说法作了大幅修正。LexisNexis和汤森路透基于RAG的法律检索工具,其中一些宣称不会产生幻觉,实际上Lexis+ AI和Ask Practical Law AI在超过17%的情形下给出不正确的信息,Westlaw AI-Assisted Research则超过34%。单独使用GPT-4的表现明显更差,这类问题上的错误率为58%至82%。
作者指出了几个原因:检索带回了不适用的文本,法律推理本身的困难,以及模型倾向于顺着问题的方向走,即使问题建立在错误的前提上。因此,RAG是转移了风险,而不是消除了风险。如果检索带回了错误的段落,模型就会依据错误的段落写出一篇流畅的回答。
防护措施主要在组织层面。准备一组已知正确答案的真实问题,在部署之前用它测量系统,此后每次变更都再测一次。允许系统回答“不知道”。对于会让组织承担责任的回答,保留人工审核。CNIL在协助法国就业服务局(France Travail)的一个项目时,强调了最后一点:培训工作人员发现错误,并给他们留出偏离工具建议的时间。
访问权限:助手能看到索引所能看到的一切
最容易被低估的风险不是出错,而是内部泄露。如果一个组织的所有文档都被索引在同一个数据库中,实习生可以向助手询问其主管的薪资,并得到一段工资单摘录。模型并没有强行突破什么;它读到的是数据库传给它的内容。
ANSSI对此提出了明确要求:AI系统在其回答中,必须遵守每位用户各自的访问限制。它指出,对于存放在模型之外的文档,这是可行的,取决于存储工具的能力,并建议定期审查所配置的权限,例如每月一次。微软在其Copilot准备文档中以自己的方式表述了这一点:助手遵循现有权限,这等于暴露了多年来积累的所有过宽的共享。该厂商还提醒,SharePoint的共享设置默认是最宽松的。
OWASP是应用安全领域的权威基金会,其2025年版语言模型十大风险排名中,专设一类涉及向量与嵌入的弱点。其中包括共用同一向量数据库的用户或客户之间的泄露、通过植入陷阱文档对数据库的投毒,以及前文提到的嵌入反演。所举的例子不言自明:一份简历里,用白底白字写了一条指令,意在让筛选系统推荐该候选人。凡被索引的文档,最终都会出现在模型眼前;必须知道它从哪里来。
实际的结论说起来简单,做起来漫长。每个被索引的片段都必须带有其来源文档的权限,检索必须按提问者的身份进行过滤,每一次查询都必须记录日志。
文档过期,回答也过期
RAG依据交给它的内容作答。如果索引里同时有2019年的通知和替代它的新通知,它可能同样自信地引用其中任何一份。在文档不断堆积却从不撤下的组织里,这种情形很常见:旧的价目表、废弃的流程、过时的合同范本。
应对办法首先是文档层面的,其次才是技术层面的。要为每个语料库指定负责人,给文档标注日期,将被取代的文档归档,并让索引自动跟随新增、修改和删除。微软自己也建议对不活跃的站点归档,以便其助手依据最新内容。在界面上,显示每个被引来源的日期,可以让人一眼看出某个回答所依据的是旧文本。
为什么敏感文档应在本地运行
从设计上说,RAG处理的是组织最宝贵的文档。使用在线服务时,这些文档、它们的向量、用户的提问和回答,都要经过或停留在供应商那里。CNIL在2024年7月关于生成式AI的问答中建议,处理个人数据或敏感数据时,优先采用本地部署,以限制被第三方提取的风险。ANSSI在其建议R34中,不建议在涉及敏感数据的任何职业用途中使用在线生成式AI工具。
公共部门提供了一个有文献记录的例子。在其公共服务AI沙盒框架内,CNIL于2024年协助了法国就业服务局的“个性化建议”项目,这是一个工具,基于由培训目录和求职者档案提供数据的RAG,向顾问推荐培训。所选模型是Mistral AI的Mixtral,部署在本地。CNIL在其建议中指出,在供应商环境中使用模型,存在个人数据失去保密性的风险。
对某些职业来说,这个问题关系到职业保密。《刑法典》第226-13条规定,因职业而保管秘密信息的人泄露该信息的,处一年监禁和15 000欧元罚款。律师事务所和会计师事务所首当其冲。索引个人档案的人力资源部门,处理社会援助申请的地方政府,所经手的个人数据一旦泄露,也会对当事人造成实际伤害。
本地意味着整条链路都留在现场:文本提取、嵌入模型、向量数据库、语言模型和日志。模型留在自己这里,却把向量交给外部服务,起不到多少保护作用,因为这些向量可以还原一部分文本。作为代价,组织要承担运维:备份、更新、访问监控。
从哪里开始
第一个成功的项目只需要很少的条件:一个范围有限且维护良好的语料库,例如某个部门的流程;清晰的访问权限;一组用来衡量质量的真实问题;以及知道要打开所引来源的用户。困难很少来自模型。它们来自文档、文档的状态、版本,以及谁有权阅读的问题。
这是HOMN采用的方式:文档、索引和模型都留在组织的围墙之内,使用外部服务则是一项明确的选择。无论选用哪种工具,回答的质量首先取决于语料库的质量和权限的严谨程度。
什么是RAG?
RAG即retrieval-augmented generation(检索增强生成),是一种先在文档库中检索相关段落,再让语言模型依据这些段落作答的技术。它让人可以在不重新训练模型的情况下查询自己的文档,并为每个回答注明来源。
RAG能消除幻觉吗?
不能,它只能减少幻觉,不能消除。斯坦福2024年发表的一项研究测得,基于RAG的商业法律工具有超过17%的回答不正确。如果检索带回了错误的段落,模型就会依据该段落写出流畅的回答,所以引用和人工核查很重要。
要让AI了解自己的文档,需要用这些文档训练它吗?
通常不需要。RAG保持模型不变,在每次提问时向它提供有用的摘录,因此通过添加或移除文档即可更新资料库。它还能保留按文档设置的访问权限,而ANSSI认为,数据一旦纳入训练,这就无法做到。
能否在不把文档上传到云端的情况下,建立基于自有文档的聊天机器人?
可以。文本提取、嵌入模型、向量数据库和语言模型,都可以在安装于组织场所内的服务器上运行。处理个人数据或敏感数据时,CNIL建议优先采用这一方案。