RAG+Agent王炸组合:让你的智能体拥有"过目不忘"的知识库 📚

导读:Agent有记忆还不够,还需要一个专属知识库!RAG(检索增强生成)就是给Agent装上"外挂大脑"的技术。本文手把手教你用RAG+Agent打造知识增强型智能体,让它对你公司的文档、产品手册、技术文档了如指掌!💯


一、RAG是什么?一句话讲透 🎯

RAG = 先搜索,再回答。

就这么简单!

方式 流程 问题
纯LLM 用户提问 → 模型凭记忆回答 知识过时、可能编造
RAG 用户提问 → 先搜索知识库 → 带着搜索结果回答 准确、有据可查

1.1 RAG流程图

👤 用户提问

🔍 检索知识库

📄 找到相关文档

📝 组装Prompt
问题+相关文档

🧠 LLM生成回答

📤 返回答案+来源

1.2 RAG vs 纯LLM对比

维度 纯LLM RAG+LLM
知识新鲜度 ❌ 训练截止日 ✅ 实时更新
幻觉率 ❌ 高(15%+) ✅ 低(2-5%)
可溯源 ❌ 不知道从哪学的 ✅ 可以给出出处
私有知识 ❌ 不知道 ✅ 完全支持
成本 💰 需要微调 💰 只需存储+检索

二、RAG+Agent:为什么是王炸组合?🃏

2.1 RAG和Agent各自的问题

系统 优势 短板
纯RAG 知识准确 不会推理、不会行动
纯Agent 会推理、会用工具 知识有限、可能幻觉
RAG+Agent 知识准确+会推理+会行动 实现稍复杂

2.2 RAG+Agent的三种集成方式

方式 原理 适用场景 复杂度
🔧 RAG作为工具 Agent把RAG当作一个搜索工具来调用 最灵活,推荐 ⭐⭐
🔄 RAG作为流程 RAG是Agent工作流的一个固定步骤 简单场景
🧠 RAG作为记忆 RAG结果注入Agent的上下文 深度集成 ⭐⭐⭐

💡 推荐方式RAG作为工具——最灵活,Agent自己决定什么时候需要查知识库。


三、从零构建RAG知识库 🏗️

3.1 知识库构建流程

📄 原始文档

📝 文档加载

✂️ 文本分割

🔢 向量化

💾 向量数据库

👤 用户提问

🔢 问题向量化

🔍 相似度搜索

📄 相关文档片段

🧠 LLM生成回答

3.2 完整代码实现

from langchain_community.document_loaders import TextLoader, PyPDFLoader, DirectoryLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain_openai import OpenAIEmbeddings, ChatOpenAI
from langchain_community.vectorstores import Chroma
from langchain.tools import tool
import os

# ===== Step 1: 文档加载 =====
def load_documents(docs_dir: str):
    """加载目录下的所有文档"""
    loaders = {
        "*.txt": DirectoryLoader(docs_dir, glob="*.txt", loader_cls=TextLoader),
        "*.pdf": DirectoryLoader(docs_dir, glob="*.pdf", loader_cls=PyPDFLoader),
    }
    
    docs = []
    for pattern, loader in loaders.items():
        try:
            docs.extend(loader.load())
        except Exception:
            pass
    return docs

# ===== Step 2: 文本分割 =====
def split_documents(docs, chunk_size=1000, chunk_overlap=200):
    """将文档分割成小块"""
    splitter = RecursiveCharacterTextSplitter(
        chunk_size=chunk_size,      # 每块最大1000字符
        chunk_overlap=chunk_overlap, # 块之间重叠200字符
        separators=["\n\n", "\n", "。", "!", "?", ".", " "]
    )
    return splitter.split_documents(docs)

# ===== Step 3: 向量化存储 =====
def create_vectorstore(chunks, persist_dir="./chroma_kb"):
    """创建向量数据库"""
    embeddings = OpenAIEmbeddings()
    vectorstore = Chroma.from_documents(
        documents=chunks,
        embedding=embeddings,
        persist_directory=persist_dir
    )
    return vectorstore

# ===== Step 4: 构建知识库工具 =====
class KnowledgeBase:
    def __init__(self, docs_dir="./assets/docs"):
        self.docs_dir = docs_dir
        self.vectorstore = None
        self._build()
    
    def _build(self):
        """构建知识库"""
        print("📚 正在构建知识库...")
        
        # 加载文档
        docs = load_documents(self.docs_dir)
        print(f"  📄 加载了 {len(docs)} 个文档")
        
        # 分割
        chunks = split_documents(docs)
        print(f"  ✂️ 分割为 {len(chunks)} 个片段")
        
        # 向量化存储
        self.vectorstore = create_vectorstore(chunks)
        print("  ✅ 知识库构建完成!")
    
    def search(self, query: str, k: int = 3) -> list:
        """搜索知识库"""
        if not self.vectorstore:
            return []
        results = self.vectorstore.similarity_search(query, k=k)
        return [{"content": doc.page_content, "source": doc.metadata.get("source", "unknown")}
                for doc in results]

# 初始化知识库
kb = KnowledgeBase()

# ===== Step 5: 封装为Agent工具 =====
@tool
def search_knowledge_base(query: str) -> str:
    """搜索内部知识库获取专业信息。当用户询问公司产品、技术文档、内部规范等问题时使用。
    
    Args:
        query: 搜索关键词或问题
    """
    results = kb.search(query, k=3)
    if not results:
        return "知识库中未找到相关信息"
    
    output = []
    for i, r in enumerate(results, 1):
        output.append(f"📄 [{i}] 来源:{r['source']}")
        output.append(f"   {r['content'][:300]}...")
        output.append("")
    return "\n".join(output)

