RAG与大模型的结合:让LLM更智能的关键

1.  RAG的定义

大模型(Large Language Models,LLMs)的发展经历了从小规模模型到如今大规模、深度学习技术不断突破的过程。最早的语言模型主要依赖规则和手工特征,虽然能够进行一定的语言理解和生成,但缺乏足够的灵活性和准确性。随着深度学习的兴起,尤其是深度神经网络的应用,大规模语言模型开始崭露头角。

从最初的GPT(Generative Pre-trained Transformer)到BERT(Bidirectional Encoder Representations from Transformers)再到如今的GPT-4、DeepSeek-R1等,语言模型的规模和能力迅速提升。大模型通常包含数十亿到数百亿个参数,通过海量数据进行预训练,能够捕捉到语言中的复杂关系和语境信息。大模型的预训练使其具备了强大的迁移学习能力,能够在多个任务上取得优秀的性能,无论是文本生成、问答、翻译还是推理任务。大模型的发展不仅在技术层面突破了许多原有的限制,还在应用上带来了巨大的变革。比如,基于大模型的自然语言处理技术已经广泛应用于智能助手、自动翻译、内容生成等领域,极大地提高了人机交互的效率和质量。从自然语言处理的发展历程来看,LLM已经是近期最热门的研究方向之一。

同时,大模型的研究方向是非常宽泛的,包括但不限于LLM本身,还包括提示词工程,检索增强生成及其各种变形,Agent LLM,LLM 应用框架等方向。

检索增强生成(Retrieval-augmented generation,RAG)是指对大型语言模型输出进行优化,使其能够在生成响应之前引用训练数据来源之外的权威知识库。大型语言模型(LLM)用海量数据进行训练,使用数十亿个参数为回答问题、翻译语言和完成句子等任务生成原始输出。在 LLM 本就强大的功能基础上,RAG 将其扩展为能访问特定领域或组织的内部知识库,所有这些都无需重新训练模型。这是一种经济高效地改进 LLM 输出的方法,让它在各种情境下都能保持相关性、准确性和实用性。下图展示了有RAG和没有RAG的两种完全不同的答案。

2.  RAG的重要性

LLM 是一项关键的人工智能(AI)技术,为智能聊天机器人和其他自然语言处理(Natural Language Processing,NLP)应用程序提供支持。目标是通过交叉引用权威知识来源,创建能够在各种环境中回答用户问题的机器人。不幸的是,LLM 技术的本质在 LLM 响应中引入了不可预测性。此外,LLM 训练数据是静态的,并引入了其所掌握知识的截止日期。

LLM 面临的已知挑战包括

  • 在没有答案的情况下提供虚假信息。
  • 当用户需要特定的当前响应时,提供过时或通用的信息。
  • 从非权威来源创建响应。
  • 由于术语混淆,不同的培训来源使用相同的术语来谈论不同的事情,因此会产生不准确的响应。

可以将大语言模型看作是一个过于热情的新员工,他拒绝随时了解时事,但总是会绝对自信地回答每一个问题。不幸的是,这种态度会对用户的信任产生负面影响,这是您不希望聊天机器人效仿的!

RAG 是解决其中一些挑战的一种方法,它会重定向 LLM,从权威的、预先确定的知识来源中检索相关信息。组织可以更好地控制生成的文本输出,并且用户可以深入了解 LLM 如何生成响应。

上图呈现了一个简单的RA-LLMs框架。

3.  RAG的优势

3.1 经济高效

聊天机器人开发通常从基础的大模型开始。基础模型是在广泛的广义和未标记数据上训练的 API 可访问 LLM。针对组织或领域特定信息重新训练的计算和财务成本很高。RAG 是一种将新数据引入 LLM 的更加经济高效的方法。它使生成式人工智能技术更广泛地获得和使用。

3.2 信息的及时性

即使 LLM 的原始训练数据来源适合您的需求,但保持相关性也具有挑战性。RAG 允许开发人员为生成模型提供最新的研究、统计数据或新闻。他们可以使用 RAG 将 LLM 直接连接到实时社交媒体提要、新闻网站或其他经常更新的信息来源。然后,LLM 可以向用户提供最新信息。

3.3 增强信任度

RAG 允许 LLM 通过来源归属来呈现准确的信息。输出可以包括对来源的引文或引用。如果需要进一步说明或更详细的信息,用户也可以自己查找源文档。这可以增加对您的生成式人工智能解决方案的信任和信心。

3.4 增加控制权

借助 RAG,开发人员可以更高效地测试和改进他们的聊天应用程序。他们可以控制和更改 LLM 的信息来源,以适应不断变化的需求或跨职能使用。开发人员还可以将敏感信息的检索限制在不同的授权级别内,并确保 LLM 生成适当的响应。此外,如果 LLM 针对特定问题引用了错误的信息来源,他们还可以进行故障排除并进行修复。组织可以更自信地为更广泛的应用程序实施生成式人工智能技术。

4.  RAG的工作原理

如果没有 RAG,LLM 会接受用户输入,并根据它所接受训练的信息或它已经知道的信息创建响应。RAG 引入了一个信息检索组件,该组件利用用户输入首先从新数据源提取信息。用户查询和相关信息都提供给 LLM。LLM 使用新知识及其训练数据来创建更好的响应。下图显示了将 RAG 与 LLM 配合使用的概念流程。

4.1 创建外部数据

LLM 原始训练数据集之外的新数据称为外部数据。它可以来自多个数据来源,例如 API、数据库或文档存储库。数据可能以各种格式存在,例如文件、数据库记录或长篇文本。另一种称为嵌入语言模型的 AI 技术将数据转换为数字表示形式并将其存储在向量数据库中。这个过程会创建一个生成式人工智能模型可以理解的知识库。

4.2 检索相关信息

下一步是执行相关性搜索。用户查询将转换为向量表示形式,并与向量数据库匹配。例如,考虑一个可以回答组织的人力资源问题的智能聊天机器人。如果员工搜索:“我有多少年假?”,系统将检索年假政策文件以及员工个人过去的休假记录。这些特定文件将被退回,因为它们与员工输入的内容高度相关。相关性是使用数学向量计算和表示法计算和建立的。

4.3 增强LLM提示

