Agent核心循环

📎 引用文件

本文引用的文件 - loop.py - context.py - memory.py - tools.py - skills.py - chat.py - grounding.py - trace.py

目录

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

简介

本文件聚焦 Vibe-Trading Agent 的“思考-行动-观察”(ReAct)核心循环,系统性说明: - ReAct 循环的执行流程、状态管理与错误处理策略 - 上下文构建器的工作方式:系统提示词生成、工具描述注入、记忆摘要整合与会话历史管理 - Agent 如何解析用户意图、选择并执行工具、处理结果 - 与 LLM 提供商的交互模式:流式响应、重试与超时控制 - 性能优化建议与常见问题排查

项目结构

围绕 Agent 核心循环的关键模块与职责如下: - AgentLoop:实现 ReAct 主循环,负责消息构建、LLM 调用、工具调度、压缩与追踪 - ContextBuilder:构建系统提示词、注入工具与技能描述、组装消息历史与持久化记忆 - ToolRegistry/BaseTool:工具注册与执行入口,统一返回 JSON 字符串 - SkillsLoader:加载技能文档,提供按需展开与章节定位能力 - WorkspaceMemory:单轮运行内的轻量共享状态(如 run_dir、计数器) - ChatLLM:封装 LLM 调用,支持函数调用、流式输出、内容过滤与异常包装 - GroundingLedger:运行期身份与数值证据门控,约束最终答案可溯源 - TraceWriter:崩溃安全的 JSONL 追踪记录,大字段旁路存储

graph TB A["AgentLoop<br/>ReAct 主循环"] --> B["ContextBuilder<br/>上下文构建"] A --> C["ChatLLM<br/>LLM 客户端"] A --> D["ToolRegistry<br/>工具注册/执行"] A --> E["GroundingLedger<br/>身份/证据门控"] A --> F["TraceWriter<br/>追踪记录"] B --> G["SkillsLoader<br/>技能加载"] B --> H["WorkspaceMemory<br/>运行时状态"] D --> I["BaseTool<br/>工具基类"]

图表来源 - loop.py:502-710 - context.py:210-322 - chat.py:272-398 - tools.py:13-95 - grounding.py:584-753 - trace.py:64-180

章节来源 - loop.py:502-710 - context.py:210-322 - tools.py:13-95 - skills.py:100-189 - memory.py:13-54 - chat.py:272-398 - grounding.py:584-753 - trace.py:64-180

核心组件

章节来源 - loop.py:502-1203 - context.py:210-396 - tools.py:13-95 - skills.py:100-387 - memory.py:13-54 - chat.py:272-554 - grounding.py:584-800 - trace.py:64-180

架构总览

下图展示一次 ReAct 迭代从消息构建到工具执行与结果处理的端到端流程。

sequenceDiagram participant U as "用户" participant AL as "AgentLoop" participant CB as "ContextBuilder" participant GL as "GroundingLedger" participant TR as "TraceWriter" participant CL as "ChatLLM" participant REG as "ToolRegistry" U->>AL : 发送用户消息 AL->>CB : 构建系统提示词与消息列表 AL->>GL : 初始化运行期身份/证据门控 AL->>TR : 写入开始事件与用户消息 loop 最多 N 次迭代 AL->>CL : 流式调用(带工具定义, 可选最后轮禁用) CL-->>AL : 文本/推理片段 + 最终响应(tool_calls或文本) alt 包含工具调用 AL->>GL : 授权检查(基于冻结的身份快照) AL->>REG : 批量执行(只读并行/写串行) REG-->>AL : 工具结果(JSON) AL->>TR : 记录tool_call与tool_result AL->>AL : 上下文压缩(自动/手动compact) else 无工具调用 AL->>GL : 验证最终答案(数值/符号一致性) GL-->>AL : 通过/拒绝(拒绝则追加修正提示) AL->>TR : 记录回答 AL-->>U : 输出最终答案 end end

图表来源 - loop.py:624-1203 - context.py:286-322 - chat.py:315-398 - grounding.py:666-753 - trace.py:92-180

详细组件分析

ReAct 核心循环(AgentLoop)

flowchart TD Start(["进入迭代"]) --> Est["估算token并压缩"] Est --> CallLLM["流式调用LLM"] CallLLM --> HasTools{"是否包含工具调用?"} HasTools -- 是 --> Auth["身份授权检查"] Auth --> BatchExec["批处理执行(只读并行/写串行)"] BatchExec --> UpdateMsg["追加工具结果到消息"] UpdateMsg --> MaybeCompact{"是否请求compact?"} MaybeCompact -- 是 --> AutoCompact["触发自动压缩"] MaybeCompact -- 否 --> NextIter["下一轮"] HasTools -- 否 --> Validate["最终答案校验"] Validate --> Valid{"是否通过?"} Valid -- 否 --> Continue["追加修正提示并继续"] Valid -- 是 --> End(["结束/输出答案"]) Continue --> NextIter AutoCompact --> NextIter

