当前位置: 首页 > news >正文

LangGraph运行时配置thread_id和user_id;特殊返回类型Command;

LangGraph运行时配置thread_id和user_id;

文档中经常提到的thread_id,跟对话持久化关联,需要仔细了解

thread_id是LangGraph的checkpointer的存储密钥,用于一条标识对话线程。只有编译图时建立了checkpointer,它才会生效。
user_id是业务元数据,框架不抓取,只在节点里由业务逻辑自行取用。

以下几个问题是我在实现持久对话时产生的问题:

  • graph.ainvoke中的{"configurable": {"thread_id": "1"}}是什么
    这是传给 LangGraph 的运行时配置,thread_id是 checkpointer 的存储密钥,用于一条标识对话线程。
    只有编译图时建立了checkpointer,它才会生效:_adaptive_rag_graph = graph_builder.compile(checkpointer=_adaptive_rag_checkpointer)

  • 相同用户两次调用,thread_id是否相同
    LangGraph 不管理“用户”概念,thread_id 完全由业务层决定。
    同一个 thread_id 代表状态累积的同一个会话,不同的 thread_id 则相互隔离。

  • 重启服务后相同thread_id丢失记忆
    因为默认的MemorySaver把状态存在进程内存里,重启后清空。要重启持久化需要换成SqliteSaver或PostgresSaver。

  • 生产环境 thread_id 的设计
    一般绑定到用户会话,常见格式为user_{user_id}session。需要存到业务数据库方便查询历史记录,并考虑检查点的清理机制。

thread_id 和 user_id 的区别

  • thread_id:checkpointer的存储key,决定读写器哪份状态,框架层使用
  • user_id:业务元数据,框架不抓取,只在节点里由业务逻辑自行取用

特殊返回类型Command;

其实之前在看langchain的时候就接触到了特殊返回类型Command,而且就是用的langgraph.types里面的,那个只是它的其中一种用法

Command来自langgraph.types,是LangGraph里一个多用途的特殊返回类型,根据使用位置不同,承担不同的职责。

场景一:节点内动态路由

传统做法是在构建图时用add_conditional_edges加一个单独的路由函数。
Command允许把路由逻辑直接内联在节点里,同时完成状态更新跳转

def node_a(state):if state["score"] > 0.8:return Command(update={"result": "high"}, goto="node_b")else:return Command(update={"result": "low"}, goto="node_c")

节点之间不需要显式连边,goto本身就是边。为了让图的可视化仍能显示拓扑结构,add_node时可以声明出口:
Pythonbuilder.add_node("node_a", node_a, ends=["node_b", "node_c"])

场景二:工具内更新图的状态(也就是之前langchain处看到的)

普通工具只能字符串结果,无法修改图的状态。
工具返回Command可以直接写入返回状态字段:

@tool
def set_user_name(new_name: str, runtime: ToolRuntime) -> Command:"""Set the user's name."""return Command(update={"user_name": new_name,"messages": [ToolMessage(content=f"已设置用户名为 {new_name}", tool_call_id=runtime.tool_call_id)]})

适合需要在工具流程执行中持久化某些业务数据到状态的场景。

场景三:恢复中断断点(暂停继续场景)

图执行到interrupt()暂停后,外部调用方Command(resume=...)将用户的决策注入回图,恢复执行:

# 第一次 invoke,执行到 interrupt() 暂停
await graph.ainvoke({"messages": [HumanMessage("帮我分析报告")]},config={"configurable": {"thread_id": "abc"}}
)# 用户确认后,第二次 invoke 恢复
await graph.ainvoke(None,  # state 传 None,从 checkpoint 恢复config={"configurable": {"thread_id": "abc"}},command=Command(resume="continue")  # 注入用户决策
)

resume的值会成为节点内interrupt()调用的返回值。

image

http://www.jsqmd.com/news/720180/

相关文章:

  • 四月回南天除湿机怎么选?2026年家用除湿机品牌排行榜 - 资讯焦点
  • 2026年全业态资产管理软件,连锁工厂酒店系统精选合集 - 品牌2026
  • 期刊推荐:Applications in Plant Sciences(ISSN: 2168-0450)
  • PHP 9.0 + RAG + 异步流式响应:三步完成企业级AI客服系统部署(含JWT鉴权+速率限制+审计日志完整配置)
  • 兰州家具超市选购全攻略:避坑逻辑与靠谱选项 - 奔跑123
  • 国内大型展馆设计公司排名,成都汉诺会展服务有限公司实力突出 - 速递信息
  • 智慧农业玉米生长阶段分类识别数据集 玉米计算机视觉数据集 玉米生长状态识别 生长进程监测 农业 AI 场景识别第10430期 (1)
  • FakeLocation终极指南:5步掌握安卓应用级虚拟定位技巧
  • 2026年新能源叉车厂家推荐:比亚迪新能源叉车/新能源锂电叉车/四驱越野叉车专业供应商精选 - 品牌推荐官
  • 除湿机厂家哪家最值得信赖?不看广告看“内功” - 资讯焦点
  • 终极音乐解锁指南:免费打破音乐平台格式壁垒
  • Win11Debloat终极指南:3步轻松清理Windows系统,提升性能与隐私保护
  • 2026年最新连锁奶茶店烤漆背光字生产厂家推荐指南 - 奔跑123
  • ProxySQL(六)—— ProxySQL 集群
  • 【会议征稿通知 | 昆明理工大学主办 | IET出版 | EI 、Scopus稳定检索】第十一届信息科学、计算机技术与交通运输国际学术会议(ISCTT 2026)
  • Cursor Free VIP破解工具终极指南:三步实现AI编程助手永久免费使用
  • 别再只改主干网络了!YOLOv5模型轻量化避坑指南:从MobileNetV3、ShuffleNetV2到GhostNet的全面对比实验
  • 教学一体机与电视的本质差异:商显技术的专业化演进 - 资讯焦点
  • 「权威评测」2026年四川美国BOSE会议音响系统厂家实力推荐,谁才是靠谱之选? - 深度智识库
  • 上交AutoLab中科院提出OneDrive:探索原生VL模型能否统一自驾多种异构任务
  • DeOldify图像上色服务场景实战:打造个性化纪念品定制工具
  • 变压器检测公司:科电中威直阻变比测试技术深度解析 - 资讯焦点
  • 2026年商超发光字烤漆背光字评测深度解析 - 奔跑123
  • 【会议征稿通知 | 华南理工大学主办 | IEEE出版 | EI 、Scopus稳定检索】第十届电子信息技术与计算机工程国际学术会议(EITCE 2026)
  • 别只埋头写代码了!用老子‘道法术器’模型,给你的程序员生涯做一次‘CT扫描’
  • 别再调参了!用Arduino+伺服电机,5分钟搞懂PID三环控制的底层逻辑
  • Degrees of Lewdity中文汉化完整教程:三步实现无障碍游戏体验
  • Preguss:结合大语言模型与形式化验证的运行时错误检测
  • Obsidian Day Planner:2025年终极日程管理插件,打造高效时间管理系统
  • 3步轻松搞定Android设备预装软件清理:Universal Android Debloater完全指南