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