4.9 KiB
4.9 KiB
知识库模块实施计划
技术选型
| 项目 | 选择 |
|---|---|
| 文档解析 | Apache Tika(一个依赖支持 PDF/Word/TXT/MD) |
| 向量化引擎 | Ollama(默认 nomic-embed-text)或 DeepSeek(text-embedding-3-small),前端可切换 |
| 向量存储 | PostgreSQL + pgvector(已有) |
| 文件存储 | MinIO(已有) |
| 切片策略 | 500 Token,10% 重叠 |
实施步骤
Step 0:AI 配置管理(前置)
| 端 | 内容 |
|---|---|
| 后端新增 | AiConfigService — 读取/写入 AI 配置(provider、模型名、API Key),存入 Redis |
| 后端实现 | AiConfigController 的 get/put/test 三个方法 |
| 后端改动 | EmbeddingService 每次调用前查配置,根据 provider 路由到 Ollama 或 DeepSeek |
| 前端新增 | 知识库页内加"Embedding 配置"区域:Provider 下拉框(Ollama / DeepSeek)+ 模型名输入框 |
Step 1:添加依赖
修改 ims-service/pom.xml,新增依赖:
| 依赖 | 用途 |
|---|---|
org.apache.tika:tika-core |
文档解析 |
org.springframework.ai:spring-ai-ollama-spring-boot-starter |
Ollama Embedding 调用 |
Step 2:创建 Service 接口 + 实现(8 个新文件)
| 文件 | 包路径 | 说明 |
|---|---|---|
EmbeddingService.java |
com.ims.service.knowledge |
接口:embed(text) + search(query, topK) |
AiConfigService.java |
com.ims.service.knowledge |
AI 配置读写,存入 Redis |
OllamaEmbeddingService.java |
com.ims.service.knowledge |
调用 Ollama 实现 Embedding |
DeepSeekEmbeddingService.java |
com.ims.service.knowledge |
调用 DeepSeek API 实现 Embedding |
DocumentParserService.java |
com.ims.service.knowledge |
Tika 解析 + 500 Token 切片 |
KnowledgeService.java |
com.ims.service.knowledge |
上传→MinIO→DB、列表、删除、重新索引 |
SearchService.java |
com.ims.service.knowledge |
pgvector 余弦相似度检索 |
SearchLogService.java |
com.ims.service.knowledge |
检索审计日志记录 |
Step 3:实现 Controller
| Controller | 方法 | 功能 |
|---|---|---|
AiConfigController |
GET /api/v1/ai/config |
读取 AI 配置 |
PUT /api/v1/ai/config |
更新 AI 配置 | |
POST /api/v1/ai/config/test |
测试连接 | |
KnowledgeController |
GET /documents |
文档列表(分页) |
POST /documents |
上传文档 → 解析 → 切片 → 向量化 → 入库 | |
DELETE /documents/{id} |
删除文档 + MinIO 文件 + 向量 | |
POST /documents/{id}/reindex |
重新向量化 | |
GET /search |
检索接口 | |
GET /logs |
检索日志列表 |
Step 4:前端知识库页面
修改 frontend/src/pages/knowledge-base/index.tsx:
| 组件 | 参考设计 |
|---|---|
| Tab 切换 | 文档管理 / 检索审计 |
| Embedding 配置区 | Provider 下拉框(Ollama / DeepSeek)+ 模型名输入框 |
| 上传拖拽区 | Ant Design Upload.Dragger |
| 文档表格 | Ant Design Table(文件名/上传人/时间/状态/分块数/操作) |
| 搜索框 | Ant Design Input.Search |
| 检索日志表格 | Ant Design Table |
| 统计卡片 | Ant Design Card + Statistic |
Step 5:配置
| 项目 | 操作 |
|---|---|
| Ollama 模型 | ollama pull nomic-embed-text |
| MinIO bucket | 管理后台创建 ims-attachments |
文件清单
修改:
backend/ims-service/pom.xml +2 依赖
backend/ims-api/src/main/java/.../AiConfigController.java 填充 3 个方法
backend/ims-api/src/main/java/.../KnowledgeController.java 填充 6 个方法
frontend/src/pages/knowledge-base/index.tsx 重写
新增(后端):
backend/ims-service/src/main/java/com/ims/service/knowledge/
├── EmbeddingService.java
├── AiConfigService.java
├── OllamaEmbeddingService.java
├── DeepSeekEmbeddingService.java
├── DocumentParserService.java
├── KnowledgeService.java
├── SearchService.java
└── SearchLogService.java
新增(前端):
frontend/src/pages/knowledge-base/services.ts API 封装
实施顺序
前置条件(你手动执行)
① ollama pull nomic-embed-text(如果用 DeepSeek 则跳过)
② MinIO 创建 ims-attachments bucket
③ 如需 DeepSeek 则准备 API Key
↓
代码实施(我写)
Step 0: AiConfigService + AiConfigController + 前端配置区
Step 1: pom.xml 加依赖 → mvn install 验证
Step 2: 8 个 Service 文件
Step 3: 填充 Controller
Step 4: 前端页面 + services.ts
↓
验证
① 启动后端 + 前端
② 配置页选择 Ollama + nomic-embed-text → 保存
③ 上传一个 PDF → 检查是否解析/切片/向量化成功
④ 检索 → 检查返回结果
⑤ 查看审计日志
⑥ 切到 DeepSeek 重新索引 → 验证 DeepSeek 向量化