#
构建智能驱动的 RAG 系统

您可以通过 此 Notebook 跟随代码实践，该文件支持在 Google Colab 中运行。

检索增强生成（Retrieval-Augmented Generation，RAG）系统结合了数据检索和生成模型的能力，以提供上下文感知的响应。例如，用户的查询会被传递给搜索引擎，检索结果与查询一起提供给模型，模型随后根据查询和检索到的信息生成响应。

智能驱动的 RAG（Retrieval-Augmented Generation）通过将自主代理与动态知识检索相结合，扩展了传统 RAG 系统。

传统 RAG 系统使用 LLM 根据检索数据回答查询，而智能驱动的 RAG 实现了对检索和生成流程的智能控制，从而提高了效率和准确性。

传统 RAG 系统面临关键限制，例如依赖单次检索步骤，以及过度关注与用户查询的直接语义相似性，这可能会忽略相关信息。

智能驱动的 RAG 通过允许代理自主制定搜索查询、评估检索结果并进行多次检索步骤，以生成更定制化和全面的输出，从而解决这些问题。

##
基于 DuckDuckGo 的基础检索

让我们构建一个能够使用 DuckDuckGo 进行网页搜索的简单代理。该代理将检索信息并综合响应来回答查询。通过智能驱动的 RAG，Alfred 的代理可以：

- 搜索最新的超级英雄派对趋势
- 优化结果以包含奢侈元素
- 将信息综合成完整方案

以下是 Alfred 的代理实现此功能的代码示例：

    from smolagents import CodeAgent, DuckDuckGoSearchTool, HfApiModel

    # 初始化搜索工具
    search_tool = DuckDuckGoSearchTool()

    # 初始化模型
    model = HfApiModel()

    agent = CodeAgent(
        model=model,
        tools=[search_tool]
    )

    # 使用示例
    response = agent.run(
        "搜索豪华超级英雄主题派对创意，包括装饰、娱乐和餐饮。"
    )
    print(response)

代理遵循以下流程：

1. 请求分析： Alfred 的代理识别查询的关键要素——重点关注装饰、娱乐和餐饮的豪华超级英雄主题派对规划
2. 执行检索： 代理利用 DuckDuckGo 搜索最新相关信息，确保符合 Alfred 对奢侈活动的精细要求
3. 信息综合： 收集结果后，代理将其处理为覆盖派对所有方面的可执行方案
4. 未来参考存储： 代理存储检索信息以便后续活动规划时快速访问，优化后续任务效率

##
自定义知识库工具

对于专业任务，自定义知识库非常宝贵。让我们创建可以查询技术文档或专业知识的向量数据库工具。通过语义搜索，代理可以找到与 Alfred 需求最相关的信息。

向量数据库（vector database）是通过专业 ML 模型实现丰富文档表示的集合，能够快速搜索和检索文档。

该方法将预定义知识与语义搜索相结合，为活动规划提供上下文感知解决方案。通过专业知识访问，Alfred 可以完善派对的每个细节。

在此示例中，我们将创建从自定义知识库检索派对策划创意的工具。使用 BM25 检索器搜索知识库并返回最佳结果，同时使用 `RecursiveCharacterTextSplitter` 将文档分割为更小的块以提高搜索效率：

    from langchain.docstore.document import Document
    from langchain.text_splitter import RecursiveCharacterTextSplitter
    from smolagents import Tool
    from langchain_community.retrievers import BM25Retriever
    from smolagents import CodeAgent, HfApiModel

    class PartyPlanningRetrieverTool(Tool):
        name = "party_planning_retriever"
        description = "通过语义搜索为 Alfred 在韦恩庄园的超级英雄主题派对检索相关策划创意"
        inputs = {
            "query": {
                "type": "string",
                "description": "搜索查询，应与派对策划或超级英雄主题相关",
            }
        }
        output_type = "string"

        def __init__(self, docs, **kwargs):
            super().__init__(**kwargs)
            self.retriever = BM25Retriever.from_documents(
                docs, k=5  # 检索前 5 个文档
            )

        def forward(self, query: str) -> str:
            assert isinstance(query, str), "搜索查询必须是字符串类型"

            docs = self.retriever.invoke(
                query,
            )
            return "\n检索到的创意：\n" + "".join(
                [
                    f"\n\n===== 创意 {str(i)} =====\n" + doc.page_content
                    for i, doc in enumerate(docs)
                ]
            )

    # 模拟派对策划知识库
    party_ideas = [
        {"text": "举办超级英雄主题化装舞会，使用金色装饰和天鹅绒窗帘等豪华装饰", "source": "派对创意 1"},
        {"text": "聘请专业 DJ 播放蝙蝠侠和神奇女侠等超级英雄主题音乐", "source": "娱乐创意"},
        {"text": "餐饮提供以超级英雄命名的菜品，如『绿巨人绿色冰沙』和『钢铁侠能量牛排』", "source": "餐饮创意"},
        {"text": "用标志性超级英雄标志装饰场地，并投射哥谭市等超级英雄城市的投影", "source": "装饰创意"},
        {"text": "通过 VR 互动体验让客人参与超级英雄模拟或主题游戏竞赛", "source": "娱乐创意"}
    ]

    source_docs = [
        Document(page_content=doc["text"], metadata={"source": doc["source"]})
        for doc in party_ideas
    ]

    # 分割文档以提高搜索效率
    text_splitter = RecursiveCharacterTextSplitter(
        chunk_size=500,
        chunk_overlap=50,
        add_start_index=True,
        strip_whitespace=True,
        separators=["\n\n", "\n", ".", " ", ""],
    )
    docs_processed = text_splitter.split_documents(source_docs)

    # 创建检索工具
    party_planning_retriever = PartyPlanningRetrieverTool(docs_processed)

    # 初始化代理
    agent = CodeAgent(tools=[party_planning_retriever], model=HfApiModel())

    # 使用示例
    response = agent.run(
        "寻找豪华超级英雄主题派对的创意，包括娱乐、餐饮和装饰选项。"
    )

    print(response)

增强后的代理能够：

1. 首先检查文档中的相关信息
2. 结合知识库的洞察
3. 在内存中维护对话上下文

##
增强的检索能力

构建智能驱动的 RAG 系统时，代理可以采用以下高级策略：

1. 查询重构： 代理可以优化原始查询，生成更匹配目标文档的搜索词
2. 多步检索： 代理可以进行多次搜索，利用初步结果优化后续查询
3. 多源整合： 结合来自网页搜索和本地文档等多个来源的信息
4. 结果验证： 在将检索内容纳入响应前分析其相关性和准确性

有效的智能驱动 RAG 系统需要仔细考虑几个关键方面。代理应根据查询类型和上下文选择可用工具，记忆系统帮助维护对话历史避免重复检索，后备策略确保在主要检索方法失败时系统仍能提供价值，验证步骤则帮助确保检索信息的准确性和相关性。

##
资源

- Agentic RAG: 使用查询重构和自查询加速您的 RAG 系统！🚀 - 使用 smolagents 开发智能驱动 RAG 系统的实践指南

< > Update on GitHub