接下来,RAG 模型通过在上下文中添加检索到的相关数据来增强用户输入(或提示)。此步骤使用提示工程技术与 LLM 进行有效沟通。增强提示允许大型语言模型为用户查询生成准确的答案。

4.4 更新外部数据

下一个问题可能是——如果外部数据过时了怎么办? 要维护当前信息以供检索,请异步更新文档并更新文档的嵌入表示形式。您可以通过自动化实时流程或定期批处理来执行此操作。这是数据分析中常见的挑战——可以使用不同的数据科学方法进行变更管理。

5.  检索增强生成和语义搜索

5.1 两者的定义

RAG(Retrieval-Augmented Generation):RAG的核心目标是通过检索外部知识(通常是文档、数据库、或其他文本资源)来增强生成式模型的回答能力。RAG结合了信息检索(retrieval)和生成模型(generation),它首先从大规模的文本库中检索相关内容,再利用生成模型(例如大型语言模型)结合这些内容生成最终的回答。这种方法特别适合用于生成需要依赖大量背景知识的文本,像是问答、文档摘要等任务。

语义搜索(Semantic Search):语义搜索的核心任务是通过理解查询的语义信息来找到与查询最相关的文档或片段。与传统的基于关键词的搜索方法不同,语义搜索基于向量表示和深度学习技术,能够理解查询和文档之间的深层语义关系,从而提供更相关的搜索结果。它通常用于搜索引擎中,目的是提高搜索结果的准确性和相关性。

5.2 两者的相关性

语义搜索可以提高 RAG 结果,适用于想要在其 LLM 应用程序中添加大量外部知识源的组织。现代企业在各种系统中存储大量信息,例如手册、常见问题、研究报告、客户服务指南和人力资源文档存储库等。上下文检索在规模上具有挑战性,因此会降低生成输出质量。

语义搜索技术可以扫描包含不同信息的大型数据库,并更准确地检索数据。例如,他们可以回答诸如 “去年在机械维修上花了多少钱?”之类的问题,方法是将问题映射到相关文档并返回特定文本而不是搜索结果。然后,开发人员可以使用该答案为 LLM 提供更多上下文。

RAG 中的传统或关键字搜索解决方案对知识密集型任务产生的结果有限。开发人员在手动准备数据时还必须处理单词嵌入、文档分块和其他复杂问题。相比之下,语义搜索技术可以完成知识库准备的所有工作,因此开发人员不必这样做。它们还生成语义相关的段落和按相关性排序的标记词,以最大限度地提高 RAG 有效载荷的质量。

6.  RAG的发展历程

6.1 RAG的成长树

大模型涉及的主要阶段包括预训练、微调和推理。随着大型语言模型(LLMs)的出现,RAG的研究最初集中于利用LLMs强大的上下文学习能力,主要集中在推理阶段。随后,研究逐渐深入,逐步与LLMs的微调过程结合。研究人员还在探索通过检索增强技术,在预训练阶段提升语言模型的能力。下图是RAG(检索增强生成)研究的技术发展路线图。

RAG过程在问答任务中的一个典型实例。它主要包括三个步骤:

  1. 索引:将文档拆分成若干块,编码成向量,并存储在向量数据库中。
  2. 检索:根据语义相似性,检索与问题最相关的前k个文档块。
  3. 生成:将原始问题和检索到的文档块一起输入到大型语言模型(LLM)中,生成最终答案。

6.2 RAG的三种形式

RAG可以分成三种形式,下图是RAG三种形式的比较:

(左)朴素RAG主要包括三个部分:索引、检索和生成。

(中)先进RAG提出了围绕预检索和后检索的多种优化策略,其过程类似于简单RAG,仍然遵循链式结构。

(右)模块化RAG继承并发展自前述范式,整体展示出更大的灵活性。其特点在于引入了多个具体的功能模块,并可以替换现有模块。整体过程不再局限于顺序的检索和生成,还包括迭代式和自适应检索等方法。

6.2.1 朴素的RAG

Naive RAG(朴素的检索增强生成模型)是最早的研究范式之一,它在 ChatGPT 被广泛采用后迅速获得了关注。Naive RAG 采用传统的 检索-生成(Retrieve-Generate)流程,主要包括三个步骤:索引、检索和生成。这一流程也被称为“检索-阅读”(Retrieve-Read)框架。

1. 索引(Indexing)

索引阶段首先是清洗和提取原始数据,这些数据通常来自不同的格式,如 PDF、HTML、Word 或 Markdown 文件,然后将其转换为统一的纯文本格式。为了适应语言模型的上下文限制,文本会被分割成较小的块(chunk)。这些文本块会使用嵌入模型(embedding model)转化为向量表示,并存储在向量数据库中。这一步对于后续检索阶段的高效相似度搜索至关重要。

2. 检索(Retrieval)

当用户提出查询时,RAG 系统使用在索引阶段相同的编码模型将查询转换为向量表示。然后,它计算查询向量与索引中每个文本块的向量之间的相似度分数。系统会优先检索与查询最相关的 Top K 个文本块,这些文本块会作为扩展上下文,供后续生成阶段使用。

3. 生成(Generation)

在生成阶段,用户提出的查询和检索到的相关文档会被组合成一个一致的提示(prompt),输入到一个大语言模型(LLM)中,任务是生成一个回应。模型生成回应的方式可以根据具体任务的要求而变化,模型可能会利用其内在的参数知识,也可以限制其回答只基于提供的文档内容。如果是多轮对话,现有的对话历史也可以被整合到提示中,以便模型能够进行多轮对话交互。

Naive RAG 的挑战和缺点

尽管 Naive RAG 有其优势,但它也存在一些显著的缺点和挑战:

1. 检索挑战

检索阶段通常面临精确度和召回率的挑战,可能会导致选择到与查询不相关或不对齐的文本块,或者无法检索到关键的有用信息。

2. 生成困难

在生成回答时,模型可能会面临 幻觉(Hallucination) 的问题,即生成的内容与检索到的上下文无关,甚至会出现生成的内容完全不准确的情况。生成的回答可能会出现无关、毒性或偏见的问题,影响回答的质量和可靠性。

3. 增强问题

将检索到的信息与不同任务进行整合时可能会遇到困难,有时会导致输出内容不连贯或不一致。检索到的信息可能存在冗余,例如从多个来源检索到类似的信息,从而导致重复的响应。此外,确定不同段落的意义和相关性,并确保输出的风格和语气一致,也是一个难点。

