LLM:RAG,设计模式,Agent框架

1,RAG 内部技术

1.1,检索器:Retriever

给定一个查询(query),从外部知识库(文档集合)中检索出与查询相关的 k 条文本段(passages/documents),以供生成模块使用。

  • 知识覆盖问题:生成模型(LLM)参数中不包含所有知识,Retriever可动态引入外部知识。

  • 上下文相关性问题:通过检索器找到与当前查询最相关的信息,提升回答的准确性与可控性。

【Retriever 的类型】

  • **稀疏检索(Sparse Retriever):****基于词频率统计与倒排索引;无需训练,效率高,解释性强;对语义理解能力弱,仅匹配关键词。**编码模型:IF-IDF、BM25以及倒排索引。
  • **稠密检索(Dense Retriever):****将query与文档都编码为向量,在向量空间中计算相似度(如内积或余弦距离);能够基于语义理解检索相关内容;需要训练编码器,存储开销大,检索效率低。**编码模型: **BERT、RoBERTa、MiniLM、MPNet、E5、bge。****评估基准:**MTEB(Massive Text Embedding Benchmark)或计算前 K 个结果中相关文档的召回率。
  • **混合检索:****混合检索结合了稀疏检索和密集检索的优势,以提供更全面和鲁棒的检索能力。**例如,先使用关键词搜索(稀疏检索)获取大量文档池,然后应用更复杂的检索方法(如语义搜索或神经排名模型)来过滤和排名结果 。另一种常见方法是RRF(Reciprocal Rank Fusion)算法可以整合来自语义搜索和BM25搜索的检索结果,并进行重排名以生成统一的最终排名 。

【Retriever 的组成】

  • **文档编码器:**将每个文档段落编码成稠密向量,保存在向量数据库中。
  • **查询编码器:**将用户查询转化为向量。
  • **相似度计算:**内积、余弦相似度、L2距离。
  • **Top-K 检索:**检索相似度排名前K的文档段落,用于生成模块。

1.2,重排序:Reranker

Retriever 采用向量相似度(如内积、余弦)进行粗排,虽然快速但容易引入语义模糊或冗余文本。**而 Reranker 可以细粒度分析 query 和候选文档的深度匹配程度,进行精排(re-ranking),提升下游生成性能。**开销大,适合精排小批量文档!

**【输入】**用户 Query;Retriever 返回的候选文档 Top-k(如 Top-100);

**【输出】**精排后的前N条文档(如 Top-10),供 Generator 使用。

【Reranker 的类型】

| 类别 | 描述 | 典型模型 |
| Cross-Encoder | 精度高,query 和 passage 一起输入模型,逐对打分 | BERT, RoBERTa, monoBERT, bge-reranker |
| Bi-Encoder (Re-rank) | 用 Retriever 向量相似度 + 轻量排序,效率高,精度较低 | DPR + ScoreLayer |

Hybrid 结合稀疏(BM25)与稠密特征,用轻量模型融合打分 uniCOIL, SPLADE + Rerank

【主流模型】bge-reranker、MonoT5/MonoBERT、CoCondenser、ColBERTv2。

1.3,生成器:Generator

与传统的"问答式抽取"不同,RAG中的生成器不是从原文中抽取答案,而是基于查询和上下文"生成一段文本 ",因此也称为抽象式生成(Abstractive Generation)

**【输入】**用户Query;检索器返回的Top-k文档(经过拼接或逐条编码);

**【输出】**一段自然语言文本,如回答、摘要、建议等。

1.4,文档切分:Chunking

将长文档拆分成适合模型处理的、语义完整的小段(chunk),使得向量检索时能精确匹配问题相关内容。

(1)Fixed-size Chunking(固定长度切分)

  • 按字数 / Token 数切分,如每 500 个 token 一段。

  • 可选滑动窗口方式增加上下文连续性(如 chunk 长度为 500,步长为 250)。

优点:

  • 简单,易于实现。

  • 保证 chunk 长度适配 embedding 模型最大 token 限制。

缺点:

  • 可能切断句子、段落,导致语义破碎。

  • 上下文连续性差。

(2)Semantic Chunking(基于语义的切分)

  • 按照自然语言的结构划分,如:

    • 句子、段落、标题结构

    • 使用 TextSplitter 工具(如 LangChain、LlamaIndex 中的 RecursiveCharacterTextSplitter)

    • 利用 语法分析文本 embedding 相似度动态切分

