langgraph搭建智能体各个组件使用与总结

LangGraph 技术学习总结

基于leaning_langgraph.py的 LangGraph 学习笔记与实践总结


📚 目录

  1. 环境配置
  2. 核心概念
  3. Agent 创建
  4. 记忆机制
  5. MCP 集成
  6. Graph 图结构
  7. 高级特性

1. 环境配置

1.1 基础依赖

importosimportpicklefromdatetimeimportdatetimefromlangchain_community.chat_modelsimportChatTongyifromlanggraph.prebuiltimportcreate_react_agentfromlanggraph.checkpoint.memoryimportInMemorySaverfromlanggraph.store.memoryimportInMemoryStorefromlanggraph.graphimportStateGraph,MessagesState,START,END

1.2 模型配置

# 配置 DashScope API Keyos.environ["DASHSCOPE_API_KEY"]="your-api-key"# 创建百炼模型实例llm=ChatTongyi(model_name="qwen-max",# 选项: qwen-max, qwen-plus, qwen-turbotemperature=0.7,streaming=False)

2. 核心概念

2.1 Agent(智能体)

Agent 是 LangGraph 的核心组件,能够使用工具(tools)来完成任务。

创建基础 Agent:

agent=create_react_agent(model=llm,tools=[tool_function],checkpointer=checkpointer# 可选,用于记忆管理)

2.2 Tools(工具)

工具是 Agent 可调用的函数,需要带有详细的注释说明。

defcurrent_time():'''查询时间'''# 注释是必须的,根据注释分配工具time=datetime.today()time.strftime("%Y-%m-%d")returntime

2.3 State(状态)

State 是整个应用共享的状态,可以使用 TypedDict 或 Pydantic 定义。

fromtypingimportTypedDictclassOverallState(TypedDict):user_input:strmiddle_output1:strmiddle_output2:strgraph_output:str

2.4 Node(节点)

节点是具体的任务执行单元。

defnode_1(state:OverallState)->OverallState:return{"middle_output1":state["user_input"]+">进行到middle1"}

2.5 Edge(边)

边定义节点之间的依赖关系。

类型说明示例
普通边单向连接graph.add_edge("node_1", "node_2")
条件边根据条件动态路由graph.add_conditional_edge(START, function_node)

3. Agent 创建与使用

3.1 基础 Agent

fromlanggraph.prebuiltimportcreate_react_agent checkpointer=InMemorySaver()agent=create_react_agent(model=llm,tools=[current_time],checkpointer=checkpointer)config={"configurable":{"thread_id":"1"}}# 调用 Agentresult=agent.invoke({"messages":[{"role":"user","content":"现在几月几号了?"}]},config)print(result)

3.2 带 Hook 的 Agent

使用pre_model_hook对输入进行预处理。

fromlangmem.short_termimportSummarizationNode# 方式1: 总结式记忆summarization_node=SummarizationNode(token_counter=count_tokens_approximately,model=llm,max_tokens=384,max_summary_tokens=128,output_messages_key="llm_input_message")classState(AgentState):context:dict[str,Any]agent=create_react_agent(model=llm,tools=[current_time],checkpointer=checkpointer,pre_model_hook=summarization_node,state_schema=State)
# 方式2: 裁剪式记忆defpre_model_hook(state):result=trim_messages(state['messages'],strategy="last",token_counter=count_tokens_approximately,max_tokens=384,start_on="human",end_on=['human',"tool"])return{"llm_input_message":result}

4. 记忆机制

LangGraph 提供三种记忆管理方式:

4.1 Checkpointer(短期记忆)

使用InMemorySaver保存对话历史。

fromlanggraph.checkpoint.memoryimportInMemorySaver checkpointer=InMemorySaver()agent=create_react_agent(model=llm,tools=[current_time],checkpointer=checkpointer)config={"configurable":{"thread_id":"1"}}# 第一次调用print(agent.invoke({"messages":[{"role":"user","content":"现在几月几号了?"}]},config))# 第二次调用(可记住上下文)print(agent.invoke({"messages":[{"role":"user","content":"那明天呢?"}]},config))

4.2 消息处理策略

策略说明适用场景
Summarization总结历史记录长对话需要保留关键信息
Trimming删除旧信息只需要最近上下文

4.3 Store(长期记忆)

使用InMemoryStore保存用户信息。

fromlanggraph.store.memoryimportInMemoryStorefromlanggraph.configimportget_storefromlangchain_core.runnablesimportRunnableConfig store=InMemoryStore()store.put(("user"),"id_123",{"name":"邓茗芳","age":"27"})defget_user_info(config:RunnableConfig):"""提供用户的个人信息的函数"""store=get_store()user_id=config["configurable"].get("user_id")user_info=store.get(("user"),user_id)returnstr(user_info.value)ifuser_infoelse"暂未查询到该用户的任何信息"agent=create_react_agent(model=llm,tools=[get_user_info],store=store)config={"configurable":{"user_id":"id_123"}}print(agent.invoke({"messages":[{"role":"user","content":"查用户年龄"}]},config))

5. MCP 集成

MCP (Model Context Protocol) 是一种用于连接 AI 模型与外部服务的协议。

5.1 MCP 两种传输方式

方式说明特点
SSE基于 HTTP 的长连接协议适合远程服务
stdio本地执行应用程序获取结果适合本地工具

5.2 使用 MCP 客户端(注释示例)

# from langchain_mcp_adapters.client import MultiServerMCPClient# import asyncio# async def create_use_mcp_agent():# client = MultiServerMCPClient({# "amap-maps": {# "command": "npx",# "args": ["-y", "@amap/amap-maps-mcp-server"],# "env": {"AMAP_MAPS_API_KEY": "your-api-key"},# "transport": "stdio"# }# })# tools = await client.get_tools()# agent = create_react_agent(model=llm, tools=tools)# response = await agent.ainvoke({# "messages": [{"role": "user", "content": "杭州新天地到欣景苑怎么走?"}]# })# return response# response = asyncio.run(create_use_mcp_agent())# print(response)

5.3 连接自定义 MCP 服务器

fromlangchain_mcp_adapters.toolsimportload_mcp_toolsfrommcpimportStdioServerParameters,stdio_client,ClientSessionimportmcp.typesastypes server_params=StdioServerParameters(command="python",args=["/www/learning_langchain/mcp_server.py"])asyncdefhandle_sample_message(message:types.CreateMessageRequestParams)->types.CreateMessageResult:returntypes.CreateMessageResult(role="assistant",content=types.TextContent(type="text",text="hello!"),model='qwen-plus',stopReason="endTurn")asyncdefuse_mcp_agent():asyncwithstdio_client(server_params)as(read,write):asyncwithClientSession(read,write,sampling_callback=handle_sample_message)assession:awaitsession.initialize()tools=awaitsession.list_tools()print(tools)resource=awaitsession.list_resources()print(resource)result=awaitsession.call_tool("is_daka",{})print(result)returnresultprint(asyncio.run(use_mcp_agent()))

6. Graph 图结构

Graph 是有向无环图(DAG),用于描述任务之间的依赖关系。

6.1 构建基础 Graph

fromtypingimportTypedDictfromlanggraph.graphimportStateGraph,START,ENDclassOverallState(TypedDict):user_input:strmiddle_output1:strmiddle_output2:strgraph_output:strdefnode_1(state:OverallState)->OverallState:return{"middle_output1":state["user_input"]+">进行到middle1"}defnode_2(state:OverallState)->OverallState:return{"middle_output2":state["middle_output1"]+">进行到middle2"}defnode_3(state:OverallState)->OverallState:return{"graph_output":state["middle_output2"]+">结束"}graph=StateGraph(state_schema=OverallState)graph.add_node("node_1",node_1)graph.add_node("node_2",node_2)graph.add_node("node_3",node_3)graph.add_edge(START,"node_1")graph.add_edge("node_1","node_2")graph.add_edge("node_2","node_3")graph.add_edge("node_3",END)graph=graph.compile()print(graph.invoke({"user_input":"开始"}))

6.2 可视化 Graph

fromIPython.displayimportImage,display display(Image(graph.get_graph().draw_mermaid_png()))

6.3 Graph 与大模型结合

defcall_model(state:MessagesState)->MessagesState:response=llm.invoke(state["messages"])return{"messages":response}builder=StateGraph(state_schema=MessagesState)builder.add_node("call_model",call_model)builder.add_edge(START,"call_model")builder.add_edge("call_model",END)builder=builder.compile()print(builder.invoke({"messages":[{"role":"user","content":"湖南省会城市是哪里?"}]}))

6.4 Node 高级特性

重试机制:

graph.add_node("node_1",node_1,retry=RetryPolicy(max_attempts=4))

缓存机制:

graph=graph.compile(InMemorycache())

7. 高级特性

7.1 条件边(Conditional Edge)

根据函数结果动态选择下一个节点。

defshould_continue(state):# 返回下一个节点的名称ifsome_condition:return"node_2"return"end"graph.add_conditional_edge("node_1",should_continue)

7.2 Time Travel(时间回溯)

由于大模型回答具有不确定性,发现某个步骤出问题时,可以手动指定从 Graph 的某个 Node 开始重演。

importuuidfromlanggraph.checkpoint.memoryimportInMemorySaverclassState(TypedDict):planning:strcity:strdefget_city(state:State):prompt="请帮我随机推荐一个热门旅游城市,只说出城市名称即可,严禁多于废话"res=llm.invoke(prompt)return{"city":res}deftravel_planning(state:State):prompt=f'请给我推荐一下{state["city"]}中的美食和三天的出行规划'res=llm.invoke(prompt)return{"planning":res}builder=StateGraph(State)builder.add_node("get_city",get_city)builder.add_node("travel_planning",travel_planning)builder.add_edge(START,"get_city")builder.add_edge("get_city","travel_planning")builder.add_edge("travel_planning",END)config={"configurable":{"thread_id":uuid.uuid4()}}checkpoints=InMemorySaver()builder=builder.compile(checkpointer=checkpoints)# 执行print(builder.invoke({"messages":[{"role":"user","content":"请给我推荐一下热门旅游城市"}]},config))# 获取历史状态state=list(builder.get_state_history(config))for_instate:print(_.next)print(_.config['configurable']['checkpoint_id'])# 修改状态并重新执行selected_state=state[1]new_config=builder.update_state(selected_state.config,values={"city":"西藏"})print(builder.invoke(None,new_config))

7.3 Human-in-the-Loop(人类监督)

使用interrupt()方法实现人类干预,决定是否执行工具。

# 示例(需具体实现)defhuman_review_node(state):# interrupt 等待人类确认result=interrupt({"question":"是否继续执行下一步?"})ifresult:return{"status":"approved"}else:return{"status":"rejected"}

8. 总结与最佳实践

8.1 核心组件对比

组件作用常用类
Agent智能主体,调用工具create_react_agent
Checkpointer短期记忆,对话历史InMemorySaver
Store长期记忆,用户信息InMemoryStore
Graph任务流程图StateGraph

8.2 记忆策略选择

  • 短期对话:使用 Checkpointer + Trim
  • 长期对话:使用 Checkpointer + Summarization
  • 用户信息:使用 Store

8.3 传输方式选择

  • 远程服务:使用 MCP (SSE)
  • 本地工具:使用 MCP (stdio)

8.4 代码规范

  1. 工具函数必须添加详细注释
  2. State 使用 TypedDict 或 Pydantic 定义
  3. Graph 结构清晰,避免复杂循环
  4. 合理使用 Checkpointer 进行状态管理

9. 参考资料

  • LangChain 官方文档
  • LangGraph 文档
  • MCP 协议规范
  • 阿里云百炼 API

文档生成时间: 2026-01-22
源文件:leaning_langgraph.py

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

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

相关文章

当数字员工与熊猫智汇结合,如何提升销售转化率?

在当前商业环境中,数字员工以其出色的业务流程优化能力和高效的成本控制,成为企业提升效率的新利器。借助AI销冠系统,这些智能工具能够自动化常规任务,如客户咨询与数据分析,使企业能快速应对市场需求。数字员工的实时…

电动冲浪板市场鱼龙混杂?这些口碑好的品牌值得关注!

电动冲浪板市场鱼龙混杂?这些口碑好的品牌值得关注! 水上运动领域,电动冲浪板正逐渐成为热门之选。然而当下电动冲浪板市场可谓鱼龙混杂,各种品牌和产品让人眼花缭乱。很多消费者满怀期待购买,却可能遭遇质量不佳…

2026年市面上诚信的氟塑料磁力泵供应商电话,耐腐蚀磁力泵/耐酸碱磁力泵/衬氟磁力泵/磁力泵,氟塑料磁力泵供应商推荐

氟塑料磁力泵作为化工、制药、电镀等强腐蚀性介质输送的核心设备,其性能稳定性与耐腐蚀性直接关系到生产安全与效率。近年来,随着环保政策趋严及产业升级需求,市场对氟塑料磁力泵的技术门槛、服务响应能力及全生命周…

RHCSA—搭建论坛

欢迎大家积极讨论~

维生素B族哪个牌子好?2026维生素B族科学选购手册:3大核心指标测评,亚健康人群不踩雷

头脑转不动、体力透支的背后,往往是一组营养细节被忽略。随着年龄增长或加班、熬夜、酗酒等生活状态,身体对维生素B族的需求拉高,却因饮食单一或脏器代谢减弱而跟不上消耗,慢慢造成能量枯竭与心脑负担加重,敏感体…

蓝牙音响CE认证办理流程

蓝牙音响 CE 认证需覆盖 RED、LVD、EMC、RoHS 四大核心指令,优先采用模块化策略 预测试摸底,全流程按 “合规锁定→文件样品→预测试整改→正式测试→DoC 与贴标→长期存档” 推进,常规周期 4-6 周,NB 介入路径 6-8 周&#xff0…

卤素水分测定仪/水分测试仪哪个品牌好?口碑、品质、售后服务全解析

卤素水分测试仪,作为基于热重分析原理的快速水分检测设备,凭借其检测速度快、操作简便、适用性广等特点,已成为食品、制药、化工、农业、矿产及科研等诸多行业进行原料验收、过程控制与成品检验的关键质量工具。与传…

2026年空乘实训室建设:多媒体供应商挑选的智慧之道,目前比较好的实训室生产厂家忠军装备专注行业多年经验,口碑良好

在航空职业教育与应急培训领域,空乘多媒体实训室作为核心教学载体,直接影响人才培养质量与行业安全水平。其建设需兼顾高仿真场景还原、设备稳定性及教学功能适配性,而供应商的技术实力与服务能力成为关键决策要素。…

探秘 AgentRun丨为什么应该把 LangChain 等框架部署到函数计算 AgentRun

作者:江昱 阿里云函数计算 AgentRun 全新发布后,我们整理了“探秘 AgentRun”系列文章,本系列将梳理企业落地 Agent 常见难题,给出具体解法,助力 Agentic AI 快速走进生产级环境。欢迎加入“函数计算 AgentRun 客户群…

亚马逊DV报告,新旧标准与报告验证

亚马逊 DV 报告(Direct Validation,直接验证)是平台 2025 年 9 月起针对儿童玩具等高风险品类推行的合规机制,核心变化在于流程由卖家自主上传报告转为 TIC 机构直接验证并提交结果,标准更严、报告有效期缩短、验证更规…

蓝牙产品什么情况需要申请BQB认证?

蓝牙产品需申请 BQB 认证的核心判断标准是 “使用蓝牙技术并商用流通,或使用蓝牙商标 / 标识”,以下从核心场景、特殊情形与豁免条件三方面以纯文本详细说明。一、必须申请 BQB 认证的核心场景商用销售且宣称蓝牙功能:任何面向公开市场销售的…

大模型编程开发翻车现场!Opencode+三大国产模型联手修复代码失败,却在问题诊断上秒杀单模型?小白必看AI实战经验

昨天我试用Opencode搭载3个国内大模型作为oh-my-opencode的角色(glmdeepseekminimax),尝试帮我的网格交易系统修复一个问题。 总体体验是:慢,就像codex那样慢,但没有codex的能力——问题没修复&#xff0c…

Redis脑裂场景

Redis脑裂场景深度解析 一、脑裂问题本质 脑裂(Split-Brain) 是分布式系统中由于网络分区导致集群被分割成多个独立子集群,每个子集群都认为自己是唯一存活的部分,从而可能产生数据不一致的严重问题。 二、Redis脑…

Agent真香警告:不懂Agent的程序员,正在被时代淘汰!大模型+AI编程开发新范式

阿里妹导读 作者通过深入分析、理解、归纳,最后解答了“为什么一定要做Agent”这个问题。 我们团队近一年多的时间一直在服务领域持续构建、深耕Agent能力,在这方面我本人也投入了大量的精力。不过呢,在进行Agent能力落地、推广的过程中&am…

锂电池CB 电池CB认证产品范围

锂电池 CB 认证的产品范围以含碱性或非酸性电解液的可充电二次电芯、电池组为核心,核心聚焦锂系二次电池,同时覆盖部分镍系二次电池,按应用场景和产品特性分为便携式消费类、动力类、储能类三大核心品类,各品类对应专属 IEC 标准&…

2026山东辐射防护器材厂家TOP5推荐:全链实力引领行业发展

随着医疗放射诊断普及、工业无损检测规范化推进,辐射防护器材的品质与合规性成为采购核心考量。在山东这片防护器材产业集聚地,众多企业各有特色,但综合实力与服务能力存在明显差异。经过资质核验、市场调研及项目案…

数据结构系列4之顺序栈链式栈

栈出现的意义:做历史记录;倒着走的逻辑、暂存状态的需求、回溯;函数调用意味着入栈,函数返回意味着出栈一.顺序栈1.四种操作行为顺序栈中,指针指向位置和操作行为上分为4种满栈,空栈,递增栈,递减…

告别灌引水!真空辅助自吸泵如何实现9米高吸程?一篇读懂技术原理与企业实战​

真空辅助自吸泵深度测评:高吸程领域的领先企业与技术优势 在工业泵送领域,自吸泵作为一种关键设备,其性能直接影响生产效率与运营成本。传统自吸泵面临水位低于泵体时需反复灌引水的痛点,长时间停泵后二次启动繁琐…

ISO 26262安全分析概览

本期研讨围绕安全分析这一主题展开。根据ISO 26262标准要求,合规的安全相关项目必须在系统、硬件和软件级别执行安全分析。为达成这一目标,需综合运用多种分析技术并合理组合,且确保分析结果与其他工作成果相互融合…

别再卷参数了!大模型开发必看:如何打造能打的企业级AI Agent

AI Agent正迎来它的“祛魅”时刻:市场的关注焦点,从“模型有多大”转向“业务有多懂”。 当行业发现,仅靠一个参数庞大的通用大模型无法有效解决业务中的难题时,最初的喧嚣开始沉淀,真正的竞赛拉开帷幕。 甲子光年智…