Agent核心循环

📎 引用文件

本文引用的文件 - loop.py - context.py - memory.py - tools.py - grounding.py - progress.py - trace.py - test_agent_loop_stream_retry.py

目录

  1. 简介
  2. 项目结构
  3. 核心组件
  4. 架构总览
  5. 详细组件分析
  6. 依赖关系分析
  7. 性能考量
  8. 故障排查指南
  9. 结论
  10. 附录:配置、调试与监控

简介

本文件为 Vibe-Trading Agent 的“核心循环”提供深入文档,聚焦 ReAct 模式的实现机制、Agent 状态管理、工具调用流程与消息处理管道。重点说明上下文构建器(ContextBuilder)如何生成系统提示词、注入工具描述、管理记忆快照并增强用户消息;解释 Agent 生命周期管理、错误恢复机制与性能优化策略;并提供配置选项、调试方法与监控指标,以及典型使用场景与最佳实践。

项目结构

围绕核心循环的关键模块位于 agent/src/agent 下: - loop.py:ReAct 主循环、迭代控制、流式输出、压缩与工具批处理、追踪与状态落盘 - context.py:上下文构建器,负责系统提示词、工具描述、技能摘要、持久化记忆注入与消息组装 - memory.py:工作区内存(单次运行内共享状态) - tools.py:工具基类与注册表,统一工具执行与 OpenAI 函数调用格式 - grounding.py:身份与数值证据门禁,保障最终答案可溯源、不矛盾 - progress.py:长耗时工具的进度与心跳通道 - trace.py:崩溃安全的 JSONL 追踪写入与大字段旁路存储

graph TB A["AgentLoop<br/>ReAct 主循环"] --> B["ContextBuilder<br/>上下文构建"] A --> C["ToolRegistry<br/>工具注册与执行"] A --> D["GroundingLedger<br/>身份与证据门禁"] A --> E["TraceWriter<br/>追踪记录"] A --> F["WorkspaceMemory<br/>运行期状态"] A --> G["Progress<br/>心跳与结构化进度"] B --> H["SkillsLoader<br/>技能描述"] C --> I["BaseTool<br/>工具抽象"]

图表来源 - loop.py:502-1203 - context.py:210-396 - tools.py:13-95 - grounding.py:584-753 - trace.py:64-183 - memory.py:13-54 - progress.py:123-185

章节来源 - loop.py:502-1203 - context.py:210-396 - tools.py:13-95 - grounding.py:584-753 - trace.py:64-183 - memory.py:13-54 - progress.py:123-185

核心组件

章节来源 - loop.py:502-1203 - context.py:210-396 - memory.py:13-54 - tools.py:13-95 - grounding.py:584-753 - trace.py:64-183 - progress.py:123-185

架构总览

下图展示一次 ReAct 迭代的端到端流程:从上下文构建到 LLM 流式响应、工具调用与结果回写、压缩与追踪、最终答案验证与落盘。

sequenceDiagram participant U as "用户" participant AL as "AgentLoop" participant CB as "ContextBuilder" participant TR as "ToolRegistry" participant GL as "GroundingLedger" participant TW as "TraceWriter" participant PR as "Progress" participant LLM as "ChatLLM" U->>AL : 调用 run(user_message, history) AL->>CB : build_messages(user_message, history) CB-->>AL : 消息列表(含系统提示、历史、增强后的用户消息) AL->>LLM : stream_chat(messages, tools=definitions) LLM-->>AL : 文本/推理块(流式) AL->>PR : 心跳/进度事件 AL->>TW : 写入开始/思考/中间结果 alt 有工具调用 AL->>TR : 批量执行(只读并行/写串行) TR-->>AL : 工具结果(JSON) AL->>GL : authorize_tool_call / ingest_tool_result AL->>TW : 写入工具调用/结果 AL->>AL : 触发压缩(必要时) else 无工具调用 AL->>GL : validate_final_answer(final_content) GL-->>AL : 通过/拒绝+修正提示 AL->>TW : 写入答案/拒绝原因 end AL-->>U : 最终答案/状态/追踪路径

图表来源 - loop.py:624-1203 - context.py:286-322 - tools.py:72-84 - grounding.py:666-753 - trace.py:92-183 - progress.py:123-185

详细组件分析

AgentLoop:ReAct 主循环

