【LangGraph】 官方demo调整为本地大模型实现
官网文档链接https://docs.langchain.com/oss/python/langgraph/quickstart#full-code-example样例代码# 第一步定义工具与大模型 # 导入LangChain工具装饰器用于将普通函数封装为Agent可调用的工具 from langchain.tools import tool # 导入LangChain模型初始化函数原Claude模型使用已注释 from langchain.chat_models import init_chat_model # 导入本地Ollama大模型对接类用于调用本地部署的大模型 from langchain_ollama import ChatOllama # 原始代码初始化Anthropic官方Claude模型需要API Key已注释 # model init_chat_model( # claude-sonnet-4-6, # temperature0 # ) # 初始化本地Ollama部署的通义千问3.5大模型无API密钥纯本地运行 # model指定本地模型名称temperature0 代表输出结果确定性最高无随机生成 model ChatOllama( modelqwen3.5:27b, # 你的本地运行的大模型名称 temperature0 ) # 定义工具1乘法函数 # tool 装饰器将Python函数转化为Agent可识别、调用的标准工具 tool def multiply(a: int, b: int) - int: Multiply a and b. Args: a: First int b: Second int # 工具核心逻辑执行乘法计算并返回结果 return a * b # 定义工具2加法函数 tool def add(a: int, b: int) - int: Adds a and b. Args: a: First int b: Second int # 工具核心逻辑执行加法计算并返回结果 return a b # 定义工具3除法函数 tool def divide(a: int, b: int) - float: Divide a and b. Args: a: First int b: Second int # 工具核心逻辑执行除法计算并返回结果 return a / b # 将所有工具存入列表方便后续管理 tools [add, multiply, divide] # 创建工具名称-工具对象的映射字典用于后续根据工具名快速找到对应工具 tools_by_name {tool.name: tool for tool in tools} # 将工具绑定到大模型上让大模型具备**自主调用工具**的能力 model_with_tools model.bind_tools(tools) # 第二步定义Agent状态 # 导入消息类型基类用于统一管理对话消息 from langchain.messages import AnyMessage # 导入类型注解工具用于定义结构化状态 from typing_extensions import TypedDict, Annotated # 导入运算符用于实现消息列表的追加合并Annotated使用 import operator # 定义Agent的全局状态类似Agent的记忆/内存 class MessagesState(TypedDict): # 消息列表Annotatedoperator.add 表示新消息会追加到列表末尾而非覆盖 messages: Annotated[list[AnyMessage], operator.add] # 记录大模型调用次数用于调试/统计 llm_calls: int # 第三步定义大模型调用节点 # 导入系统消息类用于给大模型发送指令提示 from langchain.messages import SystemMessage # 节点函数调用大模型让大模型判断是否需要使用工具 def llm_call(state: dict): LLM decides whether to call a tool or not # 从当前状态中获取历史消息拼接系统提示词后调用大模型 # 返回值更新Agent的消息列表 大模型调用次数1 return { messages: [ model_with_tools.invoke( # 系统提示定义大模型的角色算术计算助手 [ SystemMessage( contentYou are a helpful assistant tasked with performing arithmetic on a set of inputs. ) ] # 拼接用户历史对话消息 state[messages] ) ], # 累加大模型调用次数 llm_calls: state.get(llm_calls, 0) 1 } # 第四步定义工具执行节点 # 导入工具消息类用于封装工具调用的结果并返回给大模型 from langchain.messages import ToolMessage # 节点函数执行大模型指定的工具调用 def tool_node(state: dict): Performs the tool call # 存储所有工具调用的结果 result [] # 遍历大模型最后一条消息中的所有工具调用指令 for tool_call in state[messages][-1].tool_calls: # 根据工具名称从工具字典中找到对应的工具 tool tools_by_name[tool_call[name]] # 执行工具传入参数获取执行结果 observation tool.invoke(tool_call[args]) # 将工具结果封装为ToolMessage方便大模型识别 result.append(ToolMessage(contentobservation, tool_call_idtool_call[id])) # 返回更新后的消息列表工具执行结果 return {messages: result} # 第五步定义流程控制逻辑 # 导入字面量类型用于限定返回值的可选范围 from typing import Literal # 导入LangGraph核心组件状态图、开始节点、结束节点 from langgraph.graph import StateGraph, START, END # 条件判断函数决定Agent下一步是调用工具还是直接结束流程 def should_continue(state: MessagesState) - Literal[tool_node, END]: Decide if we should continue the loop or stop based upon whether the LLM made a tool call # 获取Agent当前的所有消息 messages state[messages] # 获取最后一条消息大模型的输出 last_message messages[-1] # 判断逻辑如果大模型生成了工具调用指令 → 执行工具节点 if last_message.tool_calls: return tool_node # 判断逻辑如果没有工具调用 → 结束流程直接回复用户 return END # 第六步构建并编译Agent # 创建状态图工作流传入自定义的状态结构 agent_builder StateGraph(MessagesState) # 添加节点将函数注册为Agent的执行节点 agent_builder.add_node(llm_call, llm_call) agent_builder.add_node(tool_node, tool_node) # 添加边定义节点的执行顺序 # 1. 流程起点 → 大模型调用节点 agent_builder.add_edge(START, llm_call) # 2. 条件边大模型节点执行后根据should_continue结果决定走向 agent_builder.add_conditional_edges( llm_call, should_continue, [tool_node, END] ) # 3. 工具执行完成后 → 回到大模型节点让大模型分析工具结果 agent_builder.add_edge(tool_node, llm_call) # 编译Agent将定义好的流程图转化为可运行的对象 agent agent_builder.compile() # 可视化运行Agent # 导入IPython绘图工具用于可视化Agent流程图服务器环境可注释 from IPython.display import Image, display # 展示Agent的执行流程图 display(Image(agent.get_graph(xrayTrue).draw_mermaid_png())) # 导入用户消息类用于构造用户输入 from langchain.messages import HumanMessage # 构造用户输入问题计算34 messages [HumanMessage(contentAdd 3 and 4.)] # 运行Agent传入初始状态用户消息 messages agent.invoke({messages: messages}) # 遍历并打印所有消息用户输入、大模型输出、工具结果 for m in messages[messages]: m.pretty_print()
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2466826.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!