优点:

  • 保留语义完整性,便于后续检索与阅读。

  • 有利于提高检索相关性和回答质量。

缺点:

  • 实现复杂度更高,可能不容易统一标准。

**(3)基于内容密度的切分(适用于知识图谱或结构化文档):**根据实体/主题密度或换行结构切分,适用于 FAQ、API 文档等。

1.5,多模态

**【问题】**多模态RAG有哪些实现框架?

【答案】

  • LlamaIndex提供了较为完善的多模态支持,包括MultiModalVectorStoreIndex等组件,可以处理文本、图像等多种模态数据。
  • LangChain也在逐步增强多模态能力,支持通过不同的Document
  • Loader处理图像、音频等内容。此外还有一些专门的框架如Haystack、GPT4-Vision API以及一些开源项目如MultimodalRAG等。

**【问题】**伪多模态RAG和多模态RAG分别怎么实现,有什么区别?

【答案】

  • **伪多模态RAG:****将非文本模态转换为文本描述,比如使用图像描述模型(如DeepSeek-OCR)为图片生成文字,然后将这些文字描述作为普通文本进行 embedding 和 检索。**优点是可以复用现有的文本RAG架构,实现简单,但缺点是图像中的细节信息可能在转文字过程中丢失,且依赖于模型的质量。
  • **多模态RAG:****为不同模态分别构建embedding空间,或者使用统一的多模态embedding模型(如CLIP、ALIGN等)将图像和文本映射到同一向量空间中。在检索时,查询可以是任意模态,系统能够跨模态检索相关内容。**实现上通常需要使用支持多模态的向量数据库(如Qdrant、Milvus等),并且使用多模态模型进行编码和生成。这种方式能更好地保留原始信息,支持更复杂的跨模态查询,但实现复杂度更高,对模型和基础设施要求也更高。

【问题】CLIP 属于那种多模态 RAG?

**【答案】****CLIP采用双编码器架构,通过对比学习将图像编码器和文本编码器产生的向量映射到同一个共享的语义空间中。这意味着一张图片和描述它的文本在向量空间中会非常接近。**这种设计使得CLIP天然适合构建跨模态检索系统,可以用文本查询来检索相关图像,也可以用图像查询来检索相关文本,或者图像检索图像。

1.6,效果评估

**【问题】**RAG技术短板:RAG存在哪些缺陷?RAG幻觉?

**【答案】**大模型是生成式系统,而非符号化的事实推理引擎。因此,RAG 的价值在于缓解而不是根除幻觉,工程上需要通过更好的检索、约束生成、证据对齐和拒答机制来持续降低风险。向量相似度搜索可能返回语义相似但内容不相关的文档;排序靠前的是噪声文本;Chunk 文档不合理,破坏语义完整性;问题超出了知识库的覆盖范围。

**【问题】RAG怎么评估?RAG评估体系中最重要的是什么?**文档质量

【答案】

  • **检索阶段:**检索到的文档是否相关和完整, 包括Recall@K(前K个结果中包含相关文档的比例)、Precision@K(前K个结果中相关文档的占比)、MRR(Mean Reciprocal
    Rank,首个相关结果的排名倒数)和NDCG(考虑排序质量的归一化折损累积增益)。
  • **生成阶段:**生成答案的质量, 包括Faithfulness(忠实度,生成的答案是否基于检索到的文档,没有幻觉)、Relevance(相关性,答案是否真正回答了用户问题)、Answer
    Correctness(答案正确性,与参考答案的匹配度)。
  • **端到端评估:****从用户体验角度,**包括答案的有用性、完整性、响应时间、用户满意度等。评估框架如RAGAS、TruLens、LangSmith等。

2,RAG 设计模式

2.1,总体概述

