突破RAG局限:深入浅出 Agentic RAG 架构与实战

81 阅读4分钟

在大模型应用落地过程中,如何让 AI 更精准地利用外部知识库一直是核心课题。从最初的 RAG(检索增强生成)到如今备受瞩目的 Agentic RAG(代理检索增强生成) ,技术架构正经历着从“被动检索”到“主动决策”的跨越。

本文将带你理清 RAG、AI Agent 的基本概念,并手把手教你构建一个基于 Agentic RAG 的智能问答系统。


一、 从传统 RAG 到 Agentic RAG 的演进

1. 什么是传统 RAG?

RAG (Retrieval-Augmented Generation) 的核心逻辑是: “先检索,再生成”

当用户提出问题时,系统先从向量数据库中检索相关文档,将其作为上下文(Context)连同问题一起喂给大模型(LLM)。

  • 优点:缓解幻觉、支持私有数据。
  • 局限:它是一个线性、被动的过程。面对需要多步推理、跨文档比对或工具调用的复杂任务时,传统 RAG 往往力不从心。

image-20250926083723762.png

2. 什么是 AI Agent?

AI Agent(智能体) 是一个能够感知环境、进行推理、做出决策并采取行动的自主系统。其核心在于 Reason(推理)+ Act(行动) 的循环。

  • ReAct 框架:这是目前 Agent 最主流的实现思想。它模仿人类思维,通过“思想链(CoT)”分解问题,在“思考”与“行动”之间反复迭代,直到得出最终答案。

image-20250926085241484.png

ReAct 采用的是 思想-行动-观察循环的思路。

image-20250926085922690.png

3. Agentic RAG:智能化的新高度

Agentic RAG 是将 Agent 机制引入检索流程。此时的系统不再是一个简单的“传声筒”,而是一个“聪明的调查员”:

  • 自主决策:它会判断是否需要检索。
  • 查询规划:如果问题复杂,它会将任务拆解。
  • 自我修正:如果检索到的信息不足,它会重新调整关键词再次检索。

17588492923781.png


二、 实战:构建基于 Agentic RAG 的问答系统

下面我们使用 LangChainStreamlit 以及 DeepSeek 模型,实现一个具备文件上传、自动检索和多轮对话能力的 Agentic RAG 应用。

1. 核心流程设计

  1. 数据处理:上传 TXT 文档,进行切片并向量化存储。
  2. 工具定义:将 RAG 检索器包装成 Agent 可以调用的 Tool
  3. 记忆管理:引入 ConversationBufferMemory 维护对话上下文。
  4. 代理执行:使用 ReAct Agent 模式进行任务调度。

2. 代码实现

以下是系统的核心实现代码。请注意,运行前需安装 langchain, streamlit, langchain-openai, langchain-chroma 等依赖。

Python

import streamlit as st
import tempfile
import os
from langchain_community.document_loaders import TextLoader
from langchain_openai import ChatOpenAI
from langchain_chroma import Chroma
from langchain_core.prompts import PromptTemplate
from langchain_text_splitters import RecursiveCharacterTextSplitter
from langchain.agents import create_react_agent, AgentExecutor
from langchain_community.callbacks.streamlit import StreamlitCallbackHandler
from langchain_community.embeddings import BaichuanTextEmbeddings
from langchain.memory import ConversationBufferMemory
from langchain_community.chat_message_histories import StreamlitChatMessageHistory
from langchain.tools.retriever import create_retriever_tool

# --- 1. 页面配置 ---
st.set_page_config(page_title="Agentic RAG Assistant", layout="wide")
st.title("🚀 Agentic RAG 智能助手")

