首页 / 文章

遏制聊天机器人的幻觉现象:RAG、向量搜索、分块处理以及约束规则。

针对支持型聊天机器人的系统设计方案,涉及策略制定:RAG、嵌入技术及ANN搜索、分块大小设定、引导提示词、上下文长度限制以及监控机制。

发布者:REACTAPP.TOP阅读约 7 分钟1527 词

来源: AI Chatbot Gives Wrong Answers: System Design Deep Dive on Hallucinations, RAG Architecture, and Vector Databases

有客户通过客服聊天机器人询问公司的退款政策,机器人便自行编造了一个政策。实际上该政策并不存在,但客户却按照它来操作,公司最终也不得不予以执行。这就是最严重的幻觉问题表现形式,也是系统设计面试中常出现的主题,因为它将人工智能基础设施与传统架构结合在了一起。

为什么模型会编造内容

大型语言模型是一种概率性文本生成器。它并不掌握事实,只是预测下一个最合理的字符。当答案不在其训练数据或上下文中时,它就会生成看似合理但实际上错误的内容。如果训练文本中含有许多其他公司的退款政策,模型就会输出符合这些模式的答案,即便它并不适用于当前公司的情况。

这与其说是个漏洞,不如说是该技术运作方式的必然结果。仅靠微调也无法解决这个问题,因为不可能将所有可能的事实都纳入模型权重中。主要的解决方案是检索增强生成技术,即RAG:不必让模型直接根据自身参数作答,而是先获取相关文档并将其放入提示词中。

其应用场景为客服聊天机器人,用于回答有关产品、政策及故障排除的问题。这类机器人虽然能给出自信的答复,但有时会声称产品具备实际并不存在的功能,或编造政策内容。如何确保其答复始终基于真实文档呢?

