128 lines
4.9 KiB
Markdown
128 lines
4.9 KiB
Markdown
# 知识库模块实施计划
|
||
|
||
## 技术选型
|
||
|
||
| 项目 | 选择 |
|
||
|------|------|
|
||
| 文档解析 | 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 向量化
|
||
```
|