RAG 实战:从概念到检索增强 Agent

Published by rcdfrd on 2026-02-14

RAG 实战:从概念到检索增强 Agent

大模型的知识有截止日期,也不知道你公司内部的文档内容。RAG(检索增强生成)就是在提问的时候,先从知识库里找相关内容,塞进提示词一起喂给模型。本质上是一种提示词工程。

RAG 的背景

2020 年 Meta 提出 RAG,当时 GPT-3 刚出来。大模型有两个硬伤:会编造事实(幻觉),知识有时效性。微调成本高周期长,RAG 是最轻量的解决方案。

索引阶段

from langchain_community.document_loaders import WebBaseLoader
from langchain_text_splitters import RecursiveCharacterTextSplitter
from langchain_chroma import Chroma
from langchain_openai import OpenAIEmbeddings

loader = WebBaseLoader(web_paths=["https://example.com/article"])
documents = loader.load()

splitter = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=200)
chunks = splitter.split_documents(documents)

vector_store = Chroma(
    collection_name="rag_collection",
    embedding_function=OpenAIEmbeddings(model="text-embedding-3-small"),
    persist_directory="./chroma_db",
)
vector_store.add_documents(chunks)

检索 Agent

有了向量库,把检索封装成工具交给 Agent:

from langchain.agents import create_agent
from langchain.tools import tool

@tool(response_format="content_and_artifact")
def retrieve_context(query: str):
    """检索相关文档来回答问题。"""
    docs = vector_store.similarity_search(query, k=2)
    content = "\n".join(
        f"Source: {doc.metadata}\n{doc.page_content}" for doc in docs
    )
    return content, docs

agent = create_agent(
    model="openai:gpt-4o-mini",
    tools=[retrieve_context],
    system_prompt="你是一个知识助手。用检索到的内容回答问题,找不到就说不知道。",
)

response = agent.invoke(
    {"messages": [{"role": "user", "content": "嫦娥六号发现了什么"}]}
)

response_format="content_and_artifact" 让工具同时返回文本内容和原始文档对象。模型收到问题后,先调 retrieve_context 检索相关段落,再基于检索结果生成回答。

小结

RAG 不是什么高深技术,就是「先查后答」。难点在索引质量:切片策略、Embedding 模型选择、检索参数调优。