ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

AgentLoop分享(上): 让 AI 真正“自主干活“-Day15

AgentLoop分享(上): 让 AI 真正“自主干活“-Day15 配套代码simpleAgent 项目agentloop/01_while_loop.py手写 AgentLoop一、一个关键转变从问一句到干一件事用 ChatGPT 时我们是一问一答问一句它答一句。但真实工作不是这样——把收容所的小猫领养出去这个任务需要一连串动作第 1 步先看看收容所有哪些宠物 工具列出目录第 2 步找到猫咪小花把它移走 工具移动文件第 3 步再确认一下现在剩下什么 工具列出目录第 4 步向用户汇报结果 输出总结AI 要完成这类任务不能只答一句话它需要反复地思考 → 动手 → 看结果 → 再思考。这个循环就是AgentLoopAgent 主循环。一句话AgentLoop 反复执行模型提建议 程序执行ToolCall 结果回传直到模型认为任务完成。二、为什么工具执行权必须在我们手里这是 Agent 设计最重要的安全原则模型只会说“我想调用 move_file 工具参数是 inbox/猫咪小花.txt → archive/”真正移动文件的是我们的代码我们可以在执行前做任何检查路径是否合法、权限是否足够、要不要人工确认模型输出文字我要调 move_file(猫咪小花.txt, archive) │ ▼ 代码校验 → 执行 → 返回结果 │ ▼ 结果放回历史 → 模型看到结果 → 决定下一步这也是为什么 Agent 的能力边界 我们给了它多少工具。给它的工具越多、越安全它能干的事越多但风险也越大——工具就是 Agent 的手。三、AgentLoop 的 4 步本质手写版一眼看懂参考代码agentloop/01_while_loop.py核心只有这几步forturninrange(1,8):# ① 限定最多 8 轮防死循环responsellm.invoke(messages)# ② 让模型思考基于全部历史messages.append(response)# 模型的话放回历史ifnotresponse.tool_calls:# ③ 模型没要求调工具print(response.content)# 那就是最终回答结束breaktool_callresponse.tool_calls[0]# ④ 模型要求调工具resulttool_map[tool_call[name]].invoke(tool_call[args])# 执行messages.append(ToolMessage(# 结果放回历史带 tool_call_idcontentstr(result),tool_call_idtool_call[id],))# → 回到 ②模型继续思考这 4 步就是所有 Agent 框架的底层原语。后面学 LangGraph你会发现它只是把这 4 步画成了一张开源的图。三个必须记住的细节历史要全量回传每一轮都要把完整对话历史发给模型模型才能记得前面做过什么。tool_call_id 要对上号工具结果必须带模型给的 id模型才知道这个结果回应的是哪个调用。必须有最大轮数模型可能陷入死循环反复调同一个工具for range(8)就是保险丝。四、核心概念ReAct推理 行动Agent 边思考边行动的经典范式叫ReActReasoning ActingReasoning推理模型观察当前状态决定下一步该干嘛Acting行动调用一个工具观察结果再推理下一步Thought: 我需要先看看收容所有哪些宠物 Action: list_files(inbox) Observation: 有猫咪小花、狗狗旺财、仓鼠球球 Thought: 找到了猫咪小花现在领养它 Action: move_file(inbox/猫咪小花.txt, archive/) Observation: 移动成功 Thought: 任务完成可以汇报了 Answer: 已领养猫咪小花……我们的手写循环就是 ReAct 的代码化。模型输出里的Thought / Action / Observation不一定是显式文字——现在的大模型通过结构化的tool_calls字段直接表达我要行动而观察结果由我们回传。五、动手体验10 分钟cd~/simpleAgentsource.venv/bin/activate# 配置 .env 里的 API_KEYDeepSeek 注册送额度cdagentloop python3 01_while_loop.py运行后你会亲眼看到每一轮的过程--- 第 1 轮模型思考 --- 模型决定调用工具list_files({path: inbox}) 工具返回 - inbox/猫咪小花.txt ... --- 第 2 轮模型思考 --- 模型决定调用工具move_file({source: inbox/猫咪小花.txt, target: archive/}) 工具返回 已移动 ... --- 第 3 轮模型思考 --- ✅ 最终回答已完成领养……推荐练习把任务改成领养仓鼠球球——观察模型怎么自己调整工具参数在代码里故意去掉ToolMessage回传——看模型会失忆把range(1, 8)改成range(1, 2)——看模型来不及完成任务六、小结概念一句话AgentLoop反复思考 → 执行工具 → 回传结果直到任务完成的循环ReAct推理 行动交替的经典范式tool_calls模型表达想调工具的结构化字段name / args / id执行权永远在我们代码手里模型只提议最大轮数防止死循环的保险丝
返回列表