4. 复杂问题的处理

在面对复杂问题时,单次检索可能不足以获得足够的上下文信息。生成模型可能过于依赖检索到的增强信息,导致输出的内容仅仅是检索内容的重复,而缺乏深入的分析或综合信息。

6.2.2 增强的RAG

Advanced RAG(高级检索增强生成模型)通过引入特定的改进,旨在克服 Naive RAG 的局限性,重点提升检索质量。与朴素的 RAG 方法不同,Advanced RAG 采用了预检索(Pre-Retrieval)和后检索(Post-Retrieval)策略来优化检索过程,进一步改善了索引和检索的效率。

1. 预检索过程(Pre-Retrieval)

在预检索阶段,重点是优化索引结构和原始查询。通过提升索引的质量和优化查询,提升检索的精度和相关性。

优化索引

  • 增强数据粒度:提高数据分割的细致程度,使得每个数据块(Chuck)更具针对性,便于后续的精确检索。
  • 优化索引结构:调整数据存储和索引的方式,使其更加高效,支持快速检索。
  • 添加元数据:在索引中加入额外的信息(如时间戳、来源等元数据),提高检索时的上下文理解能力。
  • 对齐优化:确保数据之间的一致性和对齐,使得索引的构建更加精确。
  • 混合检索:结合不同的检索方法,进一步提高检索的多样性和精准性。

优化查询

  • 查询重写(Query Rewriting):通过重写用户的查询,使其更简洁、清晰,便于检索模型理解。
  • 查询转换(Query Routing):将用户的查询转换成更加结构化或易于理解的格式,以提高检索效果。
  • 查询扩展(Query Expansion):通过扩展查询的关键词,涵盖更多可能的相关信息,提高检索的全面性。

2. 后检索过程(Post-Retrieval)

在检索到相关内容后,后检索阶段的任务是将检索到的内容有效整合与用户的查询进行融合,从而生成准确的响应。

  • 重排(Re-ranking):对检索到的内容进行重排序,将最相关的文本块移至提示的边缘,以增强模型对关键内容的关注度。这个策略已经在一些框架中得到了应用,如 LlamaIndexLangChainHayStack
  • 摘要(Summary)与上下文压缩(Context Compression):提炼出关键的信息,直接将所有相关文档输入到大语言模型(LLM)中,可能会导致信息过载,使得模型难以集中注意力在关键信息上。因此,后检索阶段的重点是选择最重要的信息,强调关键部分,并压缩上下文,去除不必要的冗余内容。
  • 融合(Fusion):将各种信息融合到一起。

3. 优化策略

Advanced RAG 采用了多种优化方法,旨在提升整个检索过程的效果,特别是在检索的精确性和生成的相关性方面:

  • 增强检索质量:通过预检索和后检索策略,Advanced RAG 可以显著提高检索到的信息质量,使得生成的答案更加准确和相关。
  • 减少信息过载:后检索阶段通过重排和压缩上下文,减少了不相关信息的干扰,使得生成过程更加高效。

6.2.3 模块化的RAG

Modular RAG(模块化检索增强生成模型)在之前的 Naive RAGAdvanced RAG 基础上进一步发展,提供了更高的适应性和灵活性。它通过引入不同的模块来改进模型的各个部分,从而提高检索和处理能力。与传统的顺序处理方式不同,模块化 RAG 支持更加灵活的模块替换与配置,适应不同的任务需求。

1. 新模块(New Modules)

Modular RAG 框架引入了一些额外的专用组件,以增强其检索和处理能力。以下是一些关键的新模块:

  • Search 模块:适应特定场景,支持跨多个数据源(如搜索引擎、数据库和知识图谱)的直接检索。通过大语言模型(LLM)生成的代码和查询语言,实现对各种信息源的访问。
  • RAG Fusion 模块:解决传统检索的局限性,采用多查询策略,将用户的查询扩展为多种视角。通过并行的向量搜索和智能重排序,挖掘显式和转化性知识。
  • Memory 模块:利用 LLM 的记忆功能引导检索,创建一个无限制的记忆池。通过迭代自我增强,使文本与数据分布更加对齐,从而提高检索的准确性。
  • Routing 模块:在 RAG 系统中引导不同数据源的检索,选择最优的路径进行查询。无论是总结、特定数据库检索,还是合并多个信息流,Routing 模块都能进行灵活处理。
  • Predict 模块:通过生成上下文来减少冗余和噪音,直接通过 LLM 生成相关且准确的内容,从而提升信息的相关性和质量。
  • Task Adapter 模块:为不同的下游任务定制 RAG。通过少量示例生成任务特定的检索器,自动进行零-shot 输入的提示检索,支持更广泛的应用场景。

这些模块不仅使检索过程更加流畅,而且显著提升了检索信息的质量和相关性,适应了各种任务和查询,提供了更高的精度和灵活性。

2. 新模式(New Patterns)

Modular RAG 提供了极大的适应性,允许根据特定的挑战替换或重新配置模块。这使得 Modular RAG 超越了 Naive 和 Advanced RAG 固定结构的限制,能够根据任务需求灵活调整模块的交互流程。

  • Rewrite-Retrieve-Read 模型:利用 LLM 的能力通过重写模块和语言模型反馈机制优化查询,提升任务性能。
  • Generate-Read 模型:替代传统的检索过程,使用 LLM 生成的内容作为上下文,减少对传统检索的依赖。
  • Recite-Read 模型:强调从模型权重中检索知识,提升模型处理知识密集型任务的能力。
  • 混合检索策略(Hybrid Retrieval):综合关键字检索、语义检索和向量检索,适应多样化的查询需求。通过子查询和假设文档嵌入(HyDE),提高检索的相关性,专注于生成答案与实际文档之间的嵌入相似性。
  • 模块化模块流(Modular RAG Flow):通过 FLARE 和 Self-RAG 等技术,支持适应性检索,依据不同场景评估检索的必要性。这种灵活的架构不仅可以提高检索效率,还可以更容易地与其他技术(如微调或强化学习)进行集成。

3. 模块化 RAG 的优势

