AI创想

标题: 【LangGraph】langgraph.managed.IsLastStep 类:工作流中跟踪当前步骤是否为最后一步 [打印本页]

作者: 创想小编    时间: 9 小时前
标题: 【LangGraph】langgraph.managed.IsLastStep 类:工作流中跟踪当前步骤是否为最后一步
作者:彬彬侠
本文是对 LangGraph 中 langgraph.managed.IsLastStep 类的详细介绍,涵盖其定义、功能、使用场景、代码示例以及注意事项。

1. IsLastStep 类的概述

langgraph.managed.IsLastStep 是 LangGraph 提供的一个 托管值(Managed Value) 类,位于 langgraph.managed 模块中。它用于在工作流的状态中跟踪当前执行是否为图的最后一步。IsLastStep 是一个特殊的动态值,由 LangGraph 运行时自动管理,开发者无需手动设置其值。
核心特点

典型应用场景


2. IsLastStep 类的定义

2.1 类定义

根据 LangGraph 文档,IsLastStep 的定义如下:
  1. from langgraph.managed import IsLastStep, ManagedValue
  2. from typing import Any, Optional
  3. from langchain_core.runnables import RunnableConfig
  4. classIsLastStep(ManagedValue[bool]):def__call__(self, step:int, config: Optional[RunnableConfig]=None,**kwargs: Any)->bool:...
复制代码
2.2 返回值

2.3 工作原理


3. IsLastStep 的使用方式

IsLastStep 通常通过 Annotated 类型注解集成到 StateGraph 的状态定义中,作为状态的一个字段。节点函数可以读取该字段的布尔值,以根据是否为最后一步调整逻辑。
3.1 状态注解

在状态定义中,使用 Annotated[..., IsLastStep] 指定某个字段由 IsLastStep 管理:
  1. from typing import TypedDict, Annotated
  2. from langgraph.managed import IsLastStep
  3. classState(TypedDict):input:str
  4.     output:str
  5.     is_last_step: Annotated[bool, IsLastStep]
复制代码
3.2 节点逻辑

节点函数可以通过状态访问 is_last_step,根据其值执行不同逻辑:
  1. defnode(state: State)-> State:if state["is_last_step"]:
  2.         state["output"]=f"最后一步: {state['input']}"else:
  3.         state["output"]=f"中间步骤: {state['input']}"return state
复制代码

4. 使用场景和代码示例

以下是 IsLastStep 的典型使用场景和详细代码示例。
4.1 简单工作流:检查最后一步

构建一个工作流,节点根据 is_last_step 执行不同逻辑。
  1. from typing import TypedDict, Annotated
  2. from langgraph.graph import StateGraph, START, END
  3. from langgraph.managed import IsLastStep
  4. # 定义状态classState(TypedDict):input:str
  5.     output:str
  6.     is_last_step: Annotated[bool, IsLastStep]# 定义节点defprocess(state: State)-> State:
  7.     state["output"]=f"中间处理: {state['input']}"return state
  8. deffinalize(state: State)-> State:if state["is_last_step"]:
  9.         state["output"]=f"最后一步: {state['input']}"else:
  10.         state["output"]=f"非最后一步: {state['input']}"return state
  11. # 创建 StateGraph
  12. workflow = StateGraph(State)
  13. workflow.add_node("process", process)
  14. workflow.add_node("finalize", finalize)
  15. workflow.add_edge(START,"process")
  16. workflow.add_edge("process","finalize")
  17. workflow.add_edge("finalize", END)# 编译和运行
  18. graph = workflow.compile()
  19. result = graph.invoke({"input":"Hello"})print(result)# {'input': 'Hello', 'output': '最后一步: Hello', 'is_last_step': True}
复制代码
说明
4.2 对话系统:最后一步总结

