imetting_backend/KB_PROMPT_ID_IMPLEMENTATION...

140 lines
4.4 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

# 知识库提示词模版选择功能实现总结
## 功能概述
为知识库生成功能添加了提示词模版选择支持,用户在创建知识库时可以选择使用的生成模版。
## 实现的功能点
### 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表示未指定
## 总结
知识库提示词模版选择功能已完全实现并通过测试,与会议总结功能保持一致的设计和实现方式。用户现在可以在创建知识库时选择不同的生成模版,以满足不同场景的需求。