flowchart TD Start(["进入 run()"]) --> BuildCtx["构建上下文<br/>系统提示+历史+增强用户消息"] BuildCtx --> Loop{"迭代 < 最大次数?"} Loop --> |是| Estimate["估算token数"] Estimate --> L1{">50%阈值?"} L1 --> |是| Microcompact["Layer1: 微压缩"] L1 --> |否| L2Check Microcompact --> L2Check{">70%阈值?"} L2Check --> |是| Collapse["Layer2: 上下文折叠"] L2Check --> |否| L3Check Collapse --> L3Check{">阈值?"} L3Check --> |是| AutoCompact["Layer3: 自动压缩"] L3Check --> |否| Stream["流式调用LLM"] AutoCompact --> Stream Stream --> HasTools{"是否工具调用?"} HasTools --> |是| BatchExec["批处理执行<br/>只读并行/写串行"] BatchExec --> MaybeCompact{"是否请求compact?"} MaybeCompact --> |是| ManualCompact["Layer4: 显式压缩"] MaybeCompact --> |否| NextIter["下一轮"] HasTools --> |否| Validate["最终答案校验"] Validate --> Valid{"通过?"} Valid --> |是| EmitAnswer["输出答案/记录追踪"] Valid --> |否| Correct["附加修正提示/重试或兜底"] Correct --> NextIter NextIter --> Loop Loop --> |否| End(["结束"])

图表来源 - loop.py:710-1203 - loop.py:227-320 - loop.py:1207-1599

章节来源 - loop.py:624-1203 - loop.py:1207-1599 - test_agent_loop_stream_retry.py:147-194

上下文构建器:系统提示词、工具描述、记忆快照与用户消息增强

classDiagram class ContextBuilder { +build_system_prompt(user_message) str +build_messages(user_message, history) List[Dict] +format_tool_result(tool_call_id, tool_name, result) Dict +format_assistant_tool_calls(tool_calls, content, reasoning_content) Dict -_count_data_sources() int -_format_tool_descriptions() str } class WorkspaceMemory { +run_dir str +counters Dict[str,int] +increment(key) int +to_summary() str } class SkillsLoader { +get_descriptions() str } ContextBuilder --> WorkspaceMemory : "读取状态摘要" ContextBuilder --> SkillsLoader : "获取技能描述"

图表来源 - context.py:210-396 - memory.py:13-54

章节来源 - context.py:210-396 - memory.py:13-54

工具调用流程与批处理

sequenceDiagram participant AL as "AgentLoop" participant TR as "ToolRegistry" participant GL as "GroundingLedger" participant TW as "TraceWriter" participant PR as "Progress" AL->>GL : authorize_tool_call(name, args, batch_symbols, call_id) alt 允许 AL->>TR : execute(name, params) TR-->>AL : 结果(JSON) AL->>TW : 写入tool_call/tool_result AL->>PR : 心跳/进度 else 拒绝 AL->>TW : 写入blocked tool_call AL-->>AL : 构造结构化错误结果 end

图表来源 - tools.py:13-95 - loop.py:1207-1599 - grounding.py:666-753 - trace.py:142-183 - progress.py:123-185

章节来源 - tools.py:13-95 - loop.py:1207-1599 - grounding.py:666-753

消息处理管道与追踪

章节来源 - trace.py:64-183 - loop.py:567-623 - loop.py:906-1086

身份与数值证据门禁(Grounding)

章节来源 - grounding.py:584-753 - grounding.py:789-800

依赖关系分析

graph LR loop["loop.py"] --> ctx["context.py"] loop --> tools["tools.py"] loop --> ground["grounding.py"] loop --> trace["trace.py"] loop --> prog["progress.py"] loop --> mem["memory.py"] ctx --> skills["SkillsLoader"] ctx --> pmem["PersistentMemory"] tools --> base["BaseTool"]

图表来源 - loop.py:28-51 - context.py:11-16 - tools.py:13-95

章节来源 - loop.py:28-51 - context.py:11-16 - tools.py:13-95

性能考量

章节来源 - loop.py:227-320 - loop.py:1207-1599 - trace.py:44-53 - progress.py:123-185

故障排查指南

章节来源 - test_agent_loop_stream_retry.py:147-194 - loop.py:816-857 - loop.py:920-941 - loop.py:946-998 - grounding.py:666-753

结论

Vibe-Trading Agent 的核心循环以 ReAct 模式为基础,结合五层上下文压缩、工具批处理、身份与数值证据门禁、流式输出与心跳、崩溃安全的追踪与运行清单,实现了高可靠、可观测、可复现的 Agent 执行环境。其模块化设计与完善的错误恢复机制,使其在复杂金融研究场景中具备鲁棒性与扩展性。

附录:配置、调试与监控

章节来源 - loop.py:74-120 - loop.py:156-205 - trace.py:64-183 - progress.py:30-63