Modular RAG 提供了比 Naive 和 Advanced RAG 更加灵活的架构,能够动态调整模块交互和流向。其优点包括:

  • 灵活的模块替换:可以根据具体任务需求替换或重构模块,适应不同的应用场景。
  • 增强的信息检索能力:通过多种检索策略(如混合检索、并行检索等),提高了信息检索的精确性和全面性。
  • 自我增强和记忆功能:通过 Memory 模块,LLM 可以不断优化检索过程,提供更为精准的上下文信息。
  • 跨任务适应性:通过 Task Adapter 模块,RAG 可以根据不同的下游任务自动调整,以满足多种任务需求。

6.3 RAG与微调(Fine-Tuning)

RAG与其他模型优化方法在“是否需要外部知识”和“是否需要模型适应”方面的比较。提示工程(Prompt Engineering)对模型和外部知识的修改要求较低,主要侧重于利用大型语言模型(LLMs)本身的能力。而微调则涉及对模型的进一步训练。在RAG的早期阶段(简单RAG),对模型修改的需求较低。随着研究的进展,模块化RAG与微调技术的结合变得更加紧密。

6.4 检索(Retrieval)

RAG(检索增强生成模型)依赖外部知识来增强大语言模型(LLM)的能力,而检索源的类型和检索单元的粒度都会影响最终的生成结果。

1. 数据结构(Data Structure)

检索源的演变:最初,文本是主要的检索来源,随后扩展到半结构化数据(如PDF)和结构化数据(如知识图谱, KG)。除了从外部源进行检索外,近期的研究趋势还包括利用LLM自身生成的内容进行检索和增强。

检索单元的粒度:检索单元的粒度也会影响检索的效果。粗粒度的检索单元(如文档或句子)理论上可以提供更相关的信息,但也可能包含冗余内容,干扰下游任务。而细粒度的检索单元(如词语或短语)增加了检索的负担,且不能保证语义的完整性。选择合适的检索粒度是一种简单有效的策略,可以提升密集检索器的性能。

  • 文本中的粒度:从细粒度到粗粒度,粒度包括词语、短语、句子、命题、段落、文档等。DenseX 提出了使用命题作为检索单元的概念,命题被定义为文本中的原子表达,每个命题都封装了一个独特的事实信息,形式简洁、独立,旨在提高检索的精度和相关性。
  • 知识图谱中的粒度:在知识图谱中,检索粒度包括实体、三元组和子图等。粒度的选择也可以根据下游任务调整,如在推荐任务中检索物品ID,或者在问答任务中检索句子对等。

2. 索引优化(Indexing Optimization)

在索引阶段,文档会被处理、分段并转化为嵌入向量,存储在向量数据库中。索引的质量决定了检索阶段是否能获取到正确的上下文。

分段策略(Chunking Strategy):最常见的做法是将文档按照固定的令牌数进行分段(例如 100、256、512 等)。较大的分段能够捕捉更多上下文,但也会产生更多噪音,需要更长的处理时间和更高的成本。较小的分段可能无法完整传达必要的上下文,但噪音较少。为了解决这一问题,采用递归分割和滑动窗口的方法进行优化,使得不同的检索过程能够跨多个分段获取全局相关信息。

元数据附加(Metadata Attachments):分段可以通过附加元数据(如页码、文件名、作者、时间戳等)来丰富,从而在检索时基于元数据进行过滤,限制检索范围。元数据的不同权重可以在检索过程中实现时间感知 RAG,确保所用知识的时效性。

结构化索引(Structural Index):建立文档的层级结构可以有效提高检索效率。通过构建层级索引,RAG 系统可以快速检索和处理相关数据。知识图谱索引能够帮助保持一致性,并减少检索时的误差。此外,知识图谱还能将信息检索过程转化为 LLM 能够理解的指令,增强知识检索的精度和生成的上下文连贯性。

3. 查询优化(Query Optimization)

传统的 Naive RAG 依赖于用户原始查询进行检索,然而用户提问不够精确或清晰时,检索效果会受到影响。特别是,当查询本身很复杂,或者语言不够规范时,RAG 系统容易出现问题。

查询扩展(Query Expansion)

  • 多查询(Multi-Query):通过 LLM 进行查询扩展,将一个查询转化为多个并行查询,提供更丰富的上下文,确保生成答案的相关性。
  • 子查询(Sub-Query):将复杂的查询分解为一系列更简单的子问题,通过组合这些子查询来完整回答原始问题。这种方法类似于查询扩展,能提供更好的上下文。
  • 验证链(Chain-of-Verification,CoVe):扩展后的查询通过 LLM 进行验证,从而减少幻觉现象,提高检索结果的可靠性。

查询转化(Query Transformation)

  • 查询重写(Query Rewrite):LLM 可以重写查询,帮助生成更符合检索需求的问题。在实际应用中,像 BEQUE 就利用查询重写增强了对于长尾查询的召回效果。
  • 假设文档生成(HyDE):通过 LLM 生成假设性文档(即假设答案),在检索过程中计算查询和假设问题之间的相似度,从而缩小查询和答案之间的语义差距。
  • 退后提示(Step-back Prompting):将原始查询抽象成高层次概念问题,用于生成更有针对性的检索结果。

查询路由(Query Routing):基于查询的不同特点,路由到不同的 RAG 管道中,适应多样化的场景需求。

  • 元数据路由(Metadata Router):从查询中提取关键词(如实体),然后基于元数据进行过滤,缩小搜索范围。
  • 语义路由(Semantic Router):利用查询的语义信息进行路由,结合元数据和语义的混合路由方法,以提升查询路由效果。

4. 嵌入(Embedding)

在 RAG 系统中,通过计算查询和文档段落嵌入的相似度(例如余弦相似度)来实现检索。嵌入模型的语义表示能力在其中起着关键作用。

混合检索(Mix/Hybrid Retrieval):稀疏检索模型和密集检索模型可以互补,通过结合两者的优势,提升检索的多样性和准确性。例如,可以使用稀疏模型提供初步的搜索结果,再通过密集检索模型进行精细化检索。

微调嵌入模型(Fine-tuning Embedding Model):在某些领域,特别是在专业领域(如医疗、法律等)中,微调嵌入模型是必需的,以减少与预训练语料库的差异。通过使用 LLM 的结果作为监督信号进行微调,可以提高模型的性能。

