Personal Agent 新瓶旧酒?

年初时候红极一时的 OpenClaw 已经很少被人提起。抛开部署层面的槽点和安全问题,能够把一只龙虾真的养起来,切实可用,门槛一直都是不低的。也许,之所以出现50元安装一只龙虾这样的段子,更多的是技术浪潮前 FOMO 的焦虑心态。那么当前被资本推上浪尖的 Personal Agent,是否只是本地的 OpenClaw 推上云端?只是一种新瓶旧酒呢?

从技术层面来看,这两者的基础构架是一样的:agent harness + model + sandbox. 但是,每个部分又不太一样。首先,模型这一年来有了长足的发展。我还记得年初的时候,一个 agent 的 GUI 操作天花板也就是40%左右,但是年中时候,已经突破73%,超过人类的操作成功率,近期A厂和O厂的最新模型甚至可以摸高到80%以上。这就让sandbox真正的实际解决问题可用性大幅提升。这种fit发生的同时,沙箱的安全和隔离性也在不断增强。其次,harness的开箱即用性也在提升,用户不再需要复杂的配置和部署,就可以直接使用agent。这种技术上的进步,使得 Personal Agent 不仅仅是一个技术概念,而是一个可以实际使用的工具。

这些技术上的进步,让年初的龙虾从玩具有了逐步转变成能解决实际问题的产品的趋势。我们经常说 PMF, 从这个角度来看,AI在这一年突飞猛进,日新月异,无非与其他技术的发展一样,都是在寻找自己适合的市场的过程。而市场的需求,一直以来都是相对稳定和确定的。

因此,与其关注它是否新瓶旧酒,我觉得更有意思的是在需求和模式层面。现在的 Muse 和 Instinct 其实已经没有了“传统Agent” 的工具、技能、记忆等三件套,而是一个开箱可用的普通app产品。因此,他们的用户一开始就可以不是专业用户,甚至,就不该是专业用户。人类基本的需求是不变的,回看互联网技术发展,吴军博士总结为”黄赌毒开道“:https、视频压缩、数据传输都来自于人类最本能的一些需求。But, don’t get me wrong, 我们在感慨一年的AI赛道一骑绝尘的时候,只是痴心于研究锤子找钉子,同时总寄希望于一种石破天惊。回看技术与商业的fit历史,无论是操作系统、软件工程、互联网还是移动互联网,基本都是发展自进化出来的。显然,这与刚才提到的需求稳定不变是有点矛盾的,但是这也是这次递归式自学习在这一波备受关注的内在的魅力所在。

资本从来都是嗅觉灵敏的。有人说Muse拯救了Meta的股价,我当然是同意的,毕竟不能吃着锅里的还想着把锅砸了。但是资本又从来都是无情而敏锐的:个人Agent这个短波让资本从模式上看到了从流量税到委托税转变的可能。也许资本已经把它定义为某种奇点?毕竟这种模式转变(虽然当前看起来只是星星之火),无论对于电商、搜索、OTA都是釜底抽薪式的革命。而与之相关的,一直以社交网络关系构建护城墙的IM也无法在这场变革中独善其身。我们试想一想,当人与服务的连接被委托出去的时候,人与人的连接凭什么就不能委托呢——情绪价值、活人感、陪伴、心理安全需要,在肉眼可见的未来,AI都可以做到强兑现。

任何模式的诞生都需要一场新基建,而 token 无疑是这场新基建的电力。在驻足的当前,我们无非是在焦虑等待中加速迈进新的电气时代!

简评 DeepSeek Harness 架构

DeepSeek Harness (DSH) 在内部测试数月以后终于在 8 月向社区释放了开源的第一个版本,一时之间引起了行业的海量讨论和关注。行业关于这个框架的代码分析已经很多了,本文则希望从软件工程和架构的角度聊一下这个框架带来的一些收获和思考。结论先行:DSH 本身的定位并不是局限在 Agent,而是更加广泛的 AI 驱动的软件工程;行业对他的关注和影响短期高估,但是长期低估了它可能点燃的一场工程架构革命。

一谈到 DSH,很多人张口就会说它的 Everything is a Plugin 架构设计。我不清楚在 DSH 官方代码库中也是把它作为 slogan,是出于宣传推广的原因,还是醉翁之意不在酒。

