Skip to content

智能体RAG

智能体RAG

介绍

智能体RAG(Agentic RAG)结合了检索增强生成和基于智能体的推理的优势。它不是在回答问题之前检索文档,而是由智能体逐步推理,并在交互过程中决定何时以及如何检索信息。

智能体要启用 RAG 行为,只需要访问一个或多个可以获取外部知识的工具,例如文档加载器、Web API 或数据库查询。

支持RAG多跳推理

mermaid
flowchart
    A[用户输入复杂任务] --> B(智能体规划与决策)
    B --> C{是否需要检索?}
    C -- 是 --> D[RAG增强模块<br>检索/重排序/验证]
    C -- 否 --> E[直接推理与工具调用]
    D --> F(生成与执行动作)
    E --> F
    F --> G{评估与反思}
    G -- 任务未完成 --> B
    G -- 任务完成 --> H[输出最终结果]

参考资料

智能体RAG实战

构建索引

Indexing(索引构建),构建知识库。参考文档:《LangChain向量存储》

创建智能体RAG

智能体RAG通用实现:使用工具执行搜索。构建工具:

python
from langchain.tools import tool
from langchain.agents import create_agent
from langchain.chat_models import init_chat_model
from langchain_ollama import OllamaEmbeddings
from langchain_milvus import Milvus

# 创建LLM模型实例
MODEL = "deepseek-v3.2"
API_KEY = "sk-"
BASE_URL = "https://dashscope.aliyuncs.com/compatible-mode/v1"
model = init_chat_model(
    model=MODEL, model_provider="openai", api_key=API_KEY, base_url=BASE_URL
)

# 创建向量存储实例
embeddings = OllamaEmbeddings(model="bge-m3", base_url="http://127.0.0.1:11434")
vector_store = Milvus(
    embeddings,
    connection_args={"uri": "http://127.0.0.1:19530", "db_name": "default_db"},
    collection_name="default_collection",
    auto_id=True,
    consistency_level="Session",
)


# 创建检索工具
@tool(response_format="content_and_artifact")
def retrieve_context(query: str, top_k: int = 3):
    """
    根据查询从知识库中检索最相关的上下文信息。
    参数:
        query: 查询的问题或查询关键词。
        top_k: 返回最相似的前 k 个文档片段,默认为 3,不要超过 5。
    返回:
        检索到的相关文档列表。
    """
    docs = vector_store.similarity_search(query=query, k=top_k)
    serialized = "\n\n".join(
        (
            f"Source:《{doc.metadata.get('original_filename')}\nContent: {doc.page_content}"
        )
        for doc in docs
    )
    return serialized, docs


# 创建智能体
tools = [retrieve_context]
prompt = (
    "你是一个具备检索增强能力的智能助手。你可以使用工具从知识库中检索相关信息来回答用户的问题。\n"
    "请遵循以下策略:\n"
    "1. 首先分析用户问题,调用检索工具获取相关上下文;\n"
    "2. 仔细评估检索到的信息是否足以准确、完整地回答问题;\n"
    "3. 如果当前信息不足、模糊或需要更多证据支持,请主动发起新一轮检索(例如换用更具体的关键词或聚焦子问题);\n"
    "4. 你可以进行多轮检索,直到获得足够信息来给出可靠回答;\n"
    "5. 最终回答必须基于检索到的内容,避免臆测或编造信息。"
)
agent = create_agent(model, tools, system_prompt=prompt)

检索生成

python
# 使用智能体回答问题
query = "热门专业top20中,前3名有哪些?"
for step in agent.stream(
    {"messages": [{"role": "user", "content": query}]}, stream_mode="values"
):
    step["messages"][-1].pretty_print()

输出结果

bash
================================ Human Message =================================

热门专业top20中,前3名有哪些?
================================== Ai Message ==================================

我来帮您查找热门专业排名信息。首先让我检索一下热门专业排名相关的信息。
Tool Calls:
  retrieve_context (call_5014ddf36a074e2ea78a7fe7)
 Call ID: call_5014ddf36a074e2ea78a7fe7
  Args:
    query: 热门专业top20排名前3名
    top_k: 3
================================= Tool Message =================================
Name: retrieve_context

Source:《热门专业top20.pdf》
Content: 热门专业 top20, 排名分先后
1 、电气工程及其自动化
电气工程及其自动化专业是就业的专业之一,就业率高。
2 、软件工程专业
软件工程专业是就业的专业之一,由于电子产品的普及,这个行业的需求也在增加。软件工程师的工资水平也较高,
有很高的职位和收入。就业前景广阔。
3 、英语
根据就业的专业排名榜,英语专业的就业率高达 90.9% 。这是因为英语是一门广泛使用的国际语言,在各个行业和领
域中都起着重要的作用。
...

Source:《热门专业top20.pdf》
Content: 
...
18 、财务管理
就业的专业排名榜中,财务管理是其中之一。
19 、信息安全
信息安全是工科类专业,主要学习和研究密码学理论与方法、设备安全、网络安全、信息系统安全、内容和行为安全
等方面的理论与技术。
20 、水利专业
水利专业就业前景不理想,各专业冷热不均。但随着三峡工程等一批大的水利工程上马,水利及其相关的一些专业需
求量明显增加。
================================== Ai Message ==================================

根据检索到的信息,热门专业top20中前3名分别是:

1. **电气工程及其自动化** - 就业率高,是就业的专业之一
2. **软件工程专业** - 由于电子产品的普及,这个行业的需求增加,软件工程师工资水平较高
3. **英语** - 根据就业专业排名榜,英语专业的就业率高达90.9%,因为英语是广泛使用的国际语言

这份排名显示电气工程及其自动化位列第一,软件工程专业第二,英语专业第三。这些专业都有较高的就业率和良好的发展前景。