| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227 |
- """
- 知识库管理相关 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"。
- """
|