# Refund-System **Repository Path**: yancyxiaoxy/refund-system ## Basic Information - **Project Name**: Refund-System - **Description**: 基于 Spring AI 的自动退款客服系统 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-04-02 - **Last Updated**: 2026-04-02 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 自动退款客服系统 > 基于 Spring AI 实现的智能电商客服系统,自动识别商品质量问题并为买家申请退款 [![Spring AI](https://img.shields.io/badge/Spring%20AI-1.0+-brightgreen)](https://spring.io/projects/spring-ai) [![Java](https://img.shields.io/badge/Java-17+-orange)](https://openjdk.java.net/) [![License](https://img.shields.io/badge/License-MIT-blue)](LICENSE) ## 📖 项目简介 这是一个模拟自动退款客服系统的演示项目,基于 Spring AI 框架开发。系统能够智能识别用户对商品质量的严重不满,并在确认问题后自动为用户发起退款申请,最大化客户满意度和信任度。 ### 核心功能 - 🤖 **智能对话** - 基于大语言模型的自然语言对话 - 🔍 **质量问题识别** - 自动识别用户对商品质量的严重不满 - 💬 **对话记忆** - 支持多轮对话,保持上下文连贯 - ⚡ **流式输出** - 实时显示 AI 回复内容 - 🛠️ **Function Call** - 自动调用退款工具处理问题 - 📱 **响应式前端** - 适配 PC 和移动端的对话界面 ## 🏗️ 技术架构 ### 后端技术栈 | 技术 | 版本 | 说明 | |------|------|------| | Spring Boot | 3.x | 基础框架 | | Spring AI | 1.0+ | AI 对话框架 | | DashScope | - | 通义千问大模型 | | JDBC | - | 对话记忆存储 | ### 前端技术栈 - 原生 HTML5 + CSS3 + JavaScript - 流式响应式布局 - Fetch API + ReadableStream 流式输出 ### 项目结构 ``` springai/ ├── src/main/java/cn/hollis/llm/llmentor/ │ ├── controller/ │ │ └── PddRefundController.java # 退款客服控制器 │ ├── model/ │ │ ├── OrderChat.java # 订单对话模型 │ │ └── ChatStatus.java # 对话状态枚举 │ ├── tools/ │ │ └── OrderTools.java # 退款工具类 │ └── service/ │ └── OrderManageService.java # 订单管理服务 ├── src/main/resources/ │ ├── templates/ │ │ └── pdd_refund_system_prompt.pt # 系统提示词模板 │ └── static/ │ └── pdd-refund.html # 前端对话页面 └── pom.xml ``` ## 🚀 快速开始 ### 环境要求 - JDK 17+ - Maven 3.6+ - MySQL 5.7+(可选,用于存储对话记忆) ### 配置说明 1. 编辑 `application.yml` 配置文件: ```yaml spring: ai: dashscope: api-key: your-api-key-here # 替换为你的通义千问 API Key chat: memory: repository: jdbc: platform: mysql initialization-mode: ALWAYS datasource: url: jdbc:mysql://localhost:3306/spring_ai_db username: root password: root ``` 2. 创建数据库(可选): ```sql CREATE DATABASE spring_ai_db DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; ``` ### 启动项目 ```bash cd springai mvn clean install mvn spring-boot:run ``` 访问前端页面:http://localhost:8000/pdd-refund.html ## 📡 API 接口 ### 1. 创建新对话 **请求** ``` GET /pdd/refund/newChat?userId={userId}&orderId={orderId} ``` **参数说明** | 参数 | 类型 | 必填 | 说明 | |------|------|------|------| | userId | String | 是 | 用户 ID | | orderId | String | 是 | 订单号 | **响应示例** ```json { "orderId": "order_789012", "userId": "user_123456", "chatId": "550e8400-e29b-41d4-a716-446655440000", "status": "CHAT_START" } ``` ### 2. 发送消息 **请求** ``` GET /pdd/refund/ask?question={question}&chatId={chatId} ``` **参数说明** | 参数 | 类型 | 必填 | 说明 | |------|------|------|------| | question | String | 是 | 用户问题 | | chatId | String | 是 | 对话 ID | **响应** - 流式输出,返回文本内容 ## 🧠 提示词工程 ### 角色定义 ``` 你是一名专业的电商平台客户体验专家,你的核心职责是高效、准确地处理用户关于商品的反馈。 ``` ### 处理流程 #### 第一步:主动识别与确认 识别质量问题关键词: - "根本没法用"、"是坏的"、"有瑕疵"、"质量太差了" - "和描述完全不符"、"严重色差"、"尺寸根本不对" - "一用就坏了"、"有安全隐患" - "我要投诉"、"这简直是欺诈" #### 第二步:判断与执行退款 当用户确认质量问题后,自动触发退款流程。 #### 第三步:后续安抚与闭环 表达歉意,告知用户后续流程。 ### Limit 限制 - 仅处理质量问题 - 不索要额外信息(订单号、手机号等) ## 🛠️ Function Call ### 退款工具定义 ```java @Tool(name = "apply_refund", description = "根据用户传入的订单信息发起退款") public String refund( @ToolParam(description = "订单编号,为数字类型") String orderId, @ToolParam(description = "商品名称") String name, @ToolParam(description = "退款原因") String reason ) ``` ### 工具注册 ```java .chatClient .prompt() .user(question) .tools(orderTools) // 注册工具 .stream().content() ``` ## 💡 使用示例 ### 场景 1:质量问题退款 ``` 用户:你们这个衣服质量太差了,刚收到就发现袖口开线了! 客服:非常抱歉给您带来了不好的体验。您是说刚收到的这件衣服袖口已经完全开线了,对吗? 用户:对的,就是开线了 客服:我完全理解,这确实属于严重的质量问题。为了节约您的时间,我将立即为您发起退款申请。款项将按原路径在 1-7 个工作日内退回,请您注意查收。 ``` ### 场景 2:非质量问题 ``` 用户:这个颜色我不太喜欢 客服:理解您的感受。如果不喜欢商品,您可以申请七天无理由退换货。请问您需要我协助您办理换货吗? ``` ## 📝 配置说明 ### 对话记忆配置 系统支持多种对话记忆方式: 1. **JDBC 存储**(默认) - 使用 MySQL 存储对话历史 - 支持持久化和跨会话记忆 2. **内存存储**(测试用) - 使用 `ConcurrentMapChatMemory` - 无需数据库,适合本地测试 ### 修改为内存存储 如需使用内存存储(不依赖数据库),修改控制器: ```java private final ConcurrentMapChatMemory chatMemory = new ConcurrentMapChatMemory(); @PostConstruct public void init() { chatClient = ChatClient.builder(chatModel) .defaultAdvisors( MessageChatMemoryAdvisor.builder(chatMemory).build(), new SimpleLoggerAdvisor() ) .defaultSystem(systemText) .build(); } ``` ## 🔧 常见问题 ### Q1: 如何更换大模型? 修改 `application.yml` 中的模型配置: ```yaml spring: ai: ollama: base-url: http://localhost:11434 chat: model: deepseek-r1:7b ``` ### Q2: 对话记忆失效怎么办? 确保 `chatId` 在多次请求中保持一致,并检查数据库连接。 ### Q3: 流式输出乱码? 确保响应编码设置为 UTF-8: ```java httpServletResponse.setCharacterEncoding("UTF-8"); ``` ## 📄 License MIT License ## 👨‍💻 作者 Hollis - LLMentor 项目 ---

如果这个项目对你有帮助,请给一个 ⭐️ Star 支持!