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();
    }
}
posted @ 2026-01-11 19:30  lwx_R  阅读(2)  评论(0)    收藏  举报