AgentScope第1式·识势选型

AgentScope第1式·识势选型

选错方案,后面每一次需求变更都要重写一遍。

[读者] Java 后端与架构师,正把数字人从 Demo 推向生产
[痛点] 模型能调通,记忆、工具、审批、恢复却全要自己手写
[现在读] 项目刚进入长期运行阶段,选型窗口只有一次
[读完] 能用一张表说清五种方案边界,并讲清 15 个以上核心术语
[旧方案] Spring Boot 里直接调大模型 API,外面套一层 Workflow 兜底
    |
    v
[新需求] 要跨会话记忆、要查知识查客户、要办业务、要审批、要审计
    |
    v
[冲突] 这些不是模型能力,而是运行时能力,直连 API 补不上
    |
    v
[后果] 每加一个能力就多焊一坨胶水,越改越不敢上线

我是老李,做 Java 后端十几年,最近两年大半时间在做 AI 应用的落地。我见过太多项目死在同一个地方:Demo 阶段人人叫好,进生产阶段没人敢碰。

这一次的项目是企业数字人。它要挂在企业官网上,访客点开就能对话,背后连的是企业的知识库、CRM 和几张工单表。第一版 Demo 只用了一个 Spring Boot 接口加一次模型调用,两周就上线演示了。

但演示结束那天,业务方给的下一版需求,把整个技术选型问题重新翻了出来:要记住上次聊到哪、要查客户、要发起退款、敏感操作要人工确认、所有动作要能审计。

那么问题来了:到底该按什么标准判断,这个项目需不需要一个 Agent 运行时?

如果没有标准,是继续在 Spring Boot 里堆胶水,还是现在就引入一套框架、承担学习成本?

选错了又会怎样?最坏的结果不是多写几千行代码,而是两年后整个系统没人敢改。

01、故事

周一上午的架构评审会,白板上从左到右贴了四张便签。

第一张写现状:/api/chat 接口,一次模型调用,一张 conversation 表按 sessionId 存历史。第二张写需求:查知识库、查客户、发起退款、跨会话记忆、复杂任务拆解、全程审计。第三张写约束:两个月上线,团队三个 Java 后端,没人写过 Agent。第四张写着一个被圈起来的问题——用什么?

任务是:把网页上那个只会聊天的输入框,变成能查知识、能查客户、能办业务、能记住人、能管住手的数字员工。

会议室里出现了三种声音。

第一种声音来自后端组长:别引入新东西,模型 API 加个 service 层就够了,工具调用我写 if/else 路由。第二种声音来自一位做过流程引擎的同事:上 Workflow,画流程图,节点里塞 LLM,可控、能审批、能回滚。第三种声音来自刚从另一个 AI 项目回来的同事:Spring AI 或者 LangChain4j 都行,都是 Java 生态,生态成熟,社区大。

三种声音都不算错,但它们回答的其实是三个不同的问题。第一种回答的是「怎么调模型」,第二种回答的是「怎么定流程」,第三种回答的是「怎么把模型接进 Spring」。而白板上那张便签问的是第四件事:

当一个系统要长期运行、要调用真实工具、要记住人、要把任务分给别人、要让敏感操作停下来等人点确认、要在崩溃后恢复,这套东西由谁来管?

那天的会没开出结论。会后我在仓库里建了一个空目录,决定先把判断题做完,再碰代码——因为我知道,这种项目最贵的错误不是写错代码,而是选错承载方式。

一行调用易
一栈运行时难
先问价值事
再落代码行

02、问题

旧认知很朴素:Agent 就是更会聊天的模型,把 prompt 写长一点、把模型换强一点就行。

这个认知在 Demo 阶段是对的,在数字人项目上不成立。因为需求清单里那些条目,没有一条是「模型能不能答」,全都是「系统能不能管」:跨会话记忆要有人存、工具调用要有人拦、退款要有人批、崩溃要有人恢复、审计要有人记。这些东西跟模型强弱没有关系,模型再强也不会替你管住一次退款。

证据在哪里?就在 AgentScope Java 自己的模块划分里。按固定 tag v2.0.3 的仓库结构,agentscope-core/src/main/java/io/agentscope/core/ReActAgent.java 描述的是「一个 Agent 怎么循环推理与行动」,而 agentscope-harness/src/main/java/io/agentscope/harness/agent/HarnessAgent.java 所在的模块,处理的是「这套循环怎么被装配成一个能长期运行、能挂工具、能带状态、能受约束的外壳」。官方文档 docs/v2/zh/docs/harness/architecture.md 也是围绕分层与装配讲的,而不是围绕模型效果讲的。具体字段与目录结构请以该文档和固定版本源码为准。

