模型也能“知其然知其所以然”——看SimRAG如何通过提问提升自己 精华
1. 引言部分
今天要给大家分享一篇很有意思的论文。这篇论文主要解决的是什么问题呢?就是如何让大语言模型在专业领域,比如医疗、科学领域表现得更好。
你们有没有想过,虽然现在的ChatGPT、Claude这些大模型很厉害,但在专业领域它们的表现还是不够好,对吧?比如说,当我们问它一个关于"支气管扩张"的专业问题时,它可能就答不太准确了。这是为什么呢?
主要原因是这样的 - 这些专业领域有很多特殊的知识和术语,普通模型可能理解得不够深入。就像我们普通人看医学论文一样,没有专业背景的话,很多术语都看不懂,是不是?
那么现在有一个很好的技术叫RAG(检索增强生成),这个技术的原理其实很像我们人类查资料的过程。比如当我们要回答一个问题时,会先去查找相关的资料,然后再基于这些资料来回答,对不对?RAG就是让模型也这样做 - 先检索相关文档,再基于这些文档来回答问题。
但是呢,这里又出现了一个新的问题。就算用了RAG技术,在专业领域的表现还是不够理想。这是为什么呢?因为模型可能不太懂得如何正确使用检索到的专业文献。就像一个医学院新生,即使给他一堆医学文献,他也不一定能准确理解和应用这些知识,对吧?那现在已经有哪些解决方案呢?主要有这么几种:
- 在专业文献上继续预训练,就像让模型多读点专业书籍
- 用专业领域的指令来微调模型
- 用GPT-4这样的强大模型来生成训练数据
但这些方法都有什么问题呢?
- 第一个方法成本很高,就像要付很多学费一样
- 第二个方法需要大量标注数据,这个在专业领域特别难获取
- 第三个方法不但贵,而且在一些涉及隐私的领域(比如医疗)可能还有安全隐患
这就是为什么我们需要一个更好的解决方案。那作者是怎么解决的呢?他们提出了一个叫SimRAG的方法。这个方法最有趣的地方是它让模型同时学会了两个能力:一个是回答问题,一个是提出问题。
你们觉得为什么要让模型同时具备这两种能力呢?这就像我们学习一样,不仅要会答题,还要会出题,对吧。只有真正理解了知识,才能提出好的问题。这两个能力相辅相成,可以帮助模型更好地理解专业知识。
2. 相关工作
在讲具体方法之前,我们先来了解一下相关的研究工作。这就像我们做研究之前,要先知道前人都做了什么。首先是RAG技术。它是怎么工作的呢?就像我们写论文要先查文献一样,RAG也是先去找相关的资料,然后再基于这些资料来回答问题。近期有很多研究者在改进这个技术,比如说:
- 有的在研究如何找到更相关的文档,就像图书馆员帮我们找最合适的参考资料一样
- 有的在研究如何过滤掉无关的内容,就像我们写论文时要去掉不相关的引用一样
- 还有的在研究如何让模型更好地理解和使用这些资料
第二个重要的技术叫自训练。这个概念听起来可能有点陌生,但其实很好理解。它就像是“教学相长”的过程 - 模型一边学习,一边用学到的知识来教自己。具体怎么做呢?
- 先让模型学习一些基础知识
- 然后让它自己生成一些训练数据
- 再用这些数据来提升自己
但这个过程也有个问题,就像我们自学时可能会学到一些错误的知识一样,模型生成的训练数据也可能有错误。所以研究者们想了很多办法来解决这个问题:
- 有的会仔细筛选生成的数据,只用质量好的
- 有的会给不同的数据分配不同的重要性
第三个是领域特定的大语言模型。现在已经有很多专门针对特定领域的模型了,比如医疗领域的、法律领域的。他们是怎么训练这些模型的呢?主要有两种方式:
- 一种是让模型不断地读专业文献,就像医学生要不断学习专业知识一样
- 另一种是用特定领域的问题来训练模型,就像针对性地做习题
但这些方法都有什么问题呢?
- 成本太高了,就像请个一对一家教一样贵
- 效率不够高,投入了很多资源可能效果却不理想
- 有些方法还依赖GPT-4这样的大模型来生成训练数据,这就更贵了
现在大家应该能明白为什么需要一个新的解决方案了吧。就是因为现有的这些方法都不够完美。
3. SimRAG的具体方法
接下来要讲的是本文最核心的部分了 - SimRAG具体是怎么工作的。这个方法很巧妙,分为两个主要阶段。
3.1 第一阶段:基础训练
第一阶段是做什么呢?就是先教会模型一些基本功。这就像我们学习任何新东西一样,要先掌握基础知识,对吧。具体来说,要让模型学习三类知识:
- 首先是基本的指令理解能力。这就像我们要先学会听懂老师的话一样。用了哪些训练数据呢?
OpenAssistant的数据
Dolly的数据
SODA的数据
这些数据都是帮助模型理解人类指令的。
- 然后是问答能力的训练。用了很多问答数据集,比如:
Squad数据集,这是关于阅读理解的
DROP数据集,这需要一些推理能力
NQ(自然问题)数据集,这些都是真实用户的提问
这就像给学生做各种类型的习题,帮助他们提高解题能力。
- 最后是检索相关的训练。这个训练分两部分:
教模型怎么从文档中找到可能的答案
教模型怎么根据文档和答案来提出好问题
就像教会学生不仅要会做题,还要会出题一样。
3.2 第二阶段:自我提升
这个阶段是最有意思的部分。模型要用第一阶段学到的能力来提升自己,具体怎么做呢?首先是答案生成。模型会读一段专业文献,然后找出里面可能成为答案的内容。比如读到这样一段医学文献:
For its survival, the body needs to ensure a continuous delivery of energy despite highly variable supplies of nutrients from the external environment.
模型就会找出重要的概念,比如"continuous delivery of energy"这样的关键信息。然后是问题生成。基于找到的答案,模型会生成相应的问题。而且,模型会生成不同类型的问题:
- 有的是简单的填空题
- 有的是多选题
- 有的是判断对错的题
这样做的好处是什么呢?就像我们复习时用不同类型的题目来测试自己,可以全面地掌握知识。最后还有个重要的步骤 - 质量控制。不是所有生成的问题都会被用来训练,而是要经过筛选:
- 会检查答案是否能在相关文档中找到
- 会看问题是否清晰合理,就像老师出题也要经过反复推敲一样。
4. 实验结果分析
好,现在到了最激动人心的部分了 - 我们来看看这个方法到底效果如何。
4.1 实验设置
首先,作者选择了三个非常重要的领域来测试:
- 医疗领域:选了7个数据集
PubMedQA:这是关于医学研究的问答
BioASQ:这是生物医学领域的问题
MedQA:这个更专业,是医学执照考试的题目
还有其他几个数据集
就像是让模型去参加不同类型的医学考试一样。
- 科学领域:用了3个数据集
ARC:这是中学级别的科学题目
SciQ:这包含了物理、化学、生物等各种科学问题
MMLU-sci:这个更全面,包含了14个科学学科
相当于是从基础到高等的科学知识都测试了一遍。
- 计算机科学领域:
用了最新的CS-Bench数据集
包含了编程、算法等各种计算机科学的问题
这就像是给模型来了次计算机系的期末考试。那模型用什么"教材"来学习呢?
- 医疗领域:用了医学教科书、维基百科、PubMed的文章
- 科学领域:主要用维基百科的内容
- 计算机领域:用了维基百科的CS部分和arXiv上的论文
4.2 比较对象
作者找了好几类模型来比较,就像举办一场比赛一样:
- 通用大模型选手:这些就像是全能型选手。
GPT-3.5
GPT-4
Llama3-8B
- 专业领域选手:这些就像是专攻某个领域的专家。
医疗领域有PMC-llama、MEDITRON
科学领域有SciTulu
- RAG技术选手:这些是专门做检索增强的高手。
Self-RAG
ChatQA
4.3 实验结果
在医疗领域:
在科学领域:
在计算机科学领域:
虽然分数看起来不是很高,但要知道CS-Bench的题目是很难的,这个成绩已经很不错了。
4.4 深入分析
作者还做了一些很有意思的分析:
- 不同问题类型的表现:
多选题表现最好,因为选项可以提供线索
开放性问题稍微差一点,这很正常,因为需要自由发挥嘛
判断题介于两者之间
- 生成数据的质量分析,让我们看个例子:
生成的问题很自然,答案也很准确,不是简单的复制粘贴。
- 一个很有趣的发现:如果不做数据过滤,性能会下降约2%。这说明什么?说明质量控制真的很重要,就像我们学习也要注意区分哪些是对的,哪些是错的信息。
5. 局限性和未来展望
当然,这个方法也不是完美的,还有一些可以改进的地方:
- 目前只做一轮生成:
就像我们复习,多复习几遍效果会更好
未来可以尝试迭代式的生成方式
- 计算开销问题:
生成和过滤数据需要不少时间
但好在这些都是训练时的开销,用的时候不会变慢
- 还可以用更强的模型:
比如说用70B的模型可能效果会更好
但这样就需要更多计算资源了
这种自我提升的思路其实在很多领域都能用。比如说,我们学习新知识的时候,也可以先掌握基础,然后自己出题来检验,这样不是很像SimRAG的思路吗?
原文:《SimRAG: Self-Improving Retrieval-Augmented Generation for Adapting Large Language Models to Specialized Domains》
本文转载自张 芝士AI吃鱼,作者: 雷厉风行