# --- 2. 知识库预处理 ---
@st.cache_resource(ttl="1h")
def configure_retriever(uploaded_files):
    docs = []
    temp_dir = tempfile.TemporaryDirectory()
    for file in uploaded_files:
        temp_filepath = os.path.join(temp_dir.name, file.name)
        with open(temp_filepath, "wb") as f:
            f.write(file.getvalue())
        loader = TextLoader(temp_filepath, encoding="utf-8")
        docs.extend(loader.load())
    
    # 文本分割
    text_splitter = RecursiveCharacterTextSplitter(chunk_size=300, chunk_overlap=50)
    splits = text_splitter.split_documents(docs)

    # 向量化(以百川向量模型为例)
    embeddings = BaichuanTextEmbeddings(api_key="YOUR_BAICHUAN_KEY")
    vectordb = Chroma.from_documents(splits, embeddings)
    return vectordb.as_retriever()

# 侧边栏上传
uploaded_files = st.sidebar.file_uploader(label="上传知识库文件", type=["txt"], accept_multiple_files=True)
if not uploaded_files:
    st.info("请先在左侧上传 TXT 文档以启用知识库。")
    st.stop()

retriever = configure_retriever(uploaded_files)

# --- 3. 构建 Agent 工具集 ---
tool = create_retriever_tool(
    retriever=retriever,
    name="doc_retriever",
    description="用于检索用户文档内容。当你需要基于上传的文件回答问题时,必须使用此工具。"
)
tools = [tool]

# --- 4. 记忆与提示词模板 ---
msgs = StreamlitChatMessageHistory()
memory = ConversationBufferMemory(
    chat_memory=msgs, return_messages=True, memory_key="chat_history", output_key="output"
)

base_prompt_template = """你是一个专业的文档分析助手。
你可以使用检索工具来获取信息,即使你认为自己知道答案,也请优先查阅文档以确保准确性。
如果文档中确实没有相关信息,请回答“抱歉,这个问题我还不知道。”

TOOLS:
{tools}

Format:
Thought: Do I need to use a tool? Yes
Action: [{tool_names}]
Action Input: the input to the action
Observation: the result
... (this Thought/Action/Action Input/Observation can repeat N times)
Thought: Do I need to use a tool? No
Final Answer: [your response]

Previous history:
{chat_history}

Input: {input}
{agent_scratchpad}"""

prompt = PromptTemplate.from_template(base_prompt_template)

# --- 5. 实例化 Agent 执行器 ---
llm = ChatOpenAI(
    model="deepseek-reasoner", 
    openai_api_key="YOUR_DEEPSEEK_KEY", 
    openai_api_base="https://api.deepseek.com"
)
agent = create_react_agent(llm, tools, prompt)
agent_executor = AgentExecutor(agent=agent, tools=tools, memory=memory, verbose=True, handle_parsing_errors=True)

# --- 6. 聊天交互界面 ---
if "messages" not in st.session_state or st.sidebar.button("清空对话"):
    st.session_state["messages"] = [{"role": "assistant", "content": "您好!文件已就绪,请问有什么可以帮您?"}]

for msg in st.session_state.messages:
    st.chat_message(msg["role"]).write(msg["content"])

user_query = st.chat_input(placeholder="基于文档提问...")

if user_query:
    st.session_state.messages.append({"role": "user", "content": user_query})
    st.chat_message("user").write(user_query)
    
    with st.chat_message("assistant"):
        st_cb = StreamlitCallbackHandler(st.container())
        response = agent_executor.invoke({"input": user_query}, config={"callbacks": [st_cb]})
        st.session_state.messages.append({"role": "assistant", "content": response["output"]})
        st.write(response["output"])

三、 总结与展望

Agentic RAG 的出现,标志着大模型应用进入了**“强交互、高逻辑”**的阶段。

  • 在检索效率上:它通过 ReAct 循环减少了无关信息的干扰。
  • 在业务适配上:它可以通过挂载更多工具(如 SQL 执行器、搜索 API)进一步扩展能力边界。

对于开发者而言,掌握 Agentic 架构不仅是提升系统准确率的关键,更是通往构建完全自主化 AI 应用的必经之路。