对比一下另外两类方案就更清楚了。传统大模型 API 是「一次请求一次响应」,Spring AI / LangChain4j 的定位是「把模型集成进 Java 应用」,两者都很成熟,但它们解决的问题集中在调用、提示词、流式输出、工具回调这一层。工具回调不等于工具治理:谁允许调、调之前要不要审批、调崩了怎么办、这次调用算在谁头上——那是运行时的活儿。

风险也在这里。当这些职责没有归属,它们就会散落到业务代码的各个角落:在 service 里判断意图,在 controller 里拼历史,在定时任务里清理会话,在某处硬编码一个「退款要二次确认」。三个月后没人能说清「这个数字人一共能干什么、干过什么、谁能让它干什么」。

所以本篇的完成标准不是「跑通一个 Agent」,而是四份可交付物:一份教程 README、一份架构背景说明、一份不少于 15 个术语的术语表、一份能回答三个「为什么不」的选型决策记录。

旧识以为巧
新需方知深
边界先划清
方能少返工

03、原理

本篇真正需要的原理只有一条:把「模型能力」和「运行时能力」分开看。

可以粗略分三层。最下面一层是模型能力层,负责推理、生成、理解,这是模型厂商的事。中间一层是模型集成层,负责把模型接进 Java 应用、处理鉴权、重试、流式、结构化输出,Spring AI、LangChain4j 的主战场在这里。最上面一层是 Agent 运行时层,负责状态放哪、工具怎么注册与授权、循环怎么终止、人怎么介入、崩了怎么恢复、轨迹怎么留,AgentScope Java 的主战场在这里。

先解释三个后面反复出现的词,每个只给边界。Agent 在本系列里指一个持有状态、能调用工具、能循环决策的执行体,不是「更聪明的模型」。ReAct 是一种循环范式,把「想一步、动一下、看一眼、再想」串成可终止的循环。Harness 是把这套循环装进一个可长期运行外壳的运行时,负责把循环、工具、记忆、权限、工作区这些零件装配起来,具体分层以官方 harness 架构文档为准。

这里有两个反直觉判断。

第一个反直觉判断:Agent 项目的成败,主要不取决于模型有多聪明,而取决于状态、权限、恢复这三件事有没有人负责。模型答错一句话,用户再问一遍就行;工具调错一次退款,那是要赔钱的。

第二个反直觉判断:工具调用写起来最容易,出事也最容易。因为它把「模型输出」直接接到了「真实副作用」上,中间那层校验和授权如果没做,等于把一个概率模型直接连到了数据库写接口。

还有一个必须提前说清的边界:AgentScope Java 是 Apache-2.0 许可的开源框架,框架本身可自由使用,但这和「用起来不花钱」是两回事。模型调用、API 配额、GPU、LiveKit 这类基础设施,各自有各自的成本,跟框架许可完全是两条账。混淆这两条账,会在做预算时得出错误结论。

最后一句版本提醒:本系列基线是 v2.0.3。如果你写作当天看到的 Releases 页已经有更新版本,本篇的判断仍然可以按 v2.0.3 复现,但涉及新特性的现状,需要按当天的 Release Notes 核验,不能把 v2.0.3 的限制当成永久结论。

推理非难处
状态是关山
循环装成壳
长期才可安

04、架构

[输入] 用户在 /run/{projectId} 里说的一句话,或一段语音转成的文本
    |
    v
[模块] Web 管理/运行端 → Spring Boot 装配 → Realtime Bridge → AgentScope Java
    |
    v
[数据/状态] MySQL 存项目配置 + 会话标识 + 运行期状态与上下文
    |
    v
[处理] ReAct 循环:推理 → 选工具 → 执行 → 观察 → 再推理,中途可被人工介入打断
    |
    v
[输出] 回复文本/音频事件 + 一条完整可审计的执行轨迹

这张图不是最终架构,而是「选型的坐标系」。左边是宿主:Spring Boot 管项目配置和鉴权,MySQL 存业务数据。中间是实时通信层 WebRTC Room,只负责把音频和数据搬来搬去,不负责推理。右边才是 AgentScope Java,负责循环、工具、状态、记忆、审批这些运行时职责。后续章节会把每一段填实,第 3 式会把它冻结成一个可运行的最小数字人 Demo。

