背景上一篇文章解析了main.py作为入口的流程, 这次我们看run_flow.py的部分, 我们这次换一个提示词,调试运行这个我们在上一讲看过类似的提示词了,我们主要关心这里 ,messages和tools调用的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的作用是先更新下step对应的状态新的提示词里面表达了,当前计划一共需要多少步,执行到了第几步接着就回到第一讲中的agent执行的部分了def fibonacci(n): if n <= 0: return 0 elif n == 1: return 1 else: return fibonacci(n-1) + fibonacci(n-2)
fib_5 = fibonacci(5)print(fib_5) 之前python_execute报错是因为exec(code,safe_globals,{})的写法有误,当递归调用时,函数名会在safe_globals的命名空间中寻找,改成这样就行(社区最新版已经修复了这个问题了)第一个step完成后,memory的prompt继续append,这一条是file_save最后让llm总结下过程,然后输出小bug这个是因为在step1中,虽然提示词写明了要按步骤执行,但在agent在执行斐波那契的计算后,仍旧添加了保存到文件的另一个function call尝试修复我试着在提示词里制止llm在执行当前step时执行后续的步骤。结果还是一样。。依旧重复,不过这些东西都有望随着llm的强大而解决,不应该因为这些小问题停止对目前新技术的学习。后续 |