范式 关键特性 优点
Naive RAG 基于关键词的检索(如 TF-IDF、BM25) 简单易用
Naive RAG 适用于基于事实的查询 适合处理基于事实的查询
Advance RAG 密集检索模型(如 DPR) 高精度检索
Advance RAG 神经排序和重排序 提高了语境相关性
Advance RAG 多跳检索
Modular RAG 混合检索(稀疏和密集检索) 高度灵活和可定制化
Modular RAG 工具和 API 集成 适合多样化的应用
Modular RAG 可组合的、特定领域的流水线 可扩展性强
Graph RAG 集成基于图的结构 关系推理能力
Graph RAG 多跳推理 通过节点实现语境丰富
Graph RAG 通过节点进行语境丰富 减少幻觉(hallucinations)
Agentic RAG 自主智能体 动态决策,适应实时变化
Agentic RAG 动态决策和工作流优化 适用于多领域任务
Agentic RAG 迭代式的优化和精细化 高准确度

|------|-------------|-----------------|
| | RAG | Agentic RAG |
| 场景 | 数据环境简单、任务单一 | 企业级数据环境,任务多样 |
| 数据源 | 通常基于单个检索引擎 | 通常基于多个检索引擎 |
| 索引 | 向量索引为主 | 可灵活结合多种索引 |
| 检索规划 | 无规划或静态规则 | 动态规划下一步检索策略 |
| 多步检索 | 通常不支持 | 借助多步骤推理自主实现 |
| 外部工具 | 通常不支持 | 自动推理使用必要的工具 |
| 反省机制 | 通常不支持 | 借助反省优化问题或重新检索 |
| 灵活性 | 不够灵活,流程固定 | 自主推理,或灵活编排 |

【Naive RAG & Advance RAG & Modular RAG】

  • 原始RAG:只是具备了RAG最基础的部分,离线索引构造、在线检索以及大模型生成。
  • 高级RAG:在这3个流程里增加更多细化的工作,用于进一步优化,例如数据预处理、滑动窗口、文章切片等,重点在检索层面的优化,提升检索模块的质量。
  • 模块化RAG:一个更为精细的系统,把简单的RAG组件拓展成更多的复杂的模块以应对更复杂的需求,例如query和文档的改写、过滤、精排等,或者引入多模态、决策模块(Agent)、后处理等。

【Graph RAG & Agentic RAG】

  • 图式 RAG:在传统 RAG 基础上引入了图结构,通过节点间的关系来增强检索和推理能力。

  • 智能 RAG:在传统 RAG 系统的基础上引入了自主智能体(Agent)。这些智能体能够独立决策并进行实时动态调整,从而优化整个检索和生成的流程。智能 RAG 通过在检索和生成过程中加入决策模块,使得系统能够处理更加复杂的任务和多步骤的推理。
    **【RAG & Fine-tuning】**检索增强生成(Retrieval-Augmented Generation, RAG) 是指在使用大语言模型回答问题之前,从外部知识库中检索相关信息的技术。RAG 已被证明能显著提升回答的准确性,减少模型幻觉,尤其是在依赖知识的任务中表现尤为出色。尽管可以通过神经网络微调,但它需要消耗大量计算资源,成本高昂,且需要专业技术知识,因此难以适应不断变化的信息环境。

  • RAG好比给学生(模型)提供一本教科书,让它根据特定的问题去查找信息

    • 适用于模型需要解答具体问题或执行特定信息检索任务的情况
    • 不适合于教会模型理解广泛的领域或学习新的语言、格式或风格
  • 微调更像是让学生(模型)通过广泛学习来吸收知识
    • 特别适用于强化模型已有的知识、调整或定制模型的输出,以及给模型下达复杂的指令
    • 不适合于向模型中添加新的知识,或者在需要快速迭代新场景的情况下使用

2.2,Naive RAG

RAG(Retrieval-Augmented Generation,检索增强生成) 是一种结合了信息检索生成式模型的自然语言处理技术,它利用外部知识源为 LLM 提供相关背景并减少幻觉。

**【核心思想】先查资料,再作答。**解决传统的生成模型(比如 GPT、BERT 这类预训练语言模型)只能基于已有知识进行回答。

  • **索引:**在离线状态下,从数据来源处获取数据并建立索引的过程。

    • **数据索引:**包括清理和提取原始数据,将 PDF、HTML、Word、Markdown 等不同格式的文件转换成纯文本。

    • **分块:**将加载的文本分割成更小的片段。

    • 嵌入和创建索引: 将文本编码为向量。

  • 检索(向量搜索):给定一个查询,从外部知识库(如 Wikipedia、企业知识库、向量数据库等)中检索相关文档/段落。

  • **增强(Top-K):**处理检索到的数据,提取并总结与查询上下文最相关的信息。

  • 生成(LLM):将原始查询和检索到的相关文档一起输入到生成模型中,由模型根据这些信息生成回答。

