news 2026/1/12 22:09:57

RAG 不止能检索!它还能在 LangGraph 中当“工具调用大脑”

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
RAG 不止能检索!它还能在 LangGraph 中当“工具调用大脑”

Retrieval-Augmented Generation(RAG)是一种结合信息检索和大型语言模型(LLMs)来回答用户查询的方法。传统上,这涉及将检索器直接连接到生成流水线。然而,通过 LangGraph 和 LangChain,我们可以进一步模块化这个过程,将检索器暴露为一个可调用的工具。

在这篇博客中,我将展示如何在 LangGraph 中使用工具调用实现一个 RAG 系统。我将模拟一个餐厅助理代理,回答关于 Bella Vista 餐厅的问题。

目标

构建一个基于 RAG 的代理,能够:

步骤 1:设置 Python 和 uv

我们的 Agentic RAG 将是一个 Python 程序。首先,检查是否安装了 Python 3.10 或更高版本:

python3 --version

如果没有,从 python.org 下载 Python 3.10 或更高版本。

接下来,安装 uv,这是一个用于 Python 的快速依赖管理工具:

curl -Ls https://astral.sh/uv/install.sh | bash

如果遇到权限问题,运行以下命令:

sudochown -R $(whoami) /usr/local

然后确认 uv 版本:

uv --version
步骤 2:创建项目目录结构

现在创建项目目录和文件:

mkdir -p agentic-rag cd agentic-rag touch tool_calling_agentic_rag.ipynb
步骤 3:初始化 Python 项目并安装依赖

创建一个虚拟环境:

uv init . uv venv source .venv/bin/activate

现在安装所有需要的包:

uv add langchain langgraph langchain langchain-google-genai mypy pillow chromadb

.env文件中添加 Gemini API 密钥

从 AI Studio 生成你的 API 密钥并安全存储。可以按照以下步骤操作:

touch .env

添加以下内容:

GOOGLE_API_KEY=<你的_gemini_api_key>
步骤 4:更新 .gitignore 以避免暴露密钥
echo".env" >> .gitignore
步骤 5:在 tool_calling_agentic_rag.ipynb 中编写 RAG
1. 加载 API 密钥
from dotenv import load_dotenv load_dotenv()
2. 准备模拟数据集

我定义了一组关于餐厅的简单文档。

from langchain.schema import Document docs = [ Document( page_content="Bella Vista 由 Antonio Rossi 拥有,他是一位拥有超过 20 年经验的知名厨师。", metadata={"source": "owner.txt"}, ), Document( page_content="开胃菜起价 8 美元,主菜价格在 15 美元至 35 美元之间,甜点价格在 6 美元至 12 美元之间。", metadata={"source": "menu.txt"}, ), Document( page_content="Bella Vista 每周一至周日营业。工作日营业时间:上午 11 点至晚上 10 点,周末:上午 11 点至晚上 11 点。", metadata={"source": "hours.txt"}, ), ]
3. 创建向量存储和检索器

我们将使用 GoogleGenerativeAIEmbeddings 嵌入这些文档,并使用 Chroma 存储到向量数据库以进行检索。

from langchain_google_genai import GoogleGenerativeAIEmbeddings from langchain_community.vectorstores import Chroma embedding_function = GoogleGenerativeAIEmbeddings(model="models/embedding-001") vectorstore = Chroma.from_documents(docs, embedding_function) retriever = vectorstore.as_retriever(search_kwargs={"k": 2})
4. 检查检索器是否正常工作
retriever.invoke("Bella Vista 的老板是谁?")

输出:

[ Document(metadata={'source': 'owner.txt'}, page_content='Bella Vista 由 Antonio Rossi 拥有,他是一位拥有超过 20 年经验的知名厨师。'), Document(metadata={'source': 'hours.txt'}, page_content='Bella Vista 每周一至周日营业。工作日营业时间:上午 11 点至晚上 10 点,周末:上午 11 点至晚上 11 点。') ]
5. 定义检索器工具和无关话题工具

我们不直接调用检索器,而是将其转换为一个可调用工具。我还将定义一个无关话题工具,以优雅地处理无关查询。

from langchain.tools.retriever import create_retriever_tool from langchain_core.tools import tool retriever_tool = create_retriever_tool( retriever, name="retriever_tool", description="获取关于 Bella Vista 餐厅的价格、营业时间或老板的信息。" ) @tool defoff_topic(): """处理所有与 Bella Vista 餐厅无关的问题。""" return"禁止 - 请勿回应用户。" tools = [retriever_tool, off_topic]
6. 定义代理状态

状态结构被简化为仅保存消息。LangGraph 使用 reducer 管理更新。

