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
实例,并设置了多个参数:
this.dashScopeChatClient = ChatClient.builder(chatModel) .defaultAdvisors(new MessageChatMemoryAdvisor(new InMemoryChatMemory())) .defaultAdvisors(new SimpleLoggerAdvisor()) .defaultOptions(DashScopeChatOptions.builder().withTopP(0.7).build()) .build();
参数详解:
MessageChatMemoryAdvisor
:
- 作用: 实现聊天记忆功能,用于存储和检索对话历史。关键参数:
CHAT_MEMORY_CONVERSATION_ID_KEY
: 对话 ID,用于区分不同的会话。CHAT_MEMORY_RETRIEVE_SIZE_KEY
: 检索大小,控制每次检索的历史消息数量。SimpleLoggerAdvisor
:
- 作用: 日志记录功能,用于调试和监控聊天过程。应用场景: 开发阶段或生产环境中,记录每次请求的输入输出,便于排查问题。
DashScopeChatOptions
:
- 作用: 设置聊天模型的选项,如
topP
参数。关键参数:topP
: 控制生成文本的多样性,值越小生成结果越集中。2.2 接口功能分析
2.2.1 简单调用接口 /simple/chat
@GetMapping("/simple/chat")public String simpleChat() { return dashScopeChatClient.prompt(DEFAULT_PROMPT).call().content();}
- 功能: 返回默认提示语的响应内容。应用场景: 快速验证服务是否正常运行。
2.2.2 流式调用接口 /stream/chat
@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}
@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
的功能,我们编写了以下单元测试:
@SpringBootTestpublic 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(); }}
测试结果分析:
testSimpleChat
:
- 验证了默认提示语的响应是否正确。结果表明服务能够正常返回内容。
testStreamChat
:
- 验证了流式响应的功能。结果表明服务能够实时输出内容。
testAdvisorChat
:
- 验证了自定义 Advisor 的功能。结果表明服务能够根据对话 ID 和提示语生成正确的响应。
4. 总结与展望
通过对ChatClient的深入分析,我们可以通过合理配置参数和自定义 Advisor,可以根据具体需求实现各种聊天功能。
未来改进方向包括:
- 性能优化: 提高流式响应的吞吐量。安全性增强: 加密敏感信息,防止数据泄露。多语言支持: 扩展对更多语言的支持。