边界:LiveKit 这类实时通信组件只做媒体与数据传输;Realtime Bridge 保持最薄,只做媒体消息与 Agent 消息之间的适配,不做业务判断;STT/TTS 如果启用,只作为 Bridge 周边可插拔组件。所有业务语义都落在 AgentScope 这一侧。

收益:职责清晰之后,能力可以叠加而不是重写。加一个查询工具,是注册一个 Tool;加一次审批,是挂一个中间件;加一层记忆,是换一个 Memory 实现。这三种改动都不会动到媒体链路和业务表结构。

代价:多一层运行时,就多一份学习成本、多一份排查难度,也多一个必须纳入可观测体系的组件。对小项目来说是明显的过度设计。

适用条件:意图开放(无法预先枚举分支)、有真实副作用(要调外部系统)、需要长期运行(跨会话、要恢复、要审计),三条至少占两条。

不适用条件:只是给文档站加个问答框、流程分支可以完全枚举、一次性离线批处理、团队没有任何人可以长期维护这一层——这些情况都不该引入 Agent 运行时。

涉及内部机制时,本文的判断优先落在两处固定源码入口:agentscope-core 里的 ReActAgent,和 agentscope-harness 里的 HarnessAgent;文档层面以官方 harness 架构文档为主。第 8 式会专门建立一套源码研究方法,那时我们再把调用链一条条走通。

入口接会话
中间管状态
出口留轨迹
分层不越界

05、实战一次

本章不接模型,实战产物是四份文档。这也是最有价值的一步:把判断题写下来,比把代码写出来更能防住后面的返工。

分支从 main 创建:

git checkout main
git pull
git checkout -b chapter/01-value-scenario-terms
mkdir -p docs/ch01

预期目录结构(本章产出,均为文档,不含业务代码):

  • docs/ch01/README.md —— 教程导航与本章验收清单
  • docs/ch01/architecture-background.md —— 业务背景、约束、架构分层说明
  • docs/ch01/terminology.md —— 术语表
  • docs/ch01/decision-record.md —— 选型决策记录

第一份是选型矩阵,放在 decision-record.md 里。它不是「哪个框架最好」的排行榜,而是「某项能力由谁负责」的归属表。

能力诉求 传统大模型 API Spring AI / LangChain4j 固定 Workflow / BPM AgentScope Core AgentScope Harness
单次问答 直接支持 直接支持 需包一层节点 支持 支持
确定性多步流程 手写 手写 强项 可编排 可编排
工具调用循环 手写 有工具抽象,循环较薄 节点内调服务 ReAct 循环 循环 + 工具治理
跨会话记忆 自建表 自建表 自建表 记忆抽象 记忆 + 工作区
子任务委派 无 无 人工拆节点 支持 子 Agent
人工审批 自己写 自己写 强项 需组合 中间件拦截
隔离执行 自己搭 自己搭 通常无 需组合 沙箱
崩溃恢复 自己写 自己写 流程实例可恢复 状态序列化 会话级持久化
可观测 自己埋点 自己埋点 引擎自带 需接 OTel 需接 OTel
主要成本 胶水代码 胶水代码 流程建模 学习曲线 学习曲线 + 运行时

这张表是设计稿,不是实测结果;表中每一项的细节,都应在后续章节用官方文档和固定版本源码逐条核验。

第二份是价值链拆解,说明数字人从「聊天窗口」到「数字员工」到底加了什么:从只会答,到能查知识、能查客户、能办业务、跨会话记得住人、复杂任务能委派、敏感操作能停下来确认、全过程可审计可运营。每加一条,就是往运行时上挂一个能力,而不是往业务代码里加一个 if。

第三份是术语表,见 terminology.md。按四组组织,每组给一句话边界,不做百科展开。

