使用Java快速搭一個可用的Agent的完整實例
摘要
很多人第一次接觸 Agent 框架,容易把它理解成“更復(fù)雜一點的模型 SDK”。但真正進(jìn)入業(yè)務(wù)場景后,你會發(fā)現(xiàn)問題根本不在“怎么調(diào)模型”,而在“怎么讓模型穩(wěn)定地參與業(yè)務(wù)流程”。這篇文章從 Java 開發(fā)者視角出發(fā),介紹 AgentScope 是什么、適合解決什么問題,以及如何用 AgentScope + DashScope 快速跑通一個最小可用 Agent,同時補(bǔ)充流式輸出的基本接法,適合作為 AgentScope 入門文章。

最近在做企業(yè)內(nèi)部 AI 助手時,我系統(tǒng)體驗了一下 AgentScope Java。如果只是簡單調(diào)一下模型,直接用 OpenAI SDK 或 DashScope SDK 就夠了;但如果你想做一個真正的 Agent,比如帶工具調(diào)用、記憶、流程編排、狀態(tài)管理,那就需要一個更像“運(yùn)行時”的框架。
這篇文章不講太虛的概念,重點回答 3 個問題:
AgentScope是什么- 它適合解決什么問題
- 如何用 Java 快速跑通一個最小可用 Agent
一、為什么需要 Agent 框架
很多 AI 應(yīng)用一開始的代碼都很簡單:
- 拼 prompt
- 調(diào) LLM
- 返回結(jié)果
做 demo 沒問題,但一旦進(jìn)入真實業(yè)務(wù),很快就會碰到這些問題:
- 需要調(diào)用工具,比如查數(shù)據(jù)庫、調(diào)內(nèi)部 API、發(fā)工單
- 需要多輪對話,而不是一次問答
- 需要保留上下文和記憶
- 需要讓模型輸出變成“動作”,而不是一段文本
- 需要可中斷、可恢復(fù)、可觀測
這時就不能只把 LLM 當(dāng)成一個“字符串輸入輸出函數(shù)”,而是要把它放進(jìn)一個 Agent runtime 里。
AgentScope 的價值就在這里:它不是單純封裝模型調(diào)用,而是把 Agent 常見的運(yùn)行機(jī)制一起抽象出來。
二、AgentScope 是什么
AgentScope Java 可以理解成:
一個面向 Java 生態(tài)的 Agent 運(yùn)行時框架
它主要解決的是這類問題:
- 如何統(tǒng)一消息結(jié)構(gòu)
- 如何接入不同模型
- 如何支持工具調(diào)用
- 如何維護(hù)記憶
- 如何進(jìn)行 ReAct 式推理循環(huán)
- 如何做多智能體協(xié)作和狀態(tài)恢復(fù)
如果只看最核心的組成,大概有 4 個:
Msg:統(tǒng)一消息對象Model:底層大模型Tool/Toolkit:工具能力Memory:上下文記憶
你可以把它理解成一套 Java 版的 Agent 基礎(chǔ)設(shè)施。
三、AgentScope 適合哪些場景
我覺得它特別適合以下場景:
- 企業(yè)內(nèi)部 AI 助手
- 帶工具調(diào)用的問答系統(tǒng)
- 有審批、查詢、執(zhí)行動作的智能體
- 多輪對話型業(yè)務(wù)系統(tǒng)
- 希望用 Java / Spring Boot 落地 Agent 的團(tuán)隊
如果只是做一個簡單聊天頁,其實沒必要上 AgentScope;但如果已經(jīng)進(jìn)入“讓模型參與業(yè)務(wù)執(zhí)行”的階段,它就很有價值。
四、最小 Demo:用 AgentScope + DashScope 跑一個 Agent
下面給一個最小例子,用 DashScope 接 qwen-plus。
1. Maven 依賴
<dependencies>
<dependency>
<groupId>io.agentscope</groupId>
<artifactId>agentscope</artifactId>
<version>1.0.9</version>
</dependency>
</dependencies>2. 創(chuàng)建模型
import io.agentscope.core.model.DashScopeChatModel;
public class ModelFactory {
public static DashScopeChatModel createQwenModel() {
String apiKey = System.getenv("DASHSCOPE_API_KEY");
if (apiKey == null || apiKey.isBlank()) {
throw new IllegalStateException("DASHSCOPE_API_KEY is required");
}
return DashScopeChatModel.builder()
.apiKey(apiKey)
.modelName("qwen-plus")
.build();
}
}
3. 創(chuàng)建一個 ReActAgent
import io.agentscope.core.ReActAgent;
import io.agentscope.core.message.Msg;
import io.agentscope.core.model.DashScopeChatModel;
public class SimpleAgentDemo {
public static void main(String[] args) {
DashScopeChatModel model = ModelFactory.createQwenModel();
ReActAgent agent = ReActAgent.builder()
.name("Nexus")
.sysPrompt("You are a helpful enterprise assistant.")
.model(model)
.build();
Msg response = agent.call(
Msg.builder()
.textContent("你好,請介紹一下 AgentScope 是什么")
.build()
).block();
if (response != null) {
System.out.println(response.getTextContent());
}
}
}
這個例子已經(jīng)能跑通最基礎(chǔ)的 Agent 調(diào)用。
五、如果想做流式輸出怎么辦
做聊天產(chǎn)品時,很多人都會想要“打字機(jī)效果”。
這里要區(qū)分兩種完全不同的實現(xiàn)。
1. 假流式
先一次性拿到完整回答,再按字符拆開吐給前端。
優(yōu)點:
- 簡單
- 前端效果也像流式
缺點:
- 本質(zhì)上不是 LLM 真流式
- 用戶得等完整結(jié)果出來后才開始顯示
2. 真流式
直接走模型的流式接口,邊生成邊輸出。
在 AgentScope 里,底層 Model 接口本身就有:
Flux<ChatResponse> stream(...)
這意味著你可以直接把 DashScope 的增量輸出轉(zhuǎn)成 SSE 推給前端。
比如:
import io.agentscope.core.message.Msg;
import io.agentscope.core.message.TextBlock;
import io.agentscope.core.model.DashScopeChatModel;
import io.agentscope.core.model.GenerateOptions;
import reactor.core.publisher.Flux;
import java.util.List;
public class StreamDemo {
public Flux<String> stream(String prompt) {
DashScopeChatModel model = ModelFactory.createQwenModel();
GenerateOptions options = GenerateOptions.builder()
.stream(Boolean.TRUE)
.build();
return model.stream(
List.of(Msg.builder().textContent(prompt).build()),
List.of(),
options)
.map(chatResponse -> chatResponse.getContent().stream()
.filter(TextBlock.class::isInstance)
.map(TextBlock.class::cast)
.map(TextBlock::getText)
.reduce("", String::concat))
.filter(text -> text != null && !text.isBlank());
}
}
這才是真正意義上的“邊生成邊顯示”。
六、在 Spring Boot 里怎么接
如果是 Web 項目,通常會拆成這幾層:
Controller:暴露 REST 或 SSE 接口Service:封裝 AgentScope 調(diào)用Configuration:聲明模型 BeanTool:定義業(yè)務(wù)工具
比如一個 SSE 接口:
@GetMapping(value = "/test", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
public Flux<String> test(@RequestParam String message) {
return qwenResponseComposer.composeTypewriter(message);
}
這樣前端就能實時接收模型輸出。
七、我對 AgentScope 的幾個判斷
1. 它不是“更方便調(diào)用模型的 SDK”
它更像一個 Agent runtime。
2. 它更適合往業(yè)務(wù)里走
如果你在做企業(yè)內(nèi)部助手、審批助手、查詢執(zhí)行一體化系統(tǒng),AgentScope 的抽象會比較順手。
3. Java 團(tuán)隊會比較舒服
很多 Agent 框架偏 Python 生態(tài),而 AgentScope Java 對 Spring Boot / Java 團(tuán)隊更友好。
4. 真正難的不是“跑起來”,而是“約束住”
做 Agent 項目,后期更關(guān)鍵的是:
- 權(quán)限邊界
- 工具治理
- 審計日志
- 錯誤處理
- 會話記憶
- 知識引用
框架能幫你起步,但真實項目最后拼的是工程化能力。
八、總結(jié)
如果只想做一個“能聊天”的 AI 頁面,AgentScope 可能有點重。
但如果你已經(jīng)開始考慮下面這些問題:
- 模型怎么接業(yè)務(wù)系統(tǒng)
- 工具怎么調(diào)
- 多輪對話怎么管
- 狀態(tài)怎么保存
- 流式怎么做
- 后續(xù)怎么往生產(chǎn)級演進(jìn)
那 AgentScope 值得試一試。
一句話總結(jié):
AgentScope 適合的不是“模型調(diào)用 demo”,而是“真正要進(jìn)入業(yè)務(wù)流程的 Agent 應(yīng)用”。
最后
如果你最近也在做下面這些事:
- 企業(yè)內(nèi)部 AI 助手
- 帶工具調(diào)用的問答系統(tǒng)
- 多輪對話型業(yè)務(wù)系統(tǒng)
- Spring Boot 落地 Agent 應(yīng)用
那 AgentScope 值得你認(rèn)真看一遍。
以上就是使用Java快速搭一個可用的Agent的完整實例的詳細(xì)內(nèi)容,更多關(guān)于Java搭一個可用的Agent的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Java的MyBatis框架中關(guān)鍵的XML字段映射的配置參數(shù)詳解
將XML文件的schema字段映射到數(shù)據(jù)庫的schema是我們操作數(shù)據(jù)庫的常用手段,這里我們就來整理一些Java的MyBatis框架中關(guān)鍵的XML字段映射的配置參數(shù)詳解,需要的朋友可以參考下2016-06-06
Mybatis-Plus的多數(shù)據(jù)源你了解嗎
這篇文章主要為大家詳細(xì)介紹了Mybatis-Plus的多數(shù)據(jù)源,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助2022-03-03
詳解在Spring-Boot中實現(xiàn)通用Auth認(rèn)證的幾種方式
這篇文章主要介紹了詳解在Spring-Boot中實現(xiàn)通用Auth認(rèn)證的幾種方式,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-07-07
Java判斷一個時間是否在當(dāng)前時間區(qū)間代碼示例
這篇文章主要給大家介紹了關(guān)于使用Java判斷一個時間是否在當(dāng)前時間區(qū)間的相關(guān)資料,在日常開發(fā)中我們經(jīng)常會涉及到時間的大小比較或者是判斷某個時間是否在某個時間段內(nèi),需要的朋友可以參考下2023-07-07
解決java Graphics drawImage 無法顯示圖片的問題
這篇文章主要介紹了解決java Graphics drawImage 無法顯示圖片的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-11-11
idea根據(jù)實體類生成數(shù)據(jù)庫表的流程步驟
在開發(fā)的時候,經(jīng)常會遇到數(shù)據(jù)庫表結(jié)構(gòu)設(shè)計無法滿足業(yè)務(wù)的需求,需要去改動數(shù)據(jù)庫表,我們就需要去設(shè)計數(shù)據(jù)庫的字段,然后又回來增加實體類里的字段,這樣很麻煩,所以本文給大家介紹了idea根據(jù)實體類生成數(shù)據(jù)庫表的流程步驟,需要的朋友可以參考下2024-12-12