在对话系统中,使用 IsLastStep 判断是否结束对话并生成总结。
  1. from typing import TypedDict, Annotated, List
  2. from langgraph.graph import StateGraph, START, END, add_messages
  3. from langgraph.managed import IsLastStep
  4. from langchain_core.messages import HumanMessage, AIMessage
  5. from langchain_openai import ChatOpenAI
  6. # 定义状态classState(TypedDict):
  7.     messages: Annotated[List[BaseMessage], add_messages]
  8.     is_last_step: Annotated[bool, IsLastStep]# 定义节点defagent(state: State)-> State:
  9.     llm =(ChatOpenAI(model="gpt-4o-mini"))if state["is_last_step"]:
  10.         response = llm.invoke(state["messages"]+[HumanMessage(content="请总结对话")])else:
  11.         response = llm.invoke(state["messages"])return{"messages": response}# 条件函数defroute(state: State)->str:return END iflen(state["messages"])>=3else"agent"# 创建 StateGraph
  12. workflow = StateGraph(State)
  13. workflow.add_node("agent", agent)
  14. workflow.add_edge(START,"agent")
  15. workflow.add_conditional_edges("agent", route,{"agent":"agent", END: END})# 编译和运行
  16. graph = workflow.compile()
  17. result = graph.invoke({"messages":[HumanMessage(content="Hello!")],"is_last_step":False})print(result["messages"][-1].content)# 对话总结(在第 3 次循环后)
复制代码
说明
4.3 工具调用:最后一步处理

在工具调用工作流中,使用 IsLastStep 决定是否格式化最终输出。
  1. from typing import TypedDict, Annotated, List
  2. from langgraph.graph import StateGraph, START, END, add_messages
  3. from langgraph.managed import IsLastStep
  4. from langchain_core.messages import HumanMessage, AIMessage, ToolMessage
  5. from langchain_core.tools import tool
  6. from langchain_openai import ChatOpenAI
  7. # 定义工具@tooldefsearch(query:str):returnf"搜索结果: {query}"# 定义状态classState(TypedDict):
  8.     messages: Annotated[List[BaseMessage], add_messages]
  9.     is_last_step: Annotated[bool, IsLastStep]# 定义节点defagent(state: State)-> State:
  10.     llm = ChatOpenAI(model="gpt-4o-mini").bind_tools([search])
  11.     response = llm.invoke(state["messages"])return{"messages": response}deftool_node(state: State)-> State:
  12.     tool_call = state["messages"][-1].tool_calls[0]
  13.     result = search.invoke(tool_call["args"]["query"])return{"messages": ToolMessage(content=result, tool_call_id=tool_call["id"])}deffinalize(state: State)-> State:if state["is_last_step"]:
  14.         last_message = state["messages"][-1]
  15.         state["messages"].append(AIMessage(content=f"最终结果: {last_message.content}"))return state
  16. # 条件函数defroute(state: State)->str:return"tool"if state["messages"][-1].tool_calls else"finalize"# 创建 StateGraph
  17. workflow = StateGraph(State)
  18. workflow.add_node("agent", agent)
  19. workflow.add_node("tool", tool_node)
  20. workflow.add_node("finalize", finalize)
  21. workflow.add_edge(START,"agent")
  22. workflow.add_conditional_edges("agent", route,{"tool":"tool","finalize":"finalize"})
  23. workflow.add_edge("tool","agent")
  24. workflow.add_edge("finalize", END)# 编译和运行
  25. graph = workflow.compile()
  26. result = graph.invoke({"messages":[HumanMessage(content="搜索 LangGraph")]})print(result["messages"][-1].content)# 最终结果: 搜索结果: LangGraph
复制代码
说明

5. 注意事项


6. 总结

langgraph.managed.IsLastStep 是一个托管值类,用于在 LangGraph 工作流中跟踪当前步骤是否为最后一步。其核心特点包括:
通过在状态中定义 is_last_step 字段并在节点中检查其值,你可以轻松实现基于最后一步的条件逻辑。IsLastStep 特别适合对话系统和多步骤工作流,与 MessageGraph 和 StateGraph 无缝配合。
参考文献

原文地址:https://blog.csdn.net/u013172930/article/details/147986016




欢迎光临 AI创想 (https://www.llms-ai.com/) Powered by Discuz! X3.4