术语 一句话边界
Agent 持有状态、能调工具、能循环决策的执行体
ReAct 推理与行动交替的可终止循环范式
Harness 把循环、工具、记忆、权限装配成长期运行外壳的运行时
Tool Agent 可调用的受约束能力单元,带入参描述与权限
MCP 工具与上下文接入的标准化协议
Workspace Agent 的文件与产物工作目录
RuntimeContext 一次运行期间的上下文载体,承载会话、用户、权限等
AgentState 可序列化的执行状态,用于恢复与续跑
Middleware 在循环关键节点插入的拦截与增强层
HITL 人在回路,敏感动作停下来等人确认
Skill 可复用的能力封装,区别于一次性工具
Plan Mode 先产出计划再执行的工作模式
Memory 跨轮次、跨会话的长期信息沉淀
Compaction 上下文压缩,把过长历史摘要化以继续运行
Filesystem Agent 读写文件的抽象层
Sandbox 隔离执行环境,限制副作用范围
Subagent 被主 Agent 委派执行子任务的 Agent
RAG 检索增强,先取资料再生成
SSE 服务端单向事件流,常用于逐字输出
AG-UI 前端与 Agent 之间的交互协议
A2A Agent 与 Agent 之间的协作协议
OTel 开放遥测标准,用于链路追踪与指标采集

关于几个术语的边界要特别说明:Memory 不等于把历史消息全塞进上下文,Compaction 也不等于删除历史,前者是沉淀,后者是压缩。Tool 和 Skill 的区别在于复用粒度,一个偏单次调用,一个偏成套能力。Sandbox 解决的是「跑在哪儿」,HITL 解决的是「谁点头」,两者不能互相替代。

第四份是架构背景说明,写清业务边界:注册登录、数字人项目 CRUD、项目配置(名称、标题、主题色、背景图、开场白、结束语)、最小 Agent 配置(agentName、model、systemPrompt)、运行页 /run/{projectId}。本章明确不做口型、表情、动作、复杂视频合成、直播、多租户、计费。

提交建议:

git add docs/ch01
git commit -m "docs(ch01): define AgentScope value scenarios and terminology"

本章的验收动作只有一条:合上文档,能不能用一张表说清三个「为什么不」,并且不看稿解释至少 15 个术语。做不到,就不要往下走。

不写业务码
先写决策书
术语列成表
选型有据依

06、排查

本章是认知型章节,所以「排查」排查的是判断本身,而不是代码报错。下面两条证据链,是这个星期里真实出现过的两次争论。

证据链一:「我 20 行代码就能让模型回答,为什么要引入一个框架?」

现象:同事在评审会上打开 IDE,三分钟写了一个 controller,直接调模型接口,能回答问题。全场安静,这话很难反驳。

为什么容易这么判断:因为在 Demo 场景下,这个判断 100% 正确。一次调用确实只需要 20 行。误判的地方在于,他把「回答」当成了整个需求的全部。

验证方式:把数字人的需求逐条列出来,问一句话——这条需求,一次模型调用能不能覆盖?答案会迅速分化:能覆盖的是「答一句像样的话」,不能覆盖的是「上次聊到哪儿了」「这个客户是谁」「谁批准了这次退款」「服务重启后这条会话还在不在」。后面这些都属于运行时,不属于调用。

结论:能回答 ≠ 能运行。这两件事需要分开评估,混在一起评,一定会得出「不需要框架」的错误结论。

修正做法:在做选型表时,把「调用类需求」和「运行类需求」分成两列,分别打分,不要让一次调用的简洁掩盖运行时的空缺。

证据链二:「Workflow 更可控,生产就该用流程引擎。」

现象:流程引擎能画图、能审批、能回滚、能看实例状态,每一条都是运维喜欢的。而且它确实解决了很多问题。

为什么容易这么判断:因为「确定性」在工程直觉里天然等于「安全」。看到流程图的那一刻,人会觉得一切都在掌控中。

验证方式:问一个问题——数字人的输入能不能预先穷举?用户可能说「帮我看看这个客户最近怎么样」,也可能说「上次那个事处理完了吗」,还可能说「算了,先给我讲讲你们的服务」。这些输入背后是哪条流程分支?枚举不出来。而流程引擎的前提恰恰是分支可提前定义。

结论:不是 Workflow 不行,而是它需要的前提在本场景不成立。它的强项是确定性,而数字人面对的是开放性。把开放性硬塞进确定性框架,等于给每个节点都配一条 default 分支。

修正做法:用「分支是否可穷举」作为第一判据。可穷举,用 Workflow;不可穷举且需要工具与记忆,才考虑运行时。

