9月28号的 Agent / LLM 技术日报,整理到一半我反而松了口气。去年大家还守在键盘前争论“Agent 是不是伪需求”,今天再看社区的提交记录,Agent 已经变成一整条要细心维护的工程链路:记忆库、技能包、并发治理、记忆投毒、工具调用报错……每一个当初被当成“锦上添花”的环节,现在都在实打实地卡脖子。
这期日报适合三类人:正在做 Agent 落地的后端开发、想给团队搭 LLM 工具链的架构师,以及打算给个人机器人配上长期记忆的独立开发者。下面所有内容都来自今天的社区讨论和我的实操复盘,尽量不带水分,尽量给到能直接拿走的东西。
1. 今日焦点:Agent 和 LLM 的边界到底在哪
1.1 先把 LLM 的“token 三要素”说透
今天热词里有一条非常精准:“llm 的 token 三个点 key 我是谁、query 我在找什么、value 我能提供什么”。乍看像是讲 token 结构,实际上是在讲 Agent 设计里的“自我认知模型”。
很多团队写 Agent 系统提示词时习惯把角色、目标、技能混在一大段文字里,结果模型在长对话里经常“跑偏”:一会儿把自己当成客服,一会儿又当成工具人。把这三个点拆开之后,整个结构就清晰了:key 是 Agent 的身份,也就是它怎么向自己和用户描述自己的边界;query 是当前任务的目标,明确“这一次要解决什么问题”;value 是能力清单,也就是它手里有哪些工具、哪些数据、哪些技能。
这套逻辑不仅适用于提示词设计,也直接对应记忆检索。老话说“带着问题去查资料”,Agent 从知识库召回内容时,本质上就是拿 query(我在找什么)去匹配记忆条目的 key(这条内容解决什么),再把 value(具体内容)回填到上下文。我现在的团队写 agent 配置时,已经强制要求把这三个字段拆成独立配置块,后续调试、替换工具、做记忆清理都方便很多。
1.2 harness 和 agent,同一个骨架两种身位
“harness 和 agent 区别”这个热词,看起来基础,其实恰恰是今天很多项目跑偏的根源。harness 是“套具”,它把工具、上下文、轮次控制绑到 LLM 身上,但每次决策仍然由模型完全主导,LLM 是驾驶员,harness 是方向盘和仪表盘。而 agent 更像一个岗位,除了套具提供的能力之外,还包含目标拆解、任务状态机、结果校验、错误恢复的完整闭环。
用一个代码类比更好理解:harness 就是框架里的 Runner,负责“跑起来”;agent 是业务层的 Worker,负责“跑得对”。我见过不少项目只给模型接了几个工具,就对外宣称做了 Agent。实际上那只是 harness,距离能自主拆解任务的 Agent 还差一层“计划-行动-检查”的循环。反过来说,大部分业务其实并不需要完整 Agent,硬上反而制造不可控性。什么时候才值得上?要同时具备多轮反思、任务拆解、跨工具协作这三个特征时。
1.3 一句话定调今天的内容
Agent 化的本质,是把 LLM 从“答录机”变成“执行者”。今天日报里的所有工具、框架、报错、安全研究,本质上都在回答同一个问题:怎么让模型在真实业务里持续、安全、可扩展地干活。不管是 agent anywhere(让 Agent 长在各种终端)、spatial llm(把空间信息纳入模型理解),还是各种 agent 框架的刷屏,背后都是这个趋势。学习路线也很朴素:先跑通一套框架,再做记忆和技能,最后补安全和并发治理,缺一环都会在线上炸给你看。
2. 今日上新:五个值得动手的 Agent 工具与框架
2.1 Hermes Agent 接 Obsidian:笔记库变 Agent 记忆库
Hermes Agent 是今天讨论度很高的本地方案,最让我眼前一亮的是它接 Obsidian 的玩法。Obsidian 天然适合当长期记忆的“家”:所有笔记都是纯文本 markdown,文件结构清晰,还自带双向链接。让 Agent 以本地 vault 为记忆库,意味着它真正拥有了一个可以持续写入、检索、复盘的知识仓库,而不只是靠一次会话的上下文。
开箱即用的连接方式很简单,大致四步:先安装 Hermes Agent,选择第三方工作台模式;再把配置指向 Obsidian 的 vault 路径;随后赋予“读、写、检索 markdown”三类权限;最后启动后做一次全库索引,Agent 就能在对话里引用具体笔记内容了。很多做个人知识管理的朋友会顺手把日常碎片、会议记录、灵感的 WordPress 都迁进去,然后让 Agent 定时生成摘要和关联卡片。
这里有几个我实际踩过的坑要提醒:vault 别给全部权限,至少把模板目录和回收站设为只读,防止 Agent 误删或者批量改写格式;中文文件名要留意,本地模型对路径编码的兼容性参差不齐,出现“找不到文件”先查文件名里的空格和特殊字符;如果 vault 放在同步盘(iCloud、Dropbox)目录里,Agent 高频写入容易引发同步冲突,建议把工作目录挪到本地磁盘,完成后手动回同步。
2.2 ADK.dev 的 Kotlin 快速上手:在 JVM 上跑通一个 Agent
如果你所在团队是 Java/Kotlin 技术栈,ADK(Agent Development Kit)可能是今天最值得花时间的东西。它的思路很直接:把“定义工具、配置模型、启动对话循环”封装成一套本地 API,跑在 JVM 上,天然能复用你现有的服务网格、链路追踪和监控体系。
最小流程大致是这样:先用 Kotlin 写一个普通函数,把它注册成可被模型调用的工具,再把这个工具绑定到一个支持 function calling 的模型上,启动交互循环。整个过程不用自己维护状态机,框架会帮你处理循环终止和错误回滚。伪代码看起来就像这样:
fun fetchUserOrders(userId: String): List<Order> = ... Agent.builder() .name("order-agent") .tools(listOf(::fetchUserOrders)) .model("gemini-2.5-flash") .build()说几个实操注意点。ADK 在 JVM 上的配置比 Python 版本多一些依赖管理成本,建议直接复制官方模板工程再改,别从零建 Gradle 项目。工具函数命名尽量用动词开头,比如fetchUserOrders而不是userOrders,模型对语义清晰的函数名理解准确率会明显高一些。还有最重要的一条:在 JVM 里跑 Agent 一定要给工具调用设超时,默认等待时间过长会把整个线程池拖死,线上出现过类似事故的人应该都懂这句话的分量。
2.3 Spring AI Agent:Java 后端接入 Agent 的最短路径
Spring AI 是 Java 生态里追赶 Agent 浪潮最务实的方案。它的好处不在于把 Agent 做得多酷,而在于让它变成可以被 Spring 管理的普通 Bean:模型、工具、记忆源全都可以通过配置注入,于是你现有的配置中心、熔断器、日志链路都能直接复用,团队上手成本非常低。
快速落地的思路是:在application.yml里配好模型端点,代码里声明一个ChatClientBean,把数据库查询、库存接口、工单系统都注册成方法级别的工具,业务层调用时就像调普通服务一样,底层发生了几次 LLM 调用、几次工具调用,调用方完全无感。
两条避坑经验值得记一下。Spring AI 的版本迭代速度很快,不同版本之间工具注解的行为有过不兼容调整,升级依赖后务必把工具调用测试重新跑一遍,别信“升级应该兼容”这种话。另外,别把核心业务直接交给 Agent 自主决策,金融、订单这类强校验场景更适合“规则在前、Agent 在后”的编排:规则负责守住底线,Agent 只做增强和解释,否则一个模型幻觉就能让整条业务线兜底。
2.4 Rust 写的 AI Agent:性能敏感场景的选型
Rust 在 Agent 圈的热度稳步上涨,主要集中在一个领域:性能敏感的工具调度层。你大概率不需要用 Rust 从零实现完整业务 Agent,但如果你要做一个高并发的 Agent 网关,Rust 的吸引力就很具体:内存占用低、并发模型干净、对恶意输入的容忍度也更低。
实际场景里,见过有人用 Rust 写了一个 tool proxy:所有 Agent 发起的工具调用先经过它做鉴权、限流、缓存,再用tokio异步转发到真实服务。 Python/Node 的 Agent 业务代码一行不用改,只是把“工具调用入口”这一层下沉到 Rust,整体 P99 延迟能下降一个档次,内存占用也比原来的 Python 进程小很多。
不过必须说句公道话。Rust 的迭代成本明显高于生态成熟的 Python/TypeScript,团队如果没有 Rust 维护经验,单纯为了“性能好”而全局重写 Agent 属于得不偿失。更聪明的做法是“关键入口用 Rust,业务逻辑用老本行”,把性能瓶颈那一层替换掉就够。
2.5 安卓本地跑 GGUF 模型:老设备也能玩
“安卓本地运行 GGUF 格式 LLM 软件,支持安卓 8”这个热词,反映了一个正在发生的趋势:本地小模型快速下放到旧设备。GGUF 是 llama.cpp 生态的量化模型格式,它的核心价值在于把巨大的模型压到手机跑得动的体积,同时保留基本可用的对话质量。
实操层面,最省力的路径是装一个基于 llama.cpp 的安卓前端,下载一个 Q4_K_M 量化的 7B 以下模型放到设备存储里,直接加载就能对话。我的建议是优先试 3B 到 8B 区间,超过 8B 在安卓 8 的老机器上无论是加载速度还是生成速度都会很难看,内存更是分分钟爆掉。像 LLM Studio 这类图形化工具对新手更友好,想在终端里折腾的则可以走 Termux 方向。
选本地模型前先想清楚取舍:换来的是离线可用和隐私安全,代价是智能程度和工作记忆明显弱于云端大模型。所以它更适合做“本地摘要、敏感信息脱敏、离线助手”这类场景,而不是替代你的主力 Agent。
3. 开发细节:记忆、技能、并发三根梁
3.1 Agent 记忆:短期上下文与长期存储怎么配合
“agent 记忆”几乎是我每天都被问到的话题,也是最容易做砸的模块。短期记忆就是上下文窗口,痛点很明确:贵、短、一满就截断;长期记忆则是向量库、数据库、文件系统,痛点是召回不准、写入随意、时间一久全是噪声。
我落地的方案是把记忆拆成三层。第一层是会话层,只在提示词里放本轮任务必要的信息,避免把历史垃圾全塞进去;第二层是工作层,用结构化存储记录用户偏好、任务状态、关键结论,本质是一个可以随时查询的小型数据库;第三层是归档层,沉淀可检索的历史和领域知识,用 embedding 召回。三层之间有一个关键习惯:每次任务结束时,让 Agent 把“结论、依据、未解决项”同步到工作层,归档层只在内容变化足够大时才更新。不这么做的话,记忆库会迅速膨胀,检索命中率随之下降,最后变成“什么都像相关,什么都答不准”,比没有记忆还糟糕。
3.2 Agent Skills:把“会做事”沉淀成“能力包”
“Agent Skills”是最近圈里讨论非常凶的概念,Claude 那边那篇《Claude Agent Skills: A First Principles Deep Dive》也刺激很多人开始动手。用大白话讲,Skill 就是 Agent 的“岗位资质证书”:一份 skill 里通常包含操作说明、输入输出 schema、依赖工具、失败处理策略。Agent 要做某一类任务时就加载对应 skill,而不是把所有能力全塞进系统提示词。
设计 skill 有几个原则,我现在基本当纪律来执行。接口要清晰:哪些字段必填、哪些可选、返回结构长什么样,必须一开始就写死;要为失败路径留退路:工具没返回数据时,到底是重试、降级还是让用户补充,必须写明确;版本要可追踪:skill 文件用 git 管理,升级后能回滚,出了问题能定位是哪一版引入的。
一个额外的启发是,今天有人提到“基于 LLM 的单元测试”,本质上也是把测试流程做成 skill——让 Agent 写完代码后自动调用一个“代码复核”技能,对输出做自检。这套做法的好处是,模型不会因为“懒”而跳过测试,因为测试是能力调用而不是主观意愿。
3.3 AI Agent 怎么扛并发:从串联调用到编排治理
“ai agent 怎么扛并发”这个问题,其实暴露了一个普遍误判:很多人把 Agent 当成一个普通模型接口来预估容量,却忘了它本质是一个会串行调用多次外部服务的慢任务。单个 Agent 请求动不动就消耗好几轮 LLM 调用和工具调用,一台机器能扛的并发量,取决于单次 Agent 请求的总耗时,而不是单次 LLM 调用的延迟。
我做过一个简单估算,假设一轮完整 Agent 对话需要 5 次 LLM 调用、2 次工具调用,总耗时 20 秒。那么单实例并发上限就是 1000 毫秒 / 20000 毫秒 ≈ 0.05 QPS。跑 10 个实例理论上一秒也只能接 0.5 个新请求。这时候单纯“加机器”是很昂贵且很粗的方向,更有效的做法是:把能并行的工具调用并行化,比如同时查天气和查日程;给高频重复的工具结果加短时缓存,比如同一位用户短时间内反复查订单状态;非关键路径走异步消息队列,让 Agent 先回“已在处理”;最后一定要给任务设置最大迭代轮数,防止死循环烧 token。
这套思路和传统后端限流一个道理,只不过 Agent 的“单个请求”成本被放大十倍以上。所以设计架构时,要把 Agent 循环当成一个独立的流量模型来规划,而不是顺手当成普通 API 调用就完事了。
4. 安全与评测:Agent 落地绕不开的两道坎
4.1 AgentPoison:向记忆库投毒的红队研究
热词里出现了agentpoison: red-teaming llm agents via poisoning memory or knowledge ba,这是一条关于“记忆投毒”的红队研究,今天必须拎出来说。攻击逻辑非常直接:Agent 依赖记忆库检索信息来辅助决策,那攻击者就在你的记忆库里塞精心构造的毒样本,等未来任务检索到这些样本时,Agent 就会按攻击者的意图行动。
说白了,就像有人在你工作笔记里塞了几张假情报,你时间紧、情绪差的时候一查笔记,很容易就跟着错误信息做了判断。这个研究方向对做 RAG 和 Agent 记忆的人尤其重要,因为大家默认“自己向量库里的内容就是安全的”,这个默认值实际上相当脆弱。
防御措施我有几条实践过的经验。所有写入记忆库的内容,先经过来源校验和敏感词过滤;对“读取记忆后触发的高危操作”(比如转账、删除、发外部请求)加二次确认;在 Agent 展示决策依据时带上记忆来源,让用户能看到这条信息到底来自哪份文档;定期抽查记忆库,清掉来源不明或长期没被命中的脏数据。安全不是一次配置就能完成的,它是一门运维功课。
4.2 LLM as Judge 的评价偏差与实用策略
让大模型当裁判去评审另一个大模型的输出,已经是成本最低的评测方式,但它的偏差问题比很多团队想象得严重。LLM judge 常见的倾向至少有四种:喜欢更长的回答、偏爱自己家族的模型、中间档位分数拿捏不稳、容易被评测 prompt 里的示例带偏。一旦把 judge 结果直接用来做模型选型或版本发布,这些偏差会被成倍放大。
我团队现在定了几条评测规矩。评分必须落在具体维度上,比如相关性、可执行性、真实性,不能只问一句“这个回答好不好”;至少让两个不同家族的模型交叉打分,优先分析两者结论一致的样本,分歧大的样本反而要警惕;每轮评测抽 10% 交给人工复核,用人工标签校准 judge 的漂移。还有一个容易忽略的点:换 judge 模型或版本时,先跑一遍历史样本做对比,确认分数分布没有突变。否则你看到指标涨了,可能只是因为换了个更宽松的裁判。
4.3 看榜单选模型:从 Open LLM Leaderboard 到真实业务
打开 Open LLM Leaderboard 这类公开榜单,满屏都是分数,但选模型如果只看榜单,大概率会在真实业务里翻车。榜单测的是通用能力,你的业务测的是特定场景下的稳定性:工具调用成功率、长上下文表现、中文指令遵循程度、输出格式一致性。这些恰恰在通用榜单里体现不出来。
我建议的选型步骤分两步走:先用公开榜单把明显不行的筛掉,然后立刻用自己业务的 20 到 50 条真实样本搭一个小评测集,重点对比延迟、token 消耗和关键任务成功率。很多看起来便宜又聪明的模型,在真实 Agent 场景下会因为工具调用不稳定、JSON 输出偶尔崩掉而让整体成本远超预期。把实际踩坑的过程记录下来,维护成一份团队内部的 LLM wiki,比任何公开榜单都更有指导意义。
| 业务场景 | 推荐方向 | 关键指标 |
|---|---|---|
| 通用对话、客服摘要 | 中小规模、指令遵循强的模型 | 首字延迟、单次成本 |
| 复杂 Agentic 任务 | 大参数、工具调用稳定的模型 | 任务成功率、上下文长度 |
| 本地隐私场景 | 开源量化模型 | 内存占用、响应速度 |
Agent 场景下“好模型”的标准其实很朴素:给它一套工具,它能老老实实一步步完成,出错能自纠,不瞎编,不乱发挥。这个标准需要用你自己的数据集去“考”,榜单只负责让你别考到全校最后一名。
5. 今日排查实录:三个高频报错的现场拆解
5.1 Codex 提示无法发送消息:沙盒状态是关键
热词里有一条codex 无法发送消息,显示更新 agent 沙盒。这个问题我自己也遇到过,属于那种看起来像是网络断了、实际上跟网络关系不大的报错。Codex 这类编程 Agent 通常把每次任务放到一个隔离沙盒里执行,沙盒过期或者环境配置变了,发送消息时就会卡住不动。
固定排查顺序分享给大家:先检查客户端版本,老版本沙盒镜像跟新服务端不兼容时会假死;更新后仍不行,就去设置里重置沙盒目录,注意先备份工作区改动;接着清掉本地会话缓存再重试;如果这个报错是概率性出现,多半是服务端状态同步延迟,等几分钟再连一次反而更顺。这套经验核心就是:凡是 Agent 平台带“沙盒”两个字的环境类报错,先怀疑本地环境跟远端契约不一致,而不是怀疑网络。
5.2 provider rejected the request schema or tool payload
LLM request failed: provider rejected the request schema or tool payload这个报错,在使用第三方模型服务接入工具调用时非常常见。翻译成人话就是:你发给模型提供方的 tools 参数不符合它的规范,对方直接拒收。
我的排查套路比较固定,也比较好用。先把 tools 数组缩到只有一个工具,如果还报错,问题一定出在基础 schema 上;接着检查每个工具描述里有没有非法 JSON、缺失 required 字段、多余字符;再确认你选的模型 API 是否真的支持 function calling,有些小模型或特定接口一传 tools 就会被拒;之后检查工具描述的总长度,部分服务对单个工具描述有长度上限,超长就会被拒绝;实在定位不了,就用提供方官方的 API Playground 发同样请求,能快速判断是平台问题还是你的代码问题。
这条报错最迷惑的地方在于,不同 provider 对 schema 的宽容度差很多。同一个 tools 请求,甲模型很宽松,乙模型可能严格到每个类型都必须精确匹配。所以“之前没报过错”不等于“现在没报错”,只要换模型,工具调用测试一定要重跑。
5.3 Agent execution terminated due to error 的通用排查路径
Agent execution terminated due to error属于兜底报错,任何一步执行失败都可能落到它头上。收到这个错误不要慌,按五个方向筛。先看是不是 token 或上下文超限,长任务到后半段最容易踩,临时放大窗口或者精简历史记忆能解决;再看工具调用有没有抛异常,很多工具函数只考虑了正常路径,没处理 null 和超时,模型一拿到异常就终止了;然后查是否陷入循环,Agent 反复调用同一个工具且结果不变时,框架会主动终止;还要确认第三方 API 超时设置是否合理,LLM 服务和工具服务都该有超时时间;最后看日志里有没有局部降级逻辑,子任务失败时是不是整个流程直接终止了,而更理想的做法是记一条 warning 继续执行其余步骤。
我个人习惯在 Agent 配置里加一组“护栏参数”,比如最大迭代轮数、单步超时、错误恢复策略。它们虽然只是框架参数,但其实是生产环境中保障稳定性的关键设计,缺了它们就是在裸奔。遇到过几次线上事故之后,我现在都会用类似下面的配置兜底:
{ "max_iterations": 10, "max_tokens_per_step": 2048, "timeout_seconds": 120, "on_error": "stop_and_report" }这类日报不要看完就翻篇。我的实际体验是,每天挑一条跟你项目最相关的点——可能是一个报错、一个攻击姿势、一个框架更新——花十五分钟在本地复现一下,或者抄进自己的实验笔记,能力增长比刷一百篇观点文来得扎实。最后再分享一个小技巧:维护一份自己的 LLM 排错手册,把每次报错、原因、解法按时间记下来,三个月后你会发现自己成了团队里最懂 Agent 的人。