智能助手技术实现
2025/12/3大约 4 分钟
智能助手技术实现
概述
本文档详细介绍 Gupt Management System 项目中智能助手模块的核心技术实现方案,基于本地 Ollama AI 模型构建,集成 FAQ 匹配、Elasticsearch 搜索等功能,为用户提供智能问答和信息检索服务。
1. 技术架构
智能助手服务位于 gupt-assistant-service 模块,采用分层架构设计:
- Controller 层:处理 HTTP 请求,提供 REST API 接口
- Service 层:实现核心业务逻辑,包括 Ollama 模型调用、FAQ 匹配、搜索处理
- 集成服务:集成 Elasticsearch、邮件服务等外部组件
2. 核心技术实现
2.1 Ollama AI 模型集成
2.1.1 技术概述
- 使用本地部署的 Ollama 服务器提供 AI 能力
- 采用 qwen2.5:0.5b 轻量级模型进行推理
- 通过 HTTP API 与 Ollama 服务器交互
2.1.2 关键实现
// 创建到Ollama服务器的HTTP连接
private HttpURLConnection getConnection(String query) throws IOException {
URL url = new URL(OLLAMA_SERVER_URL + "/api/generate");
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setRequestMethod("POST");
connection.setRequestProperty("Content-Type", "application/json");
connection.setDoOutput(true);
// 构建请求体
ObjectMapper mapper = new ObjectMapper();
Map<String, Object> requestBody = Map.of(
"model", "qwen2.5:0.5b",
"prompt", query
);
// 发送请求并获取流式响应
// ...
}2.2 FAQ 匹配机制
2.2.1 功能说明
- 通过
FaqMatcher组件实现常见问题快速匹配 - 采用预定义问答对,提供精确的常见问题解答
- 作为 Ollama 模型的前置筛选,提高响应速度和准确性
2.2.2 实现流程
// 查询流程
@Override
public String queryOllama(String query, boolean mode) {
try {
// 1. 先尝试FAQ匹配
Optional<String> faqAnswer = faqMatcher.match(query);
if (faqAnswer.isPresent()) {
return faqAnswer.get();
}
// 2. FAQ匹配失败后,继续后续处理
// ...
}
// ...
}2.3 Elasticsearch 搜索集成
2.3.1 技术说明
- 集成 Elasticsearch 搜索引擎实现内容检索
- 支持多类型信息搜索(通过
InfoType枚举区分) - 在指定模式下直接返回搜索结果的类型、ID和标题
2.3.2 搜索实现
// 搜索模式处理
if (mode) {
List<SearchResult> searchResults = elasticsearchService.search(query);
if (searchResults.isEmpty()) {
log.info("未找到相关内容");
return null;
}
// 返回搜索到的文章类型、id和标题
StringBuilder sb = new StringBuilder();
for (SearchResult result : searchResults) {
sb.append(InfoType.POTypeToVOType(Integer.parseInt(result.getTypeId())))
.append(":").append(result.getId())
.append(":").append(result.getTitle()).append(" ");
}
return sb.toString();
}2.4 邮件通知集成
2.4.1 功能说明
- 当 AI 回答生成完成后,自动发送通知邮件给用户
- 通过邮件服务将通知推送到 RabbitMQ 消息队列
- 支持异步处理,不阻塞用户响应
2.4.2 实现代码
// 回答生成完成后发送邮件通知
EmailDTO dto = new EmailDTO();
dto.setSubject("Ollama");
dto.setBody("回答已经生成完毕,快回来看看吧!");
dto.setStatus("已发送");
dto.setIsRead(false);
dto.setRecipientId(SecurityContextUtil.getCurrentUserId());
emailService.sendEmail(dto); // 推入 RabbitMQ,通知用户生成完毕的邮件3. API 接口设计
3.1 查询接口
- URL:
/assistant/query - 方法: GET
- 参数:
prompt: String - 用户查询的问题或关键词mode: boolean - 查询模式(true: 搜索模式,返回文章类型和ID;false: 问答模式,返回AI回答)
- 返回: JSON格式的查询结果,包含响应消息
3.2 响应格式
{
"code": 200,
"message": "success",
"data": {
"reply": "AI回答内容或搜索结果"
}
}4. 技术依赖
| 依赖 | 版本 | 用途 |
|---|---|---|
| Spring Boot | 3.2.4 | 基础框架 |
| Elasticsearch Java | - | 搜索引擎集成 |
| Jackson | - | JSON处理 |
| Lombok | - | 简化代码 |
| gupt-api | 1.0-SNAPSHOT | 数据传输对象 |
| gupt-common | 1.0-SNAPSHOT | 公共工具类 |
| gupt-email-service | 1.0-SNAPSHOT | 邮件通知服务 |
| gupt-thirdpart-service | 1.0-SNAPSHOT | 第三方服务集成 |
5. 工作流程
5.1 智能问答流程
- 用户发送查询请求到
/assistant/query接口 - 系统首先尝试通过 FAQ 匹配回答用户问题
- 如果 FAQ 匹配失败,系统将查询转发给 Ollama AI 模型
- AI 模型生成回答后,系统异步发送邮件通知给用户
- 系统将 AI 回答返回给用户
5.2 搜索流程
- 用户以搜索模式(
mode=true)发送查询请求 - 系统调用 Elasticsearch 进行内容搜索
- 系统将搜索结果转换为指定格式(类型:ID:标题)
- 系统直接返回搜索结果给用户
6. 性能优化
6.1 多层缓存策略
- 使用 FAQ 机制作为一级缓存,快速响应常见问题
- 采用 Elasticsearch 搜索引擎提高内容检索效率
- 异步处理邮件通知,不阻塞主业务流程
6.2 错误处理与日志
- 完善的异常捕获机制,确保服务稳定性
- 详细的日志记录,便于问题排查
- 友好的错误提示,提升用户体验
7. 部署与配置
7.1 Ollama 服务器配置
- 默认连接地址:
http://localhost:11434 - 使用的模型:
qwen2.5:0.5b - 需确保 Ollama 服务在应用启动前已运行
7.2 注意事项
- 首次启动 Ollama 服务可能需要下载模型,耗时较长
- 确保系统有足够的内存运行 AI 模型
- 建议在本地开发环境中测试时使用轻量级模型