早上5点就起来读书了,看完《论语别裁》里仁篇,还学了下波动方程和傅立叶变换,大早上学习效率就是高。
这几天也关注到头条的Trae Agent开源了,因此读了下源码,重点想知道它是如何分析全仓库代码的,毕竟全代码当prompt输入也不现实,LLM有长度限制,就算没限制也会看了后面,忘了前面。还有一个问题是如何解决复杂问题,怎么拆分复杂任务,又如何确保多个子任务的完成,如何边观察边修正错误的。
Trae Agent代码不多,其实重点就在工具调用,关键就是Bashtool与SequentialThinkingTool。
如何理解仓库级代码?
先来看第一个问题。这主要还是通过LLM调用bash工具来搜索代码,定位问题相关代码来理解的。不过没看到有安全限制,默认直接执行,要是LLM抽风,来个`rm -rf /` 就有得玩了。
通过bash工具来搜索代码过于粗糙了,因为会把符号定义与使用都搜索出来,而很多时候我们更需要的是获取符号的定义代码,因此会造成输出信息的干扰。这种方式简单且通用,就是搜索结果作二次筛选。
其实有更好的其它方案,有兴趣的可以去了解下LSP(Language Server Protocol)。
如何解决复杂问题?
重点就于SequentialThinkingTool,它能实现更长链的思考,特别适合复杂问题的解决。传统的思维链虽能拆分任务,但对于复杂问题,需要很多步骤来解决的,经常是走个2,3步就收工,很难长链思考与执行,而且还无法观测与修正,除非你用多agent协同解决。
sequential_thinking 是一个可反复调用的结构化思考脚手架。
- 每一次调用 = 一条“思维记录”(thought)。
- 参数:当前 thought 内容、第几条、总条数、是否还需要下一条。
与一次性输出整条 CoT 不同,它把思考过程切成可观察、可回溯、可干预的小段,从而更容易在 10-20 步内保持逻辑一致。
假设code_analyze_agent允许调用该工具SequentialThinkingTool来分析代码,解决项目bug并修复,那其交互流程可能如下:
用户└─► code_analyze_agent:issue 描述└─► sequential_thinking(1/5)└─► bash: find . -name "*.py" | xargs grep "KeyError"└─► sequential_thinking(2/5)└─► bash: python repro.py → 得到 Traceback└─► sequential_thinking(3/5)└─► 得出“root cause 是 dict.pop 的默认值缺失”└─► sequential_thinking(4/5)└─► str_replace_based_edit_tool:修改 src/foo.py└─► sequential_thinking(5/5)└─► bash: pytest tests/ → 全部通过└─► task_done() → 向用户提交报告
详细示例对话
Agent 系统提示(来自 Trae-Agent)
You can call sequential_thinking as much as you need. Set totalThoughts ≥ 5. You may run bash commands between thoughts.
Step 1 – 理解问题
sequential_thinking( thought="用户说:‘运行 flask app 时报 KeyError: "missing_config_key"’。我需要先弄清楚缺的是哪个 key。", thoughtNumber=1, totalThoughts=6, nextThoughtNeeded=true)
Step 2 – 收集证据
bash: grep -R "missing_config_key" .# 输出:config/default.py:21: raise KeyError("missing_config_key")
Step 3 – 复现
bash: python -m pytest tests/test_config.py::test_default -v# 输出:FAILED KeyError: "missing_config_key"
Step 4 – 诊断
sequential_thinking( thought="问题根源:代码尝试从 os.environ.pop('MISSING_CONFIG_KEY') 读取但无默认值。我应该给它一个缺省值。", thoughtNumber=4, totalThoughts=6, nextThoughtNeeded=true)
Step 5 – 修改
str_replace_based_edit_tool( file="config/default.py", old_str="value = os.environ.pop('MISSING_CONFIG_KEY')", new_str="value = os.environ.pop('MISSING_CONFIG_KEY', 'dev-default')")
Step 6 – 验证
bash: pytest tests/test_config.py -q# 输出:1 passedsequential_thinking( thought="测试通过,边缘情况也已覆盖;可以结束任务。", thoughtNumber=6, totalThoughts=6, nextThoughtNeeded=false)task_done()
序列思考与思维链的对比
能力 | CoT(思维链) | Sequential Thinking |
---|---|---|
步骤修正 | ❌ 需全流程重生成 | ✅ 局部修正( |
多路径探索 | ❌ 单一路径 | ✅ 多分支( |
跨会话连续性 | ❌ 仅限单次对话 | ✅ 持久化存储历史思考 |
外部工具集成 | ⚠️ 有限 | ✅ 无缝调用(如代码分析器) |
一句话总结
sequential_thinking 把 LLM 的“黑盒长链思考”拆成了可观测、可调试、可脚本化的若干小步;code_analyze_agent 通过“思考→工具→结果→再思考”的循环,像人类工程师一样步步为营地解决复杂问题。