错误尝试: 我们真的试过一条折中路线——用流程引擎包一层,里面放一个「调用大模型」节点,再补一个 default 分支兜底所有走不通的输入。为什么错:default 分支会把所有没枚举到的意图全部吞掉,而且不报错。它不会抛异常,只会安静地给出一个答非所问的回复。这类失败最难排查,因为监控上看一切正常,只有用户觉得这个数字人「有点笨」。用确定性框架兜住不确定输入,得到的不是可控,而是静默失败。

上游贡献判断:本章以认知与选型为主,未发现可归因到 AgentScope Java 的明确上游问题。按系列规则,暂时只记录一条观察点——「Harness 与 Core 的职责边界在文档中的表述是否足够清晰」,等第 8 式建立源码研究方法、真正能对照 v2.0.3 与 main 之后再判断,现在不构成 Issue/PR 候选。

误判常因熟
证据要落源
一看便知界
再改不为迟

07、优化

证据链给出的是现象,根因只有一句话:我们把「运行时职责」错当成了「调用职责」,于是选型时比较的全是模型集成层的能力。

修正判断,落到三条规范上。

第一条,先问分支是否可穷举。可穷举且没有跨会话状态,直接 Workflow,不要引入 Agent。这一条挡掉了大量本来不该复杂的项目。

第二条,再问状态是否需要跨会话。只在单次会话内有效、重启可丢的,直连模型 API 就够;需要跨会话记住人、记住偏好、记住上次办到哪一步的,才需要 AgentState 与 Memory 这一类设施。

第三条,最后问副作用是否需要治理。只读查询可以放宽;一旦涉及写操作、退款、发消息、改客户资料,就必须有工具权限、审批节点和审计轨迹。

标准化步骤可以直接做成四步决策树:分支可穷举吗?可,用 Workflow。不可,第二轮:有跨会话状态吗?没有,用模型集成层。有,第三轮:有真实副作用吗?没有,Core 级 ReAct 就够,不必上完整 Harness。有,第四轮:副作用需要审批与审计吗?需要,上带中间件与沙箱能力的运行时,并在设计期就把 HITL 画进链路。

新行为是:从这一章开始,团队里任何一个人提出「加一个 Agent」,都必须先回答这四问,答案落进 decision-record.md,而不是落进聊天记录里。

验证方法也很朴素,就是开篇那三个问题。如果一个人能在白板上把这三个问题连成一条线,说明判断成立了:为什么不是直接调模型——因为缺的是运行不是回答;为什么不是纯 Workflow——因为分支不可穷举;为什么在这个项目选 AgentScope——因为状态、工具、审批、恢复需要一个宿主。三问能一次说清,术语能随口解释十五个以上,这一章的优化就算达标。

判断既修正
规范即落地
步骤标准化
新行有法依

08、演进

[同一输入] "帮我查一下张工这个客户的订单,超期就发个提醒"
    |
    +--[V1] 直连 LLM 或写死 Workflow
    |       行为:一次回答,或按固定分支查单、按固定模板发提醒
    |       代价:不记上下文、不能审批、崩了不能恢复、每改一次就改代码
    |
    +--[V2] AgentScope 运行时承载
    |       行为:Tool 查客户 → Memory 取上下文 → HITL 确认发提醒 → 留轨迹
    |       代价:多一层运行时、多一份学习成本、必须治理工具权限
    |
[Trade-off]
得到:能力可叠加、状态可延续、动作可审批、过程可审计
失去:一次调用的极简路径,以及「一切尽在流程图里」的确定性幻觉
边界:意图开放、有真实副作用、需长期运行,三点至少占两点才值得

放在五个维度上比较这两种承载方式。

正确性:V1 在已枚举场景下正确率极高,在未枚举场景下会静默答偏;V2 把未枚举场景交给模型决策,正确率取决于工具质量与提示约束,波动更大,但至少不会假装成功。

稳定性:V1 的稳定性来自确定性,代价是脆弱——需求一变就要动流程;V2 的稳定性来自边界治理,工具越规范越稳,前提是权限与审批真的落地了。

复杂度:V1 起步几乎零复杂度,随需求增长线性堆叠;V2 起步就有一层学习成本,但增量能力的边际成本递减。两条复杂度曲线会在某个点交叉,这个交叉点就是选型分水岭。

成本:V1 的成本主要在人力胶水;V2 的成本包括学习、运行时资源、模型调用与基础设施,必须分开记账,不能把框架许可的免费当成整体成本低。