5. 适配器(Adapter)

在微调模型时,可能会遇到一些问题,例如 API 集成或计算资源限制。因此,某些方法采用外部适配器来帮助对齐。

轻量级适配器(UPRISE):通过训练一个轻量级的提示检索器,自动从预构建的提示池中检索适合给定零-shot 任务输入的提示,从而优化 LLM 的多任务能力。

增强适配器(AAR):设计了一种通用适配器,能够适应多个下游任务,并提高在特定任务上的性能。

6.5 增强生成(Augmented Generation)

在RAG(检索增强生成)领域,标准的做法通常是先进行一次性检索,然后进行生成。这种方式可能导致效率低下,尤其对于需要多步推理的复杂问题,它提供的信息范围有限。为了解决这一问题,许多研究对检索过程进行了优化。除了最常见的单次检索,RAG还包括三种类型的检索增强过程。

(左) 迭代检索涉及在检索和生成之间交替进行,使每一步都能从知识库中获得更丰富、更有针对性的上下文。

(中)递归检索则通过逐步细化用户查询,将问题分解为子问题,然后通过检索和生成不断解决复杂问题。

(右)自适应检索侧重于使RAG系统能够自主判断是否需要外部知识检索,并决定何时停止检索和生成,通常使用LLM生成的特殊标记进行控制。

6.5.1 迭代检索(Iterative Retrieval)

迭代检索是一种基于初始查询和迄今为止生成的文本,反复检索知识库的方法,为LLM(大语言模型)提供更全面的知识基础。这种方法已被证明能够增强后续生成答案的鲁棒性,通过多次检索迭代,提供更多的上下文信息。然而,迭代检索可能会受到语义不连续性和冗余信息累积的影响。ITER-RETGEN提出了一种协同方法,将“检索增强生成”与“生成增强检索”结合起来,用于需要复现特定信息的任务。该模型利用生成的内容作为检索相关知识的上下文基础,从而在后续的迭代中生成更为精准的答案。

6.5.2 递归检索(Recursive Retrieval)

递归检索在信息检索和自然语言处理(NLP)中常用于提高搜索结果的深度和相关性。这个过程涉及基于先前搜索结果不断优化查询。递归检索旨在通过反馈循环逐渐接近最相关的信息,从而改善搜索体验。IRCoT使用了思维链(chain-of-thought)来指导检索过程,并基于获得的检索结果优化思维链。ToC则创建了一个澄清树,系统地优化查询中模糊的部分。递归检索尤其适用于复杂的搜索场景,其中用户需求从一开始就不完全明确,或者所需信息非常专业或细致。递归过程允许系统不断学习和适应用户需求,从而通常能提高搜索结果的满意度。

为了应对特定的数据场景,递归检索与多跳检索技术可以结合使用。递归检索涉及结构化索引,以分层方式处理和检索数据,这可能包括在执行检索之前对文档或长PDF进行总结。随后,基于这些摘要进行二次检索,体现了递归过程的特点。与此相对,多跳检索则旨在深入挖掘图结构数据源,提取相互关联的信息。

6.5.3 自适应检索(Adaptive Retrieval)

自适应检索方法通过允许LLM主动决定最佳的检索时机和内容,优化了RAG框架,从而提高了信息来源的效率和相关性。例如,Flare和Self-RAG就是通过这种方法来优化检索过程。随着这一趋势的发展,越来越多的LLM开始在其操作中主动做出判断,例如在模型代理(如AutoGPT、Toolformer和Graph-Toolformer)中也能看到这种趋势。Graph-Toolformer 就是将检索过程分为多个步骤,LLM主动使用检索器、应用Self-Ask技术,并采用少样本提示来发起搜索查询。这种主动的策略使得LLM能够决定何时需要检索信息,类似于代理在使用工具时的判断。

WebGPT引入了强化学习框架,训练GPT-3模型在文本生成过程中自主使用搜索引擎。它通过特殊的标记来导航这一过程,包括搜索引擎查询、浏览结果和引用参考文献,从而通过外部搜索引擎扩展GPT-3的能力。Flare则通过监控生成过程的置信度(如生成词汇的概率)来自动化检索时机,当概率低于某个阈值时,激活检索系统收集相关信息,从而优化检索周期。Self-RAG引入了“反思标记”,让模型能够自我反思其输出。这些标记有两种类型:“检索”和“批评”。模型可以自主决定何时启动检索,或者通过预设阈值触发检索过程。在检索过程中,生成器通过在多个段落中进行碎片级束搜索,得出最连贯的序列。批评分数用于更新细分分数,并且可以在推理过程中调整这些权重,从而量身定制模型的行为。Self-RAG的设计避免了额外分类器或依赖自然语言推理(NLI)模型,从而简化了何时启用检索机制的决策过程,提高了模型在生成准确回答时的自主判断能力。下图是Self-RAG的整体架构图。

6.6 RAG生态系统

综上所述,RAG生态系统如下图所示:

RAG的评价指标如下,其中包含了一些基准线(benchmark)和工具(tool)。

6.7 RAG的未来发展方向

RAG的未来发展方向包括:

  • RAG与长文本:长文本往往超出了传统模型能够处理的上下文长度。许多模型有输入长度的限制,当文本长度过长时,可能会出现截断现象。这会影响模型对全文的理解,尤其是当重要信息被截断时,系统可能无法提供完整的答案。长文本中的不同部分可能涉及不同的主题、背景或情节,如何确保检索到的信息与当前生成的内容保持一致性至关重要。
  • RAG的健壮性:RAG可能会面临检索过程中引入的噪声,例如与查询无关的文档或片段,或是检索到的文本含有误导性信息。噪声数据会影响生成结果的准确性和相关性。有时需要处理用户提出的模糊、含糊不清的查询,这些查询可能没有明确的意图或是包含多重意思。在这种情况下,RAG系统需要有效地推理和生成相关答案。
  • RAG的扩展规律(Scaling Law):随着数据集的增大,检索过程的复杂度会显著提升。需要优化检索算法和数据结构,以保持检索效率。通常,扩大检索规模可以提高生成结果的质量,但同时也可能增加不相关信息的干扰。
  • 生产级RAG:指已经优化并可以在实际环境中稳定运行的RAG系统。这类系统不仅要求具有高效的检索和生成能力,还需要具备可扩展性、低延迟和高可靠性等特点。
  • 混合方法:混合方法是指将多种不同的技术或模型结合起来,以优化RAG系统的性能。常见的混合方法包括将稀疏检索(例如BM25)与密集检索(例如BERT架构)结合,或者将规则驱动的系统与深度学习模型结合使用。
  • 多模态的RAG:图片、音频、视频、代码等作为知识库和信息输入也是存在着一定的挑战。

