核心组件

📎 引用文件

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

目录

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

简介

本文件面向 Vibe-Trading 的 Agent 核心组件,系统性说明以下能力的设计与实现: - Agent 核心循环(ReAct)机制:迭代控制、上下文压缩、工具执行批处理、流式输出与取消。 - 上下文管理:系统提示构建、技能与工具描述注入、持久化记忆召回、目标上下文拼接。 - 工具注册系统:BaseTool 抽象、ToolRegistry 注册与执行、OpenAI 函数调用格式导出。 - 记忆存储系统:工作区内存(单次运行内共享)、跨会话持久化记忆(文件索引、去重、重要性衰减、FTS5/语义链接可选)。 - 组件职责边界、接口定义与交互协议。 - 依赖关系、生命周期管理、错误处理、初始化流程、状态同步与数据一致性保证。 - 配置选项、性能调优参数与监控指标。 - 典型使用场景与最佳实践。

项目结构

围绕 Agent 核心的关键模块位于 agent/src/agent 与相关支撑模块中: - 核心循环:AgentLoop(loop.py) - 上下文构建:ContextBuilder(context.py) - 工具基础设施:BaseTool、ToolRegistry(tools.py) - 工作区内存:WorkspaceMemory(memory.py) - 技能加载:SkillsLoader(skills.py) - 跨会话持久化记忆:PersistentMemory(persistent.py) - 运行状态:RunStateStore(state.py) - 身份与证据校验:GroundingLedger(grounding.py) - LLM 客户端:ChatLLM(chat.py)

graph TB A["AgentLoop<br/>核心循环"] --> B["ContextBuilder<br/>上下文构建"] A --> C["ToolRegistry<br/>工具注册与执行"] A --> D["WorkspaceMemory<br/>运行期内存"] A --> E["GroundingLedger<br/>身份与证据门控"] A --> F["ChatLLM<br/>LLM 客户端"] B --> G["SkillsLoader<br/>技能加载"] B --> H["PersistentMemory<br/>跨会话记忆"] A --> I["RunStateStore<br/>运行状态"]

图表来源 - loop.py:502-700 - context.py:210-322 - tools.py:13-95 - memory.py:13-54 - skills.py:100-189 - persistent.py:196-438 - state.py:13-87 - grounding.py:584-753 - chat.py:272-397

章节来源 - loop.py:502-700 - context.py:210-322 - tools.py:13-95 - memory.py:13-54 - skills.py:100-189 - persistent.py:196-438 - state.py:13-87 - grounding.py:584-753 - chat.py:272-397

核心组件

章节来源 - loop.py:502-700 - context.py:210-322 - tools.py:13-95 - memory.py:13-54 - skills.py:100-189 - persistent.py:196-438 - state.py:13-87 - grounding.py:584-753 - chat.py:272-397

架构总览

下图展示 AgentLoop 作为调度中心,协调上下文、工具、记忆、身份门控与 LLM 的协作关系。

sequenceDiagram participant U as "用户" participant AL as "AgentLoop" participant CB as "ContextBuilder" participant SM as "SkillsLoader" participant PM as "PersistentMemory" participant TR as "ToolRegistry" participant GL as "GroundingLedger" participant CL as "ChatLLM" U->>AL : 发送用户消息 AL->>CB : 构建 messages(system + user) CB->>SM : 获取技能描述 CB->>PM : 召回相关记忆(可选) AL->>GL : 初始化/授权工具调用 loop 迭代 AL->>CL : stream_chat(messages, tools) CL-->>AL : 文本片段/推理片段/tool_calls alt 需要工具 AL->>TR : 执行工具(批量并行只读) TR-->>AL : 结构化结果(JSON) AL->>GL : 记录证据/更新身份 AL->>AL : 上下文压缩(多层) else 直接回答 AL->>AL : 校验/缓冲输出(必要时) end AL-->>U : 推送文本/思考/工具事件 end

图表来源 - loop.py:624-800 - context.py:286-322 - tools.py:72-84 - grounding.py:666-753 - chat.py:315-397

详细组件分析

AgentLoop(核心循环)

flowchart TD Start(["进入 run()"]) --> Init["初始化 run_dir/grounding/context/trace"] Init --> Loop{"迭代 < max_iterations?"} Loop --> |是| Estimate["估算 token 数"] Estimate --> L1{">50%阈值?"} L1 --> |是| Micro["Layer1 微压缩"] L1 --> |否| L2Check Micro --> L2Check[">70%阈值?"] L2Check --> |是| Collapse["Layer2 折叠长文本"] L2Check --> |否| L3Check[">阈值?"] Collapse --> L3Check L3Check --> |是| AutoCompact["Layer3 自动摘要"] L3Check --> |否| Stream["stream_chat(LLM)"] AutoCompact --> Stream Stream --> HasTools{"有 tool_calls?"} HasTools --> |是| Exec["执行工具(并行只读)"] Exec --> Update["更新上下文/证据/摘要"] Update --> Loop HasTools --> |否| Finalize["校验/缓冲输出/结束"] Finalize --> End(["退出"]) Loop --> |否| End

图表来源 - loop.py:624-800 - loop.py:227-320 - loop.py:175-205