图表来源 - loop.py:710-1203

章节来源 - loop.py:502-1203

上下文构建器(ContextBuilder)

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 -_format_tool_descriptions() str -_count_data_sources() int } class SkillsLoader { +get_descriptions() str +get_content(name) str } class WorkspaceMemory { +to_summary() str +increment(key) int } ContextBuilder --> SkillsLoader : "读取技能描述" ContextBuilder --> WorkspaceMemory : "读取状态摘要"

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

章节来源 - context.py:210-396

工具注册与执行(ToolRegistry/BaseTool)

classDiagram class BaseTool { <<abstract>> +name string +description string +parameters dict +repeatable bool +is_readonly bool +execute(**kwargs) string +to_openai_schema() dict } class ToolRegistry { -_tools dict +register(tool) void +get(name) BaseTool +get_definitions() List[dict] +execute(name, params) string +tool_names List[string] } ToolRegistry --> BaseTool : "持有多个实例"

图表来源 - tools.py:13-95

章节来源 - tools.py:13-95

技能加载(SkillsLoader)

flowchart TD Init["初始化加载"] --> LoadUser["加载用户技能目录"] LoadUser --> LoadBundled["加载内置技能目录"] LoadBundled --> Group["按类别分组"] Group --> Desc["生成技能描述(系统提示词)"] Desc --> OnDemand{"是否请求全文?"} OnDemand -- 是 --> Split["解析章节结构"] Split --> Find["按路径/标题定位章节"] Find --> Return["返回章节内容"] OnDemand -- 否 --> End["结束"]

图表来源 - skills.py:100-387

章节来源 - skills.py:100-387

运行期状态(WorkspaceMemory)

章节来源 - memory.py:13-54

与 LLM 提供商交互(ChatLLM)

sequenceDiagram participant AL as "AgentLoop" participant CL as "ChatLLM" participant P as "Provider" AL->>CL : stream_chat(messages, tools, callbacks) loop 接收chunk CL->>P : 流式请求 P-->>CL : chunk(文本/推理) CL-->>AL : 回调on_text_chunk/on_reasoning_chunk end alt 流式为空 CL-->>AL : 降级非流式invoke end CL-->>AL : LLMResponse(含tool_calls/usage/content_filter)

图表来源 - chat.py:315-398 - chat.py:426-514

章节来源 - chat.py:272-554

身份与证据门控(GroundingLedger)

flowchart TD Req["工具调用请求"] --> CheckID{"是否需要身份锁定?"} CheckID -- 否 --> Allow["允许执行"] CheckID -- 是 --> Freeze["冻结批次身份快照"] Freeze --> Match{"符号匹配已锁定身份?"} Match -- 否 --> Block["拒绝并返回结构化错误"] Match -- 是 --> Exec["执行工具并记录证据"] Exec --> FinalCheck["最终答案校验"] FinalCheck --> Pass{"通过?"} Pass -- 否 --> Reject["拒绝并追加修正提示"] Pass -- 是 --> Output["输出答案"]

图表来源 - grounding.py:584-800

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

追踪记录(TraceWriter)

章节来源 - trace.py:64-180 - trace.py:185-268 - trace.py:302-370

依赖关系分析

graph LR AL["AgentLoop"] --> CB["ContextBuilder"] AL --> CL["ChatLLM"] AL --> TR["TraceWriter"] AL --> GL["GroundingLedger"] CB --> SK["SkillsLoader"] CB --> WM["WorkspaceMemory"] CL --> PRV["Provider(外部)"]

图表来源 - loop.py:502-710 - context.py:210-322 - chat.py:272-398

章节来源 - loop.py:502-710 - context.py:210-322 - chat.py:272-398

性能考量

章节来源 - loop.py:727-749 - loop.py:1393-1498 - chat.py:315-398 - trace.py:44-53

故障排除指南

章节来源 - chat.py:117-163 - chat.py:315-398 - loop.py:816-857 - loop.py:920-944 - loop.py:946-958 - grounding.py:666-753 - trace.py:92-180

结论

Vibe-Trading 的 Agent 核心循环以 ReAct 为主线,结合五层上下文压缩、工具批处理、身份与证据门控、流式 LLM 交互与崩溃安全的追踪机制,实现了高可靠、可追溯、可扩展的智能体执行环境。通过合理的配置与监控,可在复杂金融研究场景中稳定运行,并提供清晰的诊断与排障能力。

附录

章节来源 - loop.py:74-120 - trace.py:92-180