作者:遠雲
隨着 LLM 應用的飛速發展,越來越多的 Agent 應用開始走近每個人。圍繞着 Agent 應用的核心,目前業界有零代碼、低代碼和高代碼三條主流的技術路線。AgentScope 作為 Python 社區中受到廣泛應用的高代碼框架,在 Java 生態下的需求也越來越大。
今天,我們很高興地宣佈 AgentScope Java v0.2 版本正式發佈了,具備了所有核心的 ReActAgent 的能力。
第一性原則:透明度
AgentScope 的首要設計目標是對開發者透明。
當下,許多 Agent 框架將底層的調度進行了深度的封裝,這固然會給用户帶來一些概念上的簡化,但是也帶來了遇到問題時排查的複雜度。AgentScope 不同:
- Prompt Engineering: 用户可以自己修改所有提示詞相關的內容。
- API 調用: 每一次 API 調用都能夠被定位。
- Agent 構建: 所有 Agent 的配置都來自用户確定性的配置。
- 決策過程: Agent 的推理、執行過程都可以通過 Hook 對外暴露。
三分鐘構建一個智能體
以下是一個簡單的智能體示例:
Maven 依賴
<dependency>
<groupId>io.agentscope</groupId>
<artifactId>agentscope-core</artifactId>
<version>0.2.1</version>
</dependency>
ReActAgent
public class HelloAgentScope {
public static void main(String[] args) {
// 創建 ReActAgent
ReActAgent agent = ReActAgent.builder()
.name("Assistant")
.model(DashScopeChatModel.builder()
.apiKey(System.getenv("DASHSCOPE_API_KEY"))
.modelName("qwen3-max")
.build())
.build();
// 調用智能體
Msg response = agent.call(
Msg.builder()
.role(MsgRole.USER)
.content(TextBlock.builder()
.text("你好,請介紹一下自己")
.build())
.build()
).block();
System.out.println(response.getTextContent());
}
}
至此,一個 Agent 就構建完成了。在這個示例中,ReActAgent 是 AgentScope 的核心,我們後面幾乎所有的功能都是基於它的。
架構概覽
和 Python 版本類似,AgentScope Java 採用分層架構:
基礎組件層(Foundational Components)
Message:統一的消息抽象對象,通過一套數據結構支持文本、圖像、音頻、視頻。
Model API:支持 DashScope、OpenAI 等主流模型提供商。通過 Formatter 機制屏蔽不同模型提供商的格式差異。
Tool:允許用户定義工具給 LLM 使用,支持同步/異步、流式/非流式等 API 風格。
智能體基礎設施層(Agent-level Infrastructure)
ReAct 範式:核心 Agentic 實現,通過推理(Reasoning)再行動(Acting)的迭代循環。
Agent Hooks:運行於 ReActAgent 內部,允許用户對 Agent 執行的過程進行監測、修改。
狀態管理:會話持久化組件,支持用户對話狀態的保存和恢復。
多智能體協作層(Multi-Agent Cooperation)
MsgHub:支持多個 Agent 之間共享消息,實現多 Agent 溝通協作的工具。
Pipeline:組合多個 Agent 按照特定(順序、並行等)策略執行的工具。
部署層(Deployment)
AgentScope Runtime:解決分佈式部署與安全隔離問題的企業級運行時基礎設施,提供工具運行沙箱、A2A 協議、遠程部署等能力。
AgentScope Studio:提供開發階段到運行階段的可視化調試、觀測能力,為開發者從 0 到 1 的開發提速。
Reasoning and Acting
ReAct(Reasoning and Acting)是 AgentScope 最核心的實現範式。其設計思路很簡單:將思考和執行分離,通過迭代循環解決問題。
工作原理
Reasoning(推理)階段:Agent 會基於當前的上下文分析,決定下一步行動:
- 理解用户意圖
- 評估已有信息(上下文)
- 確定需要調用的工具及參數
Acting(行動)階段:執行 Reasoning 階段所需的獲取數據行為。
- 並行執行工具調用
- 收集執行結果
- 將結果計入記憶
迭代控制:ReActAgent 會不斷執行 Reasoning 和 Acting 的迭代,如果模型在最大迭代輪內完成迭代則會正常結束,如果未完成則會觸發 summary 的能力,進行會話總結。
為 ReActAgent 添加工具
為了讓 ReActAgent 真正可以實現 Acting,需要為 ReActAgent 添加對應的工具。
這裏以一個 Weather Assistant 為例子:
// 定義工具類
public class WeatherTools {
@Tool(description = "獲取指定城市的天氣信息")
public String getWeather(
@ToolParam(name = "city", description = "城市名稱") String city) {
// 實際應用中調用天氣 API
return String.format("%s:晴天,氣温 25 ℃", city);
}
}
// 註冊工具
Toolkit toolkit = new Toolkit();
toolkit.registerTool(new WeatherTools());
// 構建帶工具的 ReActAgent
ReActAgent agent = ReActAgent.builder()
.name("WeatherAssistant")
.sysPrompt("你是一個天氣助手,可以查詢城市天氣信息。")
.model(DashScopeChatModel.builder()
.apiKey(System.getenv("DASHSCOPE_API_KEY"))
.modelName("qwen3-max")
.build())
.toolkit(toolkit)
.build();
// 調用智能體
Msg response = agent.call(
Msg.builder()
.role(MsgRole.USER)
.content(TextBlock.builder()
.text("北京今天天氣如何?")
.build())
.build()
).block();
執行流程:
用户問題:北京今天天氣如何?
↓
[推理] 需要查天氣,決定調用 getWeather("北京")
↓
[行動] 執行工具 → "北京:晴天,氣温 25℃"
↓
[推理] 已獲取信息,生成回答
↓
回答:根據查詢結果,北京今天晴天,氣温 25℃
ReActAgent 核心特性
除了基礎的 Reasoning 和 Acting 能力,AgentScope 的 ReActAgent 還具備多個特性。
1. 多模態消息支持
ReActAgent 可以處理多模態輸入,不限於純文本:
// 創建支持視覺的 ReActAgent(使用視覺模型)
ReActAgent visionAgent = ReActAgent.builder()
.name("VisionAssistant")
.model(DashScopeChatModel.builder()
.apiKey(System.getenv("DASHSCOPE_API_KEY"))
.modelName("qwen3-vl-plus") // 視覺模型
.build())
.build();
// 發送包含圖片的消息
Msg response = visionAgent.call(
Msg.builder()
.role(MsgRole.USER)
.content(List.of(
TextBlock.builder().text("請分析這張圖片的內容").build(),
ImageBlock.builder().source(URLSource.builder().url("https://example.com/image.jpg").build()).build()
))
.build()
).block();
支持的多模態內容類型:TextBlock、ImageBlock、AudioBlock、VideoBlock。
2. 鈎子機制
為 ReActAgent 添加鈎子,監控和擴展其行為。這裏以前文中用到的 WeatherAssistant 為例子添加鈎子,實時看到智能體的思考和執行過程:
// 定義調試鈎子,顯示完整的 ReAct 執行過程
Hook debugHook = new Hook() {
@Override
public <T extends HookEvent> Mono<T> onEvent(T event) {
try {
switch (event) {
case PreReasoningEvent e -> {
System.out.println("\n[推理] 智能體開始思考...");
}
case PostReasoningEvent e -> {
System.out.println("[推理] 推理結果:" + new ObjectMapper().writeValueAsString(e.getReasoningMessage()));
}
case PostActingEvent e -> {
System.out.println("[行動] 執行工具 → " + new ObjectMapper().writeValueAsString(e.getToolResult()));
}
case PostCallEvent e -> {
System.out.println("[推理] 已獲取信息,生成回答");
System.out.println("回答:" + e.getFinalMessage().getTextContent());
}
default -> {}
} ;
} catch (JsonProcessingException e) {
...
}
return Mono.just(event);
}
};
// 將鈎子添加到 WeatherAssistant
ReActAgent weatherAgent = ReActAgent.builder()
.name("WeatherAssistant")
.sysPrompt("你是一個天氣助手,可以查詢城市天氣信息。")
.model(DashScopeChatModel.builder()
.apiKey(System.getenv("DASHSCOPE_API_KEY"))
.modelName("qwen3-max")
.build())
.toolkit(toolkit) // 前文中定義的 Toolkit
.hook(debugHook) // 添加調試鈎子
.build();
// 查詢天氣
Msg response = weatherAgent.call(
Msg.builder()
.role(MsgRole.USER)
.content(TextBlock.builder()
.text("北京今天天氣如何?")
.build())
.build()
).block();
// 輸出示例:
// [推理] 智能體開始思考...
// [推理] 推理結果:{"id":"xxx","name":"WeatherAssistant","role":"ASSISTANT","content":[{"type":"tool_use","id":"call_xxx","name":"getWeather","input":{"city":"北京"},"content":null}],"metadata":null,"timestamp":"xxx"}
// [行動] 執行工具 → {"type":"tool_result","id":"call_xxx","name":"getWeather","output":[{"type":"text","text":"\"北京:晴天,氣温 25 ℃\""}],"metadata":{}}
// [推理] 智能體開始思考...
// [推理] 推理結果:{"id":"xxx","name":"WeatherAssistant","role":"ASSISTANT","content":[{"type":"text","text":"北京今天天氣晴朗,氣温為25℃。建議外出時注意防曬,祝您擁有愉快的一天!"}],"metadata":null,"timestamp":"xxx"}
// [推理] 已獲取信息,生成回答
// 回答:北京今天天氣晴朗,氣温為25℃。建議外出時注意防曬,祝您擁有愉快的一天!
3. 會話持久化
保存和恢復 ReActAgent 的狀態:
// 創建 ReActAgent
ReActAgent agent = ReActAgent.builder()
.name("PersistentAgent")
.model(DashScopeChatModel.builder()
.apiKey(System.getenv("DASHSCOPE_API_KEY"))
.modelName("qwen3-max")
.build())
.memory(new InMemoryMemory())
.build();
// 保存會話
SessionManager.forSessionId("session-001")
.withJsonSession(Path.of("./sessions"))
.addComponent(agent)
.saveSession();
// 下次啓動時恢復
SessionManager.forSessionId("session-001")
.withJsonSession(Path.of("./sessions"))
.addComponent(agent)
.loadIfExists();
// agent 現在恢復到了之前的狀態,可以繼續對話
4. 結構化輸出
讓 ReActAgent 返回類型安全的結構化數據:
// 定義輸出結構
public class WeatherReport {
public String city;
public int temperature;
public String condition;
public List<String> suggestions;
}
// ReActAgent 調用時指定輸出類型
Msg response = agent.call(
Msg.builder()
.role(MsgRole.USER)
.content(TextBlock.builder()
.text("分析北京的天氣並給出建議")
.build())
.build(),
WeatherReport.class // 指定結構化輸出類型
).block();
// 提取結構化數據
WeatherReport report = response.getStructuredData(WeatherReport.class);
System.out.println("城市: " + report.city);
System.out.println("温度: " + report.temperature);
避免了文本解析的不確定性,編譯期就能發現類型錯誤。
5. 多智能體協作
多個 ReActAgent 可以通過 Pipeline 協作:
// 創建模型配置
DashScopeChatModel model = DashScopeChatModel.builder()
.apiKey(System.getenv("DASHSCOPE_API_KEY"))
.modelName("qwen3-max")
.build();
// 創建多個 ReActAgent
ReActAgent dataCollector = ReActAgent.builder()
.name("DataCollector")
.model(model)
.build();
ReActAgent dataAnalyzer = ReActAgent.builder()
.name("DataAnalyzer")
.model(model)
.build();
ReActAgent reportGenerator = ReActAgent.builder()
.name("ReportGenerator")
.model(model)
.build();
// 順序執行:智能體依次處理
Msg result = Pipelines.sequential(
List.of(dataCollector, dataAnalyzer, reportGenerator),
inputMsg
).block();
// 並行執行:多個智能體同時處理
List<Msg> results = Pipelines.fanout(
List.of(dataCollector, dataAnalyzer, reportGenerator),
inputMsg
).block();
Roadmap
AgentScope Java 自 2025 年 9 月開源以來,當前 v0.2 版本已具備 ReActAgent 核心能力。
我們計劃於 11 月底發佈 v1.0 版本,屆時將新增 RAG、Plan、Tracing、Evaluation 及 Studio 等全套功能,標誌着框架正式生產可用;Runtime v1.0 也將同步上線,提供涵蓋安全沙箱、A2A Agent 在內的企業級落地方案。隨後在 12 月,我們將進一步推出基於 ReMe 的上下文管理與基於 Trinity-RFT 的強化學習最佳實踐。
在技術演進層面,我們正持續探索更高效、智能的上下文工程與多 Agent 協同範式,致力於支撐更強大的 AI 應用構建。此外,針對 Agent 流量呈現的“二八定律”特徵(頭部 20% 的 Agent 承載了 80% 的流量),我們在架構上全力推進 Serverless 化,通過實現毫秒級冷啓動與混合部署,幫助開發者在應對高併發的同時,顯著降低部署成本並提升效率。
未完待續
本文作為 AgentScope Java 系列推文的首篇,受篇幅限制只能拋磚引玉,在接下來還會有更多的乾貨:
- AgentScope Runtime:幫助開發者實現 Agent 應用從 1 到 100,提供工具運行沙箱、A2A 協議、遠程部署等強大能力。
- Agent 開發範式討論:Workflow or Agentic?AgentScope 基於狼人殺遊戲的 Agent 實踐分享。
- Meta Tool:面對日益膨脹的 Tool Definition,AgentScope 的解決方案。
- Plan:使 Agent 能夠自主拆解複雜任務並系統性地執行。
如果你覺得 AgentScope Java 不錯,歡迎給我們的項目 Star~
https://github.com/agentscope-ai/agentscope-java