一份优质答案应涵盖以下内容:

  • 模型为何会产生幻觉,以及为何微调不够用
  • RAG技术中先检索上下文再生成内容的流程
  • 向量数据库与基于嵌入的语义搜索
  • 用于分割文档的分块策略
  • 可减少幻觉的提示词技巧
  • 在令牌限制内管理上下文窗口
  • 用于监控答案质量的评估流程
  • RAG如何减少幻觉

    借助RAG,系统首先从知识库中检索相关内容并将其作为上下文插入提示词中。没有RAG时,模型会依据自身参数进行猜测;而有了RAG后,模型则能从提供的文档中获取答案。虽然模型仍会生成令牌,但上下文对其起到了约束作用。如果文档中明确说明不支持退款,模型就不会编造出30天的退换货期限。

    向量数据库与嵌入向量

    系统是如何找到合适的文档的?每份文档都会被转换为向量嵌入,即对其含义的高维数值表示,查询也会经过同样的处理。向量数据库会返回那些嵌入向量与查询向量最为接近的文档。

    这一过程由四个组件完成:

    • 嵌入模型。它将文本映射为向量,使得相似的文本会产生相似的向量。可选模型包括具有1536维度的OpenAI的text-embedding-3-small,以及BGE和E5等开源模型。
    • 向量数据库。它用于存储这些嵌入向量,并支持近似最近邻搜索。可选方案包括托管型的Pinecone,以及Weaviate、Qdrant、pgvector(PostgreSQL扩展)和Milvus等。
  • ANN搜索。将查询与所有存储的向量进行比对效率很低。像HNSW(分层可导航小世界)和IVF(倒排文件索引)这样的算法能够以对数级的时间快速找到近似邻居。当向量数量达到1000万甚至更多时,穷举搜索可能需要数秒,而ANN仅需几毫秒。
  • 重排序。第一轮搜索会返回大约20个候选项,随后更精确的交叉编码器会根据相关性对它们进行重新排序,只有排名前3的候选项才会传递给大语言模型。先进行快速但近似的检索,再通过较慢但精确的重排序,从而在速度与准确性之间取得平衡。
  • 分块处理

    一份50页的政策文件无法整体检索,因此必须将其拆分。分块大小会影响检索的准确性以及上下文窗口的利用效率。

    • 过小的文本块会丢失上下文。例如,某块可能只包含“运输过程中损坏的物品不”,而句子的其余部分在另一块中,这样模型就无法正确作答。
    • 过大的文本块会用无关内容稀释有用信息,使窗口充满噪声。
    • 重叠机制可以避免因边界问题导致的信息丢失。设置10%到20%的重叠比例,可防止信息遗漏在各个文本块之间。

    文档处理的合理默认做法是按章节标题进行分割,将每个文本块的长度控制在500到1000个标记左右,并让相邻文本块有50到100个标记的重叠。每个文本块都应是一个完整的独立内容,表达一个完整的想法。

    提示词设计作为第二道防线

    即便使用了检索功能,模型仍可能忽略上下文并产生幻觉,因此提示语必须将其牢牢绑定在所提供的材料上。关键要素包括:

    • 角色设定。类似“你是一名客户支持助手”这样的表述可以明确模型的身份定位。
    • 约束要求。要求模型仅依据提供的上下文作答,可防止其依赖记忆中的信息。
    • 不确定时的处理方式。告知模型在上下文缺乏答案时应当说明无法回答,这是最有效的措施;否则模型会随意猜测。
    • 引用要求。强制模型标注信息来源,有助于减少虚假内容的生成。
    • 禁止使用外部知识。明确禁止模型引用上下文之外的信息,进一步强化约束规则。

    管理上下文窗口

    如果相关内容无法全部容纳,或者一个问题包含多个需要大量内容的部分该怎么办?现代模型拥有较大的上下文窗口,例如GPT-4o的上下文长度为128K个标记,Gemini则可达100万个标记,但填入过多无关内容会降低回答质量。以下四种策略可有所帮助:

    1. 按相关性排序。检索十个相关内容,根据得分从高到低排列,依次加入直到用完标记额度,优先舍弃最不相关的内容。
    2. 拆分查询。对于“请告诉我退款政策和配送时间”这类问题,可将其拆分为多个子查询,分别检索后再在同一个回复中给出答案。
    3. 总结复杂主题。当某个主题涉及多个相关内容时,让模型先对这些内容进行总结,再以该总结作为最终回答的上下文。
  • 围绕匹配内容扩展。对于某个特定部分的问题,提取该位置前后的一段文本,这样就能在无需包含整个文档的情况下获得完整的上下文。
  • 完整架构

    综合来看,主要决策如下:

    • 语义分块。在标题和段落等自然分隔处进行分割,每个分块约包含500个标记,并有50个标记的重叠部分,且每个分块都是独立的。
    • 两阶段检索。先通过ANN搜索得到20个候选项,再由交叉编码器进行重新排序,最终保留最佳的3个结果。
    • 低温度参数。在0到2的范围内将该参数设置为约0.2,可使模型减少创造性发挥,降低编造内容的可能性。
  • 安全机制。内容过滤器可筛查个人数据及违规内容,引用检查能确认答案是否源自给定上下文,而通过检索相似度得出的置信度则决定是给出答案还是拒绝回应。
  • 明确的“我不知道”回应。当检索置信度低于设定阈值时,机器人会表示无法回答。这是最有效的防御手段。
  • 反馈循环。用户的点赞或点踩会反馈至评估系统,该系统可长期追踪答案的准确率与虚构内容出现频率。
  • 需要监控的内容

    1. 虚构内容出现频率。指答案中包含给定上下文里不存在的信息的比例,可通过自动评估或人工审核来衡量。合理的控制目标应低于1%。
  • 检索精确度@3。在排名前三的片段中,真正与查询相关的有多少。该数值低于70%说明嵌入模型或片段划分存在问题。
  • 置信度分布。按高、中、低置信度划分的答案比例。低置信度案例较多意味着知识库存在缺失。
  • 引用准确性。自动检测所引用的文档是否真正支持相关论点。
  • 用户反馈得分。通过点赞和点踩的平均评分,反映整体满意度。
  • 上下文利用程度。已用token预算的比例。持续偏低的利用率意味着检索返回的片段过少,而接近100%则说明需要增加预算。
  • 数据更新时效性。文档被修改后到其在搜索结果中显示之间的延迟。在动态知识库中,数据过时会导致答案失效。
  • 四层防御机制

    幻觉现象并非人工智能出现故障的迹象,而是设计上的问题。由于模型的训练目标就是追求合理性而非准确性,因此不受约束的模型总会优先选择看似合理的答案。可通过四层机制来解决这一问题:

    • 检索。提供相关文档,让模型从这些文档中获取答案而非依赖记忆。
    • 提示设计。将模型限制在给定的上下文中,要求其承认不知情并注明引用来源。
    • 约束规则。过滤输出内容,检查引用信息并计算置信度得分,拒绝任何无法通过上下文验证的答案。
  • 反馈。跟踪幻觉率、用户评分及检索准确率,持续优化知识库与处理流程。
  • 最重要的原则是:能够坦诚地说“我不知道”的聊天机器人,远比那些硬编答案的机器人要好。