项目概述

小暖 是一个温柔治愈的 AI 聊天陪伴应用,能够感知用户的情绪变化,以共情、温暖的方式与用户进行实时对话交流。前端为纯 HTML/CSS/JS 单页应用,后端基于 Spring Boot 3 + Spring AI 框架,通过 OpenAI 兼容协议接入 DeepSeek 大语言模型,支持 SSE 流式对话与多轮上下文记忆。

项目源码

在这里插入图片描述

技术栈

层级 技术 版本
框架 Spring Boot 3.3.2
AI 集成 Spring AI (OpenAI Starter) 1.0.0-M5
大模型 DeepSeek Chat deepseek-chat
构建工具 Maven
JDK Java 17
前端 原生 HTML + CSS + JavaScript
流式传输 SSE (Server-Sent Events)
编码 UTF-8

项目结构

a1/
├── pom.xml                                          # Maven 项目描述符
├── README.md                                        # 项目文档
├── killPort.bat                                     # Windows 端口释放脚本
└── src/
    └── main/
        ├── java/com/therapy/chat/
        │   ├── TherapyChatApplication.java          # 应用入口
        │   ├── config/
        │   │   ├── SpringAiConfig.java              # AI 配置(ChatClient、ChatMemory、系统提示)
        │   │   └── WebMvcConfig.java                # Web MVC 配置(UTF-8 编码)
        │   ├── controller/
        │   │   ├── ChatController.java              # 聊天 API 控制器
        │   │   └── PageController.java              # 页面路由控制器
        │   ├── dto/
        │   │   ├── ChatRequest.java                 # 聊天请求 DTO
        │   │   └── ChatResponse.java                # 聊天响应 DTO
        │   └── service/
        │       └── ChatService.java                 # 聊天服务层
        └── resources/
            ├── application.yml                      # 应用配置文件
            └── static/
                └── index.html                       # 前端聊天界面

快速开始

环境要求

配置 API Key

注意:这里一定要配置自己的API Key,博主项目代码中的API Key已经删掉了,不能再使用了。

方式一:环境变量(推荐)

export DEEPSEEK_API_KEY=sk-your-api-key

方式二:直接修改配置文件

编辑 src/main/resources/application.yml

spring:
  ai:
    openai:
      api-key: sk-your-api-key

启动应用

# 编译并启动
mvn spring-boot:run

# 或先打包再运行
mvn clean package -DskipTests
java -jar target/therapy-chat-1.0.0.jar

启动后访问:http://localhost:8080

释放端口(Windows)

如果 8080 端口被占用:

killPort.bat

API 接口

1. 流式聊天(SSE)

POST /api/chat/stream
Content-Type: application/json
Accept: text/event-stream

请求体:

{
    "message": "今天心情不太好",
    "conversationId": "conv_1721000000000"
}

响应:text/event-stream 格式,逐 token 推送 AI 回复内容。

2. 普通聊天

POST /api/chat/send
Content-Type: application/json

请求体:

{
    "message": "你好",
    "conversationId": "conv_1721000000000"
}

响应:

{
    "reply": "你好呀,很高兴见到你~有什么想聊的吗?",
    "conversationId": "conv_1721000000000"
}

3. 健康检查

GET /api/chat/health

响应:ok

核心架构

数据流

流式响应

SSE 推送

浏览器 (index.html)

POST /api/chat/stream (SSE) 或 /api/chat/send

ChatController.java

ChatService.java

SpringAiConfig.java

DeepSeek API

双模式对话

前端优先使用 SSE 流式模式/api/chat/stream),实现打字机效果的文字逐字输出。若流式请求失败,自动降级到 普通 JSON 模式/api/chat/send)作为兜底。

对话记忆

  • 使用 Spring AI 的 InMemoryChatMemory 存储对话历史
  • conversationId 为键隔离不同会话
  • 前端在页面加载时生成唯一会话 ID(conv_ + 时间戳)
  • 通过 PromptChatMemoryAdvisor 自动将最近对话历史注入每次 API 请求
  • 注意:记忆存储在内存中,应用重启后丢失

AI 角色设定

小暖的角色设定(SpringAiConfig.SYSTEM_PROMPT)包含:

  • 对话逻辑:根据用户输入独立理解内容,针对性回复
  • 人设规范:语气柔和亲切、回复简短自然、第一人称表达
  • 沟通原则:先共情再引导、不评判不说教、温柔倾听
  • 禁止事项:不提供医疗诊断、不说教、不鸡汤、不冷淡敷衍
  • 安全边界:严重心理危机时建议寻求专业援助

配置说明

# application.yml
server:
  port: 8080                                # 服务端口

spring:
  ai:
    openai:
      api-key: ${DEEPSEEK_API_KEY:sk-xxx}   # API 密钥(优先读环境变量)
      base-url: https://api.deepseek.com    # DeepSeek API 地址
      chat:
        options:
          model: deepseek-chat              # 模型名称
          temperature: 0.8                  # 创造性(0-1,越高越随机)

logging:
  level:
    com.therapy.chat: DEBUG                 # 应用日志级别
    org.springframework.ai.chat: DEBUG      # Spring AI 聊天日志
    org.springframework.ai.openai: DEBUG    # OpenAI 客户端日志

切换到其他大模型

本项目使用 OpenAI 兼容协议,可切换至任意兼容的 API 服务:

Ollama(本地部署)

spring:
  ai:
    openai:
      api-key: ollama                       # Ollama 不需要真实 key
      base-url: http://localhost:11434/v1   # Ollama OpenAI 兼容端点
      chat:
        options:
          model: qwen2:7b

其他兼容服务(如通义千问、智谱等):修改 base-urlmodel 即可。

功能特性

  • 🌸 温暖治愈的聊天界面,柔和渐变配色
  • 💬 SSE 流式传输,打字机逐字输出效果
  • 🧠 多轮对话上下文记忆
  • 📱 响应式设计,适配移动端
  • 🔄 流式失败自动降级为普通请求
  • 🛡️ 完善的异常处理与用户友好提示
  • 🎯 精心设计的心理陪伴角色提示词
  • 🌐 全 UTF-8 编码,中文支持完善

注意事项

  1. API Key 安全:生产环境请务必通过环境变量注入密钥,不要将密钥硬编码在配置文件中
  2. 内存记忆:对话历史存储在内存中,应用重启会丢失,生产环境可替换为持久化实现
  3. 内网访问:如需外部访问,请配置反向代理(Nginx 等)并注意安全防护
  4. 非医疗用途:本应用仅提供情感陪伴,不提供专业心理诊断或医疗建议
Logo

欢迎加入DeepSeek 技术社区。在这里,你可以找到志同道合的朋友,共同探索AI技术的奥秘。

更多推荐