四、RAG+Agent完整系统 🤖

4.1 系统架构

内部知识

实时信息

计算分析

直接回答

👤 用户

🤖 RAG Agent

需要什么?

📚 知识库搜索

🔍 网络搜索

💻 代码执行

💬 直接回复

检索结果

搜索结果

计算结果

📤 综合回答

4.2 完整Agent代码

from langchain_openai import ChatOpenAI
from langgraph.prebuilt import create_react_agent
from langgraph.checkpoint.memory import MemorySaver
from langchain.tools import tool
import requests

# 工具1: 知识库搜索
@tool
def search_knowledge_base(query: str) -> str:
    """搜索内部知识库。当用户询问公司产品、文档、规范等内部信息时使用。
    Args:
        query: 搜索关键词
    """
    results = kb.search(query, k=3)
    if not results:
        return "知识库中未找到相关信息"
    output = []
    for i, r in enumerate(results, 1):
        output.append(f"[{i}] {r['content'][:300]}... (来源:{r['source']})")
    return "\n".join(output)

# 工具2: 网络搜索
@tool
def web_search(query: str) -> str:
    """搜索互联网获取最新信息。当知识库中没有答案时使用。
    Args:
        query: 搜索关键词
    """
    # 实际项目中接入搜索API
    return f"搜索结果:关于'{query}'的最新信息..."

# 工具3: 计算
@tool
def calculator(expression: str) -> str:
    """执行数学计算。
    Args:
        expression: 数学表达式
    """
    try:
        result = eval(expression, {"__builtins__": {}}, {})
        return f"{expression} = {result}"
    except Exception as e:
        return f"计算错误:{e}"

# 创建RAG Agent
rag_agent = create_react_agent(
    model=ChatOpenAI(model="gpt-4o", temperature=0),
    tools=[search_knowledge_base, web_search, calculator],
    prompt="""你是一个知识增强型AI助手。

回答问题的优先级:
1. 先搜索内部知识库(search_knowledge_base)—— 公司相关信息
2. 如果知识库没有,搜索互联网(web_search)—— 公开信息
3. 需要计算时使用计算器(calculator)
4. 常识性问题直接回答

回答要求:
- 引用信息来源
- 如果不确定,诚实说明
- 回答要准确、简洁""",
    checkpointer=MemorySaver()
)

五、RAG优化技巧 🔧

5.1 文本分割策略对比

策略 原理 优点 缺点 适用场景
固定长度 每N个字符切一刀 简单 可能切断句子 通用
按段落 按\n\n分割 保持语义完整 段落大小不一 文档
按句子 按句号分割 语义最完整 可能太短 对话记录
递归分割 先按段落→句子→字符 平衡 稍复杂 推荐

5.2 Chunk大小优化

Chunk大小 检索精度 上下文完整性 Token成本 推荐度
200字符 ⭐⭐⭐⭐⭐ ⭐⭐ 精确问答
500字符 ⭐⭐⭐⭐ ⭐⭐⭐ 通用推荐
1000字符 ⭐⭐⭐ ⭐⭐⭐⭐ 长文档分析
2000字符 ⭐⭐ ⭐⭐⭐⭐⭐ 很高 深度分析

5.3 检索优化策略

策略 效果 实现方式
🔍 混合检索 准确率↑30% 向量搜索+关键词搜索结合
📝 查询改写 召回率↑20% 用LLM改写用户查询
🔄 重排序 精度↑25% 检索后用Cross-Encoder重排
📏 多粒度 覆盖面↑ 同时搜索句子级和段落级

六、RAG效果评估 📊

6.1 评估指标

指标 含义 目标值
检索准确率 检索到的文档是否相关 > 85%
回答准确率 最终回答是否正确 > 90%
幻觉率 编造信息的比例 < 5%
回答延迟 从提问到回答的时间 < 5秒

6.2 常见问题与优化

问题 原因 解决方案
🔴 检索不到相关内容 Chunk太大或Embedding不好 调整chunk大小,换Embedding模型
🔴 检索到不相关内容 查询和文档表述差异大 查询改写、混合检索
🟡 回答不准确 检索到了但LLM理解错 优化Prompt、加Few-shot
🟡 回答太慢 检索+生成耗时 缓存、并行检索

七、本期小结 📝

知识点 核心内容
RAG是什么 先搜索知识库,再基于搜索结果回答
为什么RAG+Agent是王炸 知识准确 + 会推理 + 会行动
构建流程 文档加载 → 文本分割 → 向量化 → 检索 → 生成
集成方式 RAG作为Agent的一个工具(最灵活)
优化方向 分割策略、Chunk大小、混合检索、查询改写

🔥 RAG+Agent = 知识准确 + 行动力强。 这是2025年企业级AI应用的标配架构。掌握它,你就能为公司构建一个"什么都知道"的智能助手!


📢 下期预告:《ReAct vs Plan-and-Execute vs Tree of Thoughts:三大推理范式深度对比》—— Agent是怎么"思考"的?三种推理范式哪种最强?下期深度对比!🧠


📌 三连走起!RAG+Agent,知识增强型智能体的标配! 💪

📚 专栏第14/24期,记忆与规划篇进行中…

作者:高炉炼铁智能化技术研究者,专注钢铁冶金与人工智能 交叉领域。

👍 如果觉得有帮助,请点赞、收藏、转发!
版权归作者所有,未经许可请勿抄袭,套用,商用(或其它具有利益性行为)
🔔 关注专栏,不错过后续精彩内容

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