遏制聊天机器人的幻觉现象:RAG、向量搜索、分块处理以及约束规则。
针对支持型聊天机器人的系统设计方案,涉及策略制定:RAG、嵌入技术及ANN搜索、分块大小设定、引导提示词、上下文长度限制以及监控机制。
有客户通过客服聊天机器人询问公司的退款政策,机器人便自行编造了一个政策。实际上该政策并不存在,但客户却按照它来操作,公司最终也不得不予以执行。这就是最严重的幻觉问题表现形式,也是系统设计面试中常出现的主题,因为它将人工智能基础设施与传统架构结合在了一起。
为什么模型会编造内容
大型语言模型是一种概率性文本生成器。它并不掌握事实,只是预测下一个最合理的字符。当答案不在其训练数据或上下文中时,它就会生成看似合理但实际上错误的内容。如果训练文本中含有许多其他公司的退款政策,模型就会输出符合这些模式的答案,即便它并不适用于当前公司的情况。
这与其说是个漏洞,不如说是该技术运作方式的必然结果。仅靠微调也无法解决这个问题,因为不可能将所有可能的事实都纳入模型权重中。主要的解决方案是检索增强生成技术,即RAG:不必让模型直接根据自身参数作答,而是先获取相关文档并将其放入提示词中。
其应用场景为客服聊天机器人,用于回答有关产品、政策及故障排除的问题。这类机器人虽然能给出自信的答复,但有时会声称产品具备实际并不存在的功能,或编造政策内容。如何确保其答复始终基于真实文档呢?
一份优质答案应涵盖以下内容:
- 模型为何会产生幻觉,以及为何微调不够用
- RAG技术中先检索上下文再生成内容的流程
- 向量数据库与基于嵌入的语义搜索
RAG如何减少幻觉
借助RAG,系统首先从知识库中检索相关内容并将其作为上下文插入提示词中。没有RAG时,模型会依据自身参数进行猜测;而有了RAG后,模型则能从提供的文档中获取答案。虽然模型仍会生成令牌,但上下文对其起到了约束作用。如果文档中明确说明不支持退款,模型就不会编造出30天的退换货期限。
向量数据库与嵌入向量
系统是如何找到合适的文档的?每份文档都会被转换为向量嵌入,即对其含义的高维数值表示,查询也会经过同样的处理。向量数据库会返回那些嵌入向量与查询向量最为接近的文档。
这一过程由四个组件完成:
- 嵌入模型。它将文本映射为向量,使得相似的文本会产生相似的向量。可选模型包括具有1536维度的OpenAI的text-embedding-3-small,以及BGE和E5等开源模型。
- 向量数据库。它用于存储这些嵌入向量,并支持近似最近邻搜索。可选方案包括托管型的Pinecone,以及Weaviate、Qdrant、pgvector(PostgreSQL扩展)和Milvus等。
分块处理
一份50页的政策文件无法整体检索,因此必须将其拆分。分块大小会影响检索的准确性以及上下文窗口的利用效率。
- 过小的文本块会丢失上下文。例如,某块可能只包含“运输过程中损坏的物品不”,而句子的其余部分在另一块中,这样模型就无法正确作答。
- 过大的文本块会用无关内容稀释有用信息,使窗口充满噪声。
- 重叠机制可以避免因边界问题导致的信息丢失。设置10%到20%的重叠比例,可防止信息遗漏在各个文本块之间。
文档处理的合理默认做法是按章节标题进行分割,将每个文本块的长度控制在500到1000个标记左右,并让相邻文本块有50到100个标记的重叠。每个文本块都应是一个完整的独立内容,表达一个完整的想法。
提示词设计作为第二道防线
即便使用了检索功能,模型仍可能忽略上下文并产生幻觉,因此提示语必须将其牢牢绑定在所提供的材料上。关键要素包括:
- 角色设定。类似“你是一名客户支持助手”这样的表述可以明确模型的身份定位。
- 约束要求。要求模型仅依据提供的上下文作答,可防止其依赖记忆中的信息。
- 不确定时的处理方式。告知模型在上下文缺乏答案时应当说明无法回答,这是最有效的措施;否则模型会随意猜测。
- 引用要求。强制模型标注信息来源,有助于减少虚假内容的生成。
- 禁止使用外部知识。明确禁止模型引用上下文之外的信息,进一步强化约束规则。
管理上下文窗口
如果相关内容无法全部容纳,或者一个问题包含多个需要大量内容的部分该怎么办?现代模型拥有较大的上下文窗口,例如GPT-4o的上下文长度为128K个标记,Gemini则可达100万个标记,但填入过多无关内容会降低回答质量。以下四种策略可有所帮助:
- 按相关性排序。检索十个相关内容,根据得分从高到低排列,依次加入直到用完标记额度,优先舍弃最不相关的内容。
- 拆分查询。对于“请告诉我退款政策和配送时间”这类问题,可将其拆分为多个子查询,分别检索后再在同一个回复中给出答案。
- 总结复杂主题。当某个主题涉及多个相关内容时,让模型先对这些内容进行总结,再以该总结作为最终回答的上下文。
完整架构
综合来看,主要决策如下:
- 语义分块。在标题和段落等自然分隔处进行分割,每个分块约包含500个标记,并有50个标记的重叠部分,且每个分块都是独立的。
- 两阶段检索。先通过ANN搜索得到20个候选项,再由交叉编码器进行重新排序,最终保留最佳的3个结果。
- 低温度参数。在0到2的范围内将该参数设置为约0.2,可使模型减少创造性发挥,降低编造内容的可能性。
需要监控的内容
- 虚构内容出现频率。指答案中包含给定上下文里不存在的信息的比例,可通过自动评估或人工审核来衡量。合理的控制目标应低于1%。
四层防御机制
幻觉现象并非人工智能出现故障的迹象,而是设计上的问题。由于模型的训练目标就是追求合理性而非准确性,因此不受约束的模型总会优先选择看似合理的答案。可通过四层机制来解决这一问题:
- 检索。提供相关文档,让模型从这些文档中获取答案而非依赖记忆。
- 提示设计。将模型限制在给定的上下文中,要求其承认不知情并注明引用来源。
- 约束规则。过滤输出内容,检查引用信息并计算置信度得分,拒绝任何无法通过上下文验证的答案。
最重要的原则是:能够坦诚地说“我不知道”的聊天机器人,远比那些硬编答案的机器人要好。