三亩地 三亩地SAN MU DI · CODE DIARY
ARTICLE DETAIL

日记详情

真实记录编程学习的某一天,欢迎挑你感兴趣的翻一翻。

10. Harness裁剪+Checkpointer续跑,Agent运行底座这样配

10. Harness裁剪+Checkpointer续跑,Agent运行底座这样配

配套动画视频在:《10. Harness裁剪+Checkpointer续跑,Agent运行底座这样配》,源代码在《评论区置顶》。

大模型自己只会「想」和「说」,真正干活还得有人给它安排工具、约束行为、必要时再派帮手——这套围绕 Agent 转起来的运行环境,就叫 Harness,你可以把它想成 Agent 的工作台。这一节做两件事:把 Harness 裁到当前主流程需要的部分,再用 Checkpointer 让多轮对话能续上。

[图片]

先导入依赖。Harness 配置要用到 HarnessProfile、register_harness_profile;裁剪 TodoList 要用到 TodoListMiddleware;Checkpointer 则需要 MemorySaver:

from deepagents import create_deep_agent, HarnessProfile, register_harness_profile, GeneralPurposeSubagentProfile
from langchain.agents.middleware import TodoListMiddleware
from langgraph.checkpoint.memory import MemorySaver

接着注册一份 Harness 配置:去掉 task、去掉 TodoList 中间件、关掉通用子代理,让 Agent 只走当前这条主流程:

register_harness_profile("openai", HarnessProfile(excluded_tools=frozenset({"task"}),excluded_middleware=frozenset({TodoListMiddleware}),general_purpose_subagent=GeneralPurposeSubagentProfile(enabled=False),
))

创建 Agent 时再传入 checkpointer=MemorySaver(),多轮对话才能按 thread_id 接上:

return create_deep_agent(backend=LocalShellBackend(root_dir=os.getcwd(), virtual_mode=True, inherit_env=True),checkpointer=MemorySaver(),debug=True)

验证续跑时,先写好会话配置:thread_id 用来标识这一条对话线程,后面的 invoke 都传同一份 configurable,Checkpointer 才知道要把多轮对话记在同一条会话里。

第一次提问让 Agent 记住暗号,并加上 config 参数;第二次用同一个 thread_id 问刚才记住的暗号是什么。两次会话接得上,第二次应能答上来:

def main():agent = create_test_agent()cfg = {"configurable": {"thread_id": "checkpoint10"}}result = agent.invoke({"messages": [{"role": "user", "content": "请记住一个暗号:LAOCHEN。"
"只回复:已记住暗号。不要执行工具。"}]}, config=cfg)print(result["messages"][-1].content[0]["text"])result = agent.invoke({"messages": [{"role": "user", "content": "我刚才让你记住的暗号是什么?""只回答暗号本身,不要执行工具。"}]}, config=cfg)print(result["messages"][-1].content[0]["text"])

第二次能答出 LAOCHEN,说明 Checkpointer 已经把同一 thread_id 下的上下文续上了。Harness 裁干净、会话能续跑,Agent 的运行底座就算配到位了。

 配套动画视频在:《10. Harness裁剪+Checkpointer续跑,Agent运行底座这样配》,源代码在《评论区置顶》。

← 返回列表