如何有效应对 RAG 中的复杂查询?

照片来自 Sirma Krusteva,发布于 Unsplash

当你想用大型语言模型(LLMs)来回答复杂问题时,挑战通常在于推理信息的过程,而这些信息往往是模糊不清的,甚至根本没有直接提供。

和那种带着清晰指令的简单问题不一样,这类问题需要你更深入地理解数据中隐藏的联系或洞见。

这种额外的复杂性让处理变得更困难,因此我们得用更深思熟虑的方法来应对。

在这篇博客里,我们会探讨一些实用的方式,帮你搞定这些棘手的问题,同时弄清楚背后"隐藏推理"的来龙去脉。

不管你是刚接触这类话题,还是想优化你现在的方法,这里都有些可以立刻上手的点子让你用得上。

什么是隐藏推理查询?

隐藏推理查询指的是那些靠隐性逻辑才能得出答案的问题。

要回答这类问题,你得靠自己去解读一些模式、例子,或者是领域内的知识,自己琢磨出逻辑过程。

这些问题很多都来自专业领域,而且逻辑链可能分散在好几个地方,甚至根本没明说。

主要特点:

  1. 推理不明确:你得自己去推导出怎么得出答案,题目里不会直接告诉你。
  2. 专业知识:你得理解某个领域里的一些专门概念或方法。
  3. 范围很广:这种问题通常有很多种答案或处理方式。
  4. 有价值的洞见:虽然难搞,但这类问题能带来非常有用、很有意义的信息。

哪类数据能帮我们解答隐藏推理查询

要搞定这种问题,你得有对的那类数据。这些数据里藏着你需要的"隐藏知识"。有两大类数据特别管用:

  1. 域内数据
    这类数据来自和问题属于同一领域。
    它们通常包括一些例子、以前的解决方案,或是类似问题中常用的套路。
    • 例子:以前的问题和答案记录,或者是人工制作的示例数据集。
    • 场景:比如在 Python 编程里,以前的代码题解会包含常用的算法或技巧,这些对解新题也很有帮助。
  2. 预备知识
    这是那种能跨不同场景帮助你解题的背景知识。可能包括:
    • 规则或体系:比如像地方法律这种广泛框架,能指导你怎么做决策。
    • 已验证的结果:已知的事实或小结论,可以帮你简化推理过程,比如数学证明里的中间步骤。
    • 人类经验:从现实中总结出来的实际知识概要。
    例子:如果要回答一个关于国籍的法律问题,一个包含全球法律的数据集(比如 GLOBALCIT 数据集)或者以前案例的例子就特别有帮助。

AI 系统面临的挑战

对 AI 系统来说,解答隐藏推理查询尤其难,特别是那种需要检索数据又得生成答案的系统,比如 RAG(检索增强生成)模型。

这类系统主要有几个挑战:

• 上下文有限:它们一次处理不了太复杂的推理过程。

• 知识整合困难:很难把不同来源的数据拼成完整答案。

• 推理复杂度高:要理解并运用隐藏知识,就得动用高级分析能力。

隐藏推理查询的几个例子

下面是几个这类问题的样例:

  1. 经济趋势
    问题:"经济形势会怎么影响公司未来发展?"
    上下文:一堆财报。
    难点:你得明白经济因素怎么影响企业结果。
  2. 数学谜题
    问题:"用 5、5、5 和 1 怎么凑出 24?"
    上下文:一些类似谜题的例子和解法。
    难点:要靠创造性思维,还得理解谜题规则。
  3. 法律问题
    问题:"阿富汗的父母能不能把国籍传给在国外出生的孩子?"
    上下文:一个全球国籍法数据库,比如 GLOBALCIT。
    难点:你得解读法律条文,还得把它应用到特定情境。

隐藏推理查询的挑战

这种类型的问题不好搞,因为背后的逻辑不是一眼就能看出来的。

我们来看看主要的难点,以及我们能怎么解决:

  1. 找到对的信息很难
    第一个挑战是找到能匹配问题背后逻辑的信息。
    你得更深入地理解问题的本质,搞清楚它的思路或者推理逻辑。
    为什么这么难?
    • 现在很多搜索方法都是靠关键词匹配或者表面相似。
    • 这些方法经常抓不到问题深层的意思,找不到真正能答题的内容。
    怎么解决?
    我们需要更聪明的搜索算法。这些工具应该能找出模式和逻辑联系,而不光是比对字词。
    比如它们得能明白两段信息之间的逻辑是怎么和问题的思路相关的。
    这样才能找到真正有用的内容,即使它表面上看起来不太像答案。
  2. 数据零散或者不完整的问题
    另一个麻烦是你需要的信息往往不在一个地方。
    有时候答案是分散在好几个资料源头里的,甚至只是通过例子间接地表达。
    为什么这是个问题?
    • 大语言模型(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)本身就挺万能的,能应对各种任务。

但有时候它们还是会在推理复杂逻辑或处理长题时卡壳,特别是在要引入外部知识的时候就更容易出问题。

"微调"就是一个解决方法,它可以让模型更适应某些特定任务或专业领域。

下面我们来讲讲微调是怎么操作的、怎么提高效率,以及它在不同领域的实际应用例子。

什么是微调?

微调是在模型预训练阶段学到的一般知识的基础上,再进一步"精修打磨"。

通过教模型一些特定的模式或推理方式,让它能适配新的任务或领域。

最常见的方式是"指令微调",也就是用"指令-输出"的成对数据来训练模型。

构建指令数据集的几种方式:

  1. 用已有的数据集:把别的用途采集到的数据进行调整。
  2. 手动造数据:人手写一些指令和相应输出。
  3. 合成数据:让强大的 LLM 来自动生成新数据。
  4. 研究者们也在努力优化这些数据的分布方式。数据组织得好,微调效果也就越明显。

让微调更高效的方法

微调说白了挺耗时间和算力的。

为了降低成本,研究人员开发出一些轻量化的微调技术,既能提效,又不牺牲性能:

• 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 都能帮我们搞定那些最复杂的挑战。

相关推荐
阿坡RPA10 小时前
手搓MCP客户端&服务端:从零到实战极速了解MCP是什么?
人工智能·aigc
用户277844910499310 小时前
借助DeepSeek智能生成测试用例:从提示词到Excel表格的全流程实践
人工智能·python
机器之心10 小时前
刚刚,DeepSeek公布推理时Scaling新论文,R2要来了?
人工智能
算AI12 小时前
人工智能+牙科:临床应用中的几个问题
人工智能·算法
凯子坚持 c13 小时前
基于飞桨框架3.0本地DeepSeek-R1蒸馏版部署实战
人工智能·paddlepaddle
你觉得20513 小时前
哈尔滨工业大学DeepSeek公开课:探索大模型原理、技术与应用从GPT到DeepSeek|附视频与讲义下载方法
大数据·人工智能·python·gpt·学习·机器学习·aigc
8K超高清14 小时前
中国8K摄像机:科技赋能文化传承新图景
大数据·人工智能·科技·物联网·智能硬件
hyshhhh14 小时前
【算法岗面试题】深度学习中如何防止过拟合?
网络·人工智能·深度学习·神经网络·算法·计算机视觉
薛定谔的猫-菜鸟程序员14 小时前
零基础玩转深度神经网络大模型:从Hello World到AI炼金术-详解版(含:Conda 全面使用指南)
人工智能·神经网络·dnn
币之互联万物14 小时前
2025 AI智能数字农业研讨会在苏州启幕,科技助农与数据兴业成焦点
人工智能·科技