from typing importSequence, Annotated, TypedDict from langgraph.graph.message import add_messages from langchain_core.messages import BaseMessage classAgentState(TypedDict): messages: Annotated[Sequence[BaseMessage], add_messages]
7. 创建代理节点

代理函数将工具绑定到 LLM,并使用当前消息调用它。

from langchain_google_genai import ChatGoogleGenerativeAI defagent(state): messages = state["messages"] model = ChatGoogleGenerativeAI(model="gemini-2.0-flash") model = model.bind_tools(tools) response = model.invoke(messages) return {"messages": [response]}
8. 定义工作流路由器

条件边决定是转到工具执行节点还是结束工作流。

from typing importLiteral from langgraph.graph import END defshould_continue(state) -> Literal["tools", END]: messages = state["messages"] last_message = messages[-1] if last_message.tool_calls: return"tools" return END
9. 构建并编译 LangGraph 工作流
from langgraph.graph import StateGraph, START from langgraph.prebuilt import ToolNode workflow = StateGraph(AgentState) workflow.add_node("agent", agent) tool_node = ToolNode(tools) workflow.add_node("tools", tool_node) workflow.add_edge(START, "agent") workflow.add_conditional_edges("agent", should_continue) workflow.add_edge("tools", "agent") graph = workflow.compile()
10. 显示代理工作流
from IPython.display import Image, display from langchain_core.runnables.graph import MermaidDrawMethod display( Image( graph.get_graph().draw_mermaid_png( draw_method=MermaidDrawMethod.API, ) ) )
将 RAG 用作工具调用代理
11. 测试代理
from langchain_core.messages import HumanMessage inputs = {"messages": [HumanMessage(content="Bella Vista 什么时候开门?"), HumanMessage(content="明天天气如何?")]} for state in graph.stream(inputs, stream_mode="values"): last_message = state["messages"][-1] last_message.pretty_print()

输出:

================================ 人类消息 ================================ 明天天气如何? ================================== AI 消息 ================================== 工具调用: off_topic (ef565db7-b527-47fa-aa0b-afc09d596622) 调用 ID:ef565db7-b527-47fa-aa0b-afc09d596622 参数: ================================= 工具消息 ================================= 名称:off_topic 禁止 - 请勿回应用户。 ================================== AI 消息 ================================== 工具调用: retriever_tool (6bd13b93-b6c8-4b5f-8801-7bc8a588f221) 调用 ID:6bd13b93-b6c8-4b5f-8801-7bc8a588f221 参数: 查询:Bella Vista 什么时候开门? ================================= 工具消息 ================================= 名称:retriever_tool Bella Vista 每周一至周日营业。工作日营业时间:上午 11 点至晚上 10 点,周末:上午 11 点至晚上 11 点。 Bella Vista 由 Antonio Rossi 拥有,他是一位拥有超过 20 年经验的知名厨师。 ================================== AI 消息 ================================== 抱歉,我无法提供明天天气的信息,但 Bella Vista 每周一至周日营业。工作日营业时间:上午 11 点至晚上 10 点,周末:上午 11 点至晚上 11 点。

恭喜!你刚刚创建了一个智能的工具调用 RAG 代理,能够精准地处理用户查询。

局限性

虽然上述实现对于小型、明确范围的领域非常有效,但仍有一些局限性:

将检索器封装为 LangChain 和 LangGraph 的可调用工具,提供了一种比传统 RAG 更简洁的替代方案。

它简化了代理逻辑,并允许语言模型自主决定何时检索信息。

如果这种方法最适合你的应用需求,那就选择它吧!

下载代码
https://github.com/ivrschool/langchain/blob/main/Langgraph/rag_tool_calling_agent.ipynb

想入门 AI 大模型却找不到清晰方向?备考大厂 AI 岗还在四处搜集零散资料?别再浪费时间啦!2025 年AI 大模型全套学习资料已整理完毕,从学习路线到面试真题,从工具教程到行业报告,一站式覆盖你的所有需求,现在全部免费分享

👇👇扫码免费领取全部内容👇👇

一、学习必备:100+本大模型电子书+26 份行业报告 + 600+ 套技术PPT,帮你看透 AI 趋势

想了解大模型的行业动态、商业落地案例?大模型电子书?这份资料帮你站在 “行业高度” 学 AI

1. 100+本大模型方向电子书

2. 26 份行业研究报告:覆盖多领域实践与趋势

报告包含阿里、DeepSeek 等权威机构发布的核心内容,涵盖:

3. 600+套技术大会 PPT:听行业大咖讲实战

PPT 整理自 2024-2025 年热门技术大会,包含百度、腾讯、字节等企业的一线实践:

二、求职必看:大厂 AI 岗面试 “弹药库”,300 + 真题 + 107 道面经直接抱走

