imetting_backend/KB_PROMPT_ID_IMPLEMENTATION...

140 lines
4.4 KiB
Markdown
Raw Normal View History

2025-12-11 08:48:12 +00:00
# 知识库提示词模版选择功能实现总结
## 功能概述
为知识库生成功能添加了提示词模版选择支持,用户在创建知识库时可以选择使用的生成模版。
## 实现的功能点
### 1. 修改请求模型 ✅
**文件**: `app/models/models.py`
- `CreateKnowledgeBaseRequest` 模型增加 `prompt_id` 字段
- 类型Optional[int] = None
- 不指定时使用默认模版
### 2. 修改知识库异步服务 ✅
**文件**: `app/services/async_knowledge_base_service.py`
#### 2.1 修改任务创建
- `start_generation()`: 增加 `prompt_id` 参数
- 将 prompt_id 存储到 Redis 和数据库
- 支持通过 cursor 参数直接插入(事务场景)
#### 2.2 修改任务处理
- `_process_task()`: 从 Redis 读取 prompt_id传递给 `_build_prompt()`
- 处理空字符串情况,转换为 None
#### 2.3 修改提示词构建
- `_build_prompt()`: 增加 `prompt_id` 参数
- 调用 `llm_service.get_task_prompt('KNOWLEDGE_TASK', prompt_id=prompt_id)`
- 支持获取指定模版或默认模版
#### 2.4 修改数据库保存
- `_save_task_to_db()`: 增加 `prompt_id` 参数
- 插入时包含 prompt_id 字段
### 3. 修改API接口 ✅
**文件**: `app/api/endpoints/knowledge_base.py`
- `create_knowledge_base`: 从请求中获取 `prompt_id`
- 调用 `async_kb_service.start_generation()` 时传递 `prompt_id`
### 4. 数据库字段 ✅
- `knowledge_base_tasks` 表已包含 `prompt_id` 列(用户已添加)
- 类型int
- 可空NO默认值0
## 数据流向
```
前端 → POST /api/knowledge-bases (prompt_id)
→ CreateKnowledgeBaseRequest (prompt_id)
→ async_kb_service.start_generation(prompt_id)
→ 存储到 Redis 和 DB (knowledge_base_tasks.prompt_id)
→ _process_task() 读取 prompt_id
→ _build_prompt(prompt_id)
→ llm_service.get_task_prompt('KNOWLEDGE_TASK', prompt_id)
→ 获取指定模版或默认模版
```
## 向后兼容性
所有新增的 `prompt_id` 参数都是可选的Optional[int] = None确保
1. 不传递 prompt_id 时,自动使用默认模版
2. 现有代码无需修改即可正常工作
3. 数据库中 prompt_id 有默认值 0
## 测试结果
执行 `test_kb_prompt_id_feature.py` 测试脚本,所有测试通过:
- ✅ 获取启用的知识库提示词列表 (3个模版)
- ✅ 通过prompt_id获取提示词内容
- ✅ 获取默认提示词不指定prompt_id
- ✅ 验证方法签名支持prompt_id参数
- ✅ 验证数据库schema包含prompt_id列
- ✅ 验证API模型定义正确
## 使用示例
### 1. 获取启用的知识库任务模版列表
```bash
GET /api/prompts/active/KNOWLEDGE_TASK
Authorization: Bearer <token>
```
返回:
```json
{
"code": "200",
"message": "获取启用模版列表成功",
"data": {
"prompts": [
{"id": 2, "name": "默认知识库生成", "is_default": true},
{"id": 13, "name": "分析总结模版", "is_default": false}
]
}
}
```
### 2. 创建知识库时指定模版
```bash
POST /api/knowledge-bases
Authorization: Bearer <token>
Content-Type: application/json
{
"title": "产品会议知识库",
"is_shared": false,
"user_prompt": "重点提取产品功能相关信息",
"source_meeting_ids": "1,2,3",
"tags": "产品,功能",
"prompt_id": 13
}
```
## 文件变更列表
1. `app/models/models.py` - 修改CreateKnowledgeBaseRequest模型
2. `app/services/async_knowledge_base_service.py` - 修改5个方法
3. `app/api/endpoints/knowledge_base.py` - 修改create_knowledge_base端点
4. `test_kb_prompt_id_feature.py` - 测试脚本
## 与会议总结功能的一致性
知识库的实现与会议总结功能保持一致:
- 相同的prompt_id传递机制
- 相同的Redis存储格式字符串
- 相同的数据库字段类型
- 相同的向后兼容策略
- 相同的验证逻辑task_type + is_active
## 注意事项
1. prompt_id 会与 task_type='KNOWLEDGE_TASK' 一起验证
2. 如果指定的 prompt_id 不存在或未启用,会自动使用默认模版
3. 历史任务记录保留 prompt_id即使对应的提示词被删除
4. Redis 中 prompt_id 存储为字符串,使用时需转换为 int
5. 数据库 prompt_id 默认值为 0表示未指定
## 总结
知识库提示词模版选择功能已完全实现并通过测试,与会议总结功能保持一致的设计和实现方式。用户现在可以在创建知识库时选择不同的生成模版,以满足不同场景的需求。