一、大模型用于行业问答的实现和挑战
首先,让我们深入探讨大模型行业问答的实现和挑战。
1、大模型在知识管理中的形态
在解决行业问答时,了解现有产品的性能至关重要。以 360 企业云盘为例,它为我们提供了一个清晰的流程,我们对大量文档进行分类整理后,可以运用 360 智脑大模型完成许多任务,比如将撰写的周报转化为文字形式,或者通过提各种问题就能轻松地得到答案,这也有助于我们在同事之间传递重要信息。
此外,我们还可以通过上传 PDF 文件,然后在输入框针对这个文件的相关内容提问,例如提出对文章进行总结,系统就能快速地进行总结,帮助我们提高工作效率。此外,系统还能够利用搜索策略为用户提供相关的文件推荐,例如当用户上传一个文章后,系统会推荐与之相关的文件,并帮助用户查找这些文件。其中值得注意的是,如何找到相关文件是其中的一个关键点,这正是图谱在其中发挥的作用,系统预先构建了文档之间的关联关系和事件,从而帮助用户快速找到所需内容。
在实际业务中,许多客户都希望能面向他们的文档资源,快速地构建问答机器人。比如,有一个文档,需要发布到自己的小程序、网页或公众号的问答机器人,这时只需要将发布的内容及时上传到云盘,通过云盘易于理解的总结性回答、及时识别上下文、自动内容更新等功能,就能够快速地进行知识内容的问答。举个例子,上图是我们已经对接的拱墅区政策咨询,只需要将相关的文件更新到云盘,就可以直接询问相关的信息了,比如指导思想是什么等。
我们还可以将功能进行模块化,使系统可重复使用,满足个人和专业场景的知识问答配置。首先创建为一个知识号,然后进行问答配置的数据管理、训练、发布、匹配测试以及数据集管理等一系列操作。通过这种方式,实现了复用并提高效率,为业务流程带来了更好的灵活性。
2、大模型如何实现文档问答
在探讨大模型如何实现文档智能时,我们发现其背后存在六种关键环节:语料库准备、问题输入、向量检索、计算向量相似度、Prompt 优化、结果返回。
(1)语料库准备
语料库的准备主要在离线环境下进行,主要是将与行业相关的大量知识或语料上传至向量数据库,储存为向量化文本。
准备好语料文件后,会进行 chunk 处理,将文档切分为小块。随着技术不断发展,大家对于上下文长度的需求在增长,从之前的 2K、4K、8K 到现在的 192K 或 200K。然而并不是 chuck 越大越好,在真正的大模型应用中,4K 达到很高的精度就很不错了。在完成 chunk 处理后,需要对切分后的问题文本进行向量化操作,BGE、M3E 等嵌入模型都是不错的选择。完成这一步后,就已经得到带有向量的语料片段了,将其加入到向量数据库中,例如 Faiss 等。完成这些步骤后,语料库就准备好了。
(2)问题输入
当一个 query 到来后,用上一步骤同样的嵌入模型对 query 进行处理,将输入的问题转变成带有向量的提问。
(3)问题搜索
将 query 转变成的向量,放入提前准备好的语料生成的向量数据库中检索,通过计算 query 与 vector 的相似度,可以得出匹配结果。值得注意的是,这里所做的是 QD 匹配,而不是 QQ 匹配。QD 匹配存在一个很大的问题,即 Q 通常很短,例如大家做相似度通常使用的是几十字的 query 进行训练。但实际在正式场景下,QQ 基本上就是 100 字对 100 字,而 QD 会变成 100 字对上 300 字、400 字、500 字,这个时候召回的准确性就是一个需要去优化的问题。
(4)计算向量相似度
向量相似度可以采用 L1、L2 或余弦相似度,比如采用余弦相似度,需要设置一个阈值,通常在 0.8 或 0.9 左右,然后匹配出 TopN 条语义最相关的 Facts。
(5)Prompt 优化
将匹配出的 TopN 条 Facts,和用户的问题一起作为 Prompt 输入给模型。为了提供尽可能真实的回答,需要确保问题的回答是准确的,如果无法回答问题,我们希望模型应该明确指出这一点。在 prompt 的设置中,需要注意每一个重要的细节,例如,一个简单的换行符“\n”可能会对结果产生很大的影响,因此,需要确保其准确性和一致性。
(6)结果返回
通过上下文组装的 Prompt,就可以得到在有记忆交互下生成的内容,这样的结果更精准且缓解了幻觉问题。
在处理大模型知识库问答时,整个流程的六个步骤每一步都有可能导致误差累积,因此要提高整体准确率,需要关注每一个阶段的细节,尽可能提高每个阶段的准确率,即使只是将每个阶段的准确率从 0.8 提高到 0.98,那么整体就是从 0.8 的 6 次方到 0.98 的 6 次方,准确率会有显著的提升。
3、大模型文档问答现实问题
第一个问题是文档板式复杂,特别是表格、图片、单双栏情况等,处理起来相当困难。比如金融场景中的研报,涉及到公司名称、发布时间、k 线图等。此外,在处理 PDF 文件时,如需识别图表中的线,则需要进行断裂和合并处理,这个时候就需要一个文档版式模块来处理这类问题。
第二个问题是模型固执己见,在处理下游任务时无法充分关注检索到的知识,尤其是当检索到的知识与 LLMs 的参数知识相冲突,还是会跳出回答。
第三个问题是领域 embedding 的去噪问题,现有的通用 embedding 如 BGE、M3E 在特定领域上性能并不高。在特定领域中,如果没有足够的数据进行去噪处理,embedding 的性能将会受到限制。此外,相似度的控制也是一个挑战,如何筛选 top k 结果是一个关键问题,选择合适的阈值和 k 值是关键,过严或过松的筛选可能导致召回率过低或召回大量无关内容。
最后,大模型在处理文档时只关注开头和结尾部分,而忽略中间内容。这种“lost in middle”的现象在文本长度较长时尤为明显。因此,为了提高模型的性能,我们需要尽量将关键信息放在文本的前后部分。
上面所有的问题都是幻觉问题,为了具体说明幻觉问题,这里举一个例子。在安全领域的知识问答中,提问“海莲花组织是什么?”,我们知道海莲花是一个 APT 组织,但大模型给出的答案却是“海莲花是一个出现在中国互联网的神秘组织,涉嫌违法犯罪,名称中的海代表海洋。”,这个答案在语言上毫无破绽,但实际上却与事实不符,这就是幻觉问题的表现。
出现以上幻觉的主要原因就是缺乏训练数据,因为安全领域的数据是很少的,而且很多的日志数据并不如文本数据那么规范化,这就导致安全领域大模型的幻觉问题更加显著。
为了解决这个问题,我们可以引入安全知识库,当我们需要回答关于海莲花的问题时,可以从知识库中进行召回。经过检索,我们了解到海莲花组织是一个具有东南亚背景的组织,同时为了确保模型在回答问题时不会产生幻觉,需要一个大型模型来判断是否应回答问题,如果模型无法找到正确答案,应该直接告诉用户无法回答,因此,需要添加一个拒答环节来规避此类幻觉,以确保模型不会胡说八道。
当面临新的数据缺乏问题时,可以使用图谱生成的方式来解决,通过结合安全知识图谱,我们可以观察到优化结果,例如海莲花的高度组织化等。
二、什么是幻觉?从哪儿来?如何评估
1、什么是大模型幻觉
在我们落地场景中最直接的一个幻觉就是语境冲突性幻觉。在多轮对话中,常常会出现前后语境不一致的情况,比如,前面提到了某个话题,但在后续对话中突然转换到了另一个话题,导致之前的信息被忽略或遗忘,这可能会引发用户的困惑,降低对话的连贯性和用户体验,这种问题通常出现在问答场景中,当答案与问题语境不匹配时。例如上图中我们希望大模型针对以色列和哈马斯的冲突进行总结,answer 结果就明显出现了语境冲突。
另外一个幻觉就是与事实相冲突的幻觉,指的是 LLM 生成的内容不忠实于既定的世界知识。例如,对于葡萄牙的三任国王的问题,回答错误地将 Castile 的女王 Urraca 列入其中;对于月球漫步的第一个人的问题,回答错误地提到了查尔斯·雷德伯格,实际上,第一个在月球漫步的人是阿姆斯特朗。
2、大模型幻觉从哪儿来
当我们深入研究大模型的训练流程时,会发现数据问题是最为关键的。在预训练阶段,我们无法控制数据的来源,因为网上充满了随机网页内容,很多内容可能并不准确,我们无法完全清洗这些数据,只能尽量让语言更加通顺。此外网页内容又有很多包含故事性质的内容,这些导致存在一些导致幻觉的训练数据,使得大模型将虚假的相关性作为事实知识,因为LLM 偏向于肯定测试样本,LLMs 容易复制甚至放大这种幻觉行为。
大模型有时会高估自己的能力,这主要是因为它们在预测 next token 的概率时,本质上是在处理数据分布的问题,对于非常大的 LLMs 来说,正确答案和错误答案的分布熵可能是相似的,LLM 在生成错误答案时和生成正确答案时同样自信。
在 SFT 阶段,幻觉问题被引入得最为显著,有问题的对齐过程可能会误导大模型产生幻觉,如果 LLM 在预训练阶段没有获得相关的先决知识,在训练指令的时候一个错误的对齐过程,会促使 LLM 产生幻觉。
比如上图右下角的两个圈,左边是我们通过预训练获得的参数化知识,右边是 SFT 数据,中间部分是两者的交集,如果SFT 数据落在了中间这一块,那么它是正确的,如果右侧的 SFT 数据本身没有学过,而你却告诉它某些信息,那就相当于是在欺骗模型。举个例子,假设这是一个金融模型,你问它中国某部法律是在什么时候颁布的,而它之前从未见过这方面的数据,即使你的 SFT 数据很漂亮,但如果你教它撒谎,那么你和它的答案都会出现问题,因此,SFT 数据的质量需要尽可能准确。
LLM 采用的生成策略,如现在常见的 top-k、top-p 等方法,其实是一种局部最优解,不能确保全局最优。这意味着搜索空间变小了,因此可能引发幻觉问题。
从数据端和解码端来看,无论是数据的生成还是解码过程,都可能导致模型产生幻觉。因此,我们需要对模型进行仔细地评估和调整,以确保其能够准确地处理知识并避免幻觉问题。
3、大模型幻觉如何评估
要评估大模型的表现,关键在于如何制定一个可靠的指标来衡量其输出。目前有一些方法可以实现这一目标,其中一种是基于生成事实陈述评估,将幻觉视为一种生成特征,类似于流畅性和连贯性,并对 LLM 生成的文本进行评估,查看一个 query 前一个查询的答案与下一个查询的两个答案之间是否存在蕴含关系,类似于自然语言推理(NLI)中的三元组问题。此外,还可以进行基于问答对的评估,比较两个答案之间是否存在重叠。
为了更好地评估大模型的幻觉问题,已经出现了一些基准测试,如 TruthfulQA 和各种其他的基准测试,其中清华大学的 Atlas 使用了知识图谱来评估大模型的幻觉问题。
三、缓解大模型幻觉的策略
1、策略 1:构造高质量微调数据和拒答
如果 LLM 在预训练阶段没有获得相关的先决知识,在训练指令时是一个错误的对齐过程,会促使 LLM 产生幻觉。这就要求我们加工整理数据,在经过编辑的指令数据上进行微调的 LLM 能表现出更高的真实性和事实性水平。此外,还可以通过加入拒答环节,采用以诚实为导向的 SFT,即在 SFT 数据中引入一些诚实样本,诚实样本指的是承认自己无能的回答,如“对不起,我不知道”,学会拒绝回答特定问题以减少幻觉。
关于拒答数据配比的问题,我们在实际中发现,鼓励拒答问题的数据达到千级以上就能够比较好地形成一个拒答的意识。如果拒答数据过多,会造成大模型对任何问题都说不知道。
2、策略 2:强化阶段引入诚实对齐
- GPT4 使用合成幻觉数据来训练奖励模型并执行 RL,从而将 Truth-fulOA 的准确率从约 30% 提高到 60%。
- 优化 Reward 模型,设计用于减轻幻觉的特殊奖励函数:“Unhedged/HedgedCorrect/Wrong”代表 LLM 用肯定或犹豫的语气提供正确或错误的答案。
3、策略 3:优化解码策略:CAD/RAML
- 上下文感知解码策略(CAD),更关注上下文
LLMs 在处理下游任务时有时无法充分关注检索到的知识,尤其是检索到的知识与 LLMs 本身的参数知识相冲突。
迫使 LLMs 更关注上下文信息,而不是过度依赖自身的参数知识做出决策。 - KNN+LLM 策略
在推理中将两个 next_token 分布进行融码,一个分布来自自身 LLM 输出,一个是来自检索 top-k token,利用 LLM embedding 方式在外挂知识库中查找与 query token 相似的 token。 - RALM 策略
用自回归方式检索解码策略 https://arxiv.org/pdf/2302.00083.pdf。
先利用 LLM 解码出部分 tokens,再检索与该 tokens 相似的文本,然后拼接在 prompt 中,进行 next-tokens 预测,这样自回归式完成解码。
4、策略 4:外挂知识库增强,缓解幻觉
外挂知识增强涉及到几个关键问题:何时进行外挂、外挂的频率以及具体的外挂方式。一种常见的做法是在接收到 query 后,先进行检索,然后将检索结果输入到大语言模型中生成答案,这种一次性的外挂方式在某些情况下是有效的。然而,在使用 GPT4 等模型时会发现,模型对于某些问题的回答不够确定或准确,这时采用迭代的方式进行外挂,在得到模型的初步回答后,再次将问题或模型的回答作为输入,进行多次迭代,然后对生成答案进行事后干预,比如再利用知识图谱(KG)等工具对答案进行检索和修正,可以提高答案的准确性和可靠性。
在选择外挂时机时,可以考虑三种方式:在模型生成答案前、生成答案过程中以及生成答案后进行外挂。同时,我们还需要考虑使用何种知识库或工具进行外挂,如搜索引擎、API 代码执行器等。在选择具体的外挂方式时,需要根据生成式模型和纠正模型的特点进行权衡和选择。
四、总结
最后分享一些总结性认识。
1. 什么是大模型幻觉,应该如何看待
(1)大模型幻觉的分类维度各不一样。
(2)有的场景需要幻觉【创作等】,有的场景不需要【如医疗、法律】。
2. 大模型的幻觉跟多样性是怎样的逻辑关系?鸡生蛋、蛋生鸡?
多样性是造成幻觉的重要原因,因为生成多样,所以幻觉。
3. 大模型幻觉的产生都有哪些原因?
数据、训练方式、解码方方面面都有。
4. 大模型的幻觉能不能解?
(1)无根本解,只能缓解,并且要跟具体业务场景做区分;
(2)现有的 RAG 并没有触及大模型本身,都是治标不治本。
5. 大模型知不知道自己知不知道?
不知道,本质上都是概率。
6. 在大模型背景下,知识图谱应该找到自身定位
做好结构化数据,发挥好知识管理、网络结构化特性。
五、问答环节
Q1:关于 OpenAI 获取 embedding 可以细致讲一下吗?改变 embedding 的方式提升效果的范围大概在多少?对整体响应速度有提升吗?
A1:OpenAI 的 embedding 是通过 API 接口获取的,你可以根据提供的文档编写相应的代码直接调用 OpenAI 的接口;具体准确度提升的范围取决于数据集、模型架构以及embedding 质量,我们在 RAG 场景做了一些对比,自己构造了一些 QD 对和 QD 的负样本,在测试样本大约是在几千的场景下,召回侧有 30% 的提升;调用 OpenAI 的 embedding 的话是有限速的,对于一些自有模型,如果你的整个服务部署在性能较好的显卡上,处理速度会有明显提升,可以达到毫秒级别。
Q2:幻觉出现引起的错误大概占比是多少?以及您使用策略优化之后带来的优化是多少?
A2:这个占比其实在不同场景下会有所差异,如果不使用 RAG(问答对生成),很多占比的内容可能都是胡说八道,完全不知所云。但如果你将其放在 RAG 场景下,就会发现其中大约有 30% 的内容是跳出你的回答的,加入拒答后,在某个极端场景的情况下,我们整个流程的准确率从 25% 大幅提升到了 95%,这是一个相当大的提升。
Q3:你刚说到那个大模型是一个压缩器,我理解的就是说如果模型反向去学习自己生成的一些知识,就有点像缩略图的一个缩略图,它最终是不是会变得有些模糊?业界是怎么看待这个问题的,或者有没有一些相关的研究。
A3:我认为如果生成的内容在之前的训练数据中出现过,那么它会强化了数据分布,使其更容易记住,更加清晰地留在记忆中,不会变得模糊。然而,如果生成大量之前未知的内容,并大量追加到数据集中,这可能会干预模型的数据分布,导致其输出变得模棱两可。
Q4:在将业务流程转化为知识图谱的过程中,特别是关于如何将示例图转化为知识图谱,节点的变化如何处理的问题,您在这方面是否有一些经验可以分享呢?
A4:我前几年其实也一直在做事理图谱,每一个节点就是一个动作,每一个流程被固定成一个事件短语并为其排序。这本质上是一个生成和转发的关系,整个生成过程是需要人工构建的。在通用领域,比如说游记的案例,我们先把事件抽出来,然后把事件的关系抽出来,最后拉出一条边。这种东西在通用领域和特定场景中都很好用,但由于我们的 case 需要解决 agent 的问题,其业务场景非常固定,在这种情况下,人工花费一些时间来构建它以确保 100% 的准确性就足够了。
Q5:为了解决大模型的幻觉问题,我们发现它实际上无法从根本上解决,因为你之前增加了一个前置的拒答模型。在我看来在文档总结或问答过程中,没有什么问题是这个模型无法回答的,我想了解这个拒答模型的实现方式以及它是如何判断大模型无法回答问题的。
A5:这是分成两个维度去解。第一个就是问一些确定性的,就比如说问一些海莲花这种特定场景的安全场景,因为他有个安全图谱,当问一个实体的时候,你会发现就是因为这个模型在这个场景是没有见过这些东西的。按照大模型没有见过这东西问海莲花的时候,它可能就会答错,那怎么去做呢?我们先用刚才图谱的方式去构造正负样本,这是 KG 场景。然后另外一个场景就是去做一个 summary 的拒答,比如我们建立一个关于原政策的知识库,并确定每个库大致能够问哪些问题。然后,通过生成相关内容,当用户询问范冰冰是谁时,系统可以直接拒答。
Q6:进行文档问答时,您设置了一个前置的搜索增强环节,涉及到文本召回方面,您在 PPT 中也提到了这个阈值确实很困难,我非常想知道您是否有具体的解决方案。在我自己的实践中,我不仅在文档上,还包括图像上设置相似性阈值时,目前采用的方法是打标并观察,例如,当阈值设置为 0.7 时,其准确率是多少?如果阈值设为 0.6,就需要经过一个非常繁琐的尝试过程,几乎就像一个流水线工程。所以,我想知道是否有更智能化的方法来解决这个问题。
A6:首先,这个 case 确实不好解决,我们团队也遇到过类似的问题。关于阈值的问题,我们更倾向于深入研究。具体来说,我们尝试在 rank 后面接多个 rank,比如在您与某个段落 p1 进行比较后,p1 可以进行分解。由于 QD 之间无法看到,所以它们无法压缩到一个空间上,为了解决这个问题,我们会进行 query 改写并加入其中。在选择一个段落 p 之后,我们还会将其底下的句子进行比较,当在 QD 匹配上的值域较低时,经过下一个 rerank,对应的句子分数会提高。通过这种方式,可以减少这种问题,但具体效果如何很难说,因为在算法优化过程中,我们经常会遇到顾此失彼的情况,为了解决文本切割和比较的问题,我们做了很多工作,包括各种花式的切割方法,尽管如此,仍然存在许多挑战需要克服。