7.  参考资料

  1. Gao Y, Xiong Y, Gao X, et al. Retrieval-augmented generation for large language models: A survey[J]. arXiv preprint arXiv:2312.10997, 2023, 2.
  2. Gao Y, Xiong Y, Zhong Y, et al. Synergizing RAG and Reasoning: A Systematic Review[J]. arXiv preprint arXiv:2504.15909, 2025.
  3. Li X, Jia P, Xu D, et al. A Survey of Personalization: From RAG to Agent[J]. arXiv preprint arXiv:2504.10147, 2025.
  4. Arslan M, Ghanem H, Munawar S, et al. A Survey on RAG with LLMs[J]. Procedia Computer Science, 2024, 246: 3781-3790.
  5. Fan, Wenqi, et al. “A survey on rag meeting llms: Towards retrieval-augmented large language models.” Proceedings of the 30th ACM SIGKDD Conference on Knowledge Discovery and Data Mining. 2024.

GPT4All:本地部署的开源大语言模型

1.  GPT4All简介

1.1 开源项目

GPT4All 是由 Nomic AI 开发的一个开源项目,旨在让用户能够在个人设备上本地运行大型语言模型(LLM),无需依赖云服务。 这一项目自发布以来,已成为 GitHub 上增长最快的开源项目之一,拥有超过 7 万个 GitHub 星标。

1.2 适用场景

使用GPT4All的话有以下优势:

  • 隐私保护:处理敏感数据时,确保信息不外泄。
  • 离线使用:在没有网络连接的环境中使用 AI。
  • 教育与研究:用于教学、研究或学习目的。
  • 定制化需求:根据特定需求定制 AI 模型。

2.  核心特点

2.1. 完全本地运行,无需互联网连接

GPT4All 允许用户在 Windows、macOS 和 Linux 等操作系统上本地运行 LLM。 用户可以下载模型文件(通常为 1GB 至 8GB),并在没有网络连接的情况下使用 AI 聊天。

2.2 支持多种硬件平台

该项目支持多种硬件平台,包括支持 AVX 指令集的 CPU,以及 Apple M 系列芯片、AMD 和 NVIDIA GPU 等。 这使得用户能够在不同的设备上体验本地 LLM。

2.3 隐私优先

GPT4All 强调数据隐私,默认情况下,用户的对话数据不会离开本地设备。 如果用户选择使用远程模型或参与数据共享,系统会明确提示并征得同意。

2.4 丰富的模型支持

GPT4All 支持多种开源模型,包括 LLaMa、Mistral、DeepSeek R1、Nous-Hermes 等。 用户可以根据需求选择不同的模型进行本地部署。详情可以参考链接:https://github.com/nomic-ai/gpt4all/blob/main/gpt4all-chat/metadata/models3.json

2.5 集成本地文档支持

GPT4All 提供 LocalDocs 功能,允许用户将本地文档(如 PDF、TXT、Markdown 等)导入系统,与 AI 进行交互。 这对于处理敏感或私密信息非常有用。

3.  快速上手指南

3.1 下载并安装软件

访问下载适用于您操作系统(Windows、Mac、Linux)的安装包。

3.2 添加模型

启动应用程序后,点击“+ Add Model”按钮,选择并下载您需要的模型。

3.3 开始聊天

下载模型后,进入“Chats”界面,选择已加载的模型,开始与 AI 进行对话。并且还提供上传本地文件资料的功能,实现知识库的搜索。

3.4 使用Python的SDK

3.4.1 大语言模型

GPT4All 提供了 Python SDK,方便开发者将其集成到自己的项目中。 此外,项目采用 MIT 开源许可证,允许用户进行自定义和二次开发。

安装方法:

pip install gpt4all

使用方法:

可以按照官方提供的模板进行使用,如果模型没有提前下载的话,在第一次使用的时候,代码会自动下载模型。

from gpt4all import GPT4All
model = GPT4All("Meta-Llama-3-8B-Instruct.Q4_0.gguf") # downloads / loads a 4.66GB LLM
with model.chat_session():
    print(model.generate("How can I run LLMs efficiently on my laptop?", max_tokens=1024))

如果想要进行流式输出或者一次性输出,可以使用streaming这个参数进行控制,参考代码:

from gpt4all import GPT4All

def output_with_stream_control(prompt: str, model_name: str = "Meta-Llama-3-8B-Instruct.Q4_0.gguf", max_tokens: int = 1024, streaming: bool = False):
    model = GPT4All(model_name)  # 加载指定模型

    # 创建一个对话会话
    with model.chat_session() as session:
        response_buffer = ""

        if streaming:
            # 启用流式输出
            for chunk in model.generate(prompt, max_tokens=max_tokens, streaming=streaming):
                response_buffer += chunk
                print(chunk, end='', flush=True)  # 实时输出生成的文本
            print("\n\n生成的完整答案:", response_buffer)
        else:
            # 批量输出(等待完整生成后返回)
            response_buffer = model.generate(prompt, max_tokens=max_tokens, streaming=streaming)
            print("\n生成的完整答案:", response_buffer)

        return response_buffer

if __name__ == "__main__":
    prompt = "用中文回答,什么是化学?"
    result = output_with_stream_control(prompt, streaming=False)
    print('result:', result)

模型的选择范围很多,当前支持的部分模型可以参考表格:

