第二次软工作业
Agent说明文档(博客园随笔版)
| 这个作业属于哪个课程 | https://edu.cnblogs.com/campus/gdgy/SoftwareEngineering24/ |
|---|---|
| 这个作业要求在哪里 | https://edu.cnblogs.com/campus/gdgy/SoftwareEngineering24/homework/15646 |
| 这个作业的目标 | 完成一个能说会做的agent |
| 学号 | 3124004560 3124004553 3124004549 3124004594 3124004425 3124004591 3124004592 3124004548 3124004563 |
AI智能办公助理 - Agent 说明文档
📋 需求描述
项目背景
AI智能办公助理是一个基于自然语言交互的智能助手系统,旨在通过对话方式帮助用户完成日常办公任务。系统采用模块化设计,支持任务管理、文件操作、天气查询、数学计算等多种功能,为用户提供便捷的智能化办公体验。
核心需求
- 自然语言理解:用户可通过自然语言与系统进行交互,无需学习特定命令格式
- 多工具集成:整合多种实用工具(任务管理、文件操作、天气查询、计算器等)
- 对话历史管理:记录并展示用户的对话历史,支持上下文连续性
- 用户身份识别:支持登录用户和匿名用户,自动关联用户数据
- 可视化界面:提供美观的Web界面,支持快捷操作和实时反馈
- 可扩展架构:模块化设计便于新增功能和工具
目标用户
- 需要高效管理日常任务的办公人员
- 希望通过自然语言快速执行操作的普通用户
- 需要集成多种工具的开发者和技术人员
🔄 业务流描述
整体业务流程
工具调用流程
数据持久化流程
💻 实现说明
技术栈
后端技术
- 框架: Spring Boot 3.2.4
- JDK版本: Java 21
- 构建工具: Maven
- 数据库: MySQL 8.0 + MyBatis
- AI接口: 阿里云通义千问 API (DashScope)
- HTTP客户端: Spring WebFlux WebClient
- JSON处理: Jackson
- 其他: Lombok, JWT, Druid连接池
前端技术
- 基础: HTML5, CSS3, JavaScript (原生)
- 样式: 渐变背景、动画效果、响应式布局
- 通信: Fetch API
项目结构
agent/
├── common/ # 公共模块
│ └── src/main/java/com/clover/
│ ├── constant/ # 常量定义
│ ├── context/ # 上下文管理(用户ID)
│ ├── exception/ # 异常定义
│ ├── json/ # JSON配置
│ ├── properties/ # 配置属性
│ └── utils/ # 工具类(JWT、验证码)
│
├── pojo/ # 实体对象模块
│ └── src/main/java/com/clover/
│ ├── entity/ # 实体类
│ │ ├── User.java # 用户实体
│ │ ├── Task.java # 任务实体
│ │ └── Conversation.java # 对话实体
│ ├── dto/ # 数据传输对象
│ ├── vo/ # 视图对象
│ └── result/ # 响应封装
│ ├── Result.java # 统一响应
│ └── PageResult.java # 分页响应
│
└── server/ # 服务端模块
└── src/main/java/com/clover/
├── controller/ # 控制器层
│ ├── AgentController.java # AI对话接口
│ ├── UserController.java # 用户管理
│ ├── CaptchaController.java # 验证码
│ └── PageController.java # 页面路由
│
├── service/ # 服务层
│ ├── AgentService.java # AI代理核心服务
│ ├── TaskService.java # 任务管理服务
│ ├── FileService.java # 文件操作服务
│ ├── WeatherService.java # 天气查询服务
│ ├── CalculatorService.java # 计算器服务
│ └── UserService.java # 用户服务
│
├── mapper/ # 数据访问层
│ ├── UserMapper.java
│ ├── TaskMapper.java
│ └── ConversationMapper.java
│
├── interceptor/ # 拦截器
│ └── JwtTokenUserInterceptor.java # JWT认证
│
├── config/ # 配置类
│ ├── WebMvcConfiguration.java
│ └── OssConfiguration.java
│
└── agentServerApplication.java # 启动类
核心模块详解
1. AgentService - AI代理核心服务
职责:
- 协调AI API调用和工具执行
- 管理对话历史和会话
- 保存对话记录到数据库
关键方法:
// 处理用户消息的主入口
public String handleMessage(String userId, String message)
// 调用通义千问API
private String callAIAPIService(List<Map<String, String>> messages)
// 检查并执行工具调用
private String checkAndExecuteTools(String message)
// 保存对话到数据库
private void saveConversationToDB(String userId, String sessionId,
String role, String content,
String messageType, String toolCalls)
工作流程:
- 接收用户消息和用户ID
- 获取或创建会话ID
- 初始化或加载对话历史
- 添加用户消息到历史记录
- 保存用户消息到数据库
- 调用通义千问API获取AI回复
- 检测消息中是否包含工具关键词
- 如果匹配,执行相应工具并获取结果
- 合并AI回复和工具执行结果
- 保存AI回复到数据库
- 限制历史长度(最多20条)
- 返回最终响应
系统提示词:
你是一个能说的AI办公助理,你可以:
1. 管理任务(创建、查询、删除、完成任务)
2. 文件操作(创建、读取、更新文件)
3. 查询天气信息
4. 执行数学计算
5. 回答一般问题
请用简洁友好的中文回复。当用户要求执行操作时,先确认理解,然后调用相应工具执行。
2. TaskService - 任务管理服务
功能:
- 创建任务:解析用户消息中的任务描述
- 查询任务:列出所有任务及状态
- 完成任务:根据任务ID标记为已完成
- 删除任务:根据任务ID删除任务
数据存储:
使用内存存储(ConcurrentHashMap),键为用户ID,值为任务列表
任务结构:
record Task(Long id, String description, boolean completed,
LocalDateTime createdAt, LocalDateTime dueDate)
关键词识别:
- 创建:包含"创建"、"添加"、"新增"
- 查询:包含"查询"、"查看"、"列表"
- 完成:包含"完成"、"标记"
- 删除:包含"删除"、"移除"
3. FileService - 文件操作服务
功能:
- 创建文件:在
agent-files目录下创建文本文件 - 读取文件:读取指定文件的内容
- 列出文件:显示目录下的所有文件及大小
文件存储:
本地文件系统 agent-files/ 目录
文件名提取逻辑:
从消息中提取"文件"、"名为"、"叫做"等关键词后的第一个词作为文件名
内容提取逻辑:
从消息中提取"内容"或"为"关键词后的所有内容作为文件内容
4. WeatherService - 天气查询服务
功能:
- 查询城市天气信息
- 提供出行建议
- 支持模拟数据(无API Key时)
API配置:
- 默认使用 OpenWeatherMap API
- 可配置自定义API地址和密钥
- 无API时返回模拟天气数据
天气条件:
晴、多云、阴、小雨、中雨、大雨、雪
出行建议生成:
- 雨天 → "记得携带雨伞"
- 温度 < 15°C → "天气较冷,注意保暖"
- 温度 > 30°C → "注意防晒防暑"
5. CalculatorService - 计算器服务
功能:
- 解析数学表达式
- 支持加减乘除和括号运算
- 遵循运算符优先级规则
表达式解析器:
采用递归下降解析器(Recursive Descent Parser)实现
优先级层次:
- 括号和一元运算符(最高)
- 乘除法(中等)
- 加减法(最低)
支持的表达式示例:
125 * 8 + 50(2 + 3) * 4-5 + 10100 / 5 - 3
6. AgentController - REST API控制器
接口列表:
| 接口路径 | 方法 | 功能 | 参数 |
|---|---|---|---|
/agent/chat |
POST | 发送聊天消息 | userId, message |
/agent/clear |
POST | 清空对话历史 | userId |
/agent/history |
GET | 获取对话历史 | userId |
/agent/recent-conversations |
GET | 获取最近对话 | userId, limit |
/agent/health |
GET | 健康检查 | 无 |
响应格式:
{
"code": 1, // 1表示成功,0表示失败
"msg": "success", // 响应消息
"data": {} // 响应数据
}
数据库设计
conversation 表 - 对话记录表
CREATE TABLE `conversation` (
`id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键ID',
`user_id` VARCHAR(64) NOT NULL COMMENT '用户ID',
`session_id` VARCHAR(64) NOT NULL COMMENT '会话ID',
`role` VARCHAR(20) NOT NULL COMMENT '角色: user/assistant/system',
`content` TEXT NOT NULL COMMENT '消息内容',
`message_type` VARCHAR(20) DEFAULT 'text' COMMENT '消息类型',
`tool_calls` TEXT COMMENT '工具调用记录(JSON)',
`created_at` DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
PRIMARY KEY (`id`),
INDEX `idx_user_id` (`user_id`),
INDEX `idx_session_id` (`session_id`),
INDEX `idx_created_at` (`created_at`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='对话记录表';
索引设计:
idx_user_id: 加速按用户查询对话idx_session_id: 加速按会话查询idx_created_at: 加速按时间排序
配置说明
application-dev.yml 关键配置
# 通义千问API配置
agent:
api:
key: your-dashscope-api-key # 阿里云DashScope API Key
url: https://dashscope.aliyuncs.com/api/v1/services/aigc/text-generation/generation
model: qwen-turbo # 模型名称
# 天气API配置(可选)
weather:
api:
key: your-weather-api-key
url: https://api.openweathermap.org/data/2.5/weather
# 数据库配置
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/agent_db?useSSL=false&serverTimezone=Asia/Shanghai
username: your-userName
password: your-password
# 服务器端口
server:
port: 8080
安全机制
- JWT认证: 通过
JwtTokenUserInterceptor拦截器验证用户令牌 - 用户上下文: 使用
BaseContext存储当前登录用户ID - 跨域配置: 在
WebMvcConfiguration中配置CORS允许跨域请求 - 输入验证: 对用户输入进行基本验证和清理
错误处理
全局异常处理器 (GlobalExceptionHandler):
- 捕获所有未处理的异常
- 返回统一的错误响应格式
- 记录详细错误日志
API重试机制:
- 通义千问API调用失败时自动重试2次
- 每次重试间隔1秒
- 区分客户端错误(4xx)和服务器错误(5xx)
🎯 使用示例(功能演示)
1. 任务管理功能
示例1:创建任务
用户输入:
创建任务:完成项目报告
系统响应:
✅ 任务已创建:
- ID: 1
- 描述: 完成项目报告
- 时间: 2024-01-15 10:30
后台执行:
- TaskService检测到"创建"关键词
- 提取任务描述"完成项目报告"
- 生成任务ID(自增)
- 创建Task对象并存入内存
- 返回格式化响应
示例2:查看任务列表
用户输入:
查看我的任务
系统响应:
📋 你的任务清单:
⏳ [1] 完成项目报告
⏳ [2] 学习新技术
✅ [3] 准备会议材料
总计: 3 个任务
示例3:完成任务
用户输入:
完成任务 1
系统响应:
✅ 任务 1 已标记为完成!
示例4:删除任务
用户输入:
删除任务 3
系统响应:
🗑️ 任务 3 已删除。
2. 天气查询功能
示例1:查询天气
用户输入:
北京天气怎么样?
系统响应:
🌤️ 北京天气
━━━━━━━━━━━━━━
天气: 晴
温度: 22.5°C
湿度: 45%
风速: 3.2 m/s
━━━━━━━━━━━━━━
💡 出行建议: 天气不错,适合出行!
更新时间: 2024-01-15 10:30
后台执行:
- WeatherService检测到"天气"关键词
- 提取城市名"北京"
- 调用天气API或返回模拟数据
- 根据天气条件生成出行建议
- 格式化返回结果
示例2:特殊天气建议
用户输入:
上海天气如何?
系统响应(雨天场景):
🌧️ 上海天气
━━━━━━━━━━━━━━
天气: 小雨
温度: 18.0°C
湿度: 75%
风速: 4.5 m/s
━━━━━━━━━━━━━━
💡 出行建议: 有降雨,建议携带雨具。
☂️ 记得携带雨伞
🧥 天气较凉,注意保暖
3. 数学计算功能
示例1:基本计算
用户输入:
计算 125 * 8 + 50
系统响应:
🔢 计算结果:
125 * 8 + 50 = 1050.00
后台执行:
- CalculatorService检测到"计算"关键词
- 提取表达式"125 * 8 + 50"
- 使用递归下降解析器计算
- 遵循运算符优先级(先乘后加)
- 返回格式化结果
示例2:带括号的复杂计算
用户输入:
计算 (2 + 3) * 4 - 10 / 2
系统响应:
🔢 计算结果:
(2 + 3) * 4 - 10 / 2 = 15.00
计算过程:
- 先计算括号内:2 + 3 = 5
- 再计算乘法:5 * 4 = 20
- 计算除法:10 / 2 = 5
- 最后减法:20 - 5 = 15
示例3:负数运算
用户输入:
计算 -5 + 10 * 2
系统响应:
🔢 计算结果:
-5 + 10 * 2 = 15.00
4. 文件操作功能
示例1:创建文件
用户输入:
创建文件 test.txt 内容为Hello World
系统响应:
📄 文件已创建:
- 文件名: test.txt
- 大小: 11 字节
- 路径: D:\code\java\agent\agent-files\test.txt
后台执行:
- FileService检测到"创建"和"文件"关键词
- 提取文件名"test.txt"
- 提取文件内容"Hello World"
- 在
agent-files目录下创建文件 - 写入内容并返回文件信息
示例2:读取文件
用户输入:
读取文件 test.txt
系统响应:
📄 文件 test.txt 内容:
Hello World
示例3:列出所有文件
用户输入:
列出所有文件
系统响应:
📁 文件列表:
- test.txt (11 字节)
- notes.txt (256 字节)
- data.csv (1024 字节)
总计: 3 个文件
5. 综合对话示例
示例1:多轮对话
第一轮:
用户: 帮我创建一个任务
AI: 好的,请告诉我任务的具体内容是什么?
用户: 完成项目报告,明天截止
AI: ✅ 任务已创建:
- ID: 1
- 描述: 完成项目报告,明天截止
- 时间: 2024-01-15 10:30
第二轮:
用户: 再创建一个学习任务
AI: ✅ 任务已创建:
- ID: 2
- 描述: 学习任务
- 时间: 2024-01-15 10:31
第三轮:
用户: 查看我的任务
AI: 📋 你的任务清单:
⏳ [1] 完成项目报告,明天截止
⏳ [2] 学习任务
总计: 2 个任务
示例2:混合功能调用
用户输入:
今天北京天气怎么样?另外帮我计算一下 25 * 4
系统响应:
我理解你想了解北京的天气情况,并且需要进行数学计算。
🌤️ 北京天气
━━━━━━━━━━━━━━
天气: 晴
温度: 22.5°C
湿度: 45%
风速: 3.2 m/s
━━━━━━━━━━━━━━
💡 出行建议: 天气不错,适合出行!
🔢 计算结果:
25 * 4 = 100.00
后台执行:
- AgentService调用通义千问API获取通用回复
- checkAndExecuteTools检测到"天气"关键词,调用WeatherService
- checkAndExecuteTools检测到数字和运算符,调用CalculatorService
- 合并AI回复、天气结果和计算结果
- 返回综合响应
6. Web界面操作示例
登录界面
打开浏览器访问:http://localhost:8080/login

访问主页
界面布局:
打开浏览器访问:http://localhost:8080/index

点击界面上按钮"任务管理" "天气出行" "文件管理"切换其他页面
快捷操作演示
-
点击"📋 创建任务"按钮
- 自动填充:
创建任务:完成作业 - 点击发送
- 左侧显示AI回复(任务创建成功)
- 右侧自动刷新,显示刚创建的对话记录
- 自动填充:
-
点击"🌤️ 查询天气"按钮
- 自动填充:
北京天气怎么样? - 点击发送
- 显示天气信息和出行建议
- 自动填充:
-
点击"🔢 计算器"按钮
- 自动填充:
计算 125 * 8 + 50 - 点击发送
- 显示计算结果
- 自动填充:
7. 专用页面功能演示
任务管理页面 (/task-manager)
访问: http://localhost:8080/task-manager
功能特点:
- 左侧:AI对话区,用自然语言管理任务
- 右侧:任务列表展示区,实时同步
- 支持点击按钮完成任务/删除任务
- 显示任务统计信息(总数、已完成、待完成)
操作流程:
- 在左侧输入:"创建任务:学习Java"
- 右侧立即显示新任务
- 点击任务旁的"完成"按钮
- 任务状态变为✅已完成
- 统计数据自动更新
天气出行页面 (/weather-planner)
访问: http://localhost:8080/weather-planner
功能特点:
- 美观的天气展示界面(粉橙色渐变主题)
- 快捷城市选择芯片(北京、上海、广州等)
- 大号天气图标(动态浮动动画)
- 详细数据网格(温度、湿度、风速、体感温度)
- 智能出行建议和提示卡片
操作流程:
- 点击城市芯片"北京"
- 显示北京天气(大图标+详细数据)
- 自动生成出行建议
- 显示个性化提示(如"记得带伞")
文件管理页面 (/file-manager)
访问: http://localhost:8080/file-manager
功能特点:
- 文件上传下载
- 文件列表展示
- 支持多种文件格式
- 集成阿里云OSS存储(可选)
8. API调用示例
使用curl测试聊天接口
curl -X POST http://localhost:8080/agent/chat \
-H "Content-Type: application/json" \
-d '{
"userId": "test_user_001",
"message": "创建任务:完成项目报告"
}'
响应:
{
"code": 1,
"msg": "success",
"data": "✅ 任务已创建:\n- ID: 1\n- 描述: 完成项目报告\n- 时间: 2024-01-15 10:30"
}
查询对话历史
curl http://localhost:8080/agent/recent-conversations?userId=test_user_001&limit=10
响应:
{
"code": 1,
"msg": "success",
"data": [
{
"id": 1,
"role": "user",
"content": "创建任务:完成项目报告",
"createdAt": "2024-01-15T10:30:00"
},
{
"id": 2,
"role": "assistant",
"content": "✅ 任务已创建:...",
"createdAt": "2024-01-15T10:30:01"
}
]
}
9. 实际应用场景
场景1:日常工作规划
用户:
帮我创建今天的任务清单:
1. 完成项目报告
2. 参加下午3点的会议
3. 回复客户邮件
AI助理:
好的,我已为你创建了3个任务:
✅ 任务已创建:
- ID: 1
- 描述: 完成项目报告
- 时间: 2024-01-15 09:00
✅ 任务已创建:
- ID: 2
- 描述: 参加下午3点的会议
- 时间: 2024-01-15 09:00
✅ 任务已创建:
- ID: 3
- 描述: 回复客户邮件
- 时间: 2024-01-15 09:00
祝你今天工作顺利!💪
场景2:出行准备
用户:
明天要去上海出差,那边天气怎么样?
AI助理:
让我帮你查询上海的天气情况。
🌤️ 上海天气
━━━━━━━━━━━━━━
天气: 多云
温度: 25.0°C
湿度: 60%
风速: 2.5 m/s
━━━━━━━━━━━━━━
💡 出行建议: 适宜出行。
根据你的行程安排,建议:
- 穿着舒适的商务休闲装
- 携带笔记本电脑和充电器
- 准备好会议资料
需要我帮你创建出差准备任务清单吗?
场景3:快速计算
用户:
我要计算这个月的开销:房租3500 + 餐饮1200 + 交通300 + 其他500
AI助理:
让我帮你计算一下总开销。
🔢 计算结果:
3500 + 1200 + 300 + 500 = 5500.00
你这个月的总开销为 5500 元。
需要我帮你创建一个记账任务来记录这些支出吗?
🔧 部署与运行
环境要求
- JDK 21
- Maven 3.6+
- MySQL 8.0+
- 现代浏览器(Chrome/Firefox/Edge)
启动步骤
- 配置数据库
# 创建数据库
mysql -u root -p
CREATE DATABASE agent_db CHARACTER SET utf8mb4;
# 导入初始化脚本
mysql -u root -p agent_db < server/src/main/resources/db/init.sql
- 配置API密钥
编辑server/src/main/resources/application-dev.yml:
agent:
api:
key: sk-your-dashscope-api-key # 替换为真实的API Key
- 编译项目
mvn clean install
- 启动应用
cd server
mvn spring-boot:run
- 访问应用
打开浏览器访问:http://localhost:8080/index
📊 性能优化
已实现的优化
- 连接池: 使用Druid数据库连接池
- 并发安全: 使用ConcurrentHashMap存储会话数据
- 异步处理: WebClient非阻塞HTTP调用
- 索引优化: 数据库表添加合适索引
- 缓存策略: 内存缓存对话历史
可扩展优化方向
- Redis缓存: 缓存热点数据和会话
- 消息队列: 异步处理耗时操作
- CDN加速: 静态资源CDN分发
- 负载均衡: 多实例部署+负载均衡
- 数据库分片: 大数据量时分库分表
🚀 未来扩展
计划新增功能
- 语音交互: 支持语音输入和输出
- 图像识别: 上传图片进行OCR识别
- 日程管理: 集成日历和提醒功能
- 邮件助手: 自动撰写和发送邮件
- 数据分析: 生成统计报表和图表
- 多语言支持: 支持中英文切换
- 插件系统: 支持第三方工具插件
- 团队协作: 多人协作和任务分配
技术升级方向
- 向量数据库: 集成知识库和RAG检索
- 流式响应: SSE实现打字机效果
- WebSocket: 实时双向通信
- 微服务架构: 拆分为独立微服务
- 容器化部署: Docker + Kubernetes
📝 总结
AI智能办公助理是一个功能完整、架构清晰的智能对话系统。通过自然语言交互,用户可以轻松完成任务管理、文件操作、天气查询、数学计算等日常办公操作。系统采用模块化设计,易于扩展和维护,为后续功能迭代奠定了良好基础。
核心优势:
- ✅ 自然语言交互,降低使用门槛
- ✅ 多工具集成,一站式解决方案
- ✅ 对话历史持久化,数据不丢失
- ✅ 美观的Web界面,良好的用户体验
- ✅ 模块化架构,易于扩展新功能
适用场景:
- 个人工作效率提升
- 团队任务协作管理
- 智能办公助手原型
- AI应用开发学习案例
文档版本: 1.0
更新日期: 2024-01-15
作者: 许龙 王同裕 罗航 詹金涛 刘宇航 刘聪 胡祖豪 罗嘉钦 唐钢湶
项目地址: https://github.com/Princcess-Dragon/Four-Leaf-Clover/tree/main/agent
小组分工
| 成员 | 分工 | 任务 |
|---|---|---|
| 许龙 | 全栈 | 设计本项目大纲以及实现 |
| 王同裕 | 后端 | 数据库设计 |
| 罗航 | 后端 | pojo |
| 詹金涛 | 后端 | sever |
| 刘宇航 | 后端 | common |
| 刘聪 | 前端 | html,css |
| 胡祖豪 | 前端 | Javascript |
| 罗嘉钦 | 测试 | 测试项目 |
| 唐钢湶 | 文员 | 文档,使用说明 |
浙公网安备 33010602011771号