适用范围:V1 适合意图收敛、生命周期短、以只读为主的场景;V2 适合数字员工、运维助手、审批机器人这类长期在线且带副作用的场景。

遗留问题也要摆在明面上:V2 引入了运行时,就引入了新的可观测需求、新的故障面、新的权限模型。这三样在后续章节必须逐个补齐,否则 V2 只是把胶水从业务代码搬到了运行时配置里,没有本质变化。

同一句问话
两条路殊途
得失常相伴
边界自量度

09、洞见

9.1 选型选的是「谁来持有状态」

五种方案的分界线,不在模型调用能力上,而在状态归属上。传统 API 没有状态,模型集成层给你工具但没有给你状态机,Workflow 把状态放在流程实例里,Core 把状态放在 Agent 里,Harness 把状态放在会话与工作区里。只要你开始问「重启之后这条会话还在吗」,你问的就已经不是模型问题了。

9.2 反直觉判断:模型集成层再成熟,也补不上运行时的空缺

反直觉判断:Spring AI、LangChain4j 这类框架越成熟,越容易让人误以为「Java 侧已经准备好了」。它们确实把模型接入、提示词、工具回调做得很顺,但顺的是调用路径,不是运行路径。一个团队完全可能拥有非常漂亮的模型集成层,同时完全没有记忆、审批、恢复这三样东西。这不是框架的缺陷,是两层的分工不同。

9.3 反直觉判断:Workflow 不是 Agent 的低配版,而是另一类问题的正解

反直觉判断:很多人把 Workflow 当成「还没进化到 Agent 的过渡形态」,这个排序是错的。分支可穷举、需要严格审计、需要可视化回放的场景,Workflow 就是最优解,硬上 Agent 只会把确定性换成不确定性。真正的判据是分支能否穷举,不是技术是否新潮。

同一条反过来也成立:如果一个 Agent 项目里 80% 的路径其实都是确定的,那应该把确定的部分收敛成流程,只把真正开放的部分交给运行时,而不是全盘 Agent 化。

9.4 什么时候不应该用本章这套能力

本章能力,指的是「引入 Agent 运行时并围绕它做架构设计」。不该用的情况至少有五种:只是想给帮助文档加个问答入口;流程分支完全可枚举且短期内不会变;一次性离线批处理,没有交互也没有恢复需求;团队只有一个人且明确只做三个月;以及最关键的——没有任何人愿意长期维护工具权限与审计这条线。最后一条最容易被忽略:运行时能力是有运维成本的,没人负责的运行时,比没有运行时更危险。

反直觉处见
工程判断明
能用与该用
一线之间分

10、系统落地

原来有什么:一个 Spring Boot 服务、一张会话表、一次模型调用,加上 /run/{projectId} 这个运行页的雏形。能演示,不能承重。

本篇新增了什么:没有新增一行业务代码,新增的是四份文档和一套判断标准——教程 README、架构背景说明、22 条术语表、五方案选型矩阵。以及一条团队约定:提 Agent 需求之前先过四步决策树。

现在能做什么:能向业务方解释清楚这个数字人为什么不能只靠一次模型调用;能向技术负责人解释清楚为什么这里不是纯 Workflow;能向团队解释清楚引入运行时之后,哪些能力是可以叠加而不是重写的;能用统一术语讨论 Memory、Compaction、HITL、Sandbox 这些后续一定会用到的概念,不再各说各话。

还缺什么:最小可运行的数字人骨架还没冻结,项目 CRUD、配置模型、运行页、实时会话链路全都停留在文档里;AgentScope Java 的真实 API 还没有被验证过一行;源码研究方法尚未建立,现在所有关于框架内部的判断,都还需要在后面用固定版本源码核对。

下一步如何演进:第 2 式把开发和调试环境搭起来,让「能编译、能断点、能跑测试」成为常态;第 3 式冻结最小数字人 Demo,把本章的架构图变成一个能跑起来的骨架。从那一式开始,后面所有章节都在这套骨架上增量开发,不再换场景。

开源参与点:本章未发现明确上游问题。唯一的观察点是 Harness 与 Core 的文档边界表述,但当前没有形成可复现行为、没有对照 main 分支验证,也不具备最小复现,因此不作为 Issue/PR 候选。系列规则很清楚:先有可复现行为,再有 Issue,最后才是 PR,不为了「有贡献」而制造问题。

原来只有聊
如今能办事
缺者尚可补
下一步自明