GPT4All model nameFilesizeRAM RequiredParametersQuantizationDeveloperLicenseMD5 Sum (Unique Hash)
Meta-Llama-3-8B-Instruct.Q4_0.gguf4.66 GB8 GB8 Billionq4_0MetaLlama 3 Licensec87ad09e1e4c8f9c35a5fcef52b6f1c9
Nous-Hermes-2-Mistral-7B-DPO.Q4_0.gguf4.11 GB8 GB7 Billionq4_0Mistral & Nous ResearchApache 2.0Coa5f6b4eabd3992da4d7fb7f020f921eb
Phi-3-mini-4k-instruct.Q4_0.gguf2.18 GB4 GB3.8 billionq4_0MicrosoftMITf8347badde9bfc2efbe89124d78ddaf5
orca-mini-3b-gguf2-q4_0.gguf1.98 GB4 GB3 billionq4_0MicrosoftCC-BY-NC-SA-4.00e769317b90ac30d6e09486d61fefa26
gpt4all-13b-snoozy-q4_0.gguf7.37 GB16 GB13 billionq4_0Nomic AIGPL40388eb2f8d16bb5d08c96fdfaac6b2c

同时,SDK的所有参数可以参考链接:https://docs.gpt4all.io/gpt4all_python/ref.html#gpt4all.gpt4all.GPT4All.list_models

3.4.2 嵌入模型

除了大语言模型之外,它还提供三种嵌入模型,其本地调用的使用案例如下所示:

from nomic import embed
embeddings = embed.text(["String 1", "String 2"], inference_mode="local")['embeddings']
print("Number of embeddings created:", len(embeddings))
print("Number of dimensions per embedding:", len(embeddings[0]))

其嵌入模型有三个:

NameUsing with nomicEmbed4All model nameContext LengthEmbedding DimensionsFile Size
Nomic Embed v1embed.text(strings, model=”nomic-embed-text-v1″, inference_mode=”local”)Embed4All(“nomic-embed-text-v1.f16.gguf”)2048768262 MiB
Nomic Embed v1.5embed.text(strings, model=”nomic-embed-text-v1.5″, inference_mode=”local”)Embed4All(“nomic-embed-text-v1.5.f16.gguf”)204864-768262 MiB
SBertn/aEmbed4All(“all-MiniLM-L6-v2.gguf2.f16.gguf”)51238444 MiB

4.  参考资料:

  1. GPT4All的GitHub地址:https://github.com/nomic-ai/gpt4all
  2. GPT4All的文档:https://docs.gpt4all.io/
  3. nomic的官网:https://www.nomic.ai/
  4. 模型的选择范围:https://github.com/nomic-ai/gpt4all/blob/main/gpt4all-chat/metadata/models3.json

让工作充满热爱:如何通过目标感激发员工潜能

对于每一个打工人而言,目标感在职场中的重要性不可忽视,它不仅是打工人动力的源泉,更能激发打工人源源不断的创造力。对于企业而言,重视并提升员工的目标感,针对不同的员工设计不同的目标,让员工从工作本身找到热爱与归属,将企业的目标和员工的目标尽量地放在同一条轨道上。只有当员工对自己的工作充满热情,感知到个人目标与企业愿景的紧密契合,他们才会全身心投入其中,持续创新并不断突破自我。目标感激发了员工的主动性和创造力,促进了工作效率的提升,并加强了对企业的忠诚度,这对于任何希望长期发展并维持竞争力的组织来说,都是至关重要的。

在当今快速发展的职场中,企业需要的已不仅仅是完成任务的工人,而是能够创造价值、推动创新的创造型人才。创造型工作强调的是员工的思维能力、问题解决能力和创新意识,而不仅仅是简单的重复劳动。企业应当通过提供能够激发员工创造力的工作内容和环境,吸引那些有志于实现自我价值的优秀人才。通过这样的方式,企业不仅能够招募到技术娴熟的执行者,更能吸引到具有独立思考和创新精神的战略性人才,这些人才将推动公司持续发展并在长期竞争中脱颖而出。

对于企业而言,吸引并留住优秀人才是每个企业都面临的挑战。为了做到这一点,除了在招聘的时候,尽可能地争取各种各样的优秀人才之外,在日常的管理中企业的管理者也需要按照既定的目标分解任务,并以员工对工作内容本身的热爱为核心出发点,尽可能地给员工安排其喜欢的工作内容。同时,管理者可以通过定期与员工交流,帮助他们发现或唤醒内在的目标感,从而提升他们的工作积极性和忠诚度。以下是管理者可以询问员工的五个关键问题,它们能够帮助员工找回对工作的热情,激发他们的潜能。

1. 你擅长做什么工作?

作为管理者,第一步是帮助员工认识到自己的强项,尤其是应届生和刚入职公司没多久的员工。管理者可以通过提问:“你擅长做什么工作?”“在同样的工作量下,哪些工作你花费的精力较少?”可以帮助员工时刻进行自我审视,并在日常繁重的工作中找到自己的优势所在。这两个问题不仅能够让员工思考自身的核心能力,还能帮助他们意识到自己在团队中的独特价值,从而激发他们更积极地发挥这些优势。

2. 你喜欢做什么工作?

每个人都希望做自己热爱的工作,毕竟兴趣是最好的老师。管理者可以通过询问员工:“你喜欢做什么工作?”“在正常的工作日,你最期待做哪些任务?”来帮助员工发现他们的工作激情。在企业中,工作不应该仅仅是任务的堆砌,它还应当是员工内心充满动力和喜悦的源泉。当员工能够做自己喜欢的工作时,他们不仅能提高效率,还会感受到工作带来的满足感。

3. 什么类型的工作让你感到最有价值?

对于每个员工来说,虽然大部分人工作的目的是为了生计,但我想更高的层次是为了实现个人价值和职业目标。管理者还可以问员工:“在过去的一段时间里,哪些工作成果让你感到最为自豪?”“你完成了哪些对团队或组织至关重要的任务?”管理者可以帮助员工识别他们的工作对组织的重要性,甚至可以把更重要的工作安排给合适的员工。这些问题能够让员工看到他们工作的内在价值,并激发他们为更高目标而努力的动力。

4. 是什么给了你前进的动力?

每个人在工作中都有一个驱动力,管理者可以通过“你学到了哪些将来会用到的技能?”“你今天所做的工作是否让你更接近自己的愿望?”等问题,帮助员工发现自己的前进方向。工作不仅是为了眼前的任务,它还是员工通往未来目标的桥梁。通过明确自己的目标,员工将更加清晰地看到自己努力的方向和动力来源,从而更有动力去追求更高的成就。

5. 你如何与同事相处?

