🧑 博主简介:CSDN博客专家,「历代文学网」(PC端可以访问:https://lidaiwenxue.com/#/?__c=1000,移动端可关注公众号 “ 心海云图 ” 微信小程序搜索“历代文学”)总架构师,首席架构师,也是联合创始人!16年工作经验,精通Java编程,高并发设计,分布式系统架构设计,Springboot和微服务,熟悉Linux,ESXI虚拟化以及云原生Docker和K8s,热衷于探索科技的边界,并将理论知识转化为实际应用。保持对新技术的好奇心,乐于分享所学,希望通过我的实践经历和见解,启发他人的创新思维。在这里,我希望能与志同道合的朋友交流探讨,共同进步,一起在技术的世界里不断学习成长。 🤝商务合作:请搜索或扫码关注微信公众号 “ 心海云图 ”


深陷“Agent”迷宫?一文讲透 Java 生态的 Agentic 框架与“Harness”迷思(附完整代码)
从200万首诗词的加工困境说起,聊聊 Agentic 的本质、Java 框架选型,以及那个让所有人都懵了的“Harness”。
引子:当“AI工具”变成“AI同事”
设想一个场景:你有200万首古诗要处理,涉及翻译、背景提取、打分等9道工序,预估调用大模型上亿次。
面对这种规模,传统的“写死流程”代码(先调A接口,再调B接口)会变得极其脆弱——翻译卡壳后续全错,网络抖动整批重来。于是,我们把目光投向了 Agentic 框架。
但在调研时,你大概率会遇到三个灵魂拷问:
今天这篇文章,一次性把这些“连AI都容易答错”的概念彻底讲透,并附上可直接运行的代码示例。
第一章:拨云见日——到底什么是“Agentic”?
在深入代码之前,我们必须先统一认知。Agentic(智能体式)不是某种特定的算法,而是一种系统设计范式。
- 传统代码(非Agentic):你是流水线工头。你规定“步骤1提取、步骤2翻译、步骤3打分”,模型只是个被动的函数执行器。流程死了,系统就死了。
- Agentic 模式:你是公司CEO。你告诉系统(Agent)“去把这批诗处理好”,系统拥有大模型作为大脑,它自己规划路径、调用工具(查资料、算分数)、甚至自我纠错。
一句话总结:非Agentic是你教AI怎么走;Agentic是你告诉AI去哪儿,它自己看路况开车。
对于200万首诗的复杂异构数据,Agentic 的“自适应”能力是节省人力调试成本的关键。
第二章:Java 生态 Agentic 框架“四大金刚”(附代码)
虽然 Python 是 AI 的主场,但 Java 在企业级后端拥有不可撼动的地位。目前主流选择有以下四个维度:
| AgentScope Java (阿里) | 企业级生产标杆 | Agentic原生(ReAct、A2A协议) | 大规模分布式、复杂推理、需长期运行 |
| Spring AI Alibaba (阿里) | Spring生态深度整合 | 工作流(Graph) 主导,模型当函数 | 基于Spring Boot、偏好可视化低代码 |
| LangChain4j | 集成最广泛 | 轻量级封装,多模型适配 | 快速原型验证,社区活跃 |
| Google ADK (Java版) | 谷歌官方背书 | 多语言生态,强依赖Gemini | 深度使用Google云服务的项目 |
2.1 AgentScope Java 实战:从零构建第一个 Agent
AgentScope Java 是本文推荐的首选方案。我们先从 Maven 依赖开始:
<dependency>
<groupId>io.agentscope</groupId>
<artifactId>agentscope-harness</artifactId>
<version>${agentscope.version}</version>
</dependency>
<!– 如果使用 DashScope 模型,需要引入对应扩展 –>
<dependency>
<groupId>io.agentscope</groupId>
<artifactId>agentscope-extensions-model-dashscope</artifactId>
<version>${agentscope.version}</version>
</dependency>
最简示例:HarnessAgent 基础对话
HarnessAgent 是推荐的入口,把工作区、长期记忆、会话持久化、子 Agent、沙箱等工程能力打包在一个 Builder 里。
package com.example;
import io.agentscope.core.ReActAgent;
import io.agentscope.core.agent.RuntimeContext;
import io.agentscope.core.formatter.openai.OpenAIChatFormatter;
import io.agentscope.core.message.UserMessage;
import io.agentscope.core.model.GenerateOptions;
import io.agentscope.core.model.OpenAIChatModel;
import io.agentscope.core.tool.Toolkit;
import io.agentscope.harness.HarnessAgent;
import java.nio.file.Path;
public class BasicChatExample {
public static void main(String[] args) {
// 1. 从环境变量读取 API Key
String apiKey = System.getenv("DEEPSEEK_API_KEY");
// 2. 创建 Model(以 DeepSeek 为例,OpenAI 兼容协议)
OpenAIChatModel model = OpenAIChatModel.builder()
.apiKey(apiKey)
.modelName("deepseek-chat")
.baseUrl("https://api.deepseek.com")
.stream(true)
.enableThinking(true) // 启用思考模式
.formatter(new OpenAIChatFormatter())
.defaultOptions(GenerateOptions.builder()
.thinkingBudget(1024) // 思考 token 预算
.build())
.build();
// 3. 方式 A:纯 ReActAgent(最轻量,仅一个推理循环)
ReActAgent plain = ReActAgent.builder()
.name("Assistant")
.sysPrompt("你是一个乐于助人的AI助手,请友好简洁地回答问题。")
.model(model)
.toolkit(new Toolkit())
.build();
// 4. 方式 B:HarnessAgent(推荐——开箱即用:工作区、Session、记忆、子 agent、压缩…)
HarnessAgent agent = HarnessAgent.builder()
.name("Assistant")
.sysPrompt("你是一个乐于助人的AI助手,请友好简洁地回答问题。")
.model(model)
.workspace(Path.of("./workspace")) // 工作区目录,用于持久化
.build();
// 5. 构造用户消息并调用
UserMessage userMsg = new UserMessage("你好,请介绍一下自己");
String reply = agent.call(userMsg, RuntimeContext.empty())
.block()
.getTextContent();
System.out.println(reply);
}
}
代码解读:OpenAIChatModel 使用 Builder 模式创建。关键配置包括:apiKey(从环境变量读取)、modelName(deepseek-chat 或 deepseek-reasoner)、baseUrl(DeepSeek 的 OpenAI 兼容接口地址)、stream(true)(启用流式输出)和 enableThinking(true)(启用 DeepSeek 的思考链模式)。HarnessAgent 相比纯 ReActAgent,额外提供了工作区持久化、会话记忆等企业级能力。
2.2 AgentScope Java 工具系统:让 Agent 真正“动手”
光会聊天还不够,Agent 需要调用外部工具才能完成复杂任务。AgentScope 通过 @Tool 注解驱动工具注册:
package com.example;
import io.agentscope.core.ReActAgent;
import io.agentscope.core.agent.RuntimeContext;
import io.agentscope.core.formatter.openai.OpenAIChatFormatter;
import io.agentscope.core.message.UserMessage;
import io.agentscope.core.model.OpenAIChatModel;
import io.agentscope.core.tool.Tool;
import io.agentscope.core.tool.ToolParam;
import io.agentscope.core.tool.Toolkit;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
public class ToolCallingExample {
public static void main(String[] args) {
String apiKey = System.getenv("DEEPSEEK_API_KEY");
// 1. 创建工具集并注册工具
Toolkit toolkit = new Toolkit();
toolkit.registerTool(new SimpleTools());
// 2. 构建带工具的 ReActAgent
ReActAgent agent = ReActAgent.builder()
.name("ToolAgent")
.sysPrompt("你是一个可以使用工具的助手。在需要时使用工具来准确回答问题。")
.model(OpenAIChatModel.builder()
.apiKey(apiKey)
.modelName("deepseek-reasoner")
.baseUrl("https://api.deepseek.com")
.stream(true)
.formatter(new OpenAIChatFormatter())
.build())
.toolkit(toolkit)
.build();
// 3. 测试工具调用
String reply = agent.call(
new UserMessage("现在北京几点了?"),
RuntimeContext.empty()
).block().getTextContent();
System.out.println(reply);
}
/**
* 工具类:每个带 @Tool 注解的方法都会被注册为一个工具
*/
public static class SimpleTools {
@Tool(name = "get_current_time", description = "获取指定时区的当前时间")
public String getCurrentTime(
@ToolParam(name = "timezone", description = "时区名称,例如 'Asia/Shanghai'")
String timezone) {
try {
ZoneId zoneId = ZoneId.of(timezone);
LocalDateTime now = LocalDateTime.now(zoneId);
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
return String.format("Current time in %s: %s", timezone, now.format(formatter));
} catch (Exception e) {
return "Error: Invalid timezone. Try 'Asia/Shanghai'";
}
}
@Tool(name = "calculate", description = "计算简单的数学表达式")
public String calculate(
@ToolParam(name = "expression", description = "要计算的数学表达式,例如 '123 + 456'")
String expression) {
// 简化实现:仅演示工具注册机制
return "计算结果: " + expression + " = 待实现";
}
}
}
运行后,向 Agent 提问"现在北京几点了?",Agent 会:推理(需要获取北京时间)→ 决策(调用 get_current_time 工具,参数为 Asia/Shanghai)→ 执行(获取结果)→ 整理(将结果返回给用户)。
2.3 Spring AI Alibaba 实战:快速构建天气查询 Agent
如果你的团队深度绑定 Spring Boot 生态,Spring AI Alibaba 是强力竞争者:
<dependencies>
<dependency>
<groupId>com.alibaba.cloud.ai</groupId>
<artifactId>spring-ai-alibaba-agent-framework</artifactId>
<version>1.1.2.0</version>
</dependency>
<dependency>
<groupId>com.alibaba.cloud.ai</groupId>
<artifactId>spring-ai-alibaba-starter-dashscope</artifactId>
<version>1.1.2.0</version>
</dependency>
</dependencies>
最简示例:天气查询 Agent
import com.alibaba.cloud.ai.dashscope.api.DashScopeApi;
import com.alibaba.cloud.ai.dashscope.chat.DashScopeChatModel;
import com.alibaba.cloud.ai.graph.agent.ReactAgent;
import com.alibaba.cloud.ai.graph.exception.GraphRunnerException;
import org.springframework.ai.chat.messages.AssistantMessage;
import org.springframework.ai.model.tool.ToolCallback;
import org.springframework.ai.model.tool.FunctionToolCallback;
import java.util.function.BiFunction;
public class WeatherAgentExample {
@Test
void agentTest() throws GraphRunnerException {
// 1. 初始化 DashScope API
DashScopeApi dashScopeApi = DashScopeApi.builder()
.apiKey(System.getenv("AliQwen_API"))
.build();
// 2. 创建 ChatModel
DashScopeChatModel chatModel = DashScopeChatModel.builder()
.dashScopeApi(dashScopeApi)
.build();
// 3. 定义天气工具(将自定义函数包装为 Agent 可调用的工具)
ToolCallback weatherTool = FunctionToolCallback.builder("get_weather", new WeatherTool())
.description("获取某个城市的天气")
.inputType(String.class)
.build();
// 4. 构建 React Agent
ReactAgent agent = ReactAgent.builder()
.name("weather_agent")
.model(chatModel)
.tools(weatherTool)
.systemPrompt("你是一个非常有帮助的助手")
.saver(new MemorySaver()) // 使用 MemorySaver 保存对话历史
.build();
// 5. 调用 Agent
AssistantMessage response = agent.call("上海今天天气怎么样?");
System.out.println(response.getText());
}
// 自定义工具实现
static class WeatherTool implements BiFunction<String, ToolContext, String> {
@Override
public String apply(String city, ToolContext toolContext) {
return city + "今天天气非常好!";
}
}
}
核心特性:通过 Builder 模式快速构建 Agent;使用 FunctionToolCallback 将自定义函数包装为 Agent 可调用的工具;使用 MemorySaver 保存对话历史;完整的中文提示词和工具描述支持。
高级示例:带角色定位和工具约束的 Agent
String SYSTEM_PROMPT = """
你是一位擅长说**天气冷笑话/谐音梗**的专业天气预报员。
你可以使用两个工具:
– **get_weather_for_location**:用于获取指定地点的天气
– **get_user_location**:用于获取用户当前所在位置
如果用户询问天气,**必须先确认地点**。
如果从问题中能判断出他们指的是**自己所在的地方**,
就使用 **get_user_location** 工具获取他们的位置。
""";
这个提示词体现了几个重要设计原则:角色定位(明确 Agent 的身份和特色)、工具说明(清晰描述可用工具的功能)、行为约束(强制先确认地点再查询天气)。
2.4 Spring AI Alibaba 多智能体协作:顺序执行模式
当一个 Agent 要处理很多复杂的事情时,Multi-Agent 可以将复杂任务进行拆分。以下是顺序执行模式:
import com.alibaba.cloud.ai.graph.agent.ReactAgent;
import com.alibaba.cloud.ai.graph.agent.flow.agent.SequentialAgent;
// 创建具有特定角色的子 Agent
ReactAgent writerAgent = ReactAgent.builder()
.name("writer_agent")
.model(chatModel)
.instruction("你是一位专业作家,请根据用户需求撰写文章大纲")
.outputKey("article") // 输出结果存入 state 的 "article" 键
.build();
ReactAgent reviewerAgent = ReactAgent.builder()
.name("reviewer_agent")
.model(chatModel)
.instruction("你是一位专业编辑,请审阅以下文章并给出修改建议:{article}")
.outputKey("reviewed_article")
.build();
// 创建顺序工作流:writerAgent → reviewerAgent
SequentialAgent blogAgent = SequentialAgent.builder()
.name("blog_pipeline")
.subAgents(writerAgent, reviewerAgent) // 按列表顺序依次执行
.build();
// 执行:writerAgent 的输出自动作为 reviewerAgent 的输入
AssistantMessage result = blogAgent.call("写一篇关于 AI Agent 的科普文章");
顺序执行模式下,每个 Agent 按 subAgents 列表顺序执行,前一个 Agent 的 outputKey 输出会作为状态写入 OverAllState,下一个 Agent 通过 instruction 占位符 {article} 引用。
2.5 Spring AI Alibaba 多智能体协作:并行执行模式
对于200万首诗词这样的大规模任务,并行处理能显著提升效率:
// 多个 Agent 同时处理相同的输入
ReactAgent translatorAgent = ReactAgent.builder()
.name("translator_agent")
.model(chatModel)
.instruction("将以下内容翻译成英文:{input}")
.outputKey("translation")
.build();
ReactAgent summarizerAgent = ReactAgent.builder()
.name("summarizer_agent")
.model(chatModel)
.instruction("将以下内容提炼为摘要:{input}")
.outputKey("summary")
.build();
// 并行执行:两个 Agent 同时处理相同输入,结果分别存入不同 key
ParallelAgent parallelAgent = ParallelAgent.builder()
.name("parallel_pipeline")
.subAgents(translatorAgent, summarizerAgent)
.build();
第三章:【特别澄清】“Harness”的世纪大乌龙
这是当下最容易踩的坑,我们必须单独辟一章来讲。
3.1 HarnessAgent(AgentScope 的内核组件)
它不是一个独立的框架,而是 AgentScope Java 框架 底层的工程化底座。它的职责是提供“基础设施”——长期记忆(Memory)、工作区(Workspace)、会话持久化和安全沙箱。它解决的是“如何让智能体在生产环境稳定、安全地长期运行”的工程问题。
从代码层面看,HarnessAgent 的创建方式如下:
import io.agentscope.harness.agent.HarnessAgent;
import io.agentscope.harness.agent.memory.compaction.CompactionConfig;
import java.nio.file.Paths;
HarnessAgent agent = HarnessAgent.builder()
.name("note-taker")
.sysPrompt("你是一个帮助用户做笔记的助手。")
.model("dashscope:qwen-plus") // ModelRegistry 自动读取 DASHSCOPE_API_KEY
.workspace(Paths.get(".agentscope/workspace")) // 工作区目录
.compaction(CompactionConfig.builder() // 对话压缩配置
.triggerMessages(30) // 超过30条消息触发压缩
.keepMessages(10) // 压缩后保留最近10条
.build())
.build();
RuntimeContext ctx = RuntimeContext.builder()
.sessionId("demo-session") // 相同 sessionId 自动恢复历史
.userId("alice")
.build();
// 第一轮:自我介绍
agent.call(new UserMessage("我叫 Alice,今天在准备 ReAct 的技术分享。"), ctx).block();
// 第二轮:相同 sessionId — 第一轮的状态自动恢复
agent.call(new UserMessage("我叫什么名字?今天在做什么?"), ctx).block();
关键特性:工作区驱动的人格(AGENTS.md 文件驱动)、会话自动持久化(相同 sessionId 的第二轮记得第一轮)、对话压缩(超阈值后自动压缩 + 长期事实落到 MEMORY.md)。
3.2 DeepSeek Harness(代号 dsh)
这是 DeepSeek 公司于 2026年8月13日 新发布的独立 Agent 框架。它的核心理念是 Agent = Model + Harness,主打 “一切皆插件” 的开放式架构——模型适配器、工具注册表、会话日志、Agent Loop 本身都是 Cordis 插件,全部可从配置替换。
关键区别来了:
- HarnessAgent:有 Java 版,是阿里 AgentScope 的一部分,可通过 Maven 依赖直接引入。
- DeepSeek Harness:目前官方仅提供 Node.js 环境下的 NPX 运行方式,官方并没有推出 Java 版本。如果你想在 Java 项目里用 DeepSeek Harness,只能通过 HTTP 调用或封装 Shell 命令,无法直接作为 Jar 包引入。
第四章:终极选型建议(附决策代码骨架)
结合你那“200万首诗词、9种加工逻辑、上亿次调用”的背景,我的结论非常明确:
首选 AgentScope Java。
- 理由1:它是目前 Java 生态里唯一专为 大规模分布式 Agentic 场景 设计的企业级框架。
- 理由2:内置的 HarnessAgent 提供了强大的可观测性和沙箱隔离,确保你的海量批处理任务不会因为个别脏数据导致全线崩溃。
- 理由3:原生支持 A2A 协议,未来如果需要引入其他语言(如 Python)的算法模型做配合,通信无障碍。
备选方案:如果团队极度依赖 Spring Boot 生态,且愿意牺牲部分灵活性换取低代码可视化,Spring AI Alibaba 可以作为次选,但你需要做好将复杂逻辑拆解为严格工作流的心理准备。
决策代码骨架
// 如果你需要:大规模分布式、复杂推理、长期运行 → AgentScope Java
HarnessAgent productionAgent = HarnessAgent.builder()
.name("poetry-processor")
.model("dashscope:qwen-plus")
.workspace(Paths.get("/data/poetry-workspace"))
.compaction(CompactionConfig.builder()
.triggerMessages(50)
.keepMessages(15)
.build())
.build();
// 如果你需要:Spring Boot 深度集成、可视化编排 → Spring AI Alibaba
ReactAgent springAgent = ReactAgent.builder()
.name("poetry-spring-agent")
.model(chatModel)
.systemPrompt("你是诗词处理专家")
.saver(new MemorySaver())
.build();
// 如果你需要:DeepSeek Harness 的插件化架构 → 目前仅支持 Node.js
// Java 项目需通过 HTTP 调用 DeepSeek Harness 的服务接口