插件化其实本身是一个非常成熟且行业共识的架构策略,无论是在服务模块,还是服务组合以及跨域异构架构维度,都有成熟的架构方案以及落地脚手架。因此我的确不知道这点到底有什么好宣传的:无论是古早的 Eclipse IDE,还是当前依然热度不减、以短小精悍易扩展著称的 Pi Agent Framework,都是插件化的架构。而另一个开源方案 pinix 则是把整个 runtime 都 clip 化,甚至把 agent 本身也作为一个 clip。因此,在我看来,DSH 这句话隐含的 LLM is also a Plugin 表达才是真正值得关注的。而这句表达背后的理论支撑 《A Programming Paradigm for Spatiotemporal Composability》 可能相对读起来比较晦涩,反而大大低估了它的价值。

这篇论文本身要论述的事情其实很简单:程序的时空可组合性。这个命题本身也是一个非常古老的研究命题。而在实践上,Golang 的作者之一 Rob Pike,从设计语言之初就是以组合和正交作为自己的语言基础,当然受限于静态强类型语言的限制,它更多是实现了空间的可组合性。而再把计算机编程语言历史往回翻,你会发现,电信行业使用几十年的 Erlang 其实早就已经实现了 hotcode reload 机制,而这其实就已经是时空可组合性的工程实践落地了,而且这个已经落地了好几十年,你每天使用的手机、电脑所经过的核心骨干交换机几乎都有它的身影。如果你仔细阅读一下 DSH 的 loop 代码,你会发现当年 Erlang 用尾递归实现的方式其实不过是在 Node.js 通过 context 做了一次拙劣的模仿。

我这里要说的并不是这个理论本身,而是这个理论本身所支撑的技术进步方向:搭积木的可折叠性。因为只有解决了运行时的时空可组合,才有可能实现理论上任意的组合以及试错。我们在做架构设计的时候总会免不了画架构框图,本质上其实就是基于架构树的经验在使用 积木 构建不同尺寸维度的解决方案。当行业还在纠结 DSH 是否是一个更好的 Agent Harness 的时候,我觉得其实应该更多地往前看一点:有没有可能它代表的是 Arch Engineering Harness——输入架构图,然后给出整套架构解决方案的实现。

而这个点不免会跟最近讨论火热的 自进化 联系到一起。当我们讨论自进化的时候,我们到底在讨论什么?很多人觉得 DSH 就是深度求索为 agent 自进化提交的阶段性答卷。我不清楚在 DeepSeek 内部是否也是这个定位,如上所述,如果 DeepSeek 内部也是这个定位,那么这个框架注定其实很难达到让人满意的 Release 阶段。

毕竟,AI 驱动的工程时代,理论和架构永远不是壁垒,比拼的是谁先落地,以及迭代的速度。DSH 不可能不明白这一点,让我们期待一下 DSH 从 Preview 到 Beta 的来临。

快速搭建一个轻量级Agent平台

前几天在跟同行探讨多租户 Agent 平台的架构设计时,发现一个很有意思的现象:很多人在面对 LLM 应用编排时,依然带着传统的框架执念。一上来就试图引入各种厚重的生态,比如完整的 Spring AI 体系或者 LangChain 的各类高级组件(比如 @AiService 和 @Tool)。

然而,当业务场景变成“千级 Agent、动态配置、毫秒级按需装载”的时候,这些在单体应用中大放异彩的框架,往往成了阻碍工程扩展性和系统稳定性的累赘。

如果你最近有去扒一扒 Anthropic 泄露的 Claude Code CLI 源码,或者关注过 Pi 这种极简 Agent,你会发现那些真正顶级的工程团队在 Agent 架构上都在做减法:抛弃臃肿的编排黑盒,拥抱最纯粹的控制流。

本文将以 Java 服务端为背景,记录如何剥离 AI 框架的“语法糖”,仅仅依靠 LangChain4j-Core 的底层原语,手搓一个支持 MCP (Model Context Protocol)、纯数据驱动且能支撑高并发的动态 Agent Loop 引擎。

一、 阶段一:千级 Agent 平台的工程痛点

在构建 SaaS 级的 Agent 平台(或者说一个 Local Token Hub)时,系统通常要承载海量且配置各异的虚拟助手。每次请求,网关都要根据请求头的 agent_id,将特定的系统指令(Skill)、专属工具(Tool)组装好并喂给模型。

