基于LangGraph的AI智能体开发实战:从入门到多智能体协作

news2026/4/28 11:50:40
1. 项目概述当AI智能体遇上“菜谱”如果你最近在关注AI智能体Agent的开发可能会感觉有点“头大”。各种框架层出不穷LangChain、AutoGen、CrewAI……概念听起来很酷但真到了想动手做个能实际跑起来的智能体时却常常卡在第一步“我到底该怎么开始”或者“这个框架的XX功能具体怎么写代码”。Sagargupta16/agent-recipes这个项目就像它的名字“菜谱”Recipes一样就是为了解决这个痛点而生的。它不是另一个全新的智能体框架而是一个基于现有强大框架LangGraph的、开箱即用的代码示例与最佳实践集合。你可以把它理解为一本精心编纂的“AI智能体开发实战菜谱”里面没有冗长的理论而是直接给你一道道“菜”的完整做法——从食材准备环境配置到烹饪步骤代码实现再到火候把控参数调优一应俱全。这个项目的核心价值在于“降低实践门槛”和“提供经过验证的模式”。它由社区贡献者维护汇集了多种常见乃至前沿的智能体应用场景。无论你是想构建一个能联网搜索的问答助手、一个能自动化处理多步骤任务的编排系统还是一个能进行复杂推理和规划的多智能体团队你都能在这里找到对应的“配方”快速搭建原型避免重复造轮子。2. 核心架构与设计理念拆解2.1 为什么选择 LangGraph 作为基底在深入“菜谱”之前有必要先了解其依赖的“厨房”——LangGraph。LangChain 生态早已闻名而 LangGraph 是 LangChain 官方推出的一个用于构建有状态、多智能体应用程序的库。它的设计灵感来自图计算将智能体的工作流抽象为“图”Graph其中节点Node代表执行单元如一个工具调用、一个LLM调用边Edge代表控制流决定下一步执行哪个节点。agent-recipes选择 LangGraph 作为基础框架是经过深思熟虑的对复杂工作流的原生支持许多智能体任务不是一步到位的而是包含条件分支、循环、并行等复杂逻辑。LangGraph 的图结构能非常直观地刻画这些流程远比用单纯的链Chain或顺序脚本更清晰、更易维护。状态管理的优雅解智能体在运行过程中需要记住之前的对话、工具调用结果等这就是“状态”。LangGraph 内置了状态管理机制开发者无需自己费力地通过全局变量或复杂的数据结构来传递和更新上下文大大简化了代码。与 LangChain 生态的无缝集成可以直接利用 LangChain 丰富的工具Tools、模型封装LLMs和记忆组件Memory站在巨人的肩膀上快速组合功能。清晰的调试与可视化图结构使得整个智能体的执行路径一目了然便于调试和优化。agent-recipes中的许多示例都展示了如何利用这一特性。因此这个项目可以看作是 LangGraph 最佳实践的“集大成者”展示了如何用这个强大工具解决真实问题。2.2 “菜谱”式代码的组织哲学打开项目的 GitHub 仓库你会发现它的结构非常清晰通常按应用场景或功能模块进行组织/agent-recipes ├── /examples │ ├── basic_agent/ # 基础智能体示例 │ ├── web_search_agent/ # 联网搜索智能体 │ ├── multi_agent/ # 多智能体协作示例 │ ├── planning_agent/ # 具备规划能力的智能体 │ └── ... ├── /tools # 自定义工具示例 ├── /patterns # 通用设计模式 ├── requirements.txt └── README.md这种组织方式极具实用性场景驱动你可以直接带着问题来找答案比如“我要做个能查天气的机器人”就去basic_agent或tools里找相关示例。渐进式学习从basic_agent开始理解节点、边、状态等核心概念再逐步过渡到复杂的multi_agent和planning_agent。模块化复用/tools和/patterns下的代码往往是可以被不同“菜谱”复用的“基础高汤”或“刀工技巧”比如一个精心封装的数据库查询工具或者一个错误处理模式。注意由于项目由社区驱动具体目录结构可能随时间变化但“按场景/功能组织”的核心思想不会变。使用前务必查看最新的 README。3. 关键“菜谱”解析与实操要点让我们深入后厨看看几道招牌“菜”是怎么做的并理解其中的关键技巧。3.1 基础智能体理解工作流的核心构造几乎所有的复杂智能体都始于一个简单模型。一个典型的basic_agent示例会展示以下核心组件状态定义使用TypedDict或 Pydantic 模型明确定义智能体的状态结构。这就像是菜谱的食材清单。from typing import TypedDict, Annotated from langgraph.graph.message import add_messages import operator class AgentState(TypedDict): # 消息历史LangGraph 内置的加法操作符能方便地追加消息 messages: Annotated[list, add_messages] # 用户输入的问题 user_query: str # 智能体生成的最终答案 final_answer: str这里Annotated和add_messages是 LangGraph 的语法糖用于自动处理消息列表的追加避免了手动拼接的麻烦。节点函数每个节点是一个普通的 Python 函数它接收当前状态执行操作并返回更新后的状态片段。def call_model(state: AgentState): 节点调用大语言模型 from langchain_openai import ChatOpenAI model ChatOpenAI(modelgpt-4o-mini) # 从状态中获取对话历史 messages state[messages] # 调用模型 response model.invoke(messages) # 返回一个字典包含要更新的状态部分 return {messages: [response]}边条件路由函数决定工作流下一步走向哪个节点。通常基于模型输出或特定条件。def should_continue(state: AgentState) - str: 边根据模型输出决定继续使用工具还是结束 last_message state[messages][-1] # 如果模型内容中包含“Final Answer:”标记则结束 if Final Answer: in last_message.content: return end # 否则继续执行工具调用节点 return continue图的构建与编译这是 LangGraph 的核心将节点和边组装成可执行的工作流。from langgraph.graph import StateGraph, END workflow StateGraph(AgentState) # 添加节点 workflow.add_node(agent, call_model) workflow.add_node(action, call_tool) # 假设有一个工具调用节点 # 设置入口点 workflow.set_entry_point(agent) # 添加边路由 workflow.add_conditional_edges( agent, should_continue, # 路由判断函数 { continue: action, # 如果返回continue去action节点 end: END # 如果返回end结束流程 } ) workflow.add_edge(action, agent) # 工具调用完回到智能体节点 # 编译成可执行对象 app workflow.compile()实操要点状态最小化只把必要的数据放入状态避免状态过于庞大影响性能和清晰度。节点职责单一一个节点最好只做一件事如调用模型、调用一个特定工具这样图更容易理解和调试。善用add_messages对于对话历史强烈推荐使用Annotated[list, add_messages]它能自动处理消息的合并是避免消息混乱的“神器”。3.2 工具调用智能体扩展能力的核心智能体强大的关键在于能使用工具。agent-recipes中会有大量集成工具的示例。工具定义使用 LangChain 的tool装饰器或继承BaseTool类来定义。from langchain.tools import tool import requests tool def get_weather(city: str) - str: 获取指定城市的当前天气。 # 这里应调用真实的天气API以下为示例 # response requests.get(fhttps://api.weather.com/{city}) # return response.json()[weather] return fThe weather in {city} is sunny and 25°C.绑定工具与模型将工具列表提供给模型让模型知道它可以调用什么。from langchain_openai import ChatOpenAI model ChatOpenAI(modelgpt-4o) model_with_tools model.bind_tools([get_weather])在节点中处理工具调用在智能体节点中模型可能会返回一个ToolCall请求。你需要解析这个请求执行对应的工具函数并将结果以ToolMessage的形式追加到消息历史中。def agent_node(state: AgentState): messages state[messages] # 调用绑定了工具的模型 response model_with_tools.invoke(messages) # 检查响应中是否有工具调用 if response.tool_calls: tool_messages [] for tool_call in response.tool_calls: # 根据 tool_call.name 找到对应的工具函数并执行 if tool_call[name] get_weather: result get_weather.invoke(tool_call[args]) tool_messages.append(ToolMessage(contentstr(result), tool_call_idtool_call[id])) # 将工具执行结果作为消息返回 return {messages: tool_messages} # 如果没有工具调用直接返回模型响应 return {messages: [response]}注意事项工具描述要清晰工具的docstring文档字符串至关重要LLM 主要靠它来理解工具的用途和参数。描述应简洁、准确。错误处理工具执行可能会失败如网络超时、API限流。在工具函数内部和节点调用处都要有基本的try-except处理并返回友好的错误信息给模型让它能调整策略。权限与安全工具能访问外部系统或执行操作。务必谨慎设计工具避免暴露敏感信息或执行危险操作如删除文件、调用高权限API。在生产环境中需要对工具调用进行鉴权和审计。3.3 多智能体协作构建专家团队对于复杂任务单一智能体可能力不从心。multi_agent示例展示了如何构建一个协同工作的智能体团队例如一个“研究员”智能体负责搜索一个“写作”智能体负责润色。为不同角色定义专属状态和节点每个智能体可以有自己关注的状态子集和自己的模型/工具绑定。class ResearchState(TypedDict): query: str search_results: list research_summary: str class WritingState(TypedDict): research_summary: str final_report: str def researcher_node(state: ResearchState): # 此节点专注于搜索和分析 ... def writer_node(state: WritingState): # 此节点专注于撰写报告 ...构建子图并嵌套LangGraph 允许将图编译成子图然后作为另一个图的节点。这是实现多智能体分层协作的关键。# 创建研究员子图 research_graph StateGraph(ResearchState) research_graph.add_node(“researcher”, researcher_node) research_graph.set_entry_point(“researcher”) research_graph.add_edge(“researcher”, END) research_app research_graph.compile() # 在主图中研究员子图作为一个节点 main_graph StateGraph(MainState) # 将编译好的子图作为一个“超级节点”加入 main_graph.add_node(“research_team”, research_app)设计智能体间的通信协议智能体之间如何传递信息通常通过共享的状态字段或者通过发送特定的消息类型如HumanMessage、SystemMessage。agent-recipes中的高级示例可能会展示使用“邮箱”或“黑板”模式进行通信。实操心得明确职责边界在设计多智能体时首要任务是清晰定义每个智能体的角色和职责避免功能重叠和混乱。控制通信成本智能体间频繁通信会产生大量的 Token 消耗和延迟。需要设计高效的通信机制例如只传递摘要而非全文或设定明确的通信回合限制。管理并发与冲突如果多个智能体可以并行执行需要考虑它们可能修改共享状态带来的冲突。LangGraph 本身是顺序执行但可以通过特定模式模拟并行此时需要仔细设计状态更新逻辑。4. 从“菜谱”到“私房菜”进阶实践与模式掌握了基础做法后你可以利用agent-recipes中提供的“模式”Patterns和高级示例来烹饪你的“私房菜”。4.1 规划与执行模式这是让智能体变得更“智能”的关键模式。智能体不是直接回答问题而是先制定一个计划Plan然后一步步执行Execute。planning_agent目录下通常有这样的实现规划节点调用 LLM根据用户目标生成一个结构化的计划。计划可能是一个任务列表每个任务包含描述、所需工具等。执行节点按照规划节点产生的计划依次或选择性地执行每个任务调用工具。动态重规划在执行过程中如果遇到意外如工具失败、信息不足可以触发重规划节点调整后续计划。这种模式特别适合复杂、多步骤的项目任务如“写一份包含市场分析、技术方案和预算的创业计划书”。4.2 记忆与检索模式智能体需要记住长期的对话历史和知识。简单的对话历史存储在状态中但对于大量知识需要引入外部向量数据库进行检索增强生成RAG。记忆节点在对话结束时将重要的对话摘要或事实存储到长期记忆如数据库。检索节点当用户提出新问题时先从向量数据库中检索相关历史信息或知识文档并将其作为上下文注入到当前对话中。agent-recipes可能会展示如何将 LangChain 的ConversationSummaryMemory或VectorStoreRetrieverMemory与 LangGraph 的状态管理结合起来。4.3 监督与路由模式并非所有用户输入都应该触发复杂的智能体工作流。可以设计一个“门卫”或“路由”智能体作为入口先对用户意图进行分类再决定调用哪个专用的子智能体或直接回答。def router_node(state: State): user_input state[‘user_input’] # 简单规则或调用一个分类模型 if “天气” in user_input: return {“next_agent”: “weather_agent”} elif “订餐” in user_input: return {“next_agent”: “food_agent”} else: return {“next_agent”: “general_qa_agent”}这种模式使得系统架构更加清晰、模块化也便于维护和扩展。5. 常见“翻车”现场与调试技巧即使有了完美的菜谱第一次下厨也可能手忙脚乱。以下是一些在开发 LangGraph 智能体时常见的坑和解决思路。5.1 状态管理混乱问题状态更新不符合预期数据丢失或覆盖。排查检查每个节点返回的字典键是否正确对应状态字段名。确认Annotated注解的操作符如add_messages是否使用正确。对于列表追加add_messages是首选。在关键节点打印Log状态内容观察其变化流程。技巧尽量使用 Pydantic 模型来定义状态可以利用其类型验证和自动补全减少拼写错误。5.2 工具调用失败或模型不调用工具问题模型应该调用工具却没调用或者调用了工具但执行出错。排查工具描述检查工具的docstring是否清晰描述了功能和参数。用自然语言多换几种说法测试。模型能力确保使用的模型如gpt-4o,claude-3支持工具调用。gpt-3.5-turbo在此功能上较弱。提示工程在系统消息System Message中明确指示模型“你可以使用以下工具”。查看agent-recipes示例中的系统提示词是怎么写的。参数格式确保工具函数的参数类型str,int等与模型生成的参数匹配。模型有时会生成带引号的字符串需要工具函数能处理。5.3 图编译或执行错误问题workflow.compile()报错或app.invoke()执行时报错。排查节点名唯一性确保所有添加到图中的节点名称是唯一的。边指向正确add_edge和add_conditional_edges中引用的节点名必须存在。入口点设置确保set_entry_point设置了一个已添加的节点。状态一致性检查所有节点函数接收和返回的状态结构是否与StateGraph定义的一致。5.4 成本与延迟优化问题智能体运行速度慢Token 消耗高。优化精简上下文定期总结对话历史而不是无限制地增长messages。agent-recipes中可能有使用ConversationSummaryMemory的示例。选择性工具调用为工具设计更精确的触发条件避免不必要的调用。缓存对于内容变化不频繁的工具调用结果如某些数据查询可以引入缓存机制。设置超时与重试为外部 API 调用设置合理的超时和重试策略避免单个工具卡住整个流程。5.5 调试利器LangGraph Studio这是 LangGraph 官方提供的可视化调试工具它能将你的图结构可视化并逐步执行、查看每个节点的输入输出状态。对于理解复杂工作流和数据流来说这是不可或缺的“显微镜”。在agent-recipes项目中运行示例时强烈建议结合 LangGraph Studio 一起使用能直观地看到“菜谱”是如何一步步执行的。6. 项目实践构建一个简易的旅行规划助手让我们综合运用所学快速勾勒一个基于agent-recipes模式的旅行规划助手框架。目标用户输入目的地和天数智能体协助查询天气、推荐景点、并生成一个简单的行程草案。设计状态定义class TravelState(TypedDict): destination: str days: int weather_info: str attractions: list itinerary_draft: str messages: Annotated[list, add_messages]工具定义get_weather(destination): 查询目的地天气。search_attractions(destination): 搜索目的地热门景点。generate_itinerary(destination, days, weather, attractions): 根据信息生成行程草案。图构建节点1信息收集节点并行或依次调用get_weather和search_attractions工具将结果存入状态。节点2规划节点调用 LLM基于目的地、天数、天气、景点列表生成一个初步的行程想法。节点3细化节点调用generate_itinerary工具或另一个LLM将规划节点的想法扩展成详细的每日行程草案。边顺序执行即可。集成将编译好的图嵌入到你的 Web 应用如 FastAPI或聊天机器人框架中对外提供接口。通过这个实践你会发现agent-recipes提供的不仅仅是代码片段更是一种构建复杂 AI 应用的思维模式和工程范式。它帮你跳过了从零设计架构的迷茫期直接站在了实践的前沿。最后记住这本“菜谱”是开源的、动态的。最好的使用方式不是照搬而是理解其原理后根据自己项目的“口味”进行调整和创新。遇到问题时除了查阅示例多去项目的 Issue 和 Discussion 区看看社区的力量往往能带来意想不到的解决方案。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2562438.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…