【优势】

  • 知识可更新:只需更新知识库,不必重新训练大模型。

  • 更可靠的回答:可以提供依据或引用。

  • 更适合专有领域:如法律、金融、医疗等。

【局限性】

  • **单次检索,缺乏迭代:**从知识库中检索 top-k 文档,一次性送进生成模型。
  • 无法验证检索结果质量: RAG 不对检索结果的正确性或相关性做任何判断。
  • **无法使用多个知识源:**现实中很多问题需要跨知识域、跨系统。
  • **不具备任务规划或推理能力:**RAG 不会主动拆分任务,不知道怎么进行多跳问答。
  • **上下文窗口有限:**无法充分"阅读"多个长文档,丢失关键信息。
  • **不具备长期记忆与状态跟踪能力:**RAG 是"无记忆的":每次查询都是独立的。

2.3,Graph RAG

**图式 RAG(Graph RAG)**它先将文档构建成图结构,提取实体和关系,然后通过社区检测算法将图划分为不同层次的社区,并为每个社区生成摘要。检索时利用这些层次化的摘要信息,能够更好地回答需要全局理解的问题。

【核心思想】基于图的检索

  • **节点连接性:**捕捉并推理实体之间的关系。

  • **层次化知识管理:**通过基于图的层次结构处理结构化和非结构化数据。

  • **语境丰富:**通过利用图结构路径增强关系理解。

【局限性】

  • 可扩展性有限:依赖于图结构可能限制了系统的可扩展性

  • 图谱构建是一个耗时的离线过程,难以支持实时更新。

  • 从文档中抽取实体关系、构建图谱、进行社区检测、生成摘要等步骤需要大量LLM调用,成本是传统RAG的数倍甚至数十倍。

  • 图谱质量严 重依赖实体关系抽取的准确性,如果抽取有误会影响后续所有环节。

**【问题】**Graph RAG 如何应对增量场景?

  • **局部更新机制,**新增文档时只抽取新的实体关系并增量式地更新受影响的社区,而不是重建整个图谱。
  • **混合架构,**将 GraphRAG 用于相对稳定的核心知识库,而用传统RAG处理频繁更新的内容。
  • **增量社区检测算法,**当新节点加入时只重新计算局部社区结构。

2.4,Agentic RAG

Agentic RAG 是在传统 RAG 的基础上,引入了"智能体(Agent)"理念的一种增强方案。它的目标是让模型更主动、更具规划性地使用检索信息,提升任务完成能力、信息利用率和问答质量。

【核心思想】规划任务+分步检索+迭代生成+验证答案

  • 任务分解:将复杂问题拆解成若干子问题。

  • 多轮检索:每个子问题都可能单独检索信息。

  • 结果验证:对生成内容进行事实验证。

  • 行动规划:比如先查 A,再查 B,最后合成。

  • 错误修正:如果发现回答有误,可回退修正。

【优势】

  • 更强的任务执行力(规划+决策)
  • 可处理复杂、长链、多跳推理问题
  • 支持动态上下文与工具调用

**【局限性】**耗时高

3,Agent 框架

【Agent 框架】LangChain、LangGraph

  • 【LangChain】 优势是上手快、生态成熟,适合线性或简单分支的 Agent 工作流。不足在于控制流和状态管理能力有限,复杂条件分支、循环和多阶段决策不易精细表达。
  • **【LangGraph】**LangGraph 面向复杂、有状态的 Agent 系统,基于图(StateGraph)建模流程。节点表示操作,边表示控制流和状态转移,支持条件分支、循环、并行和共享状态,使多步骤流程可控、可追溯。
  • **本质区别在于控制粒度:****LangChain 偏高层抽象、开发效率优先;LangGraph 偏底层控制、灵活性优先。**实际项目中常先用 LangChain 原型,复杂后迁移或嵌入 LangGraph。

3.1,LangChain

【模型输入/输出】LangChain 中模型输入/输出模块是与各种大语言模型进行交互的基本组件,是大语言模型应用的核心元素。用户原始输入与模型和示例进行组合,然后输入给大语言模型,再根据大语言 模型的返回结果进行输出或者结构化处理。

