在上一篇文章中,我们解析了 main.py 作为程序入口的完整流程,本文继续深入 run_flow.py 的实现。使用一个新的提示词:计算斐波那契数列的第五项,并将结果保存到文件中。
背景
直接运行后,控制台不断输出异常提示——我们先暂时忽略这些异常,将注意力集中在整体流程上。提示词内容与上一讲相似,但本文重点关注 messages 和 tools 的调用细节。
调试
运行
运行结果仍然是异常频繁出现,不过我们暂时搁置,先审视内部流程。
messages 和 tools
messages 即提示词,具体内容如下:
本次调用的 tool 仅有一个,以下是格式化后的 tools 描述:
[ { "type": "function", "function": { "name": "planning", "description": "规划工具,用于创建和管理复杂任务的解决方案计划。\n提供创建计划、更新步骤和跟踪进度等功能。", "parameters": { "type": "object", "properties": { "command": { "type": "string", "description": "执行的命令,可选值:create(创建计划)、update(更新计划)、list(列出计划)、get(获取详情)、set_active(设置激活计划)、mark_step(标记步骤状态)、delete(删除计划)", "enum": ["create", "update", "list", "get", "set_active", "mark_step", "delete"] }, "plan_id": { "type": "string", "description": "计划唯一标识符。create/update/set_active/delete命令必填,get/mark_step命令可不填(默认使用当前激活计划)" }, "title": { "type": "string", "description": "计划标题。create命令必填,update命令可选" }, "steps": { "type": "array", "description": "计划步骤列表。create命令必填,update命令可选", "items": { "type": "object", "properties": { "step_description": {"type": "string"}, "expected_result": {"type": "string"} } } }, "step_index": { "type": "integer", "description": "步骤序号(从0开始)。mark_step命令必填" }, "step_status": { "type": "string", "description": "步骤状态。用于mark_step命令", "enum": ["not_started", "in_progress", "completed", "failed"] }, "step_notes": { "type": "string", "description": "步骤备注。mark_step命令可选" } }, "required": ["command"], "additionalProperties": False } } }]
虽然只有一个命令,但参数数量较多。大模型的输出恰好与之前 tools 的提示词对应,随后跳转至如下界面:
存储计划的状态数据:


创建计划,然后一步一步执行
最终会到达如下环节:
mark_step 的作用是首先更新步骤对应的状态:
然后继续执行下一步:
新的提示词
该提示词中说明了当前计划的总步骤数,以及已执行到的具体步骤。
接着就回到第一讲中的 agent 执行的部分了
def fibonacci(n):if n <= 0:return 0elif n == 1:return 1else:return fibonacci(n-1) + fibonacci(n-2)fib_5 = fibonacci(5)print(fib_5)
此前 python_execute 报错,原因是 exec(code, safe_globals,{}) 的写法存在问题。在递归调用时,函数名需要从 safe_globals 命名空间中获取。将其改为 exec(code, safe_globals, safe_globals) 后即可正确执行(该问题已在社区最新版本中得到修复)。
第一个 step 完成后,memory 的 prompt 继续 append,这一条是 file_save。当前 memory 是什么样呢?当所有步骤完成后,流程将进入下一阶段。
最后让 llm 总结下过程,然后输出
小 bug
这里存在一个小 bug:尽管提示词中明确要求按步骤执行,但 agent 在完成斐波那契计算后,仍然额外添加了一个保存文件的 function call。尝试在提示词中限制大模型在执行当前步骤时不能提前执行后续步骤,但结果依然如故——重复调用。不过,这类问题有望随着大模型能力的提升而逐步解决,我们不必因为这些小问题而停止对新技术的学习探索。
后续
接下来,我们可以关注最近备受关注的 MCP(Model Context Protocol)。
