imetting_backend/KB_PROMPT_ID_IMPLEMENTATION...

4.4 KiB
Raw Permalink Blame History

知识库提示词模版选择功能实现总结

功能概述

为知识库生成功能添加了提示词模版选择支持,用户在创建知识库时可以选择使用的生成模版。

实现的功能点

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. 获取启用的知识库任务模版列表

GET /api/prompts/active/KNOWLEDGE_TASK
Authorization: Bearer <token>

返回:

{
  "code": "200",
  "message": "获取启用模版列表成功",
  "data": {
    "prompts": [
      {"id": 2, "name": "默认知识库生成", "is_default": true},
      {"id": 13, "name": "分析总结模版", "is_default": false}
    ]
  }
}

2. 创建知识库时指定模版

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表示未指定

总结

知识库提示词模版选择功能已完全实现并通过测试,与会议总结功能保持一致的设计和实现方式。用户现在可以在创建知识库时选择不同的生成模版,以满足不同场景的需求。