复制代码
from langchain import PromptTemplate 
template = """ You are a naming consultant for new companies. What is a good name for a company that makes {product}? """ 

prompt = PromptTemplate.from_template(template) 
prompt.format(product="colorful socks")

**【简单 Chat 演示】**LangChain 是一个基于大型语言模型(LLM)开发应用程序的框架,简化了LLM应用程序的开发、生产和部署过程。

复制代码
import os
from langchain_openai import ChatOpenAI
from langchain_core.messages import HumanMessage, SystemMessage

os.environ["TOGETHER_API_KEY"] = "sk-***"

model = ChatOpenAI(
    base_url="https://api.deepseek.com",
    api_key=os.environ["TOGETHER_API_KEY"],
    model="deepseek-chat",)

# 多轮对话
messages = [
  SystemMessage(content="You are a helpful assistant."), 
  HumanMessage(content="Hi AI, how are you today?"), 
  AIMessage(content="I'm great thank you. How can I help you?"), 
  HumanMessage(content="I'd like to understand string theory.") 
] 

# 返回 AIMessage 对象
response = model(messages)
print(response.content)

**【输出解析器】**模型的响应是一个 AIMessage,包含一个字符串响应以及有关响应的其他元数据。

复制代码
from langchain_core.output_parsers import StrOutputParser
parser = StrOutputParser()
result = model.invoke(messages)
print(parser.invoke(result))

或采用**【链条】**将多个大语言模型进行链式组合,或与其他组件进行链式调用

复制代码
chain = model | parser
print(chain.invoke(messages))

**【提示词模板】**PromptTemplates 是 LangChain 中用于管理和构建提示词(prompt)的工具,它的作用是把固定文本和变量结合起来,方便动态生成模型输入。

复制代码
from langchain_core.output_parsers import StrOutputParser
from langchain_core.prompts import ChatPromptTemplate
from langchain_openai import ChatOpenAI

system_template = "Translate the following into {language}:"

prompt_template = ChatPromptTemplate.from_messages(
    [("system", system_template), ("user", "{text}")]
)
model = ChatOpenAI(
    base_url="https://api.deepseek.com",
    api_key="sk-****",
    model="deepseek-chat")
parser = StrOutputParser()
# 将 prompt 模板、模型 和 输出解析器 串联成一个 chain
# chain 会依次执行:生成提示 → 调用模型 → 解析输出
chain = prompt_template | model | parser
print(chain.invoke({"language": "Chinese", "text": "hi"}))

**【指定输出类型】**LangChain 输出结构化的数据,解析为类的实例。

复制代码
from langchain_core.output_parsers import PydanticOutputParser
from langchain_core.prompts import ChatPromptTemplate
from langchain_openai import ChatOpenAI
from pydantic import BaseModel, Field


# 定义输出类
class TranslationResult(BaseModel):
    """翻译结果的结构化输出类"""
    translated_text: str = Field(description="翻译后的文本")
    source_language: str = Field(description="源语言")
    target_language: str = Field(description="目标语言")


# 创建解析器,指定输出为 TranslationResult 类
parser = PydanticOutputParser(pydantic_object=TranslationResult)

system_template = """Translate the following into {language}.

{format_instructions}"""

prompt_template = ChatPromptTemplate.from_messages(
    [("system", system_template), ("user", "{text}")]
)

model = ChatOpenAI(
    base_url="https://api.deepseek.com",
    api_key="sk-***",
    model="deepseek-chat"
)

chain = prompt_template | model | parser

result = chain.invoke({
    "language": "Chinese",
    "text": "Stay curious, and the world will always feel new.",
    "format_instructions": parser.get_format_instructions()
})

print(f"翻译结果: {result.translated_text}")
print(f"源语言: {result.source_language}")
print(f"目标语言: {result.target_language}")

【修改提示词】

复制代码
from langchain.prompts import ChatPromptTemplate

# 创建一个空的ChatPromptTemplate实例
template = ChatPromptTemplate()

# 添加聊天消息提示
template.add_message("system", "You are a helpful AI bot.")
template.add_message("human", "Hello, how are you doing?")
template.add_message("ai", "I'm doing well, thanks!")
template.add_message("human", "What is your name?")