网络编程(Modbus进阶)

思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…

IDEA运行Tomcat出现乱码问题解决汇总

最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…

利用最小二乘法找圆心和半径

#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式

一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明&#xff1a;假设每台服务器已…

XML Group端口详解

在XML数据映射过程中&#xff0c;经常需要对数据进行分组聚合操作。例如&#xff0c;当处理包含多个物料明细的XML文件时&#xff0c;可能需要将相同物料号的明细归为一组&#xff0c;或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码&#xff0c;增加了开…

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造&#xff0c;完美适配AGV和无人叉车。同时&#xff0c;集成以太网与语音合成技术&#xff0c;为各类高级系统&#xff08;如MES、调度系统、库位管理、立库等&#xff09;提供高效便捷的语音交互体验。 L…

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)

题目&#xff1a;3442. 奇偶频次间的最大差值 I 思路 &#xff1a;哈希&#xff0c;时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况&#xff0c;哈希表这里用数组即可实现。 C版本&#xff1a; class Solution { public:int maxDifference(string s) {int a[26]…

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型

摘要 拍照搜题系统采用“三层管道&#xff08;多模态 OCR → 语义检索 → 答案渲染&#xff09;、两级检索&#xff08;倒排 BM25 向量 HNSW&#xff09;并以大语言模型兜底”的整体框架&#xff1a; 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后&#xff0c;分别用…

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板&#xff0c;载入页面后&#xff0c;会显示引导弹窗&#xff0c;适用于引导用户使用页面&#xff0c;点击完成后&#xff0c;会显示下一个引导弹窗&#xff0c;直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…

