照片来自 Sirma Krusteva,发布于 Unsplash
当你想用大型语言模型(LLMs)来回答复杂问题时,挑战通常在于推理信息的过程,而这些信息往往是模糊不清的,甚至根本没有直接提供。
和那种带着清晰指令的简单问题不一样,这类问题需要你更深入地理解数据中隐藏的联系或洞见。
这种额外的复杂性让处理变得更困难,因此我们得用更深思熟虑的方法来应对。
在这篇博客里,我们会探讨一些实用的方式,帮你搞定这些棘手的问题,同时弄清楚背后"隐藏推理"的来龙去脉。
不管你是刚接触这类话题,还是想优化你现在的方法,这里都有些可以立刻上手的点子让你用得上。
什么是隐藏推理查询?
隐藏推理查询指的是那些靠隐性逻辑才能得出答案的问题。
要回答这类问题,你得靠自己去解读一些模式、例子,或者是领域内的知识,自己琢磨出逻辑过程。
这些问题很多都来自专业领域,而且逻辑链可能分散在好几个地方,甚至根本没明说。
主要特点:
- 推理不明确:你得自己去推导出怎么得出答案,题目里不会直接告诉你。
- 专业知识:你得理解某个领域里的一些专门概念或方法。
- 范围很广:这种问题通常有很多种答案或处理方式。
- 有价值的洞见:虽然难搞,但这类问题能带来非常有用、很有意义的信息。
哪类数据能帮我们解答隐藏推理查询
要搞定这种问题,你得有对的那类数据。这些数据里藏着你需要的"隐藏知识"。有两大类数据特别管用:
- 域内数据
这类数据来自和问题属于同一领域。
它们通常包括一些例子、以前的解决方案,或是类似问题中常用的套路。
• 例子:以前的问题和答案记录,或者是人工制作的示例数据集。
• 场景:比如在 Python 编程里,以前的代码题解会包含常用的算法或技巧,这些对解新题也很有帮助。 - 预备知识
这是那种能跨不同场景帮助你解题的背景知识。可能包括:
• 规则或体系:比如像地方法律这种广泛框架,能指导你怎么做决策。
• 已验证的结果:已知的事实或小结论,可以帮你简化推理过程,比如数学证明里的中间步骤。
• 人类经验:从现实中总结出来的实际知识概要。
例子:如果要回答一个关于国籍的法律问题,一个包含全球法律的数据集(比如 GLOBALCIT 数据集)或者以前案例的例子就特别有帮助。
AI 系统面临的挑战
对 AI 系统来说,解答隐藏推理查询尤其难,特别是那种需要检索数据又得生成答案的系统,比如 RAG(检索增强生成)模型。
这类系统主要有几个挑战:
• 上下文有限:它们一次处理不了太复杂的推理过程。
• 知识整合困难:很难把不同来源的数据拼成完整答案。
• 推理复杂度高:要理解并运用隐藏知识,就得动用高级分析能力。
隐藏推理查询的几个例子
下面是几个这类问题的样例:
- 经济趋势
问题:"经济形势会怎么影响公司未来发展?"
上下文:一堆财报。
难点:你得明白经济因素怎么影响企业结果。 - 数学谜题
问题:"用 5、5、5 和 1 怎么凑出 24?"
上下文:一些类似谜题的例子和解法。
难点:要靠创造性思维,还得理解谜题规则。 - 法律问题
问题:"阿富汗的父母能不能把国籍传给在国外出生的孩子?"
上下文:一个全球国籍法数据库,比如 GLOBALCIT。
难点:你得解读法律条文,还得把它应用到特定情境。
隐藏推理查询的挑战
这种类型的问题不好搞,因为背后的逻辑不是一眼就能看出来的。
我们来看看主要的难点,以及我们能怎么解决:
- 找到对的信息很难
第一个挑战是找到能匹配问题背后逻辑的信息。
你得更深入地理解问题的本质,搞清楚它的思路或者推理逻辑。
为什么这么难?
• 现在很多搜索方法都是靠关键词匹配或者表面相似。
• 这些方法经常抓不到问题深层的意思,找不到真正能答题的内容。
怎么解决?
我们需要更聪明的搜索算法。这些工具应该能找出模式和逻辑联系,而不光是比对字词。
比如它们得能明白两段信息之间的逻辑是怎么和问题的思路相关的。
这样才能找到真正有用的内容,即使它表面上看起来不太像答案。 - 数据零散或者不完整的问题
另一个麻烦是你需要的信息往往不在一个地方。
有时候答案是分散在好几个资料源头里的,甚至只是通过例子间接地表达。
为什么这是个问题?
• 大语言模型(LLM)通常靠清晰直接的数据来输出好的答案。
• 如果数据分散、零碎或者不完整,模型就很难把它们串起来,准确回应。
怎么解决?
LLM 得变得更擅长从多个地方抓信息,然后整合起来。
它们还得学会怎么让这些数据碎片拼成一个完整的答案。
像多步推理、知识网络这样的工具就能帮上忙。
这些方法能让模型收集各种小信息,然后有条理地组合成答案。
方法一:离线学习处理隐藏推理查询
处理这类问题有个简单办法,就是用"离线学习"。
顾名思义,这个方法就是事先从数据集中提取出一些模式和规则,然后以后遇到问题的时候再用这些规则来找相关信息。
下面我们来分解一下,各种策略是怎么用"离线学习"来提高推理能力的。
生成推理解释
有些项目专注于教模型怎么生成解释,也就是回答背后的"推理理由":
• STaR:这个方法采用逐步学习的方式(few-shot),从小数据集开始,然后逐渐扩大,在过程中一步步生成推理解释。
• LXS:LXS 设计了"两个角色"来生成并检查推理解释。先是一个"学习者"模型来生成解释,然后一个"评论者"模型来检查这些解释合不合理。
目前的(自)精炼式机器学习采用了两种方式 :
I. 自我监督式的模型优化(比如自我奖励),
II. 解释型交互学习(XIL),通过人类提供的解释来优化模型。
(右)相对来说,我们引入了"自我解释式学习(Learning by SelfExplaining)",它结合了这两个领域的思路,形成解释驱动的自我优化方法(I + II)。
从错误中学习并制定原则
另外一些方法专注于从错误中学习,教模型制定新的规则或指导原则:
• GL(Guideline Learning):GL 在训练过程中识别出模型犯的错,然后把这些错误转化成通用规则,之后模型就能用这些规则来做其他任务。
Guideline Learning 框架,包括推理阶段和训练阶段
• LEAP:LEAP 刻意制造一些错误,然后从这些错误中学习。不光是学简单的规则,连复杂的推理原则也能学出来,之后加进 prompt 引导模型推理。
LEAP 示意图:给定一些输入-输出的例子,Chain-of-Thought(左边)直接学正确示例回答问题。相比之下,Learning Principles(LEAP,右边)会先
(a) 用非零温度采样方式制造出错误的零样本 Chain-of-Thought 回答;
(b) 把错误答案和正确输出给模型,让它生成明确的原则;
最后再结合原始例子和这些原则,一起引导模型回答测试问题。注意步骤 (a) 和 (b) 只在每个任务里做一次。
• RICP:RICP 会分析训练数据中的错误,并通过聚类技术把它们分类。然后在任务层面和问题层面都生成规则,再组合起来,帮助模型应对具体问题。
RICP 的流程包括:
1)洞察生成:教师模型分析学生模型犯的错,给出高级理由和具体见解;
2)原则制定:基于分层聚类,生成任务级和问题级的原则;
3)原则应用:把这些原则加进现有的 prompt 中,提高模型表现。
• Buffer-of-Thought: 这个方法从不同推理任务中提取洞见,然后存在一个"元缓冲区"里。之后这些经验可以复用到各种任务中,提升模型效果。
对比单一查询、多查询和我们的方法 BoT。
多策略融合
有些方法会把上面这些技巧组合起来用,进一步增强推理能力:
• MedPrompt:MedPrompt 利用 GPT-4 生成的"思维链"(一步步的推理例子),再配合 KNN 检索系统提升学习效果。
MedPrompt 的组件和在 MedQA 基准任务上性能提升的可视化图
• Agent Hospital:这个方法会通过"反思"生成推理理由。它把"记录检索"(查找历史例子)和"经验检索"(使用生成数据)结合在一起,用来做更好的判断。
用模式提升推理力
虽然这些方法名字不一样------指导原则、经验、模板、规则......
但它们的目标都是一致的,就是找出有用的模式或规律,让模型能更有效地推理。
这些模式的来源可能是:
• 模型自己生成的解释(比如 MedPrompt,Buffer-of-Thought)
• 模型训练过程中的错误(比如 GL,RICP,Agent Hospital)
• 故意设计出来的错误(比如 LEAP)
• 有些规则适用于所有任务(比如 Agent Hospital,RICP),有些则是针对具体问题才调用的(比如 MedPrompt,Buffer-of-Thought)
方法二:上下文学习(In-Context Learning,ICL)
上下文学习(ICL)是一种方法,它通过使用示例来引导推理,从而借助预训练大型语言模型(LLMs)来挖掘隐藏的推理逻辑。
通过基于相似度检索相关例子,ICL 能在少量示例的情况下增强模型的学习能力。
不过,为了让 ICL 更加有效,我们还得解决一系列挑战。
下面我们来看看这些挑战、一些创新的解决办法,以及它在不同领域的应用。
上下文学习的挑战
ICL 的一个主要难点在于怎么选对 prompt 里用的例子。
如果示例选得不合适或质量不高,就可能误导 LLM,导致回答错误。
这是因为 LLM 对上下文的质量和结构非常敏感。
主要的问题包括:
• 无关示例:prompt 里有干扰性或不相关的信息会降低准确率。
• 覆盖范围有限:光靠语义相似度来检索例子,可能无法涵盖复杂任务所需要的更广泛联系。
改善上下文构建的创新解决方案
研究人员提出了各种策略,用来优化如何选择和使用 ICL 示例。
这些办法的目标是让 prompt 更贴切当前任务,也更有代表性。
• OpenICL 框架(Wu 等人): 这个框架研究了不同的检索方法和推理技术是怎么影响 ICL 效果的。
它强调选对上下文有多么重要,避免让模型被无关信息干扰。
OpenICL 的整体架构图:OpenICL 先从索引集中为每个测试输入(或整个测试集)用指定的检索方法(比如 TopK 或 VoteK)获取合适的上下文示例。
然后这些示例和测试输入会根据 prompt 模板拼接成一个完整序列,最后所有 prompt 会输
入进语言模型,通过定义好的推理方式(比如思维链)输出结果。
• Vote-k 方法(Su 等人): 这个无监督的图结构方法会构建一个多样且有代表性的例子数据库。
它避免过度依赖语义相似度,保证例子能更广泛地适用于复杂问题。
一个两步的 ICL 框架:我们不假设手头有大量标注数据。
第一步:从一小批未标注样本中挑出多样且有代表性的来做标注(在测试前);
第二步:测试时从这小池子里检索上下文示例。
• Auto-CoT(Zhang 等人): 这个方法把例子分组到有代表性的类别中,然后生成多样的推理链,
通过采样问题并构建示例,帮助模型更好地学会推理逻辑。
Auto-CoT 方法概览:
突破 few-shot 学习的限制
一个持续存在的挑战是:让 LLM 在超出它预训练领域的问题上也能表现出色。
为此,有一些解决方案被开发出来,下面列几个:
• 推理路径采样(Reasoning Path Sampling,Wang 等人):这个方法会采样多个推理路径,然后选出最一致的答案。
通过对不同的推理链做"边缘化",让 LLM 更有可能得出正确解。
自洽性方法的三个步骤:
❶ 用思维链(CoT)提示语言模型;
❷ 用随机采样(而不是贪婪解码)生成一堆不同的推理路径;
❸ 最后从这些路径中挑出最一致的那个作为最终答案。
• 任务分解(DIN-SQL): 把复杂任务拆成更小的子任务,每个小任务的解法可以当作 prompt 用。
比如 DIN-SQL 就大大提高了 LLM 从自然语言生成 SQL 查询的能力。
DIN-SQL 方法的四大模块总览图
• 优化思维链推理(DUP): 这个方法专门解决一些在数学问题中常见的问题,比如语义理解错了、算错了、漏步骤等等。
DUP 帮助 LLM 更深入地理解问题,并抓住关键信息,从而提升数学推理的表现。
DUP 提示策略示意图,包含三步:
❶ 从原始输入中提炼出核心问题;
❷ 基于核心问题提取解题信息;
❸ 结合核心问题和解题信息来生成并提取最终答案。
拓展 ICL 的应用领域
ICL 现在已经越来越多地用于数学、法律、医学和金融等领域。
它能灵活适应各种任务,是打造数据增强型 LLM 应用的重要工具。
通过不断优化示例选择的方法和提升推理能力,ICL 大大增强了 LLM 在复杂现实问题中的实用性
方法三:用微调来优化(Refining using Fine-Tuning)
大型语言模型(LLMs)本身就挺万能的,能应对各种任务。
但有时候它们还是会在推理复杂逻辑或处理长题时卡壳,特别是在要引入外部知识的时候就更容易出问题。
"微调"就是一个解决方法,它可以让模型更适应某些特定任务或专业领域。
下面我们来讲讲微调是怎么操作的、怎么提高效率,以及它在不同领域的实际应用例子。
什么是微调?
微调是在模型预训练阶段学到的一般知识的基础上,再进一步"精修打磨"。
通过教模型一些特定的模式或推理方式,让它能适配新的任务或领域。
最常见的方式是"指令微调",也就是用"指令-输出"的成对数据来训练模型。
构建指令数据集的几种方式:
- 用已有的数据集:把别的用途采集到的数据进行调整。
- 手动造数据:人手写一些指令和相应输出。
- 合成数据:让强大的 LLM 来自动生成新数据。
- 研究者们也在努力优化这些数据的分布方式。数据组织得好,微调效果也就越明显。
让微调更高效的方法
微调说白了挺耗时间和算力的。
为了降低成本,研究人员开发出一些轻量化的微调技术,既能提效,又不牺牲性能:
• Adapter Tuning(适配器微调):这个方法会在 LLM 里加上一些小模块(adapter),
训练时只更新 adapter 的参数,主模型保持不动。
• Prefix Tuning 和 Prompt Tuning:这些方法是在输入前面加上可以训练的向量(prefix),
模型学会用这些向量来提升效果,但又不用改动整个模型。
• 低秩适配(LoRA):这个方式减少需要训练的参数量,用"低秩矩阵"限制训练范围,
既省资源,又能达到很好的微调效果。
现有方法和我们提出的变体的图示。图中"PLM 模块"指的是预训练语言模型的某个子层(比如注意力机制或前馈网络),这些部分保持冻结不变。
"Scaled PA" 表示放大比例的并行适配器。图中为了节省空间没展示多头并行适配器。
为专业领域进行微调
微调在数学、法律、医疗、金融等专业场景里特别有用。
下面我们列一些应用例子:
• LISA:研究人员用一个包含推理例子的"小数据集"来微调了 LLaVA(一个多模态 LLM),
让它更擅长处理分段式推理任务。------相关论文
• MAmmoTH:这个项目构建了一个结合两种推理方式的数据集:"思维链"和"程序化思维"。
用这个数据微调之后,模型在解数学题上的能力显著提升。------相关论文
• ReFT:ReFT 专注于让模型从"多个推理路径"中学习同一个问题的解法。
它通过采样不同方法,并用正确答案做反馈,提升模型的解决问题能力。------相关论文
• ChatDoctor:这个项目用十万个"病人与医生对话"的数据集,微调了 LLaMA,
让它在医疗场景下理解患者需求和给出建议的能力变强了。------相关论文
• FinGPT:这是一个开源金融模型,用金融数据做了微调。
研究人员用自动数据采集和 LoRA 微调,让模型更擅长处理金融相关任务。------相关论文
• DISC-LawLLM:这个项目把模型专门微调用于中国法律推理,
使模型在处理各种法律场景时更加精准。------相关论文
结语
大型语言模型(LLMs)确实是很强大的工具,但想真正做出效果好的应用,还是得精心设计。
在这篇博客里,我们聊了怎么用数据增强型 LLM 来应对不同类型的难题。
每种查询类型------不管是常识类、显性信息、隐性信息,还是复杂推理类------都需要自己的一套策略和工具。
在大多数真实场景里,一个系统往往需要同时处理多种问题。
开发者们通常会组合使用几种方法,用一个"路由流程"来判断并调用最适合的策略。
随着我们不断探索和改进这些方法,LLM 在各行各业解决问题的潜力也会越来越大。
只要我们了解它们的强项和限制,就能构建出更聪明、更靠谱的应用系统。
不管是医疗、法律、金融还是教育,只要搭配上对的方法,LLMs 都能帮我们搞定那些最复杂的挑战。