# 修改提示模板
template.set_message_content(0, "You are a helpful AI assistant.")
template.set_message_content(3, "What is your name? Please tell me.")

# 格式化聊天消息
messages = template.format_messages()

print(messages)

【流式传输】在LLM生成回复时,不必等待完整结果返回,而是边生成边输出,让用户实时看到生成进度。

复制代码
from langchain_core.output_parsers import StrOutputParser
from langchain_core.prompts import ChatPromptTemplate
from langchain_openai import ChatOpenAI
from pydantic import BaseModel, Field

class TranslationResult(BaseModel):
    translated_text: str = Field(description="翻译后的文本")
    source_language: str = Field(description="源语言")
    target_language: str = Field(description="目标语言")


# 创建模型实例
model = ChatOpenAI(
    base_url="https://api.deepseek.com",
    api_key="sk-***",
    model="deepseek-chat",
    streaming=True
)

simple_template = "Translate the following into {language}:"
simple_prompt = ChatPromptTemplate.from_messages(
    [("system", simple_template), ("user", "{text}")]
)

stream_chain = simple_prompt | model | StrOutputParser()

print("翻译中: ", end="", flush=True)
for chunk in stream_chain.stream({
    "language": "Chinese",
    "text": "Stay curious, and the world will always feel new."
}):
    print(chunk, end="", flush=True)
print("\n")

3.3,ReAct

ReAct(Reasoning + Acting)是一种 将"推理过程"和"工具调用"交替结合的 Agent 架构 ,核心目标是让模型在多步任务中,一边思考、一边与外部环境交互,而不是一次性给出答案。ReAct 将模型的行为拆成三个循环阶段**:****Thought(思考)→ Action(行动)→ Observation(观察)**。让大模型先进行思考,思考完再进行行动,然后根据行动的结果再进行观察,再进行思考,这样一步一步循环下去。

【Reasoning】

  • 动态思考链(Chain-of-Thought) :Agent在每一步生成自然语言推理逻辑,解释当前决策原因(如:"用户需要查天气,需先获取位置信息")。
  • 错误回溯机制:当行动失败时,Agent能分析原因并调整策略(如:"API返回错误,可能是参数格式问题,重试前需校验输入")。

【Acting】

  • 工具集成(Tool Calling) :调用外部API、数据库、计算器等(如:search_weather(location="Beijing"))。
  • 环境状态感知:实时接收行动结果,作为下一步决策的输入(如:"获取到北京气温25°C,建议用户带薄外套")。
    **【COT 思维链】****通过在少样本学习中提供一系列中间推理步骤作为"思路链",可以明显改善语言模型在算术、常识推理和符号推理任务上的表现。**COT 模拟了人类逐步推理的过程,让语言模型也能够逐步组织语言进行多步推理。与只给出最终输出的标准提示学习不同,COT 提供了从输入到输出的完整推理路径。这模拟了人类逐步思考解决复杂问题的过程。
相关推荐
longfei.li2 小时前
AI项目工程化落地如何降本30%?
人工智能·语言模型
汉克老师2 小时前
小学生0基础学大语言模型应用(第4课 《数字盒子与算数魔法》)
人工智能·语言模型·自然语言处理·小学生0基础学习大语言模型
阿拉斯攀登2 小时前
设计模式:构建者模式
设计模式·建造者模式·构建者模式
雅欣鱼子酱2 小时前
Type-C受电端芯片ECP5702演示:串口发送电压电流,给外部MCU读取
c语言·人工智能·单片机·嵌入式硬件·芯片·电子元器件
ECT-OS-JiuHuaShan2 小时前
麻烦是第一推动力,不厌其烦就是负熵流
开发语言·人工智能·数学建模·学习方法·量子计算
skywalk81632 小时前
关于创建中文编程语言及自然语言转MoonBit的整合分析报告
大数据·人工智能
TMT星球2 小时前
欧瑞博推出全新集成方案,用谷电做空调,一晚只需一度电
人工智能·语音识别
阿标在干嘛2 小时前
使用科力辰app与依赖传统渠道获取科技业务信息的效率差
大数据·人工智能·科技
newsxun2 小时前
首都现代物流骨干网络体系正式启动
大数据·人工智能