团队协作是现代职场中不可或缺的一部分。管理者可以通过提问:“你与哪些同事关系最适合?”“如果整个办公室的同事都是你喜欢的人,场景会是怎样的?”来帮助员工思考如何与同事建立更好的人际关系。工作中良好的合作氛围不仅能增强团队的凝聚力,还能让员工感到他们在工作中找到了归属感,从而增强工作的意义感。

结语

通过这五个简单而深刻的问题,管理者能够帮助员工更清晰地认识自己、发现自己的热情,进而激发他们的内在目标感。当员工能够在工作中找到自己的价值与意义时,他们不仅能为企业创造更大的价值,也能够在职业生涯中获得更多的满足与成就。为了吸引和留住优秀人才,重新设计工作本身,让员工找到对工作的热爱,将是成功的关键所在。

给的很少,要的很多:职场中的奇怪要求

在职场上,有的时候会出现一种奇怪的现象,正在悄无声息地消耗着人的价值。

在招聘的时候,岗位的职责和内容明明写的是“算法工程师”,但是在候选人入职之后却要背负起后端开发、前端搭建、数据分析、测试开发,甚至是各种边边角角的杂活。对于一名算法工程师而言,不仅要做会议记录,要做服务器维护,连日常的excel数据报表也得一个个出,还有想象不到的各种各样项目对接、繁重的流程和技术文档撰写、流程混乱的跨部门沟通,这些已经统统被塞进算法工程师的日常待办里。最讽刺的是,当这些杂乱无章的任务终于在一片疲惫中堆叠完成时,管理者却开始反问算法工程师:“你怎么在算法上没有成果?怎么AI项目还没有突破?还不能够让AI做到减少人力和减轻负担的效果?”

在这种岗位上,一个典型的算法工程师,明明是在专攻机器学习、深度学习这些复杂课题的技术人才,结果突然变身为项目经理,跨部门沟通小能手,后端开发大神,前端布局专家,甚至还得做数据清洗、做测试开发,和测试人员一起深夜守在业务旁边死磕。唯一的共同点是——每个任务都没有时间给你真正专注做。于是,身为一位“全能”的技术人才,他被要求同时兼顾这些不同领域的工作,连各种各样的日报、周报、双周报、月报、季度报、半年报和年报都得自己来。反而最需要投入深度的算法研究,被推到了“闲暇时间”的角落,长期等着“有空再做”的状态。

对于某些公司而言,算法的突破,仿佛是在碎片化劳动、疲于奔命中,凭空诞生的奇迹。仿佛一个工程师,只要加班熬夜、不断堆工时,就能自动产出深度学习模型,就能轻松攻克科研课题。仿佛一个工程师,只需要在睡梦中做梦,就能够在梦中实现AI的算法开发达成意想不到算法效果

AI算法开发是需要一定的创新能力的,可真正需要产出创新的岗位,需要的是什么?是深度的思考,是高密度的专注,是反复试错和沉淀,而不是在每天数十个小任务中疲于奔命,不是把注意力分成无数碎片,不是在无休止的救火和打杂中消磨殆尽。简单来说就是给得太少:这里给得太少并不是指工资给得很少,而是管理者不给时间,不给专注的空间,不给明确的边界感。同时,管理者又对算法工程师要得太多:要你全能,要你无所不能,要你在一片杂乱中还能天才地爆发,在服务器都少之又少的前提下还希望有巨大的产出。这本质上,不是对个人的挑战,而是对职业角色的深度误解。

如果管理者希望算法工程师承担起整个产品的研发工作,那不如直接把“全能型人才”的名字印在招聘广告上,标明“招聘全能型工程师”,这样或许更合适——这样的候选人他不仅需要做算法,还得做产品设计,做架构开发,做项目经理,做前后端开发,做数据分析,做项目管理,成为PPT和EXCEL工程师,甚至还要为公司的整体战略和布局负责。

到最后让人不解的是,虽然管理者已经把很多额外的职责都压给他,最终却仍然对他没有任何宽容,反而把对AI成果的期望推得越来越高——“做出AI突破”、“产出创新”,“行业领先”、甚至希望“超越竞争对手”。这一切,似乎都没有考虑到他的时间和精力早已被无限分配。在忙碌完各种需求之后,AI终于有了一定的产出,但是更加让人无奈的是,管理者却又说“AI只是锦上添花,项目交付才是雪中送炭”。真正让人气愤的是,往往这样的要求背后,管理层只会关注短期内的“完成情况”,而忽略了创新和技术突破背后需要长时间的专注和积累。却不见他们提出过“给你更多的资源”、“让你专注做技术”的方案。创新需要土壤,而不是不间断的碎片时间和加班文化

在工作中,每个角色的价值,都是需要被尊重的。让算法工程师做后端、前端、测试、运维,是对专业的稀释;让创意型工作在碎片中挣扎,是对产出的扼杀。当一个岗位需要承担四五个岗位的职责时,其实早已失去了基本的职业尊重。当一个组织习惯于压榨式使用人才时,它正在透支的不仅是人的体力,更是创新力、责任感和未来的可持续发展力。短期看,似乎解决了燃眉之急;但长期看,最宝贵的人才,只会在沉默和疲惫中,悄悄流失。或许对于某些公司而言,招聘的目的并不是提升自身的技术实力,而是在海量招聘中筛选到某些合适的人并长期留用,其他不合适的人只需要及时离开就可以了。

真正成熟的组织,懂得给角色留空间,让专业的人做专业的事,不要让各种各样的杂事拉打扰专业的人。管理者需要懂得设定合理预期,让创新建立在专注、探索和持续打磨之上,而不是建立在无尽打杂之中。想要算法上的突破,就要在管理上先突破短视;想要技术上的飞跃,就要在制度上先尊重专注。别再让“给的很少,要的很多”成为职场的常态。别再让真正有创造力的人,在无意义的疲惫里,变成一颗颗沉默的螺丝钉。

一个合格的企业应该懂得角色的专业性和深度,懂得为创新提供足够的时间和空间,而不是一味要求员工成为“全能神”。真正有眼光的领导,应该知道,技术和创新需要一颗宁静的心,需要日复一日的专注,而不是在千头万绪的琐事中迷失自我。别再让这种“给得很少,要的很多”的荒谬逻辑,成了职场中唯一的标准。让每个岗位都能专注于自己的本职工作,才能创造出真正的价值,才是每个企业应追求的目标。