接口测试中缓存处理策略

在接口测试中&#xff0c;缓存处理策略是一个关键环节&#xff0c;直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性&#xff0c;避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明&#xff1a; 一、缓存处理的核…

龙虎榜——20250610

上证指数放量收阴线&#xff0c;个股多数下跌&#xff0c;盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型&#xff0c;指数短线有调整的需求&#xff0c;大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的&#xff1a;御银股份、雄帝科技 驱动…

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具&#xff0c;该工具基于TUN接口实现其功能&#xff0c;利用反向TCP/TLS连接建立一条隐蔽的通信信道&#xff0c;支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式&#xff0c;适应复杂网…

铭豹扩展坞 USB转网口 突然无法识别解决方法

当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑&#xff1a;陈萍萍的公主一点人工一点智能 未来机器人的大脑&#xff1a;如何用神经网络模拟器实现更智能的决策&#xff1f;RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战&#xff0c;在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…

Linux应用开发之网络套接字编程(实例篇)

服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …

华为云AI开发平台ModelArts

华为云ModelArts&#xff1a;重塑AI开发流程的“智能引擎”与“创新加速器”&#xff01; 在人工智能浪潮席卷全球的2025年&#xff0c;企业拥抱AI的意愿空前高涨&#xff0c;但技术门槛高、流程复杂、资源投入巨大的现实&#xff0c;却让许多创新构想止步于实验室。数据科学家…

深度学习在微纳光子学中的应用

深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向&#xff1a; 逆向设计 通过神经网络快速预测微纳结构的光学响应&#xff0c;替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…