章节来源 - loop.py:502-800 - loop.py:227-320 - loop.py:175-205

上下文管理(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 -_count_data_sources() int -_format_tool_descriptions() str } class ToolRegistry class SkillsLoader class PersistentMemory ContextBuilder --> ToolRegistry : "读取工具描述" ContextBuilder --> SkillsLoader : "读取技能描述" ContextBuilder --> PersistentMemory : "召回相关记忆"

图表来源 - context.py:210-396 - tools.py:68-70 - skills.py:143-189 - persistent.py:358-438

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

工具注册系统(BaseTool + ToolRegistry)

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

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

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

记忆存储系统(WorkspaceMemory + PersistentMemory)

flowchart TD Add["add(name,content,type)"] --> Sanitize["清理/截断内容"] Sanitize --> Slug["生成 slug/路径"] Slug --> Lock{"获取文件锁"} Lock --> Write["写入 .md 文件"] Write --> Index["_update_index(MEMORY.md)"] Index --> Links{"启用语义链接?"} Links --> |是| Discover["发现并保存关联"] Links --> |否| Done Discover --> Done["完成"]

图表来源 - memory.py:13-54 - persistent.py:462-578 - persistent.py:41-73

章节来源 - memory.py:13-54 - persistent.py:196-637

技能系统(SkillsLoader)

classDiagram class Skill { +name str +description str +category str +body str +dir_path Path +metadata Dict +load_support_file(filename) str } class SkillsLoader { +skills List[Skill] +get_descriptions() str +get_content(name) str -_load() void } SkillsLoader --> Skill : "管理多个技能"

图表来源 - skills.py:22-60 - skills.py:100-189 - skills.py:229-387

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

身份与证据门控(GroundingLedger)

sequenceDiagram participant AL as "AgentLoop" participant GL as "GroundingLedger" participant TR as "ToolRegistry" AL->>GL : authorize_tool_call(tool, args, batch_symbols, call_id) alt 允许 AL->>TR : 执行工具 TR-->>AL : 结果(JSON) AL->>GL : ingest_tool_result(tool, args, result, call_id, success) else 拒绝 AL-->>AL : 返回结构化错误(需先解析身份) end

图表来源 - grounding.py:666-753 - grounding.py:789-800

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

LLM 客户端(ChatLLM)

sequenceDiagram participant AL as "AgentLoop" participant CL as "ChatLLM" AL->>CL : stream_chat(messages, tools, on_text_chunk, on_reasoning_chunk) loop 流式接收 CL-->>AL : 文本/推理片段 end CL-->>AL : LLMResponse(content, tool_calls, reasoning_content, finish_reason, usage_metadata) alt 无流式数据 CL->>CL : 回退到 chat() end

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

章节来源 - chat.py:272-397 - chat.py:426-514

依赖关系分析

graph LR AL["AgentLoop"] --> CTX["ContextBuilder"] AL --> REG["ToolRegistry"] AL --> MEM["WorkspaceMemory"] AL --> GL["GroundingLedger"] AL --> LLM["ChatLLM"] CTX --> SK["SkillsLoader"] CTX --> PM["PersistentMemory"] AL --> RS["RunStateStore"]

图表来源 - loop.py:502-700 - context.py:210-322 - tools.py:13-95 - memory.py:13-54 - skills.py:100-189 - persistent.py:196-438 - state.py:13-87 - grounding.py:584-753 - chat.py:272-397

章节来源 - loop.py:502-700 - context.py:210-322 - tools.py:13-95 - memory.py:13-54 - skills.py:100-189 - persistent.py:196-438 - state.py:13-87 - grounding.py:584-753 - chat.py:272-397

性能考量

章节来源 - loop.py:74-120 - loop.py:227-320 - loop.py:175-205 - persistent.py:80-99 - persistent.py:440-460

故障排查指南

章节来源 - tools.py:72-84 - grounding.py:666-753 - chat.py:117-163 - chat.py:315-397 - persistent.py:41-73

结论

Vibe-Trading 的 Agent 核心组件以 AgentLoop 为中心,围绕上下文管理、工具注册、记忆存储、身份门控与 LLM 客户端构建了高内聚、低耦合的体系。其设计强调: - 可解释性与可审计:系统提示固定、工具调用结构化、证据链完整。 - 可扩展性:技能与工具可插拔,记忆系统支持多种后端与索引。 - 鲁棒性:多层上下文压缩、流式回退、内容过滤熔断、文件锁与去重。 - 可观测性:追踪、用量统计、状态文件与运行清单。

通过合理配置与调优,可在不同规模与复杂度的交易研究场景中稳定运行。

附录

组件初始化流程

章节来源 - loop.py:624-700 - context.py:235-268 - persistent.py:196-220 - state.py:16-47

状态同步与数据一致性

章节来源 - state.py:79-87 - persistent.py:41-73 - grounding.py:666-753

配置选项与性能调优

章节来源 - loop.py:74-120 - persistent.py:80-99 - chat.py:281-297

监控指标

章节来源 - loop.py:175-205 - grounding.py:658-664 - persistent.py:309-438

典型使用场景与最佳实践

章节来源 - context.py:23-200 - loop.py:227-320 - persistent.py:462-578