AgentScope
1.安装和基础使用
<dependencies>
<dependency>
<groupId>io.agentscope</groupId>
<artifactId>agentscope</artifactId>
<version>1.0.6</version>
</dependency>
<!--引入spring-boot-starter-web,支持web开发-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>3.4.2</version>
</dependency>
</dependencies>
@GetMapping("/call")
public String call() {
// 创建智能体并内联配置模型
ReActAgent agent = ReActAgent.builder()
.name("Assistant")
.sysPrompt("你是一个有帮助的 AI 助手。")
.model(DashScopeChatModel.builder()
.apiKey("sk-0")
.modelName("qwen3-max")
.build())
.build();
Msg response = agent.call(Msg.builder()
.textContent("你好!")
.build()).block();
System.out.println(response.getTextContent());
return response.getTextContent();
}
2.概念
2.1 ReAct
Reasoning + Acting 循环
- Reasoning(推理):从 Memory 读取历史消息 → Formatter 转换格式 → Model 调用 LLM
- Acting(行动):Toolkit 执行工具 → 结果存入 Memory → 返回继续推理
public String call() {
// 准备工具
Toolkit toolkit = new Toolkit();
toolkit.registerTool(new SimpleTools());
// 创建智能体
ReActAgent jarvis = ReActAgent.builder()
.name("Jarvis")
.sysPrompt("你是一个名为 Jarvis 的助手")
.model(DashScopeChatModel.builder()
.apiKey("sk-0")
.modelName("qwen3-max")
.build())
.toolkit(toolkit)
.build();
// 发送消息
Msg msg = Msg.builder()
.textContent("你好!Jarvis,现在几点了?")
.build();
Msg response = jarvis.call(msg).block();
System.out.println(response.getTextContent());
return response.getTextContent();
}
- Tool
@Component
public class SimpleTools {
@Tool(name = "get_time", description = "获取当前时间")
public String getTime(
@ToolParam(name = "zone", description = "时区,例如:北京") String zone) {
System.out.println("1233");
return java.time.LocalDateTime.now()
.format(java.time.format.DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
}
}
3.简单应用
- MCP
public interface MCPService {
/**
* 查询用户信息
*/
String queryUserInfo(String userId);
/**
* 查询套餐信息
*/
String queryPackageInfo(String packageId);
/**
* 查询销售话术
*/
String querySalesScript(String scenarioType);
/**
* 查询客户偏好
*/
String queryCustomerPreference(String userId);
}
@Service
public class MockMCPService implements MCPService {
private Map<String, Object> userData;
private Map<String, Object> packageData;
private Map<String, Object> scriptData;
public MockMCPService() {
initializeMockData();
}
private void initializeMockData() {
// 模拟用户数据
userData = new HashMap<>();
Map<String, Object> user1 = new HashMap<>();
user1.put("userId", "U001");
user1.put("name", "张三");
user1.put("age", 30);
user1.put("location", "北京");
user1.put("interests", new String[]{"流量", "通话", "国际漫游"});
user1.put("currentPackage", "基础套餐");
userData.put("U001", user1);
Map<String, Object> user2 = new HashMap<>();
user2.put("userId", "U002");
user2.put("name", "李四");
user2.put("age", 25);
user2.put("location", "上海");
user2.put("interests", new String[]{"视频", "音乐", "游戏"});
user2.put("currentPackage", "标准套餐");
userData.put("U002", user2);
// 模拟套餐数据
packageData = new HashMap<>();
Map<String, Object> package1 = new HashMap<>();
package1.put("packageId", "PKG001");
package1.put("name", "流量王套餐");
package1.put("price", 59.9);
package1.put("data", "100GB");
package1.put("talkTime", "500分钟");
package1.put("features", new String[]{"全国通用流量", "免费WiFi", "会员权益"});
packageData.put("PKG001", package1);
Map<String, Object> package2 = new HashMap<>();
package2.put("packageId", "PKG002");
package2.put("name", "畅聊套餐");
package2.put("price", 89.9);
package2.put("data", "200GB");
package2.put("talkTime", "1000分钟");
package2.put("features", new String[]{"无限流量", "无限通话", "国际漫游"});
packageData.put("PKG002", package2);
Map<String, Object> package3 = new HashMap<>();
package3.put("packageId", "PKG003");
package3.put("name", "学生套餐");
package3.put("price", 29.9);
package3.put("data", "50GB");
package3.put("talkTime", "300分钟");
package3.put("features", new String[]{"校园网", "学习应用免流", "优惠活动"});
packageData.put("PKG003", package3);
// 模拟话术数据
scriptData = new HashMap<>();
Map<String, Object> script1 = new HashMap<>();
script1.put("scenarioType", "新客户");
script1.put("script", "您好,我是您的专属客服经理。根据您的需求,我们为您推荐了最适合的套餐方案...");
scriptData.put("新客户", script1);
Map<String, Object> script2 = new HashMap<>();
script2.put("scenarioType", "升级");
script2.put("script", "您目前使用的套餐已接近上限,我们为您准备了更优惠的升级方案...");
scriptData.put("升级", script2);
Map<String, Object> script3 = new HashMap<>();
script3.put("scenarioType", "挽留");
script3.put("script", "我们注意到您可能考虑更换套餐,为此我们特别为您提供专属优惠...");
scriptData.put("挽留", script3);
}
@Override
public String queryUserInfo(String userId) {
Object user = userData.get(userId);
return user != null ? JSON.toJSONString(user) : "{}";
}
@Override
public String queryPackageInfo(String packageId) {
Object pkg = packageData.get(packageId);
return pkg != null ? JSON.toJSONString(pkg) : "{}";
}
@Override
public String querySalesScript(String scenarioType) {
Object script = scriptData.get(scenarioType);
return script != null ? JSON.toJSONString(script) : "{}";
}
@Override
public String queryCustomerPreference(String userId) {
Object user = userData.get(userId);
if (user instanceof Map) {
Map<String, Object> userMap = (Map<String, Object>) user;
Map<String, Object> preference = new HashMap<>();
preference.put("userId", userId);
preference.put("currentPackage", userMap.get("currentPackage"));
preference.put("interests", userMap.get("interests"));
return JSON.toJSONString(preference);
}
return "{}";
}
}
- Tool
public class MCPTools {
private final MCPService mcpService;
public MCPTools(MCPService mcpService) {
this.mcpService = mcpService;
}
/**
* 查询用户信息
*/
@Tool(
name = "query_user_info",
description = "查询指定用户的基本信息和当前套餐情况"
)
public String queryUserInfo(
@ToolParam(name = "userId", description = "用户ID") String userId
) {
return mcpService.queryUserInfo(userId);
}
/**
* 查询套餐信息
*/
@Tool(
name = "query_package_info",
description = "查询指定套餐的详细信息"
)
public String queryPackageInfo(
@ToolParam(name = "packageId", description = "套餐ID") String packageId
) {
return mcpService.queryPackageInfo(packageId);
}
/**
* 查询销售话术
*/
@Tool(
name = "query_sales_script",
description = "根据场景类型查询适用的销售话术"
)
public String querySalesScript(
@ToolParam(name = "scenarioType", description = "场景类型,如:新客户、升级、挽留等") String scenarioType
) {
return mcpService.querySalesScript(scenarioType);
}
/**
* 查询客户偏好
*/
@Tool(
name = "query_customer_preference",
description = "查询客户的套餐偏好和兴趣点"
)
public String queryCustomerPreference(
@ToolParam(name = "userId", description = "用户ID") String userId
) {
return mcpService.queryCustomerPreference(userId);
}
}
- Agent
public class PackageRecommendationAgent extends AgentBase {
private final ReActAgent reactAgent;
private final MCPService mcpService;
public PackageRecommendationAgent(MCPService mcpService) {
super("PackageRecommendationAgent");
this.mcpService = mcpService;
// 创建工具包
Toolkit toolkit = new Toolkit();
toolkit.registerTool(new MCPTools(mcpService));
// 创建 ReAct Agent
this.reactAgent = ReActAgent.builder()
.name("PackageRecommendationReActAgent")
.sysPrompt(
"你是套餐推荐专家,职责是:\n" +
"1. 分析客户的基本信息、当前套餐和偏好\n" +
"2. 根据客户需求匹配最适合的套餐\n" +
"3. 提供详细的推荐理由和优势分析\n" +
"4. 考虑价格敏感性、使用习惯等因素\n\n" +
"请使用MCP工具查询必要的客户和套餐数据。"
)
.model(DashScopeChatModel.builder()
.apiKey("sk-0")
.modelName("qwen3-max")
.build())
.toolkit(toolkit)
.build();
}
/**
* 专门的方法用于套餐推荐
*/
public Msg recommendPackage(String userId) {
String prompt = String.format(
"请为用户ID为 %s 的客户推荐最适合的套餐。" +
"请使用query_user_info和query_customer_preference工具获取客户信息," +
"使用query_package_info工具获取套餐信息,然后进行分析和推荐。",
userId
);
Msg msg = Msg.builder().textContent(prompt).build();
return reactAgent.call(msg).block();
}
@Override
protected Mono<Msg> doCall(List<Msg> msgs) {
// 直接调用 ReAct Agent 处理套餐推荐任务
Msg result = reactAgent.call(msgs).block();
return Mono.just(result);
}
@Override
protected Mono<Msg> handleInterrupt(InterruptContext context, Msg... originalArgs) {
return null;
}
}
public class SalesScriptAgent extends AgentBase {
private final ReActAgent reactAgent;
private final MCPService mcpService;
public SalesScriptAgent(MCPService mcpService) {
super("SalesScriptAgent");
this.mcpService = mcpService;
// 创建工具包
Toolkit toolkit = new Toolkit();
toolkit.registerTool(new MCPTools(mcpService));
// 创建 ReAct Agent
this.reactAgent = ReActAgent.builder()
.name("SalesScriptReActAgent")
.sysPrompt(
"你是销售话术专家,职责是:\n" +
"1. 根据客户特征和推荐套餐,制定个性化销售话术\n" +
"2. 考虑客户类型(新客户、升级、挽留等)调整话术策略\n" +
"3. 强调推荐套餐的优势和客户关注点\n" +
"4. 保持话术专业、有说服力且符合品牌风格\n\n" +
"请使用MCP工具查询必要的客户和话术模板数据。"
)
.model(DashScopeChatModel.builder()
.apiKey("sk-02763c31521141a2ac5431b708ff4ebd")
.modelName("qwen3-max")
.build())
.toolkit(toolkit)
.build();
}
/**
* 专门的方法用于生成销售话术
*/
public Msg generateSalesScript(String userId, String recommendedPackage, String scenarioType) {
String prompt = String.format(
"请为用户ID为 %s 的客户生成销售话术。" +
"客户当前情况:%s,推荐套餐:%s,销售场景:%s。" +
"请使用query_sales_script工具获取相应场景的话术模板,然后生成定制化销售话术。",
userId, mcpService.queryUserInfo(userId), recommendedPackage, scenarioType
);
Msg msg = Msg.builder().textContent(prompt).build();
return reactAgent.call(msg).block();
}
@Override
protected Mono<Msg> doCall(List<Msg> msgs) {
// 直接调用 ReAct Agent 处理话术推荐任务
Msg result = reactAgent.call(msgs).block();
return Mono.just(result);
}
@Override
protected Mono<Msg> handleInterrupt(InterruptContext context, Msg... originalArgs) {
return null;
}
}
public class SalesTaskAgent extends AgentBase {
private final ReActAgent packageRecommendationAgent;
private final ReActAgent salesScriptAgent;
private final MCPService mcpService;
public SalesTaskAgent(MCPService mcpService) {
super("SalesTaskAgent");
this.mcpService = mcpService;
// 创建工具包
Toolkit toolkit = new Toolkit();
toolkit.registerTool(new MCPTools(mcpService));
// 创建套餐推荐 Agent
this.packageRecommendationAgent = ReActAgent.builder()
.name("PackageRecommendationAgent")
.sysPrompt("你是套餐推荐专家,负责分析客户需求并推荐最合适的套餐方案。你需要根据MCP系统查询到的客户信息和偏好,结合可用套餐信息,为客户推荐最适合的套餐。")
.model(DashScopeChatModel.builder()
.apiKey("sk-0")
.modelName("qwen3-max")
.build())
.toolkit(toolkit)
.build();
// 创建话术推荐 Agent
this.salesScriptAgent = ReActAgent.builder()
.name("SalesScriptAgent")
.sysPrompt("你是销售话术专家,负责根据客户情况和推荐的套餐,生成最适合的销售话术。你需要根据客户类型、推荐套餐特点和销售场景,设计出具有说服力的话术。")
.model(DashScopeChatModel.builder()
.apiKey("sk-0")
.modelName("qwen3-max")
.build())
.toolkit(toolkit)
.build();
}
/**
* 执行销售任务
*/
public Msg executeSalesTask(String userId, String scenarioType) {
// 步骤1: 获取客户信息
String userInfo = mcpService.queryUserInfo(userId);
String customerPreference = mcpService.queryCustomerPreference(userId);
// 步骤2: 套餐推荐
String packageRecommendationPrompt = String.format(
"客户信息: %s\n客户偏好: %s\n请为客户推荐最适合的套餐,并说明推荐理由。",
userInfo, customerPreference
);
Msg packageRecommendationMsg = Msg.builder()
.textContent(packageRecommendationPrompt)
.build();
Msg packageResult = packageRecommendationAgent.call(packageRecommendationMsg).block();
// 步骤3: 话术推荐
String salesScriptPrompt = String.format(
"客户信息: %s\n推荐套餐: %s\n销售场景: %s\n请为该客户和推荐套餐生成合适的销售话术。",
userInfo, packageResult.getTextContent(), scenarioType
);
Msg salesScriptMsg = Msg.builder()
.textContent(salesScriptPrompt)
.build();
Msg scriptResult = salesScriptAgent.call(salesScriptMsg).block();
// 步骤4: 组合结果
String finalResult = String.format(
"=== 销售任务执行结果 ===\n\n" +
"客户ID: %s\n" +
"销售场景: %s\n\n" +
"推荐套餐:\n%s\n\n" +
"销售话术:\n%s\n",
userId, scenarioType, packageResult.getTextContent(), scriptResult.getTextContent()
);
return Msg.builder().textContent(finalResult).build();
}
@Override
protected Mono<Msg> doCall(List<Msg> msgs) {
// 解析输入消息,提取用户ID和场景类型
Msg message = msgs.get(0);
String content = message.getTextContent();
// 这里简化处理,实际中需要解析JSON或其他格式的消息
String[] parts = content.split(",");
if (parts.length >= 2) {
String userId = parts[0].trim();
String scenarioType = parts[1].trim();
Msg result = executeSalesTask(userId, scenarioType);
return Mono.just(result);
} else {
return Mono.just(Msg.builder().textContent("错误:请输入正确的参数格式,例如:用户ID,场景类型").build());
}
}
@Override
protected Mono<Msg> handleInterrupt(InterruptContext context, Msg... originalArgs) {
return null;
}
}
- 入口
@RestController
@RequestMapping("/sales")
public class SalesTaskController {
private final MCPService mcpService = new MockMCPService();
private final SalesTaskAgent salesTaskAgent = new SalesTaskAgent(mcpService);
@PostMapping("/execute-task")
public String executeSalesTask(@RequestBody SalesTaskRequest request) {
// 构建输入消息
String inputMessage = request.getUserId() + "," + request.getScenarioType();
Msg inputMsg = Msg.builder().textContent(inputMessage).build();
// 执行销售任务
Msg result = salesTaskAgent.call(inputMsg).block();
return result.getTextContent();
}
@GetMapping("/recommend-package")
public String recommendPackage(@RequestParam String userId) {
PackageRecommendationAgent packageAgent = new PackageRecommendationAgent(mcpService);
Msg result = packageAgent.recommendPackage(userId);
return result.getTextContent();
}
@GetMapping("/generate-script")
public String generateScript(@RequestParam String userId, @RequestParam String recommendedPackage, @RequestParam String scenarioType) {
SalesScriptAgent scriptAgent = new SalesScriptAgent(mcpService);
Msg result = scriptAgent.generateSalesScript(userId, recommendedPackage, scenarioType);
return result.getTextContent();
}
}

浙公网安备 33010602011771号