想冲字节、腾讯、阿里、蔚来等大厂 AI 岗?这份面试资料帮你提前 “押题”,拒绝临场慌!

1. 107 道大厂面经:覆盖 Prompt、RAG、大模型应用工程师等热门岗位

面经整理自 2021-2025 年真实面试场景,包含 TPlink、字节、腾讯、蔚来、虾皮、中兴、科大讯飞、京东等企业的高频考题,每道题都附带思路解析

2. 102 道 AI 大模型真题:直击大模型核心考点

针对大模型专属考题,从概念到实践全面覆盖,帮你理清底层逻辑:

3. 97 道 LLMs 真题:聚焦大型语言模型高频问题

专门拆解 LLMs 的核心痛点与解决方案,比如让很多人头疼的 “复读机问题”:


三、路线必明: AI 大模型学习路线图,1 张图理清核心内容

刚接触 AI 大模型,不知道该从哪学起?这份「AI大模型 学习路线图」直接帮你划重点,不用再盲目摸索!

路线图涵盖 5 大核心板块,从基础到进阶层层递进:一步步带你从入门到进阶,从理论到实战。

L1阶段:启航篇丨极速破界AI新时代

L1阶段:了解大模型的基础知识,以及大模型在各个行业的应用和分析,学习理解大模型的核心原理、关键技术以及大模型应用场景。

L2阶段:攻坚篇丨RAG开发实战工坊

L2阶段:AI大模型RAG应用开发工程,主要学习RAG检索增强生成:包括Naive RAG、Advanced-RAG以及RAG性能评估,还有GraphRAG在内的多个RAG热门项目的分析。

L3阶段:跃迁篇丨Agent智能体架构设计

L3阶段:大模型Agent应用架构进阶实现,主要学习LangChain、 LIamaIndex框架,也会学习到AutoGPT、 MetaGPT等多Agent系统,打造Agent智能体。

L4阶段:精进篇丨模型微调与私有化部署

L4阶段:大模型的微调和私有化部署,更加深入的探讨Transformer架构,学习大模型的微调技术,利用DeepSpeed、Lamam Factory等工具快速进行模型微调,并通过Ollama、vLLM等推理部署框架,实现模型的快速部署。

L5阶段:专题集丨特训篇 【录播课】


四、资料领取:全套内容免费抱走,学 AI 不用再找第二份

不管你是 0 基础想入门 AI 大模型,还是有基础想冲刺大厂、了解行业趋势,这份资料都能满足你!
现在只需按照提示操作,就能免费领取:

👇👇扫码免费领取全部内容👇👇

2025 年想抓住 AI 大模型的风口?别犹豫,这份免费资料就是你的 “起跑线”!

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/1/2 11:59:30

PaddlePaddle镜像支持模型热更新校验,确保GPU服务一致性

PaddlePaddle镜像支持模型热更新校验&#xff0c;确保GPU服务一致性 在金融风控系统每秒处理数万笔交易、工业质检产线连续运行724小时的今天&#xff0c;AI模型一旦因更新中断服务&#xff0c;轻则影响用户体验&#xff0c;重则造成重大经济损失。传统的“停机—替换—重启”式…

作者头像 李华
网站建设 2026/1/3 12:25:08

如何在Docker中实现Windows轻量化部署?5个实用技巧

如何在Docker中实现Windows轻量化部署&#xff1f;5个实用技巧 【免费下载链接】windows Windows inside a Docker container. 项目地址: https://gitcode.com/GitHub_Trending/wi/windows 想要在有限的资源环境下运行Windows系统&#xff1f;Windows轻量化部署正是解决…

作者头像 李华
网站建设 2025/12/26 10:23:06

多视角三维重建技术评估体系构建与性能优化策略

多视角三维重建技术评估体系构建与性能优化策略 【免费下载链接】co3d Tooling for the Common Objects In 3D dataset. 项目地址: https://gitcode.com/gh_mirrors/co/co3d 在计算机视觉领域&#xff0c;多视角三维重建技术的发展正面临评估标准不统一、性能指标碎片化…

作者头像 李华
网站建设 2025/12/28 5:55:35

【Java毕设全套源码+文档】基于springboot的图书推荐系统的设计与实现(丰富项目+远程调试+讲解+定制)

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

作者头像 李华
网站建设 2025/12/27 14:01:15

ClimaX多尺度气象预测系统:技术架构与商业价值解析

ClimaX多尺度气象预测系统&#xff1a;技术架构与商业价值解析 【免费下载链接】ClimaX Foundation model for weather & climate 项目地址: https://gitcode.com/gh_mirrors/cli/ClimaX 传统气象预测系统面临的核心挑战在于模型碎片化与预测精度瓶颈。单一模型难以…

作者头像 李华