10. Harness裁剪+Checkpointer续跑,Agent运行底座这样配
配套动画视频在《10. Harness裁剪+Checkpointer续跑,Agent运行底座这样配》,源代码在《评论区置顶》。
大模型自己只会「想」和「说」,真正干活还得有人给它安排工具、约束行为、必要时再派帮手——这套围绕 Agent 转起来的运行环境,就叫 Harness,你可以把它想成 Agent 的工作台。这一节做两件事:把 Harness 裁到当前主流程需要的部分,再用 Checkpointer 让多轮对话能续上。
![[图片]](https://i-blog.csdnimg.cn/img_convert/30ee9cce7f102d151fe13e7f8e1098a7.png)
先导入依赖。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运行底座这样配》,源代码在《评论区置顶》。
更多推荐
所有评论(0)