11、小结

Q1 → 为什么不是直接调 LLM:数字人缺的不是一次回答,而是可延续的运行
Q2 → 为什么不是纯 Workflow:开放式意图的分支无法预先穷举,硬塞只会静默答偏
Q3 → 为什么在这个项目选 AgentScope:状态、工具、审批、恢复、观测需要一个宿主
状态 → 五方案矩阵 + 22 条术语表 + 选型决策记录,本章可交付

本章没有产出任何可运行代码,产出的是判断力。判断力这种东西没法截图,但它决定了后面二十几章是稳步叠加,还是反复推倒。

需要提醒的是,本章结论都建立在 AgentScope Java v2.0.3 的模块划分与官方文档之上。如果你阅读时 Releases 页已有更新版本,本文的选型逻辑依然成立,但涉及具体模块与 API 的表述,请以你手上的版本为准核验。

一问定价值
二问答边界
三问验术语
状态已成篇

12、作业

12.1 理解题:用一句话说清「模型集成层」和「Agent 运行时层」的分工,并各举两个属于该层的具体职责

参考答案:模型集成层负责把模型接进应用,例如鉴权与重试、结构化输出解析;Agent 运行时层负责让 Agent 能长期运行,例如跨会话状态持久化、工具权限治理与人工审批。判据很简单:换一个模型厂商,职责是否还成立。成立的是集成层,不成立的才是运行时层。

12.2 实战题:为你手头任意一个真实项目,按本章四步决策树走一遍,产出一份三行结论

参考答案:格式可以是「分支可穷举性 → 跨会话状态 → 副作用治理 → 结论」。例如:分支不可穷举、需要跨会话记住用户、涉及写操作,结论是引入运行时并把 HITL 画进链路。如果走完发现分支完全可穷举且没有副作用,结论写「不引入 Agent,用现有流程引擎」同样是一份合格答卷——这份作业考的是判得准,不是判得新。

12.3 排障题:同事说「我加个 default 分支兜底,Workflow 就能处理所有输入了」,你怎么反驳?

参考答案:指出 default 分支会造成静默失败而非显式失败。它不抛异常、监控无告警,只是答非所问,因而最难排查。正确做法是先判断分支是否可穷举,不可穷举就说明这个场景不适合用确定性框架承载,而不是给它加一个吞掉所有意外的出口。

12.4 架构判断题:打开官方仓库,对照固定 tag v2.0.3 的 agentscope-core 与 agentscope-harness 两个模块,找出至少三处「只有 Harness 层才有、Core 层没有」的职责,并说明各自对应本章术语表中的哪个词

参考答案:本题不提供标准答案,正确答案在你的浏览器里。要求是:打开 https://github.com/agentscope-ai/agentscope-java/tree/v2.0.3 ,定位 agentscope-core/src/main/java/io/agentscope/core/ReActAgent.java 与 agentscope-harness/src/main/java/io/agentscope/harness/agent/HarnessAgent.java,再对照官方 harness 架构文档 https://github.com/agentscope-ai/agentscope-java/blob/v2.0.3/docs/v2/zh/docs/harness/architecture.md ,自己判断哪些职责属于运行时装配、哪些属于循环本身。如果你的结论和本章术语表里的边界写法不一致,以官方文档和固定版本源码为准,并把差异记进自己的决策记录。顺手看一眼 Issues 与 Discussions,确认你想提的观察是否已经有人提过——这一步是第 15 式贡献闭环的预演。

四题各一面
理解与动手
排障与判断
做完再前行

13、思考

回到这个项目最初的冲突:一边是「一次调用就能演示」的简单路径,一边是「长期运行、会调工具、要审批、要隔离、要恢复」的真实需求。这两者之间没有中间地带可以长期骑墙——你迟早要选一条承载方式。

本章给出的答案是:先不写代码,先把「谁负责运行」这件事写清楚。因为在大模型应用里,写代码从来不是最贵的环节,选错承载方式才是。

还有一句话值得记住:「会用框架」是能把 Agent 跑起来,「能参与框架演进」是知道它在哪一层薄、哪一层厚,知道什么时候该绕开它、什么时候该给它提一个 Issue。这中间的差距,就是后面二十八式要拉平的东西。

一念辨边界
一证定根因
一择知取舍
一役见真章

posted @ 2026-10-11 11:19  李福春  阅读(5)  评论(0)    收藏  举报