""" 知识库管理相关 Prompt 包含知识库管理 prompt(供 KnowHub Server 调用)。 """ # ===== 去重相关 ===== DEDUP_RELATION_PROMPT = """你是知识库管理专家。请判断【新知识】与【相似知识列表】中每条知识的关系。 【新知识】 Task: {new_task} Content: {new_content} 【相似知识列表】(向量召回 top-10,按相似度排序) {existing_list} 格式: [序号] ID: xxx | Task: xxx | Content: xxx 【关系类型定义】 - duplicate: task 和 content 语义完全相同,无新增信息 → 新知识应 rejected - subset: task语义一致,新知识的content信息完全被某条已有知识覆盖 → 新知识应 rejected - superset: task语义一致,新知识包含某条已有知识的全部信息,且有额外内容 → 新知识应 approved - conflict: 同一 task 下给出相互矛盾的结论 → 新知识应 approved - complement: 描述同一 task 的不同方面,互补 → 新知识应 approved - none: task 语义不同,或无实质关系 → 新知识应 approved,不写入 relations 【判断步骤】 第一步:逐条比较新知识的 task 与列表中每条知识的 task 语义是否一致。 - task 语义一致 = 两者描述的是同一个问题或目标(即使措辞不同) - task 语义不同 = 描述的是不同的问题、不同的工具、不同的场景 - 如果 task 语义不同,该条关系直接判定为 none,**不再看 content** - 只有 task 语义一致时,才进入第二步比较 content 第二步:对 task 语义一致的知识,比较 content,判断具体关系类型(duplicate/subset/superset/conflict/complement)。 **规则**: 1. 如果以上类型无法准确描述,可自定义关系类型(英文小写下划线),并自行决定 approved/rejected 2. final_decision 为 rejected 时,relations 中必须至少有一条关系说明拒绝原因(type 不能为 none) 【输出格式】(严格 JSON,不要其他内容) 示例1 - 无关知识(task 不同): {{ "final_decision": "approved", "relations": [] }} 示例2 - 重复知识: {{ "final_decision": "rejected", "relations": [ {{ "old_id": "knowledge-xxx", "type": "duplicate", "reverse_type": "duplicate" }} ] }} 示例3 - 互补知识: {{ "final_decision": "approved", "relations": [ {{ "old_id": "knowledge-xxx", "type": "complement", "reverse_type": "complement" }} ] }} """ # ===== 工具分析相关 ===== TOOL_ANALYSIS_PROMPT = """\ 分析以下知识条目,判断是否涉及"图像创作或解构任务中使用的工具"。 工具范畴(包括但不限于): - AI 生图平台/模型:Midjourney、Stable Diffusion、DALL-E、Flux、ComfyUI - SD 插件/节点:ControlNet、IP-Adapter、InstantID、DWPose、DSINE - 图像处理库:rembg、PIL/Pillow、OpenCV、scikit-image - LoRA/checkpoint 模型、ComfyUI 自定义节点、AI 绘图辅助工具 知识条目: task: {task} content: {content} 要求: - 如果涉及上述工具,提取每个工具的信息并以 JSON 格式返回。 - 如果不涉及任何工具,返回 {{"has_tools": false}}。 - 只输出 JSON,不要输出其他内容。 输出格式: {{ "has_tools": true, "tools": [ {{ "name": "工具名称(原名)", "slug": "小写英文短名,空格换下划线,如 controlnet、ip_adapter", "category": "image_gen | image_process | model | plugin | workflow | other", "version": "版本号或 null", "description": "一句话功能介绍", "usage": "核心用法", "scenarios": ["应用场景1", "应用场景2"], "input": "输入类型描述或 null", "output": "输出类型描述或 null", "source": "来源/文档链接或 null", "status": "未接入" }} ] }} """ # ===== 检索重排序相关 ===== RERANK_PROMPT_TEMPLATE = """你是知识检索专家。根据用户查询,从候选知识中选出最相关的 {top_k} 条。 用户查询:"{query}" 候选知识: {candidates_text} 请输出最相关的 {top_k} 个知识 ID,按相关性从高到低排序,用逗号分隔。 只输出 ID,不要其他内容。""" # ===== 知识进化相关 ===== KNOWLEDGE_EVOLVE_PROMPT_TEMPLATE = """你是一个 AI Agent 知识库管理员。请根据反馈建议,对现有的知识内容进行重写进化。 【原知识内容】: {old_content} 【实战反馈建议】: {feedback} 【重写要求】: 1. 融合知识:将反馈中的避坑指南、新参数或修正后的选择逻辑融入原知识,使其更具通用性和准确性。 2. 保持结构:如果原内容有特定格式(如 Markdown、代码示例等),请保持该格式。 3. 语言:简洁直接,使用中文。 4. 禁止:严禁输出任何开场白、解释语或额外的 Markdown 标题,直接返回重写后的正文。 """ # ===== 知识瘦身相关 ===== KNOWLEDGE_SLIM_PROMPT_TEMPLATE = """你是一个 AI Agent 知识库管理员。以下是当前知识库的全部条目,请执行瘦身操作: 【任务】: 1. 识别语义高度相似或重复的知识,将它们合并为一条更精炼、更通用的知识。 2. 合并时保留 helpful 最高的那条的 ID(helpful 取各条之和)。 3. 对于独立的、无重复的知识,保持原样不动。 【当前知识库】: {entries_text} 【输出格式要求】: 严格按以下格式输出每条知识,条目之间用 === 分隔: ID: <保留的id> TYPES: <逗号分隔的type列表> HELPFUL: <合并后的helpful计数> HARMFUL: <合并后的harmful计数> SCORE: <评分> TASK: <任务描述> CONTENT: <合并后的知识内容> === 最后输出合并报告: REPORT: 原有 X 条,合并后 Y 条,精简了 Z 条。 禁止输出任何开场白或解释。""" # ===== 消息提取相关 ===== MESSAGE_EXTRACT_PROMPT_TEMPLATE = """你是一个知识提取专家。请从以下 Agent 对话历史中提取有价值的知识。 【对话历史】: {messages_text} 【提取要求】: 1. 识别对话中的关键知识点(工具使用经验、问题解决方案、最佳实践、踩坑经验等) 2. 每条知识必须包含: - task: 任务场景描述(在什么情况下,要完成什么目标) - content: 核心知识内容(具体可操作的方法、注意事项) - types: 知识类型(从 strategy/tool/user_profile/usecase/definition/plan 中选择) - score: 评分 1-5(根据知识的价值和可操作性) 3. 只提取有实际价值的知识,不要提取泛泛而谈的内容,一次就成功或比较简单的经验就不要记录了。 4. 如果没有值得提取的知识,返回空列表 【输出格式】: 严格按以下 JSON 格式输出,每条知识之间用逗号分隔: [ {{ "task": "任务场景描述", "content": "核心知识内容", "types": ["strategy"], "score": 4 }}, {{ "task": "另一个任务场景", "content": "另一个知识内容", "types": ["tool"], "score": 5 }} ] 如果没有知识,输出: [] **注意**:只记录经过多次尝试、或经过用户指导才成功的知识,一次就成功或比较简单的经验就不要记录了。 禁止输出任何解释或额外文本,只输出 JSON 数组。""" # ===== 语义路由相关(原有的,保留)===== KNOWLEDGE_SEMANTIC_ROUTE_PROMPT_TEMPLATE = """你是一个知识检索专家。根据用户的当前任务需求,从下列原子知识元数据中挑选出最相关的最多 {routing_k} 个知识 ID。 任务需求:"{query_text}" 可选知识列表: {routing_data} 请直接输出 ID 列表,用逗号分隔(例如: knowledge-20260302-001, research-20260302-002)。若无相关项请输出 "None"。 """