Agentic RAG:基于 Milvus + LangChain + LangGraph 的智能检索增强生成系统
传统 RAG 只会“检索 + 生成”,Agentic RAG 则让系统主动决策、自动优化检索流程,是智能化检索的关键进化。
Agentic RAG 的核心理念
传统检索增强生成(RAG, Retrieval-Augmented Generation)系统仅执行“检索 → 生成”两段式流程,缺少智能判断和多步优化。这导致系统容易被噪声文档、模糊查询、上下文缺失所影响,难以应对复杂业务场景。
下面列举了传统 RAG 的常见不足:
- 是否检索的判断
- 检索结果质量评估
- 查询重写
- 多步推理
Agentic RAG(代理式 RAG)通过引入“可决策的智能体”,让检索流程具备以下能力:
- 判断何时需要检索
- 判断是否需要重写 query
- 判断检索结果是否足够好
- 自动多轮推理
- 基于文档质量生成更相关的答案
Agentic RAG 工作流结构
下方流程图展示了 Agentic RAG 的决策循环和多节点工作流,帮助理解其智能化检索机制:
Agentic RAG 的核心是决策循环(decision loop):
“检索是否有用?如果无用,是否需要重写 query?”
环境准备
在开始构建 Agentic RAG 系统前,需要安装相关依赖。以下命令可快速完成环境准备:
pip install --upgrade langchain langchain-core langchain-community \
langchain-text-splitters langchain-openai langgraph pymilvus \
beautifulsoup4
确保已配置大语言模型(LLM, Large Language Model)API,例如:
import os
os.environ["OPENAI_API_KEY"] = "sk-******"
数据准备:加载文档并切分 Chunk
下面以我的博客为示例数据源,演示如何加载网页并切分为检索块(chunk)。
from langchain_community.document_loaders import WebBaseLoader
from langchain_text_splitters import RecursiveCharacterTextSplitter
loader = WebBaseLoader("https://jimmysong.io/blog/ai-inference-on-kubernetes/")
docs = loader.load()
splitter = RecursiveCharacterTextSplitter(chunk_size=800, chunk_overlap=120)
chunks = splitter.split_documents(docs)
嵌入与向量入库:使用 Milvus
将切分后的文档转为向量,并写入 Milvus 向量数据库(Vector Database)。
from pymilvus import MilvusClient
milvus = MilvusClient(uri="milvus.db")
collection_name = "agentic_rag_demo"
milvus.create_collection(
collection_name=collection_name,
dimension=1536,
)
# 转换为向量并写入数据库
vectors = embed_model.embed_documents([c.page_content for c in chunks])
milvus.insert(collection_name, vectors)
构建 LangChain 检索器(Retriever)
通过 LangChain 构建检索器,实现向量检索能力。
from langchain_community.vectorstores import Milvus
from langchain_openai import OpenAIEmbeddings
emb = OpenAIEmbeddings()
vectorstore = Milvus(
embedding_function=emb,
collection_name=collection_name,
connection_args={"uri": "milvus.db"},
)
retriever = vectorstore.as_retriever(search_kwargs={"k": 4})
Agentic RAG 工作流节点设计
Agentic RAG 的智能决策依赖于多个节点协作。下方流程图展示了关键节点及其关系:
关键节点说明:
- agent_router:判断 query 类型(可直接回答 / 需要检索 / 需要重写)
- retrieve_node:向 Milvus 查询文档
- grade_node:文档是否相关
- rewrite_node:Query 改写
- answer_node:生成最终回答
LangGraph 实现示例
以下代码演示如何用 LangGraph 构建 Agentic RAG 的决策循环工作流:
from langgraph.graph import StateGraph, END
def router_node(state):
query = state["query"]
if len(query) < 10:
return {"route": "direct"}
return {"route": "retrieve"}
def retrieve_node(state):
docs = retriever.get_relevant_documents(state["query"])
return {"docs": docs}
def grade_node(state):
docs = state["docs"]
if len(docs) == 0:
return {"grade": "bad"}
return {"grade": "good"}
def rewrite_node(state):
new_q = llm.invoke(f"请改写这个搜索查询:{state['query']}")
return {"query": new_q}
def answer_node(state):
query = state["query"]
docs = state.get("docs", [])
context = "\n".join([d.page_content for d in docs])
answer = llm.invoke(f"根据上下文回答:\n{context}\n问题:{query}")
return {"answer": answer}
# 构建工作流
workflow = StateGraph()
workflow.add_node("route", router_node)
workflow.add_node("retrieve", retrieve_node)
workflow.add_node("grade", grade_node)
workflow.add_node("rewrite", rewrite_node)
workflow.add_node("answer", answer_node)
workflow.add_edge("route", "retrieve")
workflow.add_edge("retrieve", "grade")
workflow.add_edge("grade", "answer", condition=lambda x: x["grade"] == "good")
workflow.add_edge("grade", "rewrite", condition=lambda x: x["grade"] == "bad")
workflow.add_edge("rewrite", "route")
workflow.set_entry_point("route")
workflow.set_finish_point("answer")
app = workflow.compile()
运行示例
下面代码展示如何运行 Agentic RAG 工作流并获取最终答案:
result = app.invoke({"query": "LLM 的 Agent 架构是如何工作的?"})
print(result["answer"])
Agentic RAG 的最佳实践与经验总结
下面结合云原生工程视角,总结 Agentic RAG 的实战经验。
Chunk 策略建议:
- 学术文章:800–1200 字符
- 技术文档:400–800 字符
- Blog/SOP 文档:300–600 字符,建议 15–20% overlap
适用场景:
- Query 含糊,需要 query rewriting
- 检索结果经常“不够好”
- 需要根据上下文自动多轮检索
- 大型知识库(> 5 万文档)
- FAQ + 长文档混合场景
向量库选择理由(为何选 Milvus):
- 全球主流开源向量库
- 支持 HNSW / IVF / DiskANN 多种索引
- 本地 Milvus Lite 轻量级,易部署
- 云原生架构,易于大规模扩展
总结
本节带你构建了一个具备主动决策能力的 RAG 系统,通过 LangGraph 多节点 Agent 工作流,让检索流程从单向变为智能循环。
下表对比了传统 RAG 与 Agentic RAG 的能力差异:
| 能力 | 传统 RAG | Agentic RAG |
|---|---|---|
| Query 判断 | ❌ | ✅ |
| Query 重写 | ❌ | ✅ |
| 文档相关性评估 | ✅(简单) | ✅(智能) |
| 多轮推理 | ❌ | ✅ |
| 复杂知识库表现 | 中等 | 强 |