从73.7到89.5,HALO 智能体用“轨迹分析“实现了递归自我进化
HALO (Hierarchical Agent Loop Optimization) 一个递归自改进的智能体框架在 AppWorld 测试的成绩将原有智能体的表现从 73.7 提升至 89.5。而89.5 的成绩意味着接近实用级别。一、核心理念HALO 的核心思想可以用一个闭环来概括收集 Agent 执行追踪 → 喂入 HALO-RLM 引擎分析 → 产出失败模式报告 → 反馈给编码 Agent 修改 harness → 重新部署 → 收集更多追踪 → ……这是一个专门用于分析 Agent 执行追踪、发现系统性问题的 RLMReasoning Language Model引擎。当你有一个在生产环境中运行的 Agent 系统HALO 能帮你从海量执行数据中找出跨执行共性的失败模式而不是对单条追踪过拟合。二、核心架构2.1 引擎主循环引擎入口在engine/main.py提供 4 个函数函数模式返回值stream_engine_async异步流式AsyncIterator[EngineStreamEvent]run_engine_async异步批量list[AgentOutputItem]stream_engine同步流式list[EngineStreamEvent]run_engine同步批量list[AgentOutputItem]执行流程如下1. configure_default_sdk_client() → 配置 OpenAI 兼容端点 2. TraceIndexBuilder.ensure_index() → 并行扫描 JSONL构建 sidecar 索引 3. TraceStore.load() → 加载索引到内存 4. build_root_sdk_agent() → 构建带全套工具的根 Agent 5. OpenAiAgentRunner.run() → 驱动 SDK 事件流 6. EngineOutputBus.stream() → 流式输出事件 7. compact_old_items() → 每轮结束后 LLM 压缩历史对话2.2 层级式 Agent 架构核心的设计创新根 Agent (depth0) ├── 拥有所有叶子工具 call_subagent ├── 以 final/ 标记结束 │ └── 子 Agent (depth1) ├── 拥有所有叶子工具 可能的 call_subagent ├── 返回简洁答案不使用 final/ │ └── 孙 Agent (depth2, 如果 maximum_depth2) └── 只有叶子工具无 call_subagent结构性地阻止无限递归深度控制是通过结构化工具注册而非运行时检查实现的def _child_tools_for_depth(depth, ...): leaf_tools [GetDatasetOverviewTool, QueryTracesTool, ...] if depth engine_config.maximum_depth: return leaf_tools # 叶子节点没有 call_subagent subagent_tool _build_subagent_as_tool(...) return leaf_tools [subagent_tool] # 非叶子节点可以委派并发控制使用每深度独立的信号量避免死锁def build_subagent_semaphores(engine_config): return { d: asyncio.Semaphore(engine_config.maximum_parallel_subagents) for d in range(1, engine_config.maximum_depth 1) }为什么不用单一共享信号量因为如果 depth-N 的 parent 占满了所有槽位等待 depth-(N1) 的 grandchild而 grandchild 又在等同一个信号量就会死锁。每深度独立信号量完美解决了这个问题。2.3 工具体系引擎为 Agent 提供了10 个工具分为三类追踪查询工具6 个工具功能属性截断get_dataset_overview数据集级统计追踪数、span 数、token 总量、采样 trace_id-query_traces分页过滤查询追踪摘要-count_traces计数匹配追踪不物化摘要-view_trace读取单个追踪的所有 span~4KB/属性view_spans按指定 span_id 精确读取~16KB/属性search_trace子串搜索追踪内的 span~4KB/属性两级截断策略是关键设计•发现级4KBview_trace/search_trace用于快速扫描•手术级16KBview_spans用于精确读取被截断的属性4 倍更高分析与执行工具3 个工具功能synthesize_tracesLLM 驱动的多追踪综合摘要run_code在 DenoPyodide WASM 沙箱中执行 Python预装 numpy/pandas/pydanticget_context_item获取 Agent 上下文中的存储项用于压缩后查询原始数据委派工具1 个工具功能call_subagent委派问题给子 Agent返回SubagentToolResult2.4 追踪数据存储TraceStore实现了高效的追踪索引和查询索引构建流程阶段 1: 顺序扫描 JSONL → 记录每行的 (byte_offset, byte_length) 阶段 2: 按 CPU 数分块 → ProcessPoolExecutor 并行解析 累加 阶段 3: 按 trace_id 合并各 worker 的部分结果• 小文件1000 行直接内联处理避免 fork 开销• Sidecar 文件traces.jsonl.engine-index.jsonl.engine-index.meta.json• 基于文件 size mtime_ns 的指纹检测索引未过期则复用追踪格式OpenTelemetry 兼容的 JSONL每行一个 span包含trace_id/span_id/parent_span_id和inference.* 投影键。2.5 WASM 沙箱基于Deno Pyodide (WASM)实现零信任代码执行• 每次执行启动全新deno run子进程WASM 文件系统不跨运行泄漏• JSON-RPC 协议mount_file→bootstrap→execute• 权限极度锁定仅--allow-read枚举式无通配符无网络/写入/环境/子进程• 预装 numpy、pandas、pydantic TraceStore 只读访问• 60 秒超时64KB stdout/stderr 截断上限2.6 上下文压缩AgentContext实现了压缩感知的对话记忆• 每个条目保留原始字段 压缩状态• 文本消息和工具调用分别跟踪有独立的 keep-last 阈值• 工具轮次assistant tool_calls 匹配的 tool results作为整体压缩• 压缩后的条目渲染为摘要文本原始数据仍可通过get_context_item查询• 压缩使用 LLMcompaction_model生成摘要2.7 容错与重试OpenAiAgentRunner实现了断路器模式• 连续 LLM 失败计数器上限MAX_CONSECUTIVE_LLM_FAILURES 10• 可重试错误APIConnectionError/APITimeoutError/RateLimitError/ 5xx• 仅在零事件处理时重试避免状态损坏• 子 Agent 失败返回SubagentToolResult而非抛异常优雅降级三、系统提示词设计prompt_templates.py定义了三套提示词根 Agent 提示词You are the root agent in the HALO engine. You explore OTel trace data using the tools the runtime provides. Depth rules: - You are at depth0. - maximum_depth{maximum_depth}. Subagents you spawn are at depth1. - Spawn at most {maximum_parallel_subagents} subagents concurrently. Output rules: - When you are finished and have produced your final answer, end that assistant message with a single line containing only: final/ - Do not emit final/ in intermediate messages.子 Agent 提示词You are a HALO subagent at depth{depth} of maximum_depth{maximum_depth}. ... When finished, return a concise answer. Do not emit final/ — that sentinel is reserved for the root agent.默认工具使用指南内置的DEFAULT_SYSTEM_PROMPT是一份详尽的工具使用手册包含 7 条规则指导 Agent 如何高效地使用两级截断策略分析追踪数据。四、使用方式安装pip install halo-engine halo --helpCLI 使用export OPENAI_API_KEY... halo path_to_your_traces.jsonl -p Diagnose errors you find and suggest fixes关键参数参数说明默认值TRACE_PATHJSONL 追踪文件路径必填---prompt / -p用户提示必填---model / -m模型名gpt-5.4-mini--max-depth子 Agent 最大递归深度2--max-turns每 Agent 最大轮次20--max-parallel最大并发子 Agent2--reasoning-effort推理力度-在Python 代码调用from engine import stream_engine_async, run_engine from engine.engine_config import EngineConfig from engine.model_config import ModelConfig from engine.model_provider_config import ModelProviderConfig from engine.models.messages import AgentMessage from pathlib import Path config EngineConfig( model_providerModelProviderConfig(api_key...), # ... 其他配置 ) messages [AgentMessage(roleuser, content分析这些追踪中的错误模式)] # 异步流式 async for event in stream_engine_async(messages, config, Path(traces.jsonl)): print(event) # 同步批量 results run_engine(messages, config, Path(traces.jsonl))五、HALO 自改进循环完整工作流六、基准测试结果AppWorld Engine 是一个高保真度的执行环境包含 9 个日常应用程序可通过 457 个 API 进行操作模拟了 106 位生活在模拟世界中的人物的数字活动。在此基础上提供了一个相关的基准测试用于测试自然、多样化且具有挑战性的自主代理任务这些任务需要丰富的交互式编码。这些任务具有强大的程序评估能力包含基于状态和执行的单元测试。在 AppWorld 基准上评测的结果两款模型的峰值性能较基线均有显著提升。对于 Gemini 3 Flash开发环境 SGC 从 36.8% 提升至 52.6%提升 15.8 个百分点测试环境 SGC 从 37.5% 提升至 48.2%提升 10.7 个百分点。对于 Sonnet 4.6开发环境 SGC 从 73.7% 提升至 89.5%提升 15.8 个百分点测试环境 SGC 从 62.5% 提升至 73.2%提升 10.7 个百分点。模型指标基线HALO 优化后提升Gemini 3 Flashdev SGC36.8%52.6%15.8Gemini 3 Flashtest_normal SGC37.5%48.2%10.7Sonnet 4.6dev SGC73.7%89.5%15.8Sonnet 4.6test_normal SGC62.5%73.2%10.7HALO 发现的系统性问题及对应修复轨迹证据Harness 改进幻觉工具调用加强工具选择引导冗余工具参数简化工具 Schema拒绝循环修改系统提示词/中间件语义正确性问题优化中间件逻辑每个问题都能直接映射到一个 prompt 编辑。而 test_normal SGC的提升验证了改进不是过拟合。七、项目特点总结特点说明递归自改进收集追踪 → 分析 → 修改 → 重新部署的闭环层级式 Agent结构化深度控制避免无限递归每深度独立信号量避免死锁RLM 专精专门构建的追踪分析引擎避免通用 Agent 对单条追踪过拟合两级截断4KB 发现级 16KB 手术级平衡上下文窗口与信息完整性WASM 沙箱DenoPyodide 零信任执行权限极度锁定OTLP 兼容使用 OpenTelemetry 标准格式便于集成现有可观测性基础设施并行索引多进程扫描 JSONLsidecar 索引实现高效随机访问对话压缩LLM 驱动的旧消息压缩保留关键信息同时控制 token 预算断路器容错连续失败检测 可重试错误分类 子 Agent 优雅降级流式事件异步输出总线支持多 Agent 并行输出交错可插拔 Runnerrunner参数是测试接缝支持注入 FakeRunner 进行探测测试八、RLMReasoning Language Model引擎RLM是 HALO 项目的核心概念全称Reasoning Language Model递归语言模型。论文地址https://arxiv.org/abs/2512.24601v1。在 HALO 的语境中HALO Engine 本身就是这个 RLM 的实现——一个专门用于分析 Agent 执行追踪的推理型 LLM Agent。RLM在SKILL.md 明确定义的Halo Engine is a trace-exploration runtime.Its an LLM agent that has tools to read a JSONL trace dataset and answer questions about it. It isnota code-modification tool,nota fix proposer, andnota verifier.RLM 与通用 LLM Agent 的区别在于它拥有专门构建的工具集来处理追踪数据普通 LLM Agent: 给我看那个文件 → 读文件 → 帮我改代码 → 写文件 HALO RLM Agent: 给我看数据集概览 → get_dataset_overview 查询失败的追踪 → query_traces(has_errorsTrue) 搜索这个追踪中的错误 → search_trace(trace_id, STATUS_CODE_ERROR) 精确读取这个 span → view_spans(trace_id, span_ids) 综合多条追踪 → synthesize_tracesRLM 的专精体现在三个层面1.结构化工具6 个追踪查询工具 综合工具 沙箱执行 子 Agent 委派每个工具都有精确的截断策略防止上下文溢出2.层级式推理根 Agent 负责最终输出子 Agent 负责深入分析深度受控避免无限递归3.渐进式数据访问发现级4KB/属性→ 手术级16KB/属性先扫描后精确读取为什么不用通用工具直接分析追踪这就是 HALO 被设计出来的原因1. 追踪太长通用工具无法高效处理一条追踪可能包含数百个 span每个 span 的属性可能有几十 KB。Claude Code 只能读文件——它要么读整个追踪上下文溢出要么读部分信息不完整。HALO Engine 的两级截断策略4KB 发现 16KB 手术专门解决了这个问题。2. 通用 Agent 会过拟合单条追踪通用 Agent 的自然倾向是看到一条追踪中的错误 → 聚焦于这条追踪 → 提出针对这条追踪的修复。但一条追踪的失败可能是偶然的真正的问题是跨追踪的系统性模式。HALO Engine 的工具集count_traces、query_traces、synthesize_traces专门用于发现跨追踪的共性。3. 诊断和执行应该分离HALO Engine 只能读取追踪数据不能修改代码。这个限制是刻意的——它确保诊断结果是基于数据的观察而非基于猜测的指令。SKILL.md 明确警告Treat its output astrace evidence, not as a directive. It can identify patterns, cite trace_ids, surface error strings, count failure modes — thats what its for. It cannot see your code; if it names a file path or claims a constraint is missing,verify before acting.完整的 HALO 循环中通用 Agent 的位置HALO 自改进循环 ① 你的 Agent Harness 在生产环境运行 ↓ 产生 traces.jsonlOTLP 格式追踪 ② HALO Engine (RLM) 分析追踪 最常见的失败模式是什么给出 trace_id 证据 ↓ 产出诊断报告基于数据的观察 ③ Claude Code / Cursor 执行变更 - 验证引擎的声明是否属实rg/读文件 - 形成假设做最小变更通常是 prompt 编辑 - 不是盲目执行引擎的建议而是独立验证后行动 ↓ 修改 harness 代码 ④ 重新部署 harness → 收集新追踪 → 回到 ①举例来说如果你有 1000 条追踪其中 50 条失败了•通用 Agent如 Claude Code可能逐条读取追踪对某一条追踪中的特定错误过度关注•RLM先用get_dataset_overview看全局用count_traces统计失败比例用query_traces过滤失败追踪用search_trace搜索共性错误字符串最终识别出跨追踪的系统性模式向 HALO Engine 提问的正确方式SKILL.md 给出了明确的指导——问数据问题而非代码问题好的提问HALO 擅长回答• 有多少条追踪至少有一个 TOOL span 的status.code STATUS_CODE_ERROR列出错误数最多的前 5 条并引用 trace_id• 在失败的追踪中output.value中最常出现的字面错误字符串是什么• 比较两条追踪——一条成功完成一条达到最大轮次——失败的那条在第 5 轮之后做了什么不同的事坏的提问HALO 会回答但不可靠• 我应该做什么修改来修复这个问题 — 引擎没有仓库访问权限会幻觉文件路径• 给prompts/instructions.txt写一个补丁 — 同上你应该自己写补丁• 重构 harness 让它更健壮 — 太模糊引擎会给出泛泛建议九、应用场景场景HALO 的价值高流量 Agent 系统执行量大、方差高最适合发现系统性模式Coding Agent 优化自动发现和修复幻觉工具调用、冗余参数等 Harness 级问题Agent Harness 持续优化递归循环让 Harness 持续进化无需人工逐条 debug多模型对比对 Gemini、Sonnet 等不同模型均有效10~16 分HALO 的创新在于构建了专门的工具集和层级式 Agent 架构来系统性地分析追踪数据避免了通用 Agent 的过拟合问题同时将诊断和执行分离确保每一步都有据可依。参考https://x.com/samhogan/status/2049619541727302040Github地址 https://github.com/context-labs/halo最后顺带推荐一个新开源项目https://github.com/CJackHwang/ds2api。将 DeepSeek Web 对话能力转换为 OpenAI、Claude 与 Gemini 兼容 API说明用户已经认可国产模型在实际使用场景与上面三家的模型能力不相上下了。欢迎评论区留言。-END-推荐阅读DeepSeek 新视觉模型论文以视觉原语思考让 AI 学会指图说话小米模型 MiMo V2.5 全系列 Pro · TTS 免费用让 AI 帮你修 bug结果它把整个代码重写了一遍Claude Code 写攻击脚本 OpenClaw 自动指挥900家公司3万密钥外泄DeepSeek-V4 技术报告深度解析AI 让我更累了这不是错觉万字深研 Harness 工程实践指令遵从率 20%Hook 执行率 100%