待处理

Agentic RAG:基于 Milvus + LangChain + LangGraph 的智能检索增强生成系统

传统 RAG 只会“检索 + 生成”,Agentic RAG 则让系统主动决策、自动优化检索流程,是智能化检索的关键进化。

Agentic RAG 的核心理念

传统检索增强生成(RAG, Retrieval-Augmented Generation)系统仅执行“检索 → 生成”两段式流程,缺少智能判断和多步优化。这导致系统容易被噪声文档、模糊查询、上下文缺失所影响,难以应对复杂业务场景。

下面列举了传统 RAG 的常见不足:

  • 是否检索的判断
  • 检索结果质量评估
  • 查询重写
  • 多步推理

Agentic RAG(代理式 RAG)通过引入“可决策的智能体”,让检索流程具备以下能力:

  • 判断何时需要检索
  • 判断是否需要重写 query
  • 判断检索结果是否足够好
  • 自动多轮推理
  • 基于文档质量生成更相关的答案

Agentic RAG 工作流结构

下方流程图展示了 Agentic RAG 的决策循环和多节点工作流,帮助理解其智能化检索机制:

图 1: Agentic RAG 工作流结构
图 1: 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 的智能决策依赖于多个节点协作。下方流程图展示了关键节点及其关系:

图 2: Agentic RAG 工作流节点结构
图 2: 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 的能力差异:

能力传统 RAGAgentic RAG
Query 判断
Query 重写
文档相关性评估✅(简单)✅(智能)
多轮推理
复杂知识库表现中等
表 1: 传统 RAG 与 Agentic RAG 能力对比

参考资料

文章导航

章节内容

这是章节的内容页面。

章节概览