Spring AI应用系列——基于DashScope平台的Chat应用

1. 项目背景与架构

dashscope-chat-client 是一个基于 Spring AI 框架的聊天客户端示例项目,主要依赖于阿里巴巴云的 DashScope 聊天服务。项目的核心功能是通过 DashScopeChatClientController 提供 RESTful API 接口,支持简单的对话、流式响应以及自定义 Advisor 功能。

文件结构

  • pom.xml: Maven 构建文件,定义了项目的依赖和插件配置。
  • DashScopeChatClientApplication.java: Spring Boot 启动类,负责启动应用程序。
  • DashScopeChatClientController.java: 核心控制器类,实现聊天功能的接口。
  • application.yml: 配置文件,包含服务端口和 API 密钥。

2. 核心类分析:DashScopeChatClientController

2.1 类初始化与参数解析

DashScopeChatClientController 的构造函数中,通过 ChatClient.builder 初始化了一个 ChatClient 实例,并设置了多个参数:

java 复制代码
this.dashScopeChatClient = ChatClient.builder(chatModel)
    .defaultAdvisors(new MessageChatMemoryAdvisor(new InMemoryChatMemory()))
    .defaultAdvisors(new SimpleLoggerAdvisor())
    .defaultOptions(DashScopeChatOptions.builder().withTopP(0.7).build())
    .build();
参数详解:
  1. MessageChatMemoryAdvisor:

    • 作用: 实现聊天记忆功能,用于存储和检索对话历史。
    • 关键参数 :
      • CHAT_MEMORY_CONVERSATION_ID_KEY: 对话 ID,用于区分不同的会话。
      • CHAT_MEMORY_RETRIEVE_SIZE_KEY: 检索大小,控制每次检索的历史消息数量。
    • 应用场景: 在多轮对话中,通过记忆功能确保上下文连贯性。例如,用户可以问"我叫什么名字",系统能够根据历史记录回答。
  2. SimpleLoggerAdvisor:

    • 作用: 日志记录功能,用于调试和监控聊天过程。
    • 应用场景: 开发阶段或生产环境中,记录每次请求的输入输出,便于排查问题。
  3. DashScopeChatOptions:

    • 作用 : 设置聊天模型的选项,如 topP 参数。
    • 关键参数 :
      • topP: 控制生成文本的多样性,值越小生成结果越集中。
    • 应用场景: 调整生成文本的质量和多样性,适用于不同场景的需求。

2.2 接口功能分析

2.2.1 简单调用接口 /simple/chat
java 复制代码
@GetMapping("/simple/chat")
public String simpleChat() {
    return dashScopeChatClient.prompt(DEFAULT_PROMPT).call().content();
}
  • 功能: 返回默认提示语的响应内容。
  • 应用场景: 快速验证服务是否正常运行。
2.2.2 流式调用接口 /stream/chat
java 复制代码
@GetMapping("/stream/chat")
public Flux<String> streamChat(HttpServletResponse response) {
    response.setCharacterEncoding("UTF-8");
    return dashScopeChatClient.prompt(DEFAULT_PROMPT).stream().content();
}
  • 功能: 返回流式响应,支持实时输出。
  • 应用场景: 实时聊天场景,如语音助手或直播互动。
2.2.3 自定义 Advisor 接口 /advisor/chat/{id}/{prompt}
java 复制代码
@GetMapping("/advisor/chat/{id}/{prompt}")
public Flux<String> advisorChat(HttpServletResponse response, @PathVariable String id, @PathVariable String prompt) {
    response.setCharacterEncoding("UTF-8");
    return this.dashScopeChatClient.prompt(prompt)
            .advisors(a -> a.param(CHAT_MEMORY_CONVERSATION_ID_KEY, id).param(CHAT_MEMORY_RETRIEVE_SIZE_KEY, 100))
            .stream().content();
}
  • 功能: 支持自定义 Advisor,增强聊天功能。
  • 应用场景: 多轮对话、个性化推荐等复杂场景。

3. 单元测试分析

为了验证 DashScopeChatClientController 的功能,我们编写了以下单元测试:

java 复制代码
@SpringBootTest
public class DashScopeChatClientControllerTest {

    @Autowired
    private DashScopeChatClientController controller;

    @Test
    public void testSimpleChat() {
        String response = controller.simpleChat();
        assertNotNull(response);
        assertTrue(response.contains("你好"));
    }

    @Test
    public void testStreamChat() {
        Flux<String> response = controller.streamChat(null);
        StepVerifier.create(response)
                .expectNextMatches(s -> s.contains("你好"))
                .verifyComplete();
    }

    @Test
    public void testAdvisorChat() {
        Flux<String> response = controller.advisorChat("123", "你好,我叫牧生");
        StepVerifier.create(response)
                .expectNextMatches(s -> s.contains("牧生"))
                .verifyComplete();
    }
}
测试结果分析:
  1. testSimpleChat:

    • 验证了默认提示语的响应是否正确。
    • 结果表明服务能够正常返回内容。
  2. testStreamChat:

    • 验证了流式响应的功能。
    • 结果表明服务能够实时输出内容。
  3. testAdvisorChat:

    • 验证了自定义 Advisor 的功能。
    • 结果表明服务能够根据对话 ID 和提示语生成正确的响应。

4. 总结与展望

通过对ChatClient的深入分析,我们可以通过合理配置参数和自定义 Advisor,可以根据具体需求实现各种聊天功能。

未来改进方向包括:

  1. 性能优化: 提高流式响应的吞吐量。
  2. 安全性增强: 加密敏感信息,防止数据泄露。
  3. 多语言支持: 扩展对更多语言的支持。
相关推荐
Georgeviewer5 小时前
商业落地评测|实体门店GEO优化性价比与服务体系深度复盘
大数据·人工智能
GuWenyue5 小时前
分不清AI Workflow与Agent?3个实战案例彻底讲透,做AI应用不再踩选型坑
人工智能
彩讯股份3006346 小时前
彩讯股份与心洲科技签署战略合作协议,共建企业级模型后训练能力
人工智能·科技
迅易科技6 小时前
从场景验证到Agent上线:迅易 × WorkBuddy如何帮助企业建设AI能力?
人工智能·ai·腾讯云
PNP Robotics6 小时前
多伦多大学机器人峰会|物理AI与具身智能落地新趋势
人工智能·深度学习·机器学习·机器人
GIR1236 小时前
官方出品 | 多通道土壤呼吸测量系统市场现状与十五五规划深度报告:行业分析+趋势预测全收录
大数据·人工智能·机器学习
绿算技术6 小时前
绿算技术亮相第十八届HPC AI中国年会,擘画AI基础设施全栈协同新图景
人工智能
GetcharZp7 小时前
抛弃低效SSH!这套Ansible+Web可视化神器,让你天天准点下班!
后端
Litluecat7 小时前
2026年7月22日科技热点新闻
人工智能·科技·新闻·每日·速览
To_OC7 小时前
别再傻傻分不清:Workflow 和 Agent 到底不是一回事
人工智能·agent·workflow