第5章:AI智能医生实战
摘要:本文介绍了SpringAIAlibaba的快速入门指南,包括其特性对比、API-KEY获取、Maven依赖配置和YML文件设置。重点展示了如何开发AI智能医生助手项目,涉及Redis持久化存储、多用户会话隔离、流式响应等功能实现。详细讲解了MessageWindowChatMemory组件的作用及配置方法,并提供了完整的控制器代码示例,包括系统提示词模板设计和请求处理方法。项目采用Java2
SpringAi Alibaba快速开始
首先我们需要引入springAI Alibaba。
官方文档:https://java2ai.com/docs/dev/overview/

|
特性 |
Spring AI Alibaba |
LangChain (Python) |
Hugging Face (Python) |
|
语言生态 |
Java 原生,无缝对接 Spring |
Python 为主,需桥接 Java |
Python 为主,轻量级 |
|
企业级治理 |
内置 Nacos、Sentinel |
需额外集成 |
无 |
|
多模态支持 |
通义万相、语音交互 |
需插件扩展 |
部分模型支持 |
|
动态配置 |
Nacos 热更新 |
需重启应用 |
无 |
然后我们需要去获取API-KEY:https://bailian.console.aliyun.com/?tab=model#/api-key
引入maven依赖
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.guslegend</groupId>
<artifactId>SpringAI-project</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.5.3</version>
<relativePath/>
</parent>
<properties>
<maven.compiler.source>21</maven.compiler.source>
<maven.compiler.target>21</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<java.version>21</java.version>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.alibaba.cloud.ai</groupId>
<artifactId>spring-ai-alibaba-bom</artifactId>
<version>1.0.0.2</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.alibaba.cloud.ai</groupId>
<artifactId>spring-ai-alibaba-starter-dashscope</artifactId>
</dependency>
</dependencies>
</project>
配置yml文件
spring:
application:
name: spring-ai-project
ai:
dashscope:
api-key: sk-6ef5a7da223c485bb08a9660dda504a6
logging:
level:
org.springframework.ai.chat.client.advisor: debug
编写controller
@RestController
@RequestMapping("/ai")
public class ChatController {
private static final String DEFAULT_PROMPT="你是guslegend团队的智能助手,请根据用户问题回答";
private final ChatClient dashScopeChatClient;
public ChatController(ChatClient.Builder chatClientBuilder){
this.dashScopeChatClient = chatClientBuilder
// 设置系统角色
.defaultSystem(DEFAULT_PROMPT)
// 设置默认提示语,打印输出
.defaultAdvisors(new SimpleLoggerAdvisor())
// 设置默认参数
.defaultOptions(
DashScopeChatOptions.builder()
.withTopP(0.7)
.build()
).build();
}
/**
* ChatClient 简单调用
*/
@GetMapping("/chat/simple")
public String chatSimple(@RequestParam(value = "query",defaultValue = "你好,可以简单介绍一下你吗?") String query){
return dashScopeChatClient.prompt(query).call().content();
}
/**
* ChatClient 流式调用
*/
@GetMapping("/chat/stream")
public Flux< String> chatStream(@RequestParam(value = "query",defaultValue = "你好,可以简单介绍一下你吗?") String query, HttpServletResponse response){
response.setCharacterEncoding("UTF-8");
return dashScopeChatClient.prompt(query).stream().content();
}
}
AI智能医生助手项目背景和基础准备
需求背景:开发一个智能医生,可以回答病人的问题。需要持久优化存储,避免重启后历史消息丢失。支持多用户进行使用,且可以查询历史对话消息,需要支持流失响应。
主要知识点:
- 依赖注入: 通过构造函数注入
ChatClient.Builder 和 RedisChatMemoryRepository。 - 记忆管理: 使用
MessageWindowChatMemory实现滑动窗口式记忆管理。 - 会话隔离: 通过
conversationId实现多用户会话隔离。 - 参数传递: 使用
CONVERSATION_ID参数关联特定会话。 - 系统提示: 通过
defaultSystem()方法设置 AI 行为规范。
添加Redis依赖
<dependency>
<groupId>com.alibaba.cloud.ai</groupId>
<artifactId>spring-ai-alibaba-starter-memory-redis</artifactId>
</dependency>
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>5.2.0</version>
</dependency>
spring:
ai:
memory:
redis:
host: 127.0.0.1
port: 6379
password: 123456
timeout: 5000
docker容器化部署redis
@Configuration
public class MemoryConfig {
@Value("${spring.ai.memory.redis.host}")
private String redisHost;
@Value("${spring.ai.memory.redis.port}")
private int redisPort;
@Value("${spring.ai.memory.redis.password}")
private String redisPassword;
@Value("${spring.ai.memory.redis.timeout}")
private int redisTimeout;
@Bean
public RedisChatMemoryRepository redisChatMemoryRepository() {
return RedisChatMemoryRepository.builder()
.host(redisHost)
.port(redisPort)
// 若没有设置密码则注释该项
.password(redisPassword)
.timeout(redisTimeout)
.build();
}
}
提示词
- 明确助手角色定位(医学健康咨询),定义回复结构和内容要求
- 强调免责声明和就医建议,规范语言风格和专业术语使用
// 系统提示词模板
private static final String SYSTEM_PROMPT = """
你是一位基于医学知识的AI健康咨询助手,你的职责是:
1. 礼貌询问用户的健康问题(症状、持续时间、年龄、基础疾病等关键信息)
2. 基于用户描述提供可能的健康建议(非诊断结果)
3. 明确提示"本建议仅供参考,不替代专业医师诊断"
4. 对紧急症状(如胸痛、严重出血等)优先建议立即就医
回复要求:
- 语言通俗易懂,避免专业术语堆砌
- 结构清晰:先回应问题,再给出建议,最后提示就医
- 不承诺治愈效果,不提供具体用药剂量建议
- 对超出常识的问题,引导用户咨询专业医生
""";
WindowChatMemory开发
什么是MessageWindowChatMemory:是处理对话记忆的核心组件之一。主要用于存储和管理对话过程中的历史消息(用户输入和AI回复),并通过窗口机制控制记忆的消息数量。确保大模型能基于最近的对话上下文生成连贯的回复,避免历史记录过长导致的性能问题或上下文冗余。
@RequestMapping("/ai/docker")
@RestController
public class AIDoctorController {
private final ChatClient chatClient;
private final int MAX_MESSAGES = 100;
private final MessageWindowChatMemory messageWindowChatMemory;
// 系统提示词模板
private static final String SYSTEM_PROMPT = """
你是一位基于医学知识的AI健康咨询助手,你的职责是:
1. 礼貌询问用户的健康问题(症状、持续时间、年龄、基础疾病等关键信息)
2. 基于用户描述提供可能的健康建议(非诊断结果)
3. 明确提示"本建议仅供参考,不替代专业医师诊断"
4. 对紧急症状(如胸痛、严重出血等)优先建议立即就医
回复要求:
- 语言通俗易懂,避免专业术语堆砌
- 结构清晰:先回应问题,再给出建议,最后提示就医
- 不承诺治愈效果,不提供具体用药剂量建议
- 对超出常识的问题,引导用户咨询专业医生
""";
/**
* AIDoctorController构造函数
* 初始化聊天客户端和消息窗口内存管理器
*
* @param builder ChatClient.Builder对象,用于构建聊天客户端
* @param redisChatMemoryRepository Redis聊天内存仓库,用于持久化聊天记录
*/
public AIDoctorController(ChatClient.Builder builder, RedisChatMemoryRepository redisChatMemoryRepository) {
// 构建消息窗口聊天内存管理器,设置最大消息数量和Redis仓库
this.messageWindowChatMemory = MessageWindowChatMemory.builder()
.chatMemoryRepository(redisChatMemoryRepository)
.maxMessages(MAX_MESSAGES)
.build();
// 构建聊天客户端,设置默认的消息内存
this.chatClient = builder
.defaultSystem(SYSTEM_PROMPT)
.defaultAdvisors(
MessageChatMemoryAdvisor.builder(messageWindowChatMemory)
.build()
)
.build();
}
}
请求发送和流失发送
/**
* 处理聊天调用请求
* 接收用户查询和会话ID,返回AI助手的回复内容
*
* @param query 用户的查询内容
* @param conversationId 会话ID
* @return AI助手的回复内容字符串
*/
@GetMapping("/call")
public Flux<String> call(@RequestParam(value = "query") String query,
@RequestParam(value = "conversation_id") String conversationId, HttpServletResponse response
) {
response.setCharacterEncoding("UTF-8");
return chatClient.prompt(query)
.advisors(
a -> a.param(CONVERSATION_ID, conversationId)
)
.stream().content();
}
火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。
更多推荐
所有评论(0)