一个 Spring Boot 版 AI 聊天教练 MVP。它把用户粘贴的聊天记录交给大模型分析,先快速生成可直接发送的推荐回复,再在用户需要时补充关系阶段、兴趣度、风险和原因解释。
这个仓库不是原始话术资料包,也不包含私有聊天记录。公开版只保留已经整理成产品雏形的代码、轻量评测体系和少量示例知识库。
很多聊天建议工具只做“帮我回一句”,结果很容易变成随机话术生成器。这个项目更关注一个小但重要的问题:让 AI 的输出结构稳定、能被前端展示、能被评测回归,并且始终保持尊重边界。
所以它不只是一个 API 调用 demo,还包含:
- 结构化 JSON 输出
- 快速回复与详细分析的两段式接口
- 前端模块化展示和一键复制
- 安全边界 prompt
- 轻量 eval cases
- failed cases 错题本
- baseline 记录
POST /api/chat/analyze/quick:快速生成回复策略、推荐回复、避免回复POST /api/chat/analyze/detail:按需生成关系阶段、兴趣度、当前风险和原因解释POST /api/chat/analyze:保留完整结构化分析接口,兼容旧调用- 内置静态 Web 页面,启动后访问
/ - DeepSeek Chat Completions 调用封装
- 模型返回非标准 JSON 时尝试修复
- 邀请码校验和基础限流
- 基于 JSON 文件的轻量知识库检索
- PowerShell 评测脚本和 30 条示例 eval cases
需要 Java 17 和 Maven。
cd ai-chat-coach-public
$env:DEEPSEEK_API_KEY="your-deepseek-api-key"
$env:INVITE_CODE="test2026"
mvn spring-boot:run启动后打开:
http://localhost:8080
第一次使用页面时会提示输入邀请码。默认示例是:
test2026
生产环境请改成自己的 INVITE_CODE。
复制环境变量示例:
cp .env.example .env编辑 .env 后启动:
docker compose up -d --build快速回复:
curl -X POST "http://localhost:8080/api/chat/analyze/quick" \
-H "Content-Type: application/json" \
-H "X-Invite-Code: test2026" \
-d '{"chatRecord":"我:今天在干嘛?\n她:没干嘛,有点累。","stage":"刚认识","goal":"延续话题","style":"自然"}'详细分析:
curl -X POST "http://localhost:8080/api/chat/analyze/detail" \
-H "Content-Type: application/json" \
-H "X-Invite-Code: test2026" \
-d '{"chatRecord":"我:今天在干嘛?\n她:没干嘛,有点累。","stage":"刚认识","goal":"延续话题","style":"自然"}'项目带了一个轻量评测体系,不依赖复杂平台:
.\eval-runner.ps1 -BaseUrl "http://localhost:8080" -InviteCode "test2026" -DelaySec 15 -MaxRetries 3相关文件:
eval-cases.json:30 条示例场景eval-runner.ps1:批量请求接口并生成结果failed-cases.json:失败案例错题本failed-stats.ps1:失败类型统计EVAL.md:评测流程说明BASELINE.md:baseline 记录
src/main/java/com/example/aichatcoach/
chat/ API、请求响应 DTO、分析服务
deepseek/ DeepSeek 调用封装
knowledge/ JSON 知识库读取与检索
config/ 鉴权、限流、Web 配置
common/ 全局异常处理
src/main/resources/
static/ 前端页面
system-prompt.md
knowledge.json
application.yml
- 不要把真实 API Key、邀请码、聊天记录提交到仓库
- 页面里的推荐回复只是辅助草稿,应该由用户自己判断是否发送
- Prompt 明确禁止操控、施压、贬低、PUA、死缠烂打等话术
- 示例知识库只用于演示结构,不代表完整产品能力
- 评测用关键词命中只是轻量回归方法,不等同于真实用户效果
MIT