Retrieval-Augmented Generation(RAG)是一种结合信息检索和大型语言模型(LLMs)来回答用户查询的方法。传统上,这涉及将检索器直接连接到生成流水线。然而,通过 LangGraph 和 LangChain,我们可以进一步模块化这个过程,将检索器暴露为一个可调用的工具。
在这篇博客中,我将展示如何在 LangGraph 中使用工具调用实现一个 RAG 系统。我将模拟一个餐厅助理代理,回答关于 Bella Vista 餐厅的问题。
目标
构建一个基于 RAG 的代理,能够:
• 将文档检索器封装为一个可调用工具。
• 通过专门的回退工具处理无关话题的输入。
• 通过消息精简保持最小的代理状态。
• 利用 LangGraph 实现清晰的工作流路由。
步骤 1:设置 Python 和 uv
我们的 Agentic RAG 将是一个 Python 程序。首先,检查是否安装了 Python 3.10 或更高版本:
复制如果没有,从 python.org 下载 Python 3.10 或更高版本。
接下来,安装 uv,这是一个用于 Python 的快速依赖管理工具:
复制如果遇到权限问题,运行以下命令:
复制然后确认 uv 版本:
复制步骤 2:创建项目目录结构
现在创建项目目录和文件:
复制步骤 3:初始化 Python 项目并安装依赖
创建一个虚拟环境:
复制现在安装所有需要的包:
复制在 .env 文件中添加 Gemini API 密钥
从 AI Studio 生成你的 API 密钥并安全存储。可以按照以下步骤操作:
复制添加以下内容:
复制步骤 4:更新 .gitignore 以避免暴露密钥
复制步骤 5:在 tool_calling_agentic_rag.ipynb 中编写 RAG
1. 加载 API 密钥
复制2. 准备模拟数据集
我定义了一组关于餐厅的简单文档。
复制3. 创建向量存储和检索器
我们将使用 GoogleGenerativeAIEmbeddings 嵌入这些文档,并使用 Chroma 存储到向量数据库以进行检索。
复制4. 检查检索器是否正常工作
复制输出:
复制5. 定义检索器工具和无关话题工具
我们不直接调用检索器,而是将其转换为一个可调用工具。我还将定义一个无关话题工具,以优雅地处理无关查询。
复制6. 定义代理状态
状态结构被简化为仅保存消息。LangGraph 使用 reducer 管理更新。
复制7. 创建代理节点
代理函数将工具绑定到 LLM,并使用当前消息调用它。
复制8. 定义工作流路由器
条件边决定是转到工具执行节点还是结束工作流。
复制9. 构建并编译 LangGraph 工作流
复制10. 显示代理工作流
复制将 RAG 用作工具调用代理
11. 测试代理
复制输出:
复制恭喜!你刚刚创建了一个智能的工具调用 RAG 代理,能够精准地处理用户查询。
局限性
虽然上述实现对于小型、明确范围的领域非常有效,但仍有一些局限性:
• 可扩展性:随着文档库的增长,向量搜索和分类需要优化。
• 内存:当前实现不保留任何历史交互的记忆。LangGraph 的 InMemorySaver 可用于短期会话内存。对于生产级使用,建议使用数据库支持的持久内存解决方案。
将检索器封装为 LangChain 和 LangGraph 的可调用工具,提供了一种比传统 RAG 更简洁的替代方案。
它简化了代理逻辑,并允许语言模型自主决定何时检索信息。
如果这种方法最适合你的应用需求,那就选择它吧!
下载代码:https://github.com/ivrschool/langchain/blob/main/Langgraph/rag_tool_calling_agent.ipynb