犀利豆的博客

高质量的技术博客

Harness 的本质是什么?

Harness 就是通过工程的手段,让 LLM 一轮一轮地挑选合适的 Tools,在受控的情况下完成工作。

Read more »

多Agent 协同 - 需要一个团队

前面我们实现了 Subagent、Background Task,为什么还需要多 Agent 协同呢?

一句话区分

  • Background Task = “把这个工具调用派到后台跑,我等结果通知
  • Subagent = “派一个新 agent 干一件具体事,跑完销毁,我等摘要
  • Teammate = “派一个长期协作的队友,我们持续异步通信”

对比表

维度 Background Task Subagent Teammate
被派的是什么 一个工具调用(bash) 一个全新 agent(独立 LLM + messages) 一个全新 agent
谁在执行 工具 executor 新一轮 LLM 调用 新一轮 LLM 调用
生命周期 短(工具一次调用结束) 短(派一次跑完销毁) 长(教学版限 10 轮)
同步 / 异步 异步(daemon thread) 同步(父等子返回) 异步(daemon thread)
父是否阻塞 不阻塞,立即拿 placeholder 阻塞,等子 agent 结果 不阻塞,立即拿”已派出”
通信方式 单向 — 后台→父 (<task_notification>) 单向 — 子→父(只回 last text) 双向MessageBus 文件邮箱
能否多个并行 否(父 spawn 时阻塞)
能否互相通信 不能 不能 (teammate 之间能 send)
典型用途 慢命令(./mvnw test) “分析 X 模块,做完告诉我” “重构后端 — 多 agent 长期协作”
能调用工具 不能(它就是工具) 能(白名单子集) 能(白名单 + send_message)

人多力量大。遇到一个很大的任务时,从 Java 程序员的思路来看,可以多来几个分布式 Agent 来协同处理问题。

还有一个核心问题,多个Agent 之间怎么通信呢?

Background task 和 Subagent 都是单向通信:父向子安排工作后,子完成后单向地向父汇报结果,中间没有交互。

Teammate 之间是同事关系。双方之间通过 MessageBus 进行双向通信。

MessageBus 基于文件形式,Agent A 告诉 Agent B 应该干什么,Agent B 告诉 Agent A 我完成了。

Read more »

书接上文

Error Recovery - 从错误中恢复

让 agent loop 在面对 LLM 三类常见故障(输出截断 / context 太长 / 后端过载)时自我恢复,而不是把异常一路抛回出去。

对于一个 Java 程序员处理异常那就太熟悉不过了。给 LLM 的调用方法加上 try catch。

目前最常见的错误,输出太长,输入太长,调用太快,模型压力太大。

输出太长:

  1. 第一次:把 max_tokens 从默认 8000 → 升级到 64000(escalated),丢掉截断的输出,重新跑这一轮。模型重生成,通常这次能说完
  2. 第二次还截断:已经 64k 还说不完 → 真的需要”分两次说”。append 截断输出 + 注入 Continue. user message,让模型续写
  3. 超过 maxRecoveryRetries=3 次 continuation:放弃,Fatal

输入太长:

  1. 可以直接调用 reactive_compact 压缩模式。使用比较激进的压缩模式,只保留最近的若干条消息。

调用太快、模型压力过大:

  1. 调用 LLM 的时候才用指数退避的方式重试。若干次后依然报错,则抛出异常。
    Read more »

AI in Harness(一)

最近系统性地研究了一下 Claude Code 的实现,作为 Java 程序员写了一个开源的 Loop-based Agent Harness 框架。从工程的角度,以 Java 语言构建一个 Harness 的学习框架,理解 Harness 实现的技术细节。

从”写提示词”到”设计循环”再到”驾驭循环”

在使用 AI 的初期,你是否遇到过这样一个场景。写一个提示词,AI 回复一次,然后人工评估 AI 的结果,修改提示词,重新再向 AI 提问。这个场景中人是 Loop 中的一个环节,人的效率决定了 Loop 的效率。

Loop Engineering 被提出。Loop 的核心是人设定目标,系统自动完成”执行-观察-评估-修正”的闭环,直到任务完成。人从”指挥者”变成了”系统设计者”。但是 Loop 带来了新的问题,Loop Engineering 解决了 “AI 能不能自己跑”,但没解决 “AI 能不能跑得久、跑得稳、跑得安全、跑得起”。

为了解决以上的问题,Harness Engineering 被提出。在 Loop Engineering 基础上增加了上下文工程、工具设计、权限管控、记忆管理、上下文压缩等能力。

loop

Read more »

负载均衡

前端

使用 DNS 进行负载均衡。在 DNS 回复中提供多个 A 记录或者 AAAA 记录。
虽然 DNS 看起来简单,但是存在不少问题。

  1. DNS 对客户端行为的约束很弱:记录是随机选择的。
  2. 客户端无法识别“最近”的地址
  3. 权威服务器不能主动清楚某个解析器的缓存,DNS 记录需要保持一个相对低的失效值(TTL)。
Read more »

事后总结:从失败中学习

哲学

保证事故能够被记录下来,理清所有根源问题。确保实施有效的措施是的未来重现的几率和影响得以降低,甚至避免。

书写事后总结不是一种惩罚,而是整个公司的一次学习机会。

需要书写的标准:

  • 用户可见的宕机或者服务质量下降到一定标准
  • 任何形式的数据丢失
  • on-call 工程师需要人工介入
  • 问题解决耗时超过一定限制
  • 监控问题
Read more »

应急事件响应

测试导致的事故

SRE 故意破坏系统,利用这些测试发现系统的薄弱地方。

在某次测试中发现了额外的系统依赖。

响应

  • 终止测试
  • 用以前 测试过的方法 回滚了数据
  • 找到开发者修复了相关问题
  • 制定了周期性测试机制来保证问题不重现

事后总结

好的方面:
事先沟通,有足够信息推测是测试造成的问题。
快速恢复了系统。
遗留一个代办,彻底修复问题。制定了周期性的测试流程。

Read more »

有效的故障排查手段

理论:

反复采用假设排除手段的过程:
不断提出一个造成系统问题的假设,进而针对这些假设进行测试和排除

常见的陷阱

  • 关注的错误的系统现象,或者错误地理解了系统现象的含义。
  • 不能正确的修改系统的配置信息,输入信息或者系统运行环境。
  • 将问题过早的归结为极为不可能的因素,或者之前曾经发生过的问题
  • 试图解决与当前问题相关的一些问题,却没有认识到只是巧合。
Read more »

新财年换了领导,管理风格也有一些区别。在团队内增加了一个 SRE 的职位。这一财年我将会承担一部分 SRE 的工作。

之前作为开发者,总的来说从开发的角度来思考系统的稳定性。现在需要从更高更全面的角度来思考和理解站点的稳定性。上网研究了一番,SRE 是 google 的一个职位同时 SRE 也是一套 google 总结出来的站点稳定性的方法论。所以找来了 《SRE google 运维解密》。这本书成书比较早,里面有些章节介绍的技术栈可能过时。具体我也不了解 google 内部是否还在使用。但是方法论还是很合理、科学的。

一直以来我工作过的团队对于风险的态度都是,预防和杜绝。但是在这本书里面,google 对于风险的态度就变成了管理,合理使用,甚至利用风险来保证项目的迭代。

Read more »
0%