RAG实战-从Naive到Agentic的完整演进路径
- 引言
1.1 RAG 技术演进背景
2020 年,Google 的 Lewis 等人发表了一篇里程碑式的论文 Retrieval-Augmented Generation for Knowledge-Intensive NLP Tasks,正式提出了 RAG 框架。其核心思想极其朴素:让大语言模型在生成回答之前,先从外部知识库中检索相关文档,以此作为生成的依据。
这一思想在两年后随着 ChatGPT 的爆发性增长而被重新发现和大规模拥抱。企业们很快意识到,RAG 是解决大语言模型三大核心痛点的最佳方案:
知识时效性:模型训练数据截止于某个时间点,无法回答最新的问题
幻觉问题:模型可能生成看似合理但实际错误的内容
私有知识:模型无法访问企业内部的专有数据
然而,在实践中,简单的 Naive RAG 方案在复杂场景下表现乏力。检索不精准、上下文利用率低、缺乏推理能力等问题逐渐暴露。于是,学术界和工业界开始了对 RAG 技术的持续演进——从模块化的改进,到高级检索策略,再到 Agent 驱动的自主决策。
1.2 为什么需要演进
根据 Stanford HAI 发布的 2024 年 AI Index 报告,在企业级 RAG 部署中,超过 62% 的项目在 Naive RAG 阶段就遇到了性能瓶颈。具体来说:
召回率低(检索不到相关文档):78% 的项目,严重程度高
精度不足(检索到的文档不相关):65% 的项目,严重程度高
多跳推理失败(无法跨文档推理):53% 的项目,严重程度中
上下文窗口浪费(信息冗余/截断):47% 的项目,严重程度中
对抗性查询崩溃:31% 的项目,严重程度低
这些数据清晰地表明:RAG 的演进不是学术界的"过度设计",而是工业实践中的必然选择。
1.3 本文结构与阅读指南
本文按照 RAG 技术的演进脉络组织,共分为五个主要阶段:
阅读建议:
如果你是 RAG 初学者,建议按顺序阅读全文
如果你已有 Naive RAG 经验,可直接从第 3 节开始
如果你在评估技术选型,重点关注第 6 节的对比分析
每个章节都包含完整的可运行代码,建议边读边实践
- Naive RAG:起点与困境
2.1 架构原理
Naive RAG 的架构可以概括为三个阶段的线性流水线:
数据流向:向量数据库(Embedding)→ 检索 → 增强 → 生成 → 最终回答
阶段一:索引(Indexing)——将文档分割为固定大小的文本块(chunk),对每个块计算 Embedding 向量并存入向量数据库。
阶段二:检索(Retrieval)——将用户查询计算为向量,通过相似度搜索(通常是余弦相似度)从向量数据库中检索 Top-K 个相关块。
阶段三:生成(Generation)——将检索到的文本块与用户查询拼接成 Prompt,发送给 LLM 生成最终回答。
这个流程简单直接,也是大多数 RAG 项目的起点。但正是这种简单性,埋下了后续种种问题的种子。
2.2 核心问题一:召回率低
召回率(Recall@K)是衡量 RAG 系统最重要的指标之一,它表示所有相关文档中有多少被成功检索到了。Naive RAG 的召回率低,根本原因在于 Embedding 模型的语义匹配存在固有局限。
具体问题表现:
-
语义漂移(Semantic Drift):Embedding 模型在处理长文本时,往往会丢失局部细节信息。一个包含多个事实的长 chunk,其 Embedding 向量可能只反映了其中某一个主题的语义。
-
关键词匹配缺失:纯向量检索无法有效处理需要精确关键词匹配的场景。例如,当用户查询特定的产品型号、代码函数名或法律条文编号时,语义相似度可能无法捕捉到这种精确匹配。
-
维度灾难:在高维向量空间中,余弦相似度的区分度会下降。当向量维度超过 512 后,"最近邻"和"最远邻"的距离差异可能变得微乎其微。
2.3 核心问题二:推理能力弱
Naive RAG 采用单轮检索策略——对用户的原始查询只检索一次。这种策略在面对需要多跳推理(Multi-hop Reasoning)的复杂问题时完全失效。
多跳推理示例:
用户问题:“2023 年收购了 Activision Blizzard 的公司,其 CEO 在哪所大学获得的 MBA 学位?”
这个问题需要:
- 第一步:找到收购 Activision Blizzard 的公司 → Microsoft
- 第二步:找到 Microsoft 的 CEO → Satya Nadella
- 第三步:找到 Satya Nadella 的 MBA 学位信息 → University of Chicago
Naive RAG 只有一次检索机会,用原始查询去检索,很可能在第一步就检索不到正确的文档。
2.4 核心问题三:上下文利用率低
Naive RAG 简单地将检索到的文本块拼接在一起,直接送入 LLM。这种方式存在两个问题:
-
信息冗余:Top-K 检索返回的多个块之间往往有大量重叠信息,浪费宝贵的上下文窗口。
-
丢失顺序:文本块之间的逻辑顺序和因果关系被完全忽略,LLM 拿到的是一堆碎片化的信息。
-
“Lost in the Middle” 现象:根据斯坦福大学的研究,LLM 倾向于关注 Prompt 的开头和结尾,中间部分的信息容易被忽略。Naive RAG 将检索结果放在中间位置,恰好是模型注意力最弱的区域。
2.5 代码实现:Naive RAG 的 LangChain 实现
以下是完整的 Naive RAG 实现代码,使用 LangChain 框架构建:
【Python 代码示例 — Naive RAG 完整实现】
前置依赖:pip install langchain langchain-openai langchain-chroma langchain-community
环境变量:OPENAI_API_KEY=your-api-key-here
第一步,导入依赖:
PYTHON
import os
from langchain_openai import OpenAIEmbeddings, ChatOpenAI
from langchain_chroma import Chroma
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain.document_loaders import TextLoader
from langchain.prompts import ChatPromptTemplate
from langchain.schema.output_parser import StrOutputParser
from langchain.schema.runnable import RunnablePassthrough
第一步:文档加载与分块
使用 RecursiveCharacterTextSplitter 将文档按固定大小切分为文本块。chunk_size 参数控制每个块的最大字符数(越小检索越精准但可能丢失上下文),chunk_overlap 控制相邻块之间的重叠字符数(保留重叠可确保跨越边界的语义不被切断)。分块器优先在段落边界处分割,其次在句子边界,最后在单词边界。
PYTHON
def load_and_split_documents(file_path, chunk_size=500, chunk_overlap=50):
loader = TextLoader(file_path, encoding=“utf-8”)
documents = loader.load()
text_splitter = RecursiveCharacterTextSplitter(
chunk_size=chunk_size,
chunk_overlap=chunk_overlap,
length_function=len,
separators=[“\n\n\n”, “\n\n”, “\n”, “。”, “.”, ", ", " "],
)
chunks = text_splitter.split_documents(documents)
return chunks
第二步:向量化与存储
将文本块通过 Embedding 模型转换为向量并存入 Chroma 向量数据库。这里使用的是 OpenAI 的 text-embedding-3-small 模型,生成 1536 维的向量。对于中文场景,可以考虑替换为 BAAI/bge-large-zh-v1.5 等针对中文优化的 Embedding 模型。
PYTHON
def create_vector_store(chunks, persist_directory=“./chroma_db”):
embeddings = OpenAIEmbeddings(model=“text-embedding-3-small”)
vector_store = Chroma.from_documents(
documents=chunks,
embedding=embeddings,
persist_directory=persist_directory,
)
return vector_store
第三步:构建 RAG 链
构建 Naive RAG 链:检索 → 增强 → 生成。使用 LangChain 的 LCEL(LangChain Expression Language),管道操作符 | 表示将上一个组件的输出作为下一个组件的输入。
PYTHON
def build_naive_rag_chain(vector_store, llm_model=“gpt-4o-mini”):
retriever = vector_store.as_retriever(
search_type=“similarity”,
search_kwargs={“k”: 2}
)
prompt = ChatPromptTemplate.from_template(“”"
你是一个专业的问答助手。请根据以下提供的上下文信息,回答用户的问题。
上下文信息:{context}
用户问题:{question}
回答要求:
1. 只基于提供的上下文信息回答
2. 如果上下文信息不足以回答问题,请明确说明
3. 不要引入上下文之外的外部知识
4. 回答要简洁、准确、有条理
“”")
llm = ChatOpenAI(model=llm_model, temperature=0)
rag_chain = (
{“context”: retriever | format_docs, “question”: RunnablePassthrough()}
| prompt
| llm
| StrOutputParser()
)
return rag_chain
def format_docs(docs):
return “\n\n”.join(doc.page_content for doc in docs)
第四步:运行与测试
PYTHON
def main():
chunks = load_and_split_documents(“your_document.txt”)
vector_store = create_vector_store(chunks)
rag_chain = build_naive_rag_chain(vector_store)
test_queries = [
“文档中提到的核心技术是什么?”,
“这种方法相比之前的方法有什么优势?”,
“实验结果如何?”,
]
for query in test_queries:
retrieved_docs = vector_store.as_retriever().invoke(query)
print(f"检索到 {len(retrieved_docs)} 个文档块")
answer = rag_chain.invoke(query)
print(f"回答:\n{answer}")
if __name__ == “__main__”:
main()
2.6 Naive RAG 性能数据
以下是 Naive RAG 在几个代表性基准测试上的表现(基于公开文献和内部测试的综合数据):
2WikiMultiHopQA(多跳推理):28.5% 准确率 — 需要 2-4 跳推理的复杂问答
MuSiQue(多跳推理):19.2% 准确率 — 更困难的多跳推理数据集
NQ (Natural Questions)(单跳问答):52.3% 准确率 — 标准单跳问答
TriviaQA(知识问答):58.7% 准确率 — 基于知识的问答
MMLU (open-book)(多领域知识):45.1% 准确率 — 大规模多任务语言理解
企业私有 QA(内部知识问答):41.8% 准确率 — 某金融企业实测数据
关键发现:
Naive RAG 在简单单跳问答场景下尚可接受(50-60% 准确率)
在多跳推理场景下表现严重不足(低于 30%)
在企业私有知识场景下,由于文档质量和领域专业性问题,表现进一步下降
- Modular RAG:模块化改进
3.1 设计理念
Naive RAG 的流水线是刚性的:检索 → 增强 → 生成,一步到位。Modular RAG(模块化 RAG)的核心理念是:将 RAG 流水线的每个阶段解耦为独立的、可替换的模块,针对每个模块进行精细化优化。
Naive RAG(刚性流水线):检索 → 增强 → 生成
Modular RAG(灵活组合):检索 → 重排 → 压缩 → 增强 → 生成(每个模块可插拔替换)
2024 年 2 月,新加坡国立大学 Jian et al. 发表了 Modular RAG: Transforming RAG Systems into LEGO-like Fleixible Architectures,系统性地提出了模块化 RAG 的框架,将 RAG 流水线解构为以下核心模块:
嵌入策略(Embedding Strategy):如何表示文档和查询
检索器(Retriever):如何查找相关文档
重排器(Reranker):如何优化检索结果的排序
压缩器(Compressor):如何减少冗余信息
增强器(Augmenter):如何将信息组织成 Prompt
生成器(Generator):如何生成最终回答
3.2 嵌入策略优化
3.2.1 混合嵌入(Hybrid Embedding)
纯向量检索的致命缺陷是无法进行精确关键词匹配。混合嵌入的核心思想是同时使用向量检索和关键词检索(BM25),然后将两者的结果融合。
向量检索结果:D3, D7, D1, D9(按语义相似度排序)
BM25 检索结果:D1, D3, D5, D8(按关键词匹配排序)
融合方式:使用 RRF 算法将两个排序列表融合
融合后结果:D1, D3, D7, D5, D9, D8(综合排序)
RRF(Reciprocal Rank Fusion) 是最常用的融合算法:RRF(d) = ∑(1 / (k + rank(d))),其中 k 是常数(通常取 60),rank(d) 是文档 d 在排名列表中的位置。
3.2.2 多向量检索(Multi-Vector Retrieval)
传统的 Embedding 是一个 Chunk 对应一个向量。多向量检索则为每个文档生成多个向量表示:
摘要向量:基于文档摘要生成的向量(更聚焦核心主题)
摘要+内容向量:摘要与内容拼接后的向量
母文档向量:整个文档级别的向量(用于粗筛)
在检索时,可以先用母文档向量做粗筛,再用子块向量做精筛,兼顾召回率和精度。
3.3 检索优化:重排序(Reranking)
重排序是 Modular RAG 中性价比最高的优化手段。它的思路很简单:
- 第一步:用快速的向量检索从海量文档中召回 Top-100(高召回、低精度)
- 第二步:用一个更精确但更慢的 Cross-Encoder 模型对 Top-100 重新打分排序,选出 Top-5
Cross-Encoder 之所以比 Bi-Encoder(向量检索)更精确,是因为它在同一个注意力机制中同时观察查询和文档,可以进行细粒度的交互计算。代价是速度慢一个数量级——所以必须先通过向量检索做粗筛,将候选集缩小到合理范围,再用 Cross-Encoder 精排。
3.4 代码实现:Modular RAG 的 LangChain 实现
【Python 代码示例 — Modular RAG 完整实现】
在 Naive RAG 的基础上,引入混合检索、重排序和上下文压缩三大优化模块。
前置依赖:pip install langchain langchain-openai langchain-chroma langchain-community rank_bm25
环境变量:OPENAI_API_KEY=your-api-key-here
PYTHON
import os
from typing import List
from langchain_openai import OpenAIEmbeddings, ChatOpenAI
from langchain_chroma import Chroma
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain.document_loaders import TextLoader
from langchain.retrievers import EnsembleRetriever
from langchain.prompts import ChatPromptTemplate
from langchain.schema.output_parser import StrOutputParser
from langchain.schema.runnable import RunnablePassthrough
from rank_bm25 import BM25Okapi
import numpy as np
模块 1:混合嵌入与混合检索
HybridRetriever 融合向量检索(语义相似度)和 BM25(关键词匹配)。向量检索擅长捕获语义相似度但无法处理精确关键词匹配,BM25 擅长关键词匹配但无法捕获语义关系,两者互补效果更佳。使用 RRF(Reciprocal Rank Fusion)算法融合两个排序列表。
PYTHON
class HybridRetriever:
def __init__(self, vector_store, documents, alpha=0.5):
self.vector_store = vector_store
self.documents = documents
self.alpha = alpha
self.bm25 = BM25Okapi(
[doc.page_content.split() for doc in documents]
)
def retrieve(self, query, top\_k=5):
vector\_results = self.vector\_store.similarity\_search\_with\_score(
query, k=len(self.documents)
)
tokenized\_query = query.split()
bm25\_scores = self.bm25.get\_scores(tokenized\_query)
# RRF 融合
vector\_ranks = {doc.metadata.get("id", str(i)): rank
for rank, (doc, \_) in enumerate(vector\_results)}
bm25\_ranks = {}
sorted\_indices = np.argsort(bm25\_scores)[::-1]
for rank, idx in enumerate(sorted\_indices):
doc\_id = self.documents[idx].metadata.get("id", str(idx))
bm25\_ranks[doc\_id] = rank
all\_doc\_ids = set(vector\_ranks.keys()) | set(bm25\_ranks.keys())
rrf\_scores = {}
for doc\_id in all\_doc\_ids:
v\_rank = vector\_ranks.get(doc\_id, len(self.documents))
b\_rank = bm25\_ranks.get(doc\_id, len(self.documents))
rrf\_scores[doc\_id] = (
self.alpha / (60 + v\_rank) +
(1 - self.alpha) / (60 + b\_rank)
)
sorted\_docs = sorted(rrf\_scores.items(), key=lambda x: x[1], reverse=True)
top\_doc\_ids = [doc\_id for doc\_id, \_ in sorted\_docs[:top\_k]]
results = []
for i, doc in enumerate(self.documents):
if doc.metadata.get("id", str(i)) in top\_doc\_ids:
results.append(doc)
return results
模块 2:重排序(Reranking)
使用 Embedding 相似度对初步检索结果进行二次排序。在生产环境中可替换为 Cross-Encoder(如 BGE-Reranker)获得更高精度。
PYTHON
class RerankingModule:
def __init__(self, embeddings, top_n=3):
self.embeddings = embeddings
self.top_n = top_n
def rerank(self, query, documents):
if len(documents) <= self.top\_n:
return documents
doc\_embeddings = self.embeddings.embed\_documents(
[doc.page\_content for doc in documents]
)
query\_embedding = self.embeddings.embed\_query(query)
similarities = []
for doc\_emb in doc\_embeddings:
sim = np.dot(query\_embedding, doc\_emb) / (
np.linalg.norm(query\_embedding) \* np.linalg.norm(doc\_emb)
)
similarities.append(sim)
ranked\_indices = np.argsort(similarities)[::-1]
return [documents[i] for i in ranked\_indices[:self.top\_n]]
模块 3:上下文压缩(Compression)
两种压缩策略:(1) EmbeddingsFilter 去除与查询语义过于接近的冗余文档;(2) LLMChainFilter 使用 LLM 判断文档是否与问题相关。
PYTHON
class ContextCompressionModule:
def __init__(self, embeddings, llm):
from langchain.retrievers.document_compressors import (
EmbeddingsFilter, LLMChainFilter
)
self.embeddings_filter = EmbeddingsFilter(
embeddings=embeddings, similarity_threshold=0.75,
)
self.llm_filter = LLMChainFilter.from_llm(
llm=llm,
prompt=ChatPromptTemplate.from_template(“”"
判断以下文档是否包含回答用户问题所需的信息。
用户问题:{question}
文档内容:{document_content}
只回答 “YES” 或 “NO”。
“”"),
)
def compress(self, query, documents):
filtered\_docs = self.embeddings\_filter.compress\_documents(
documents, query
)
relevant\_docs = self.llm\_filter.compress\_documents(
filtered\_docs, query
)
return relevant\_docs
主流程:组装 Modular RAG
PYTHON
def build_modular_rag(file_path):
loader = TextLoader(file_path, encoding=“utf-8”)
documents = loader.load()
text_splitter = RecursiveCharacterTextSplitter(
chunk_size=500, chunk_overlap=50,
)
chunks = text_splitter.split_documents(documents)
embeddings = OpenAIEmbeddings(model=“text-embedding-3-small”)
vector_store = Chroma.from_documents(chunks, embeddings)
llm = ChatOpenAI(model=“gpt-4o-mini”, temperature=0)
hybrid_retriever = HybridRetriever(vector_store, chunks, alpha=0.5)
reranker = RerankingModule(embeddings, top_n=3)
compressor = ContextCompressionModule(embeddings, llm)
prompt = ChatPromptTemplate.from\_template("""
你是一个专业的问答助手。根据以下上下文信息回答用户问题。
上下文信息(已按相关性排序,越前面的越重要):{context}
用户问题:{question}
回答要求:1. 优先使用相关性最高的文档 2. 只基于提供的上下文
3. 信息不足时明确说明 4. 回答简洁准确有条理
""")
def modular\_rag\_pipeline(query):
retrieved = hybrid\_retriever.retrieve(query, top\_k=10)
reranked = reranker.rerank(query, retrieved)
compressed = compressor.compress(query, reranked)
context = "\n\n---\n\n".join(
f"[文档 {i+1}]\n{doc.page\_content}"
for i, doc in enumerate(compressed)
)
response = llm.invoke(prompt.format(question=query, context=context))
return response.content
return modular\_rag\_pipeline
def main():
rag = build_modular_rag(“your_document.txt”)
answer = rag(“文档中提到的核心技术方案是什么?”)
print(f"回答:\n{answer}")
if __name__ == “__main__”:
main()
3.5 Modular RAG 性能对比
混合检索 (BM25 + Vector):准确率 45.1% → 52.3%,提升 +7.2%,Token 开销 +5%
重排序 (Reranking):准确率 45.1% → 50.8%,提升 +5.7%,Token 开销 +15%
上下文压缩:准确率 45.1% → 47.2%,提升 +2.1%,Token 开销 -30%
全部模块启用:准确率 45.1% → 58.7%,提升 +13.6%,Token 开销 +25%
实践洞察:
混合检索是最值得优先实施的优化——实现成本低(几行代码),效果提升显著(+7.2%)
重排序在文档数量大时效果更明显——候选池越大,精排的价值越高
上下文压缩的主要价值是节省成本——在保持甚至提升精度的同时减少 30% 的 Token 消耗
- Advanced RAG:增强检索
4.1 核心理念
如果说 Modular RAG 关注的是流水线上每个模块的独立优化,那么 Advanced RAG(高级 RAG)则更关注索引结构和查询理解层面的增强。它的核心思想是:
Advanced RAG 不再满足于"检索到了"这个基本目标,而是追求"检索到最对的、最相关的、最有助于生成的内容"。
4.2 索引优化
4.2.1 层次化索引(Hierarchical Indices)
Naive RAG 中,所有文档块是扁平的,一视同仁。层次化索引引入了摘要-详情的两层结构:
- 顶层(Summary Level):摘要/标题 — 小、精、聚焦
- 底层(Detail Level):详细文档块 — 大、全、丰富
工作流程:
- 用户查询首先与摘要层匹配(因为摘要更短、更聚焦, Embedding 质量更高)
- 找到相关的摘要后,追溯到对应的详细文档块
- 将详细文档块作为上下文送入 LLM
这种方式的优势在于:摘要的 Embedding 比长文本块的 Embedding 语义更清晰,因此首轮检索更精准。
4.2.2 图索引(Graph Indices)
当文档之间存在复杂的知识关联时,知识图谱(Knowledge Graph)可以显著提升检索质量。LlamaIndex 等框架已经原生支持 Graph + Vector 的混合检索。
- 识别实体:“Microsoft”
- Graph 遍历:Microsoft → (收购) → OpenAI;Microsoft → (合作) → GitHub;Microsoft → (产品) → Azure AI
- 返回所有关联实体的文档
4.3 查询变换(Query Transformation)
查询变换是 Advanced RAG 中效果最显著的技术之一。它的核心观点是:
4.3.1 查询重写(Query Rewriting)
使用 LLM 将用户的原始查询重写为更适合检索的形式。例如,原始查询 "那家做 ChatGPT 的公司最近有什么大动作?" 被重写为 "OpenAI 2024 年 最新产品发布 公司战略"。
查询重写可以解决口语化、代词消解、省略等问题。
4.3.2 子问题分解(Sub-Question Decomposition)
对于复杂问题,将其分解为多个子问题,分别检索:
- 原始查询:“2023年AI领域的重大突破有哪些?它们分别来自哪些公司?”
- 分解为:
- Q1: “2023年AI领域有哪些重大突破?”
- Q2: “GPT-4 是由哪家公司发布的?”
- Q3: “Stable Diffusion 是由哪家公司开发的?”
- Q4: “LLaMA 是由哪家公司发布的?”
- 分别检索 Q1-Q4 → 合并所有结果 → 生成回答
子问题分解的核心价值在于:每个子问题的检索查询更加精确,因此召回的文档质量更高。
4.3.3 HyDE(Hypothetical Document Embeddings)
HyDE 是一个相当巧妙的技术。它的思路是:
- 先用 LLM 生成一个"假设的完美回答"(不依赖真实知识,只是一个格式模板)
- 用这个假设文档的 Embedding 去检索
- 假设文档的语义与真实相关文档的语义空间更接近
研究表明,在某些场景下 HyDE 比直接用查询检索的准确率提升 10-15%。
4.4 路由机制(Routing)
当系统面对多个数据源时,路由模块负责自动选择最合适的数据源和检索策略:
- 用户查询 → 路由分类器(Query Router,LLM 判断查询类型)
- 分类结果分发:代码文档(向量检索)、API 文档(精确匹配)、业务知识(混合检索)
- 合并各路径结果 → 生成回答
4.5 代码实现:Advanced RAG 的完整实现
【Python 代码示例 — Advanced RAG 完整实现】
实现查询变换、层次化索引和路由三大增强技术。
前置依赖:pip install langchain langchain-openai langchain-chroma langchain-community
环境变量:OPENAI_API_KEY=your-api-key-here
PYTHON
import os
from typing import List, Optional
from langchain_openai import OpenAIEmbeddings, ChatOpenAI
from langchain_chroma import Chroma
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain.document_loaders import TextLoader
from langchain.prompts import ChatPromptTemplate
from langchain.schema.output_parser import StrOutputParser
from langchain.schema.runnable import RunnablePassthrough, RunnableLambda
from langchain.schema.document import Document
查询变换模块
QueryTransformer 支持三种策略:(1) 查询重写 — 将口语化表达转为正式技术术语;(2) 子问题分解 — 将复杂查询拆分为多个可独立检索的子问题;(3) HyDE — 生成假设性回答文档,利用其 Embedding 检索真实文档。
PYTHON
class QueryTransformer:
def __init__(self, llm):
self.llm = llm
def rewrite\_query(self, query):
"""将用户原始查询重写为更适合检索的形式"""
rewrite\_prompt = ChatPromptTemplate.from\_template("""
你是一个查询优化助手。将以下用户查询重写为更适合搜索引擎检索的形式。
用户原始查询:{query}
重写规则:1. 将口语化表达替换为正式技术术语 2. 补全被省略的主语
3. 添加相关关键词 4. 解析代词为具体实体
重写后的查询:
""")
response = self.llm.invoke(rewrite\_prompt.format(query=query))
return response.content.strip()
def decompose\_query(self, query, max\_subquestions=4):
"""将复杂查询分解为多个子问题"""
decompose\_prompt = ChatPromptTemplate.from\_template("""
你是一个查询分解助手。将以下复杂查询分解为多个可以独立回答的子问题。
用户查询:{query}
最多分解为 {max\_subquestions} 个子问题,每个子问题独占一行。
子问题列表:
""")
response = self.llm.invoke(
decompose\_prompt.format(
query=query, max\_subquestions=max\_subquestions
)
)
subquestions = [
line.strip()
for line in response.content.strip().split("\n")
if line.strip() and not line.strip().isdigit()
]
import re
cleaned = [re.sub(r'^\d+[\.\)、]\s\*', '', sq).strip()
for sq in subquestions]
return cleaned if cleaned and len(cleaned) > 1 else [query]
def generate\_hypothetical\_document(self, query):
"""生成假设性回答文档用于改进检索质量(HyDE)"""
hyde\_prompt = ChatPromptTemplate.from\_template("""
请针对以下问题,生成一段可能的回答文档。
你不需要确保回答完全准确,只需要生成一段语义和风格上与
真实文档相似的文字即可。
问题:{query}
生成的回答文档:
""")
response = self.llm.invoke(hyde\_prompt.format(query=query))
return response.content.strip()
层次化索引模块
HierarchicalIndex 实现两层索引结构:摘要层 + 详细文档层。检索时先匹配摘要(语义更清晰),再追溯到对应的详细文档块。
PYTHON
class HierarchicalIndex:
def __init__(self, embeddings):
self.summary_store = Chroma(
collection_name=“summaries”,
embedding_function=embeddings,
persist_directory=“./chroma_summaries”
)
self.detail_store = Chroma(
collection_name=“details”,
embedding_function=embeddings,
persist_directory=“./chroma_details”
)
self.summary_to_details = {}
def build\_index(self, documents):
text\_splitter = RecursiveCharacterTextSplitter(
chunk\_size=500, chunk\_overlap=50,
)
for i, doc in enumerate(documents):
summary = doc.page\_content[:500]
summary\_doc = Document(
page\_content=summary,
metadata={"source\_id": i, "type": "summary"},
)
chunks = text\_splitter.split\_documents([doc])
detail\_docs = []
for j, chunk in enumerate(chunks):
chunk.metadata["source\_id"] = i
chunk.metadata["chunk\_id"] = j
chunk.metadata["type"] = "detail"
detail\_docs.append(chunk)
self.summary\_store.add\_documents([summary\_doc])
self.detail\_store.add\_documents(detail\_docs)
self.summary\_to\_details[i] = [
f"{i}\_{j}" for j in range(len(chunks))
]
def retrieve(self, query, top\_k=3):
"""两阶段检索:先检索摘要,再检索详细文档"""
summary\_results = self.summary\_store.similarity\_search(query, k=top\_k)
relevant\_source\_ids = set()
for summary in summary\_results:
relevant\_source\_ids.add(summary.metadata["source\_id"])
all\_results = []
for source\_id in relevant\_source\_ids:
detail\_results = self.detail\_store.similarity\_search(
query, k=5, filter={"source\_id": source\_id}
)
all\_results.extend(detail\_results)
return all\_results
路由模块
QueryRouter 根据查询类型(factual / analytical / code / creative)自动选择最优检索策略。
PYTHON
class QueryRouter:
def __init__(self, llm):
self.llm = llm
self.route_prompt = ChatPromptTemplate.from_template(“”"
分析以下用户查询,判断类型:factual(事实性)、
analytical(分析性)、code(代码相关)、creative(创意性)。
只输出类型名称。
用户查询:{query}
查询类型:
“”")
def route(self, query):
response = self.llm.invoke(self.route\_prompt.format(query=query))
return response.content.strip().lower()
主流程:组装 Advanced RAG
PYTHON
def build_advanced_rag(file_paths):
llm = ChatOpenAI(model=“gpt-4o-mini”, temperature=0)
embeddings = OpenAIEmbeddings(model=“text-embedding-3-small”)
all_docs = []
for path in file_paths:
loader = TextLoader(path, encoding=“utf-8”)
all_docs.extend(loader.load())
hierarchical\_index = HierarchicalIndex(embeddings)
hierarchical\_index.build\_index(all\_docs)
query\_transformer = QueryTransformer(llm)
router = QueryRouter(llm)
prompt = ChatPromptTemplate.from\_template("""
你是一个专业的问答助手。根据以下检索到的上下文回答用户问题。
上下文信息:{context}
用户问题:{question}
请基于上下文信息给出准确、详细的回答。如果上下文不足,请明确说明。
""")
def advanced\_rag\_pipeline(query):
query\_type = router.route(query)
if query\_type == "analytical":
subquestions = query\_transformer.decompose\_query(query)
all\_docs = []
for sq in subquestions:
docs = hierarchical\_index.retrieve(sq, top\_k=2)
all\_docs.extend(docs)
elif query\_type == "code":
rewritten = query\_transformer.rewrite\_query(query)
all\_docs = hierarchical\_index.retrieve(rewritten, top\_k=3)
else:
all\_docs = hierarchical\_index.retrieve(query, top\_k=3)
# 去重
seen = set()
unique\_docs = []
for doc in all\_docs:
if doc.page\_content not in seen:
seen.add(doc.page\_content)
unique\_docs.append(doc)
context = "\n\n---\n\n".join(doc.page\_content for doc in unique\_docs)
response = llm.invoke(
prompt.format(question=query, context=context)
)
return response.content
return advanced\_rag\_pipeline
def main():
rag = build_advanced_rag([“doc1.txt”, “doc2.txt”])
test_queries = [
“2023年AI领域有哪些重大突破?”,
“Transformer 中的注意力机制如何计算?”,
“请解释 PyTorch 中 nn.Linear 的实现原理”,
]
for q in test_queries:
answer = rag(q)
print(f"回答:\n{answer}")
if __name__ == “__main__”:
main()
4.6 Advanced RAG 性能数据
多跳推理 (3-hop):28.5% → 45.2%,提升 +16.7%
多跳推理 (4-hop):19.2% → 33.8%,提升 +14.6%
关键词查询 (精确匹配):52.1% → 68.3%,提升 +16.2%
口语化查询 (自然语言):44.7% → 57.9%,提升 +13.2%
跨文档综合 (分析类):35.4% → 51.6%,提升 +16.2%
关键发现:
Advanced RAG 在所有查询类型上都有显著提升
多跳推理是最大的受益者(+14-17%),因为子问题分解天然适合多跳场景
关键词查询提升最大(+16.2%),查询重写有效解决了口语化和模糊匹配问题
- Agentic RAG:Agent 驱动的 RAG
5.1 核心理念
Agentic RAG 代表了 RAG 技术的最新发展方向。其核心理念可以概括为一句话:
如果说 Naive RAG 是一条固定的传送带,Modular RAG 是一套可拼接的乐高积木,Advanced RAG 是一个智能的交通调度系统,那么 Agentic RAG 就是一个拥有自主决策能力的"智能助手"——它可以根据任务的复杂程度和当前状态,自主决定下一步该做什么。
- Naive RAG:检索 → 生成(固定流水线)
- Modular RAG:检索 → 重排 → 压缩 → 生成(可配置流水线)
- Advanced RAG:查询变换 → 检索 → 生成(智能预处理)
- Agentic RAG:Agent 自主决策(检索?查数据库?调用 API?继续推理?)
5.2 Agent 决策机制
5.2.1 ReAct(Reason + Act)
ReAct 是 Agentic RAG 中最核心的决策框架。它由 Stanford 大学在 2022 年提出,将**推理(Reasoning)和行动(Acting)**交替进行:
- Thought:“我需要先检索关于 X 的信息”
- Action:search(“X”)
- Observation:“检索返回了 5 个文档…”
- Thought:“文档 A 相关,但还需要更多关于 Y 的信息”
- Action:search(“Y”)
- Observation:“检索返回了 3 个文档…”
- Thought:“信息已经足够了”
- Final Answer:生成最终回答
ReAct 的关键优势在于每一步都有明确的推理过程,这使得 Agent 的行为具有可解释性——你可以看到它每一步在想什么、做了什么、观察到了什么。
5.2.2 Plan-and-Execute
Plan-and-Execute 是另一种重要的 Agent 策略。它将任务分为两个阶段:
-
Plan(规划):将复杂任务分解为有序的子任务序列
-
Execute(执行):按顺序执行每个子任务,并根据执行结果动态调整
-
检索 Microsoft 最近的 AI 相关收购
-
检索 Microsoft 的 AI 产品列表
-
检索 Microsoft AI 团队的组织架构
-
综合以上信息撰写分析报告
- 步骤 1 完成 → 发现 Microsoft 收购了 OpenAI
- 步骤 2 完成 → 发现 Azure AI 是核心产品
- 步骤 3 完成 → 发现 Mustapha Mustapha 是 AI 负责人
- 步骤 4 执行 → 综合以上信息生成报告
Plan-and-Execute 的优势在于全局视角——Agent 在执行之前先规划整个任务路径,避免了 ReAct 可能出现的"短视"问题。
5.3 多工具调用
Agentic RAG 的 Agent 可以调用多种工具来完成任务,而不仅仅是文本检索:
文本检索(Vector Search, BM25):标准文档检索
数据库查询(SQL, GraphQL):结构化数据查询
API 调用(REST API, GraphQL):实时数据获取
代码执行(Python REPL, Jupyter):数据计算、可视化
网络搜索(Google Search, Bing):获取最新信息
知识图谱(Neo4j, RDF Store):关系推理
5.4 自主优化
Agentic RAG 最强大的能力在于自主优化——Agent 可以根据执行结果和反馈,动态调整策略:
- 初始策略:用向量检索 → 观察结果:检索结果不相关
- 自我反思:“向量检索可能不是最佳策略,这个问题需要精确关键词匹配”
- 调整策略:切换到 BM25 检索 → 观察结果:BM25 结果仍然不理想
- 自我反思:“这个问题可能涉及多个文档的综合”
- 调整策略:使用子问题分解 + 混合检索 → 观察结果:检索到相关信息
- 继续:生成回答
5.5 代码实现:Agentic RAG 的 LangChain + LangGraph 实现
【Python 代码示例 — Agentic RAG 完整实现(LangChain + LangGraph)】
这是 RAG 技术的最新形态——Agent 自主决策检索策略和工具调用。
前置依赖:pip install langchain langchain-openai langchain-chroma langgraph langchain-community
环境变量:OPENAI_API_KEY=your-api-key-here
PYTHON
import os
from typing import Annotated, List, Optional, TypedDict
from langchain_openai import OpenAIEmbeddings, ChatOpenAI
from langchain_chroma import Chroma
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain.document_loaders import TextLoader
from langchain.prompts import ChatPromptTemplate
from langchain.schema.document import Document
from langchain_community.document_retrievers import BM25Retriever
from langchain.tools import tool
from langgraph.graph import StateGraph, END
from langgraph.prebuilt import ToolNode
from langchain_core.messages import HumanMessage, AIMessage, SystemMessage
from typing import Sequence
class RAGTools:
def __init__(self, vector_store, documents, llm):
self.vector_store = vector_store
self.documents = documents
self.llm = llm
self.bm25_retriever = BM25Retriever.from_documents(documents)
self.bm25_retriever.k = 5
@tool
def vector\_search(self, query):
"""语义向量搜索。适用于:概念理解、语义匹配、模糊查询"""
results = self.vector\_store.similarity\_search(query, k=3)
context = "\n\n".join(doc.page\_content for doc in results)
return f"向量检索结果:\n{context}"
@tool
def keyword\_search(self, query):
"""关键词匹配搜索。适用于:精确关键词、代码函数名、产品型号"""
results = self.bm25\_retriever.invoke(query)
context = "\n\n".join(doc.page\_content for doc in results)
return f"关键词检索结果:\n{context}"
@tool
def generate\_summary(self, query, context):
"""根据已有上下文生成回答"""
summary\_prompt = ChatPromptTemplate.from\_messages([
("system", "你是专业的问答助手。只基于提供的上下文生成准确回答。"),
("human", "上下文:{context}\n\n问题:{query}"),
])
response = self.llm.invoke(summary\_prompt.format(
context=context, query=query
))
return response.content
@tool
def check\_relevance(self, query, context):
"""检查上下文是否与问题相关,用于判断是否需要继续检索"""
relevance\_prompt = ChatPromptTemplate.from\_messages([
("system", "判断以下上下文是否包含回答用户问题所需的信息。"),
("human", "问题:{query}\n\n上下文:{context}"),
])
response = self.llm.invoke(relevance\_prompt.format(
query=query, context=context
))
return response.content
class AgentState(TypedDict):
query: str # 用户原始查询
retrieval_history: List[str] # 检索历史
current_context: str # 当前积累的上下文
step_count: int # 已执行的步骤数
final_answer: str # 最终回答
needs_more_info: bool # 是否需要更多信息
class AgenticRAG:
def __init__(self, file_paths):
self.llm = ChatOpenAI(model=“gpt-4o-mini”, temperature=0)
self.embeddings = OpenAIEmbeddings(model=“text-embedding-3-small”)
all_docs = []
for path in file_paths:
loader = TextLoader(path, encoding=“utf-8”)
all_docs.extend(loader.load())
text_splitter = RecursiveCharacterTextSplitter(
chunk_size=500, chunk_overlap=50,
)
chunks = text_splitter.split_documents(all_docs)
self.vector_store = Chroma.from_documents(chunks, self.embeddings)
self.tools = RAGTools(self.vector_store, chunks, self.llm)
self.graph = self._build_graph()
def \_build\_graph(self):
workflow = StateGraph(AgentState)
workflow.add\_node("planner", self.\_planner\_node)
workflow.add\_node("retriever", self.\_retriever\_node)
workflow.add\_node("evaluator", self.\_evaluator\_node)
workflow.add\_node("generator", self.\_generator\_node)
workflow.set\_entry\_point("planner")
workflow.add\_edge("planner", "retriever")
workflow.add\_edge("retriever", "evaluator")
workflow.add\_conditional\_edges(
"evaluator",
self.\_should\_continue,
{True: "retriever", False: "generator"}
)
workflow.add\_edge("generator", END)
return workflow.compile()
def \_planner\_node(self, state):
planning\_prompt = ChatPromptTemplate.from\_messages([
("system", """你是检索策略规划助手。
可选策略:vector\_first(向量检索)、keyword\_first(关键词检索)、both(两者并用)
只输出策略名称。"""),
("human", "用户问题:{query}"),
])
response = self.llm.invoke(
planning\_prompt.format(query=state["query"])
)
state["retrieval\_history"].append(f"策略: {response.content.strip()}")
return state
def \_retriever\_node(self, state):
query = state["query"]
history = " ".join(state["retrieval\_history"])
if "keyword" in history.lower() and len(state["retrieval\_history"]) > 1:
results = self.tools.keyword\_search.invoke(query)
else:
results = self.tools.vector\_search.invoke(query)
state["retrieval\_history"].append(f"检索结果: {results[:200]}...")
state["current\_context"] += "\n" + results
state["step\_count"] += 1
return state
def \_evaluator\_node(self, state):
if state["step\_count"] >= 5:
state["needs\_more\_info"] = False
return state
relevance = self.tools.check\_relevance.invoke({
"query": state["query"],
"context": state["current\_context"]
})
state["needs\_more\_info"] = "NOT\_RELEVANT" in relevance.upper()
return state
def \_generator\_node(self, state):
answer = self.tools.generate\_summary.invoke({
"query": state["query"],
"context": state["current\_context"],
})
state["final\_answer"] = answer
return state
def \_should\_continue(self, state):
return state["needs\_more\_info"] and state["step\_count"] < 5
def invoke(self, query):
initial\_state = AgentState(
query=query, retrieval\_history=[], current\_context="",
step\_count=0, final\_answer="", needs\_more\_info=True,
)
result = self.graph.invoke(initial\_state)
return result["final\_answer"]
def main():
rag = AgenticRAG([“doc1.txt”, “doc2.txt”])
complex_query = “请分析 2023 年 AI 领域的重大技术突破,以及这些突破对产业的影响。”
answer = rag.invoke(complex_query)
print(f"回答:\n{answer}")
if __name__ == “__main__”:
main()
5.6 Agentic RAG 性能数据
简单问答(单跳):Advanced RAG 68.3%,Agentic RAG 67.1%,变化 -1.2%
多跳推理(3跳):Advanced RAG 45.2%,Agentic RAG 54.8%,提升 +9.6%
多跳推理(4跳):Advanced RAG 33.8%,Agentic RAG 44.2%,提升 +10.4%
跨文档综合:Advanced RAG 51.6%,Agentic RAG 62.3%,提升 +10.7%
需要工具调用的任务:Advanced RAG N/A,Agentic RAG 58.7%
需要实时数据的任务:Advanced RAG 31.2%,Agentic RAG 65.4%,提升 +34.2%
关键洞察:
Agentic RAG 在简单问答上略有劣势——Agent 的决策 overhead 使得它在简单任务上反而不如直接检索
在复杂多跳推理任务上优势明显(+9-10%),因为 Agent 可以自主决定子问题分解和多次检索
在需要实时数据的任务上优势巨大(+34.2%),因为 Agent 可以调用网络搜索等工具
- 性能对比与选型建议
6.1 四种 RAG 全面对比
架构复杂度:Naive RAG(低)< Modular RAG(中)< Advanced RAG(中高)< Agentic RAG(高)
开发成本:Naive RAG(1-2 天)< Modular RAG(1-2 周)< Advanced RAG(2-3 周)< Agentic RAG(3-4 周+)
推理延迟:Naive RAG(低,~2s)< Modular RAG(中,~4s)< Advanced RAG(中高,~6s)< Agentic RAG(高,~8-15s)
Token 消耗:Naive RAG(最低)< Modular RAG(低)< Advanced RAG(中)< Agentic RAG(高)
单跳问答准确率:Naive RAG(52.3%)< Modular RAG(58.7%)< Advanced RAG(68.3%)> Agentic RAG(67.1%)
多跳推理准确率:Naive RAG(19.2%)< Modular RAG(35.4%)< Advanced RAG(45.2%)< Agentic RAG(54.8%)
关键词查询准确率:Naive RAG(52.1%)< Agentic RAG(65.2%)< Modular RAG = Advanced RAG(68.3%)
跨文档综合准确率:Naive RAG(35.4%)< Modular RAG(47.8%)< Advanced RAG(51.6%)< Agentic RAG(62.3%)
可解释性:Naive RAG(高)、Modular RAG(高)、Agentic RAG(高,推理轨迹可追溯)、Advanced RAG(中)
扩展性:Naive RAG(低)< Advanced RAG(中)< Modular RAG(高)< Agentic RAG(极高)
适用文档量:Naive RAG(< 10K)< Modular RAG(< 100K)< Advanced RAG(< 1M)< Agentic RAG(不限)
维护成本:Naive RAG(低)< Modular RAG(中)< Advanced RAG(中高)< Agentic RAG(高)
6.2 场景推荐
使用 Naive RAG 的场景:
快速原型验证(PoC)
文档数量少(< 1000 篇),查询简单
对延迟要求极高(< 1s)
团队刚开始接触 RAG 技术
预算紧张,成本敏感
使用 Modular RAG 的场景:
生产环境的文档问答系统
需要精确关键词匹配(如客服系统)
文档数量中等(1000 - 100000 篇)
需要在效果提升和成本增加之间取得平衡
这是大多数企业项目的最佳起点
使用 Advanced RAG 的场景:
复杂的多跳推理任务
需要处理口语化、模糊的用户查询
多数据源环境(需要路由)
对检索精度有严格要求的研究和决策支持系统
文档数量大(> 10 万篇)
使用 Agentic RAG 的场景:
需要调用多种工具的复杂任务(搜索、数据库、API、代码执行)
需要实时数据获取的任务
高度不确定的查询模式
研究分析类应用
自主决策和自适应能力是核心需求的场景
6.3 成本分析
以下是一个月处理 10 万次查询的典型成本估算(基于 OpenAI API 定价):
Naive RAG:Token 消耗 ~3,000/次(月总量 3 亿),月成本约 $90,平均延迟 1.5s
Modular RAG:Token 消耗 ~4,500/次(月总量 4.5 亿),月成本约 $135,平均延迟 3.2s
Advanced RAG:Token 消耗 ~8,000/次(月总量 8 亿),月成本约 $240,平均延迟 5.8s
Agentic RAG:Token 消耗 ~15,000/次(月总量 15 亿),月成本约 $450,平均延迟 10.5s
6.4 演进阶梯建议
- 项目初期(第 1-2 周)→ Naive RAG:验证概念、确认可行性
- 效果不足?→ Modular RAG:加入混合检索 + 重排序
- 效果仍不足?→ Advanced RAG:加入查询变换 + 层次化索引
- 需要自主决策?→ Agentic RAG:引入 Agent 自主决策
实践经验:
不要一开始就选择 Agentic RAG。大多数场景下,Modular RAG 已经能提供足够的效果,而复杂度和成本远低于 Agentic RAG。
渐进式演进是最稳妥的策略。先实现 Naive RAG 基线,根据效果数据逐步添加模块。
用数据驱动决策。每个阶段都要用标准化的评估数据集来衡量效果提升,避免"为了优化而优化"。
- 总结
7.1 RAG 技术演进的核心逻辑
回顾 RAG 从 Naive 到 Agentic的完整演进路径,我们可以提炼出三条核心演进逻辑:
1. 从刚性到柔性(Flexibility)
Naive RAG 的流水线是固定的,Modular RAG 让它变得可配置,Advanced RAG 让它具备智能预处理能力,Agentic RAG 则让系统完全自主化。柔性的提升意味着系统能够适应更广泛、更不确定的任务场景。
2. 从浅层到深层(Depth)
Naive RAG 只做一次简单的向量相似度匹配,Modular RAG 引入了重排序和压缩,Advanced RAG 深入到了查询理解和索引结构层面,Agentic RAG 则进一步引入了推理和决策的深度。深度的增加意味着系统能够处理更复杂、更精细的任务。
3. 从确定到自适应(Adaptivity)
Naive RAG 对任何查询都采用相同的处理流程。Agentic RAG 则可以根据每个查询的特点,动态选择最优策略。自适应能力是 RAG 系统走向"智能化"的关键一步。
7.2 未来趋势展望
RAG 技术仍在快速演进中,以下方向值得重点关注:
-
Self-RAG(自反思 RAG):在生成过程中,让模型自主反思检索质量、生成质量,并动态调整策略。2023 年纽约大学提出的 Self-RAG 框架已经显示出了良好的效果。
-
CA-RAG(Corrective RAG):引入纠错机制,在检索、生成、验证的每个环节加入自我纠正,减少错误传递。
-
多模态 RAG(Multimodal RAG):不仅检索文本,还能检索图像、表格、视频等多模态内容,适用于更丰富的场景。
-
RAG + 微调(RAG + Fine-tuning):将 RAG 的外部知识检索与模型微调相结合,让模型"内化"领域知识的同时保持外部知识的可更新性。
-
GraphRAG:将知识图谱与向量检索深度结合,利用图谱的结构化关系增强检索和推理能力。Microsoft 已经开源了 GraphRAG 框架。
-
端侧 RAG(On-device RAG):随着边缘计算能力的提升,RAG 系统可以部署在本地设备上,无需云端 API,降低延迟和保护隐私。
7.3 结语
RAG 技术从 Naive 到 Agentic 的演进,本质上反映了 AI 系统从"简单的工具组合"走向"智能自主决策"的大趋势。但需要强调的是,复杂度更高的 RAG 并不一定适合所有场景。
在实际项目中,选型的核心原则应该是:以业务需求为导向,以数据为决策依据,用最小复杂度满足性能要求。 很多情况下,一个精心调优的 Modular RAG 系统已经足以满足企业级应用的需求,而不必盲目追求 Agentic RAG。
技术的价值不在于它的复杂度,而在于它解决问题的有效性。选择最适合的,而非最复杂的——这是 RAG 演进之路带给我们的最重要启示。
学AI大模型的正确顺序,千万不要搞错了
🤔2026年AI风口已来!各行各业的AI渗透肉眼可见,超多公司要么转型做AI相关产品,要么高薪挖AI技术人才,机遇直接摆在眼前!
有往AI方向发展,或者本身有后端编程基础的朋友,直接冲AI大模型应用开发转岗超合适!
就算暂时不打算转岗,了解大模型、RAG、Prompt、Agent这些热门概念,能上手做简单项目,也绝对是求职加分王🔋

📝给大家整理了超全最新的AI大模型应用开发学习清单和资料,手把手帮你快速入门!👇👇
学习路线:
✅大模型基础认知—大模型核心原理、发展历程、主流模型(GPT、文心一言等)特点解析
✅核心技术模块—RAG检索增强生成、Prompt工程实战、Agent智能体开发逻辑
✅开发基础能力—Python进阶、API接口调用、大模型开发框架(LangChain等)实操
✅应用场景开发—智能问答系统、企业知识库、AIGC内容生成工具、行业定制化大模型应用
✅项目落地流程—需求拆解、技术选型、模型调优、测试上线、运维迭代
✅面试求职冲刺—岗位JD解析、简历AI项目包装、高频面试题汇总、模拟面经
以上6大模块,看似清晰好上手,实则每个部分都有扎实的核心内容需要吃透!
我把大模型的学习全流程已经整理📚好了!抓住AI时代风口,轻松解锁职业新可能,希望大家都能把握机遇,实现薪资/职业跃迁~
这份完整版的大模型 AI 学习资料已经上传CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费】

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐



所有评论(0)