如果此时采用高层框架的静态绑定模式,会暴露出几个工程上的致命伤:

  1. 静态工具绑定与动态调度的错位: 传统框架要求你将工具写死为 Java 类的方法。但在平台场景中,Tool 往往只是存放在数据库里的 OpenAPI 描述或是 JSON Schema。我们需要的是“元数据先行,按需加载”,而不是预编译。
  2. 资源与 Context 开销: 为几千个 Agent 初始化几千个包含 Memory Provider、Chat Memory、Agent Executor 的重量级常驻对象,服务器的堆内存很快就会被撑爆。
  3. 黑盒化与控制流丧失: 当你需要深度接入 MCP,或是需要对每次 Tool Call 进行细粒度的 Token 计费、权限沙箱校验时,被框架完全接管的 ReAct Loop 会让你寸步难行。

二、 阶段二:大道至简的 Agent Loop

“An autonomous agent is just an LLM + tools + a loop.”

这句话堪称 Agent 工程化里的一句箴言。剥离掉所有包装,Agent 的执行层本质上就是一个 While 循环。

我们要做的,是在每次 API 请求到达时,执行以下“三位一体”的动态组装,并送入循环:
* Skills (技能):根据 agent_id 提取 System Prompt(比如从 SKILL.md 中解析),作为上下文基调。
* Tools (本地工具):将数据库里配置的 API 描述转化为 LLM 能懂的 JSON Schema。
* MCP (模型上下文协议):连接外部数据源,将其提供的能力动态拉取并合并到工具列表中。

三、 核心实现:基于原语的“微内核”架构

作为一个开发者,我们要实现的是一个“微内核”的调度引擎。这里我们只引入 langchain4j-core 的底层原语,借用它抹平各家大模型 API 差异的能力,但控制流完全由我们自己掌握。

1. 依赖约束

我们不需要庞大的依赖树,只需要核心层即可:

<dependency>
<groupid>dev.langchain4j</groupid>
<artifactid>langchain4j-core</artifactid>
<version>0.35.0</version>
</dependency>
<dependency>
<groupid>dev.langchain4j</groupid>
<artifactid>langchain4j-open-ai</artifactid>
<version>0.35.0</version>
</dependency>

2. 动态 Agent Loop 引擎

以下代码展示了如何实现一个无状态、纯数据驱动的微型引擎:

import dev.langchain4j.data.message.*;
import dev.langchain4j.model.chat.ChatLanguageModel;
import dev.langchain4j.model.openai.OpenAiChatModel;
import dev.langchain4j.agent.tool.ToolSpecification;
import dev.langchain4j.agent.tool.ToolExecutionRequest;
import dev.langchain4j.model.output.Response;
import com.fasterxml.jackson.databind.ObjectMapper;

import java.util.ArrayList;
import java.util.List;

public class DynamicAgentLoopExecutor {

// 全局复用无状态的 LLM Client
private final ChatLanguageModel chatModel;

public DynamicAgentLoopExecutor(String apiKey) {
this.chatModel = OpenAiChatModel.builder()
.apiKey(apiKey)
.modelName("gpt-4o")
.temperature(0.3)
.build();
}

/**
* 核心 Agent Loop (网关每次请求的无状态入口)
*/
public String runAgent(String agentId, String userMessage) throws Exception {

// ==========================================
// 1. 渐进式发现与 Context 构造
// ==========================================
// 从存储加载当前 Agent 的 Skill (System Prompt)
String systemPrompt = loadSystemPromptFromDb(agentId);

// 动态构造 Tool Schema,不依赖任何 @Tool 注解
List<toolspecification> dynamicTools = new ArrayList<>();
dynamicTools.add(ToolSpecification.builder()
.name("get_weather")
.description("获取指定城市的天气")
.addParameter("city", dev.langchain4j.agent.tool.JsonSchemaProperty.STRING)
.build());</toolspecification>

// 假如有 MCP 接入,这里直接调用 MCP Client 获取远端工具列表并 append 进来
// dynamicTools.addAll(mcpClient.listTools());

List<chatmessage> chatHistory = new ArrayList<>();
chatHistory.add(SystemMessage.from(systemPrompt));
chatHistory.add(UserMessage.from(userMessage));</chatmessage>

// ==========================================
// 2. 意图匹配与 ReAct 循环执行
// ==========================================
int maxIterations = 10; // Token Budget 与死循环熔断
while (maxIterations-- > 0) {

// 提交 LLM 推理
Response<aimessage> response = chatModel.generate(chatHistory, dynamicTools);
AiMessage aiMessage = response.content();
chatHistory.add(aiMessage);</aimessage>

// 如果模型未发起 Tool Call,直接完成文本输出
if (!aiMessage.hasToolExecutionRequests()) {
return aiMessage.text();
}

// 拦截到 Tool Call,进入执行侧的分发
for (ToolExecutionRequest toolRequest : aiMessage.toolExecutionRequests()) {
String toolName = toolRequest.name();
String toolArgsJson = toolRequest.arguments();
String toolResult = "";

try {
// 工程分化点:本地沙箱调用 vs 远程 MCP 调用
if (isLocalTool(toolName)) {
toolResult = executeLocalTool(toolName, toolArgsJson);
} else {
// toolResult = mcpClient.callTool(toolName, toolArgsJson);
toolResult = "Mock MCP Result";
}
} catch (Exception e) {
toolResult = "Error: " + e.getMessage();
}

// 将执行结果(Observation)封装追加,进入下一轮迭代
chatHistory.add(ToolExecutionResultMessage.from(
toolRequest.id(), toolName, toolResult
));
}
}

throw new RuntimeException("Agent iteration limit exceeded");
}

// ... 省略 mock 的辅助方法 ...
}

这段百行代码的优势在于:它是绝对无状态(Stateless)的。一千个 Agent 的配置只是存放在数据库里的静态文本,在调用时才进行内存 Context 构造,用完随 GC 销毁,非常契合 Serverless 和高并发网关的诉求。

四、 延伸思考:MCP、Skill 与“嵌入派”的胜利

在研究这段手搓的 Agent Loop 时,很容易让人联想到 Anthropic 推出的 MCP 标准。

对于多租户平台来说,MCP 就是一个面向 LLM 的微服务架构。在上面的代码逻辑中,LLM 其实并不关心 dynamicTools 中的某个工具是在当前宿主机执行的原生代码,还是通过网络请求转发到某台 MCP Server 上的。在引擎的视角,MCP 仅仅是提供了一堆动态的 ToolSpecification。

这再次印证了之前关于“大模型嵌入派”的观点:将 LLM 作为决策中枢(Router),自下而上地将其嵌入到可控的系统架构中。

太阳底下没有新鲜事,以前微服务架构下积累的限流、熔断、调用链追踪经验,在这个微内核 Agent 架构下依然有着极高的借鉴意义。你可以在上面的 While 循环中,轻易地插入 Token Budget 检查、权限拦截(沙箱控制)和分布式日志。

五、 结语

有时候,过于 FOMO(Fear of Missing Out)的心态会让我们在面对技术演进时,盲目去追求一些看似大而全的权威框架,这反而会损失工程决策的质量。

把 LLM 当成 CPU 内核,把 Prompt/Skill 当作指令集,把 Tool 和 MCP 当成系统调用,你会发现,设计一个高可用的 Agent 框架,跟一门编程语言最终要实现如何自举的设计哲学几乎完全一致。

面对千级 Agent 的工程挑战,扔掉那些过度封装的框架,回归到最基础的 Agent Loop。在确定性的架构上去嵌入大模型的能力,不断将其沉淀为系统的稳定模块,这或许才是我们面对这一轮技术浪潮时,最不该焦虑且最踏实的演进路线。

印象中,这已经是这两年以来,自己第4次相对正式的设计和实现特定业务场景下Agent平台了。虽然每次都会有一些不同的业务背景和技术栈,但是问题的本质一直都没有改变。而有显著的改变的是,通过vibe coding,我们可以非常快速的把整个平台扶上线。

上周刚刚发布的GPT-5.6出来以后,很多开发者发出了”是时候把gstack, superpowers卸载了“的感慨。虽然开发者社区总是喜欢短期内高度阶段技术进步的影响,模型的嵌入和折叠外部能力的速度未必如他们口中呼喊的那么快,但从工程角度来看,在这个不断萃取和沉淀的过程中,随着螺旋上升不断调整和适应新的底座和新的能力,才是我们在这个时代最应该关注的事情。