gwdoc/prompts.py
2026-07-24 10:42:26 +08:00

1255 lines
65 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

"""
提示词集中管理模块
将各工作流中的提示词统一提取到此处,方便调整和维护。
每个提示词都附有详细注释说明其用途和所属工作流节点。
模块结构:
- COMMON_PROMPTS: 多个工作流共享的提示词(格式规范、友好回复、无检索建议等)
- BAIKE_PROMPTS: 百科问答工作流专用提示词
- STATISTICS_PROMPTS: 统计工作流专用提示词
- FAULT_DIAGNOSIS_PROMPTS: 故障诊断工作流专用提示词(仅含与操作指导不同的部分)
- OPERATE_PROMPTS: 操作指导工作流专用提示词(仅含与故障诊断不同的部分)
"""
# ============================================================
# 一、共享提示词(多个工作流通用)
# ============================================================
COMMON_PROMPTS = {
# ------------------------------------------------------------------
# 格式规范系统提示词
# 用于: workflow_baike.py (generate_answer)、workflow_utils.py (stream_format_and_postprocess)
# ------------------------------------------------------------------
"format_system": (
"你是一个专业的格式规范助手,负责将给定的文本内容规范成美观、易读的格式。"
),
# ------------------------------------------------------------------
# 格式规范用户提示词(带图片示例,用于百科问答和通用格式化)
# 输入变量: raw_content
# 用于: workflow_baike.py (generate_answer)、workflow_utils.py (stream_format_and_postprocess 无content_label时)
# ------------------------------------------------------------------
"format_user_with_image_examples": (
"请将以下内容规范成美观、易读的Markdown格式\n"
"\n"
"【原始内容】\n"
"{raw_content}\n"
"\n"
"【格式规范要求】\n"
"1. 保持原始内容的完整性和准确性,**不要修改任何内容**,只调整格式\n"
"2. 适当使用标题、段落分隔等Markdown格式使内容更易读\n"
"3. 确保图片链接在相关位置自然展示使用,并且只输出准确格式,`![图片](/api/v1/knowledge/files/images/xxx.jpg)` \n"
"4. 如果参考资料中没有图片,**不要输出任何关于图片的说明**\n"
"5. 确保LaTeX公式格式正确$$...$$,并在 $$...$$ 前后加空格\n"
"6. 如果有代码片段,使用适当的代码块格式\n"
"7. 不要添加任何额外的解释或说明\n"
"\n"
"【图片输出示例】\n"
"示例一: 原始内容:`![图片](images/xxx.jpg)`\n"
" 规范后输出:`![图片](/api/v1/knowledge/files/images/xxx.jpg)`\n"
"示例二: 原始内容:`![图片](/api/v1/knowledge/files/images/xxx.jpg)`\n"
" 规范后输出:`![图片](/api/v1/knowledge/files/images/xxx.jpg)`\n"
"示例三: 原始内容:`images/xxx.jpg`\n"
" 规范后输出:`![图片](/api/v1/knowledge/files/images/xxx.jpg)`\n"
"示例四: 原始内容:`xxx.jpg`\n"
" 规范后输出:`![图片](/api/v1/knowledge/files/images/xxx.jpg)`\n"
"示例五: 原始内容:`![油污清理](/api/v1/knowledge/files/images/ce9650912c24fa0ed693228469322ec2a735f14d9ac729a1dc87427441bad0b.jpg)`\n"
" 规范后输出:`![图片](/api/v1/knowledge/files/images/ce9650912c24fa0ed693228469322ec2a735f14d9ac729a1dc87427441bad0b.jpg)`\n"
"示例六: 原始内容:`![部分断裂的螺栓及垫片](![图片](/api/v1/knowledge/files/images/e34eb1ddbe26730c84409e02365db416e74ce9e3bf2793a2605db5a085548415.jpg)`\n"
" 规范后输出:`![图片](/api/v1/knowledge/files/images/e34eb1ddbe26730c84409e02365db416e74ce9e3bf2793a2605db5a085548415.jpg)`\n"
"\n"
"请直接输出规范后的内容:"
),
# ------------------------------------------------------------------
# 格式规范用户提示词(简化版,用于方案重新格式化,图片链接保持原样)
# 输入变量: content_label, raw_content
# 用于: workflow_utils.py (stream_format_and_postprocess 有content_label时)
# ------------------------------------------------------------------
"format_user_simple": (
"请将以下{content_label}内容规范成美观、易读的Markdown格式\n"
"\n"
"【原始内容】\n"
"{raw_content}\n"
"\n"
"【格式规范要求】\n"
"1. 保持原始内容的完整性和准确性,**不要修改任何内容**,只调整格式\n"
"2. 适当使用标题、列表、段落分隔等Markdown格式使内容更易读\n"
"3. 确保图片链接保持原样:`![图片](URL)`\n"
"4. 确保LaTeX公式格式正确$$...$$,并在 $$...$$ 前后加空格\n"
"5. 如果有代码片段,使用适当的代码块格式\n"
"6. 不要添加任何额外的解释或说明\n"
"\n"
"请直接输出规范后的内容:"
),
# ------------------------------------------------------------------
# 意图分类用户提示词(故障诊断和操作指导共用)
# 输入变量: combined_query
# 用于: workflow_fault_diagnosis.py、workflow_operate.py 的 classify_intent 节点
# ------------------------------------------------------------------
"classify_intent_user": (
"\n"
"### 用户输入\n"
"\"{combined_query}\"\n"
"\n"
"请根据上述标准进行意图分类:"
),
# ------------------------------------------------------------------
# 信息提取用户提示词(故障诊断和操作指导共用)
# 输入变量: existing_info_str, history_str, combined_query
# 用于: workflow_fault_diagnosis.py、workflow_operate.py 的 extract_info 节点
# ------------------------------------------------------------------
"extract_info_user": (
"请从以下内容中提取{biz_label}相关信息:\n"
"\n"
"【已提取的信息】\n"
"{existing_info_str}\n"
"\n"
"【历史对话】\n"
"{history_str}\n"
"\n"
"【当前用户输入】\n"
"{combined_query}\n"
"\n"
"请提取信息JSON格式"
),
# ------------------------------------------------------------------
# 询问用户系统提示词(故障诊断和操作指导共用)
# 用于: workflow_fault_diagnosis.py、workflow_operate.py 的 ask_user 节点
# ------------------------------------------------------------------
"ask_user_system": (
"你是一个专业的{biz_label}助手,需要友好地引导用户提供缺失信息。\n"
"\n"
"要求:\n"
"1. 语气友好、专业,不要生硬\n"
"2. 说明为什么需要这些信息(更准确的{biz_label_short}\n"
"3. 鼓励用户提供更多细节"
),
# ------------------------------------------------------------------
# 询问用户提示词(故障诊断和操作指导共用)
# 输入变量: info_completeness, existing_str, missing_str, combined_query
# ------------------------------------------------------------------
"ask_user_prompt": (
"请生成一段友好的回复,引导用户补充缺失信息。\n"
"\n"
"【已获取的信息】(完整性评分: {info_completeness}\n"
"{existing_str}\n"
"\n"
"【缺失的信息】\n"
"{missing_str}\n"
"\n"
"【用户当前输入】\n"
"{combined_query}\n"
"\n"
"请生成回复:"
),
# ------------------------------------------------------------------
# 无检索结果且无设备信息时的系统提示词(故障诊断和操作指导共用)
# ------------------------------------------------------------------
"generate_response_friendly_system": (
"你是一个友好的{biz_label}助手。用户可能只是在打招呼或询问一般性问题。\n"
"请友好地回复,并简要介绍你能提供的帮助。"
),
# ------------------------------------------------------------------
# 无检索结果且无设备信息时的用户提示词(故障诊断和操作指导共用)
# 输入变量: combined_query
# ------------------------------------------------------------------
"generate_response_friendly_user": (
"用户说:{combined_query}\n"
"\n"
"请友好回复:"
),
# ------------------------------------------------------------------
# 无检索结果但有设备信息时的系统提示词(故障诊断和操作指导共用)
# ------------------------------------------------------------------
"generate_response_no_rag_system": (
"你是一个专业的{biz_label}助手。\n"
"虽然没有检索到相关资料,但可以根据用户提供的信息给出一般性建议。\n"
"注意:明确告知用户这是基于一般经验的建议。"
),
# ------------------------------------------------------------------
# 无检索结果(简化版)系统提示词(故障诊断和操作指导共用)
# ------------------------------------------------------------------
"generate_response_no_rag_simple_system": (
"你是一个专业的{biz_label}助手。\n"
"虽然没有检索到相关资料,但可以根据用户提供的信息给出一般性建议。"
),
# ------------------------------------------------------------------
# 后续交互提示词(故障诊断和操作指导共用)
# 输入变量: biz_label, ship_number, device_name, item_name, detail_info,
# rag_answer, combined_query, image_guidance
# 用于: workflow_fault_diagnosis.py、workflow_operate.py 的 generate_response 节点
# ------------------------------------------------------------------
"generate_response_follow_up": (
"你是一名资深工业设备{biz_label}工程师。用户正在与你进行后续交互。\n"
"\n"
"【设备信息】\n"
"- 舷号:{ship_number}\n"
"- 设备名称:{device_name}\n"
"- {item_label}{item_name}\n"
"{detail_info}"
"【参考资料】\n"
"{rag_answer}\n"
"\n"
"【用户当前问题】\n"
"{combined_query}\n"
"\n"
"【输出要求】\n"
"1. {image_guidance}\n"
"2. 如果参考资料包含表格,请转化成不用表格的形式输出内容\n"
"3. 如果参考资料包含 LaTeX 公式,请转为 $$...$$ 公式格式输出,并在 $$...$$ 前后加空格\n"
"4. 所有链接必须与参考资料保持一致,不得裁剪、转义或改写\n"
"5. 不能虚构参考资料中未提及的图片、表格、零件号或步骤\n"
"\n"
"请给出回复:"
),
# ------------------------------------------------------------------
# 正常生成方案提示词(故障诊断和操作指导共用)
# 输入变量: biz_label, ship_number, device_name, item_name, item_label,
# detail_info, item_action, rag_answer
# ------------------------------------------------------------------
"generate_response_normal": (
"你是一名资深工业设备{biz_label}工程师,请根据以下信息生成{biz_label}分析与{biz_label}方案。\n"
"\n"
"【设备信息】\n"
"- 舷号:{ship_number}\n"
"- 设备名称:{device_name}\n"
"- {item_label}{item_name}\n"
"{detail_info}"
"当前的{item_label}要以{item_name}为准,{item_action}\n"
"\n"
"【参考资料】\n"
"{rag_answer}\n"
"\n"
"【输出要求】\n"
"1. **重要**:如果参考资料中包含图片链接(格式为 `![图片](URL)` 或 `images/xxx.jpg`),请务必在相关位置自然展示使用,如果参考资料中没有图片,**不要输出任何关于图片的说明**\n"
"2. 如果参考资料包含 LaTeX 公式、连接等,请在对应位置正常使用,不得修改或删除\n"
"3. 请专注于内容的准确性、完整性和逻辑性,不要担心格式的美观性\n"
"4. 可以适当使用简单的段落分隔但不要使用复杂的Markdown格式\n"
"5. 如果参考资料包含表格,请不要输出表格,而要直接描述表格的内容\n"
"\n"
"请给出回复:"
),
# ------------------------------------------------------------------
# 基于反馈重新生成方案提示词(故障诊断和操作指导共用)
# 输入变量: biz_label, ship_number, device_name, item_name, item_label,
# detail_info, item_action, user_feedback_for_regenerate,
# rag_answer, image_guidance
# ------------------------------------------------------------------
"generate_response_regenerating": (
"你是一名资深工业设备{biz_label}工程师。用户对之前的方案有反馈,请根据反馈重新生成{biz_label}分析与{biz_label}方案。\n"
"\n"
"【设备信息】\n"
"- 舷号:{ship_number}\n"
"- 设备名称:{device_name}\n"
"- {item_label}{item_name}\n"
"{detail_info}"
"【用户反馈】\n"
"{user_feedback_for_regenerate}\n"
"\n"
"【参考资料】\n"
"{rag_answer}\n"
"\n"
"【输出要求】\n"
"1. 先用一句话判断{item_label}原因(包含舷号、设备、{item_label}不超过40字\n"
"2. 然后给出{biz_label}方案,步骤清晰、可直接执行\n"
"3. 根据用户的反馈调整方案\n"
"4. 如果参考资料信息不足,明确指出缺少什么\n"
"5. {image_guidance},如果参考资料中没有图片,**不要输出任何关于图片的说明**\n"
"6. 如果参考资料包含表格,请转化成不用表格的形式输出内容\n"
"7. 如果参考资料包含 LaTeX 公式,请转为 $$...$$ 公式格式输出,并在 $$...$$ 前后加空格\n"
"8. 所有链接必须与参考资料保持一致,不得裁剪、转义或改写\n"
"9. 不能虚构参考资料中未提及的图片、表格、零件号或步骤\n"
"\n"
"请直接输出调整后的方案:"
),
# ------------------------------------------------------------------
# 生成内容系统提示词(故障诊断和操作指导共用)
# ------------------------------------------------------------------
"generate_response_content_system": (
"你是一名资深工业设备{biz_label}工程师,严格依据检索信息生成{biz_label}方案。请专注于内容的准确性、完整性和逻辑性,如果参考资料中包含图片,请务必在回答中展示出来。"
),
# ------------------------------------------------------------------
# 深度分析点选择系统提示词(故障诊断和操作指导共用)
# ------------------------------------------------------------------
"deep_rag_analysis_system": (
"你是一名资深工业设备{biz_label}专家。用户反馈之前的方案没有解决问题,请分析:\n"
"1. 之前方案可能存在的不足\n"
"2. 用户当前问题的关键点\n"
"3. 选择3-5个可以深入检索的分析点如特定部件、原理、{biz_label}方法等)\n"
"\n"
"输出格式JSON\n"
"{\n"
" \"analysis_points\": [\"分析点1\", \"分析点2\", \"分析点3\"],\n"
" \"reason\": \"分析理由\"\n"
"}"
),
# ------------------------------------------------------------------
# 深度分析点选择用户提示词(故障诊断和操作指导共用)
# 输入变量: ship_number, device_name, item_name, item_label, detail_info,
# history_str, last_generated_scheme, combined_query
# ------------------------------------------------------------------
"deep_rag_analysis_user": (
"【设备信息】\n"
"- 舷号:{ship_number}\n"
"- 设备名称:{device_name}\n"
"- {item_label}{item_name}\n"
"{detail_info}"
"\n"
"【对话历史】\n"
"{history_str}\n"
"\n"
"【之前的方案】\n"
"{last_generated_scheme}\n"
"\n"
"【用户当前反馈】\n"
"{combined_query}\n"
"\n"
"请分析并选择深度分析点JSON格式"
),
# ------------------------------------------------------------------
# 深度响应生成提示词(故障诊断和操作指导共用)
# 输入变量: biz_label, ship_number, device_name, item_name, item_label,
# detail_info, combined_query, analysis_points_prompt,
# analysis_points_text, original_rag_text, graph_results
# ------------------------------------------------------------------
"generate_deep_response": (
"你是一名资深工业设备{biz_label}专家。用户反馈之前的方案没有解决问题,请根据多维度深度检索的资料,进行深入的{item_label}原因分析和解决方案规划。\n"
"\n"
"【设备信息】\n"
"- 舷号:{ship_number}\n"
"- 设备名称:{device_name}\n"
"- {item_label}{item_name}\n"
"{detail_info}"
"【用户反馈】\n"
"{combined_query}\n"
"{analysis_points_prompt}"
"【针对分析点的深度检索资料】\n"
"{analysis_points_text}\n"
"{original_rag_text}\n"
"\n"
"【图谱检索结果】\n"
"{graph_results}\n"
"\n"
"【输出要求】\n"
"1. 首先重新深入分析{item_label}原因,结合所有检索资料进行推理\n"
"2. 给出更详细、更精准的{biz_label}方案,步骤清晰、可直接执行\n"
"3. 重点关注用户反馈的问题,根据用户反馈和检索资料,进行{item_label}原因分析和解决方案规划。\n"
"4. **重要**:如果参考资料中包含图片链接(格式为 `![图片](URL)` 或 `images/xxx.jpg`),请务必在相关位置自然展示使用,如果参考资料中没有图片,**不要输出任何关于图片的说明**\n"
"5. 如果参考资料包含 LaTeX 公式、连接等,请在对应位置正常使用,不得修改或删除\n"
"6. 请专注于内容的准确性、完整性和逻辑性,不要担心格式的美观性\n"
"7. 可以适当使用简单的段落分隔但不要使用复杂的Markdown格式\n"
"8. 如果参考资料包含表格,请不要输出表格,而要直接描述表格的内容\n"
"\n"
"请直接输出深度分析和方案:"
),
# ------------------------------------------------------------------
# 深度响应内容系统提示词(故障诊断和操作指导共用)
# ------------------------------------------------------------------
"generate_deep_response_content_system": (
"你是一名资深工业设备{biz_label}专家,严格依据检索信息进行深度分析和方案生成。请专注于内容的准确性、完整性和逻辑性,如果参考资料中包含图片,请务必在回答中展示出来。"
),
# ------------------------------------------------------------------
# 基于反馈修改方案提示词(故障诊断和操作指导共用)
# 输入变量: biz_label, ship_number, device_name, item_name, item_label,
# detail_info, item_action, last_scheme, user_feedback, image_guidance
# ------------------------------------------------------------------
"regenerate_scheme_from_feedback": (
"你是一名资深工业设备{biz_label}专家。用户对之前的{biz_label}方案有反馈,请根据反馈直接修改方案。\n"
"\n"
"【设备信息】\n"
"- 舷号:{ship_number}\n"
"- 设备名称:{device_name}\n"
"- {item_label}{item_name}\n"
"{detail_info}"
"当前的{item_label}要以{item_name}为准,{item_action}\n"
"\n"
"【之前的方案】\n"
"{last_scheme}\n"
"\n"
"【用户反馈】\n"
"{user_feedback}\n"
"\n"
"【输出要求】\n"
"1. 首先根据用户反馈,分析之前方案的问题所在\n"
"2. 然后基于之前的方案进行修改和优化,给出调整后的方案\n"
"3. 重点解决用户反馈的问题\n"
"4. {image_guidance}\n"
"5. 如果之前方案包含表格,请转化成不用表格的形式输出内容\n"
"6. 如果之前方案包含 LaTeX 公式,请转为 $$...$$ 公式格式输出,并在 $$...$$ 前后加空格\n"
"7. 所有链接必须与原方案保持一致,不得裁剪、转义或改写\n"
"8. 不能虚构原方案中未提及的图片、表格、零件号或步骤\n"
"\n"
"请直接输出修改后的完整方案:"
),
# ------------------------------------------------------------------
# 基于反馈修改方案系统提示词(故障诊断和操作指导共用)
# ------------------------------------------------------------------
"regenerate_scheme_from_feedback_system": (
"你是一名资深工业设备{biz_label}专家,根据用户反馈直接修改和优化{biz_label}方案。请专注于内容的准确性、完整性和逻辑性。"
),
}
# ============================================================
# 二、百科问答工作流 (workflow_baike.py) 专用提示词
# ============================================================
BAIKE_PROMPTS = {
# ------------------------------------------------------------------
# judge_need_retrieval 节点:判断用户问题是否需要检索知识库
# 输入变量: history_messages, original_query
# ------------------------------------------------------------------
"judge_need_retrieval": (
"You are an intent classifier for a knowledge-base QA assistant. Decide whether the user question needs retrieval.\n"
"\n"
"Return true when the question asks about documents, files, knowledge-base content, equipment, systems, faults, operations, standards, procedures, meeting notes, database-related materials, or any factual/domain-specific information.\n"
"Return false only for pure greetings, thanks, cancellation/confirmation with no substantive question, or a follow-up that can be fully answered from the conversation history alone.\n"
"Default rule: when unsure, return true.\n"
"\n"
"Conversation history:\n"
"{history_messages}\n"
"\n"
"User question:\n"
"{original_query}\n"
"\n"
"Output only true or false."
),
# ------------------------------------------------------------------
# rewrite_query_with_history 节点使用历史上下文重写检索query
# 输入变量: last_user_query, history_str, original_query
# ------------------------------------------------------------------
"rewrite_query_with_history": (
"你是知识库问答系统的检索问题改写助手。请结合当前用户问题与必要的对话上下文,生成适合向量检索/RAG 的主查询和补充查询。\n"
"\n"
"第一步:补全当前问题\n"
"1. 以【当前用户问题】表达的意图为最高优先级。只有当前问题存在指代、省略或承接关系时,才使用历史补全;如果当前问题已经完整独立,不要强行融入历史。\n"
"2. 需要补全时,优先参考【上一轮用户问题】,再从最近的相关对话中确认对象、设备、故障、操作、时间或其他必要限定;忽略与当前意图无关的历史。\n"
"3. 将“这个”“它”“上述问题”“刚才的故障”等指代替换为明确对象,使主查询脱离对话也能独立理解。\n"
"4. 保留用户原意和关键术语,不虚构历史中没有的信息,不回答问题,不添加检索范围之外的背景。\n"
"\n"
"第二步:判断是否需要拆分\n"
"1. 单知识点查询问题只涉及一个主题下的一个明确检索意图。不要拆分rewrite_query 输出补全后的问题search_queries 返回空数组。\n"
"2. 单主题多知识点查询:问题围绕同一对象明确询问多个方面时,按知识点拆分为可独立检索的问题。\n"
"3. 多主题多知识点查询:问题涉及多个对象、文档或主题时,优先按主题拆分;比较类问题应分别检索各主题的对应信息,完整比较问题由 rewrite_query 保留。\n"
"4. 不要仅因一句话较长就判定为多知识点,也不要把一个简单问题机械拆成同义句。\n"
"\n"
"第三步:生成检索查询\n"
"1. rewrite_query 必须保留用户的完整检索意图,是一句简洁、自然、自洽的中文问句或陈述句。\n"
"2. search_queries 只放拆分后的代表性子问题最多2条每条聚焦一个明确知识点并包含必要的主题或对象名称。\n"
"3. 主查询与补充查询合计最多3条。不要偏离原主题不要臆造用户未询问的知识点也不要输出答案。\n"
"4. 所有查询均不得包含“改写结果”“检索query”等前缀、条目编号、解释文字或多余引号。\n"
"\n"
"示例:\n"
"当前问题某设备A的工作原理是什么\n"
"输出:{{\"rewrite_query\":\"某设备A的工作原理是什么\",\"search_queries\":[]}}\n"
"\n"
"当前问题:发动机和螺旋桨的工作原理有什么区别?\n"
"输出:{{\"rewrite_query\":\"发动机和螺旋桨的工作原理有什么区别?\",\"search_queries\":[\"发动机的工作原理是什么?\",\"螺旋桨的工作原理是什么?\"]}}\n"
"\n"
"【上一轮用户问题】\n"
"{last_user_query}\n"
"\n"
"【对话历史JSON 格式,已按时间排序)】\n"
"{history_str}\n"
"\n"
"【当前用户问题】\n"
"{original_query}\n"
"\n"
"只输出一个合法的 JSON 对象,不要输出 Markdown 代码块或任何解释。格式如下:\n"
"{{\"rewrite_query\":\"最终主查询\",\"search_queries\":[\"补充查询1\",\"补充查询2\"]}}"
),
# ------------------------------------------------------------------
# generate_suggested_replies_baike 函数:生成百科问答的建议回复问题
# 输入变量: question, answer
# ------------------------------------------------------------------
"generate_suggested_replies": (
"你是一个专业的工业设备问答助手。根据以下问答内容,生成两个用户可能关心的后续问题。\n"
"\n"
"【用户问题】\n"
"{question}\n"
"\n"
"【回答内容】\n"
"{answer}\n"
"\n"
"请生成两个简洁、实用的问题,这些问题应该:\n"
"1. 不得出现需要归档和下载等操作相关的问题\n"
"2. 与当前问答内容相关,能够帮助用户进一步了解相关信息\n"
"3. 问题要具体、可操作\n"
"4. 每个问题不超过20个字\n"
"\n"
"请以JSON格式输出格式如下\n"
"[\n"
" {{\"title\": \"问题1的标题\", \"content\": \"问题1的完整内容\"}},\n"
" {{\"title\": \"问题2的标题\", \"content\": \"问题2的完整内容\"}}\n"
"]\n"
"\n"
"只输出JSON不要有其他文字说明。"
),
# ------------------------------------------------------------------
# generate_answer 节点 - 有检索结果时的系统提示词
# 输入变量: domain_desc
# ------------------------------------------------------------------
"generate_answer_with_retrieval_system": (
"You are a professional knowledge-base assistant for {domain_desc}.\n"
"Answer ONLY from the retrieved evidence provided by the user message. Do not use prior knowledge as factual evidence.\n"
"If the evidence is insufficient, say clearly what is missing and what can be confirmed from the evidence.\n"
"Prefer concrete facts, names, parameters, steps, conclusions, and source relationships from the evidence.\n"
"When sources conflict, explain the conflict instead of inventing a merged fact.\n"
"Use images only when their URLs appear in the retrieved evidence; never fabricate or repair image URLs.\n"
"Always respond in Chinese. Do not expose internal tool names or implementation details."
),
# ------------------------------------------------------------------
# generate_answer 节点 - 有检索结果时的用户提示词
# 输入变量: extracted_text, rag_count, all_source_text
# ------------------------------------------------------------------
"generate_answer_with_retrieval_user": (
"用户问题:\n"
"{extracted_text}\n"
"\n"
"# Retrieved evidence ({rag_count} items)\n"
"\n"
"{all_source_text}\n"
"\n"
"【输出要求】\n"
"1. 先直接回答用户问题,再补充必要依据。\n"
"2. 每个关键事实都必须能在 Retrieved evidence 中找到依据;不要补充资料外结论。\n"
"3. 如果资料只能说明部分内容,请明确说“资料中只能确认...”和“资料中未提供...”。\n"
"4. LaTeX 格式必须严格区分:变量或很短的表达式使用 $...$;包含等号、求和、积分、分式或较长的完整方程必须使用独立段落,且 $$ 必须各自单独占一行。两条独立公式必须分别使用两个公式块,两个公式块之间保留一个空行,不能写进同一个公式块或紧挨在一起。不要把完整方程嵌在列表正文中。\n"
"5. 参考资料中真实存在的图片可在对应段落附近展示URL 必须逐字来自资料。\n"
"6. 表格内容请转成自然语言描述,不要输出复杂表格。\n"
"\n"
"请给出回复:"
),
# ------------------------------------------------------------------
# generate_answer 节点 - 无检索结果时的系统提示词
# 输入变量: domain_desc
# ------------------------------------------------------------------
"generate_answer_without_retrieval_system": (
"我是一个专业的{domain_desc}知识问答助手,根据用户的问题,结合我的专业知识,提供准确、专业、完整的回答内容。"
),
# ------------------------------------------------------------------
# generate_answer 节点 - 无检索结果时的用户提示词
# 输入变量: extracted_text
# ------------------------------------------------------------------
"generate_answer_without_retrieval_user": (
"{extracted_text}\n"
"\n"
"【输出要求】\n"
"1. 请根据您的专业知识提供准确、完整的回答\n"
"2. 可以适当使用简单的段落分隔但不要使用复杂的Markdown格式\n"
"3. 请专注于内容的准确性和专业性\n"
"4. LaTeX 格式必须严格区分:变量或很短的表达式使用 $...$;包含等号、求和、积分、分式或较长的完整方程必须使用独立段落,且 $$ 必须各自单独占一行。两条独立公式必须分别使用两个公式块,两个公式块之间保留一个空行,不能写进同一个公式块或紧挨在一起。不要把完整方程嵌在列表正文中。\n"
"\n"
"请给出回复:"
),
}
# ============================================================
# 三、统计工作流 (workflow_statistics.py) 专用提示词
# ============================================================
STATISTICS_PROMPTS = {
# ------------------------------------------------------------------
# _extract_info_with_llm 函数 - 故障频次统计信息提取
# 输入变量: text
# ------------------------------------------------------------------
"extract_fault_frequency_info": (
"从以下文本中提取统计所需的信息返回JSON格式。\n"
"提取内容:\n"
"- system: 系统名称(如:动力系统、电气系统等),如果没有则为空字符串\n"
"- time: 时间描述(如:近一个月、上周等),如果没有则为空字符串\n"
"\n"
"文本:\n"
"{text}\n"
"\n"
"输出格式示例:\n"
"{{\"system\": \"动力系统\", \"time\": \"近一个月\"}}\n"
"{{\"system\": \"\", \"time\": \"上周\"}}\n"
"{{\"system\": \"电气系统\", \"time\": \"\"}}\n"
"\n"
"现在请提取:"
),
# ------------------------------------------------------------------
# _extract_info_with_llm 函数 - 备件消耗统计信息提取
# 输入变量: text
# ------------------------------------------------------------------
"extract_spare_parts_info": (
"从以下文本中提取统计所需的信息返回JSON格式。\n"
"提取内容:\n"
"- ship_number: 舷号数字101、163等如果没有则为空字符串\n"
"- time: 时间描述(如:近一个月、上周等),如果没有则为空字符串\n"
"\n"
"文本:\n"
"{text}\n"
"\n"
"输出格式示例:\n"
"{{\"ship_number\": \"101\", \"time\": \"近一个月\"}}\n"
"{{\"ship_number\": \"\", \"time\": \"上周\"}}\n"
"{{\"ship_number\": \"163\", \"time\": \"\"}}\n"
"\n"
"现在请提取:"
),
# ------------------------------------------------------------------
# _extract_info_with_llm 函数 - 维修反馈统计信息提取
# 输入变量: text
# ------------------------------------------------------------------
"extract_repair_feedback_info": (
"从以下文本中提取统计所需的信息返回JSON格式。\n"
"提取内容:\n"
"- source: 反馈来源(如:好评、差评、反馈),如果没有则为空字符串\n"
"\n"
"文本:\n"
"{text}\n"
"\n"
"输出格式示例:\n"
"{{\"source\": \"差评\"}}\n"
"{{\"source\": \"好评\"}}\n"
"{{\"source\": \"\"}}\n"
"\n"
"现在请提取:"
),
# ------------------------------------------------------------------
# extract_tool_parameters 节点:统计工具参数提取
# 输入变量: current_date, tool_name, tool_description, params_desc_str,
# history_str, extracted_text, extra_instructions
# ------------------------------------------------------------------
"extract_tool_parameters": (
"你是一个参数提取助手。请从用户问题中提取统计工具所需的参数。\n"
"\n"
"当前日期:{current_date}\n"
"\n"
"工具名称:{tool_name}\n"
"工具描述:{tool_description}\n"
"\n"
"所需参数:\n"
"{params_desc_str}\n"
"\n"
"对话历史:\n"
"{history_str}\n"
"\n"
"用户问题:\n"
"{extracted_text}\n"
"\n"
"请特别注意:\n"
"1. 时间参数映射:\n"
" - \"最近一周\" -> 开始日期为当前日期前7天结束日期为当前日期\n"
" - \"最近一个月\" -> 开始日期为当前日期前30天结束日期为当前日期\n"
" - \"最近三个月\" -> 开始日期为当前日期前90天结束日期为当前日期\n"
" - \"上个月\" -> 开始日期为上个月1号结束日期为上个月最后一天\n"
" - \"今年\" -> 开始日期为今年1月1日结束日期为当前日期\n"
" - 如果用户提到具体日期,请按原样提取\n"
"{extra_instructions}\n"
"3. top_n参数\n"
" - 如果用户提到\"前N个\"\"Top N\"提取N的值\n"
" - 否则使用默认值\n"
"\n"
"请输出JSON格式\n"
"{{\n"
" \"parameters\": {{\n"
" \"参数名\": \"参数值\"\n"
" }},\n"
" \"missing_required\": [\"缺少的必填参数列表\"],\n"
" \"confidence\": 0.0-1.0之间的置信度\n"
"}}\n"
"\n"
"如果某个参数在用户问题中没有提到且不是必填则不要包含在parameters中。\n"
"只输出JSON不要有其他文字。"
),
}
# ============================================================
# 三-B、受控 Text2SQL 工作流 (workflow_statistics.py) 专用提示词
# ============================================================
TEXT2SQL_PROMPTS = {
# ------------------------------------------------------------------
# router_node: 路由判断 - 判断用户问题是统计分析还是普通问答
# 输入变量: question
# ------------------------------------------------------------------
"router": (
"你是一个路由判断专家。请判断用户的问题是否需要查询数据库进行统计分析。\n"
"\n"
"判断标准:\n"
"- 如果问题涉及统计、排名、频次、数量、趋势、对比、分布等,需要查询数据库 → 回答 \"statistics\"\n"
"- 如果问题涉及维修反馈、好评、差评等,需要查询外部系统 → 回答 \"feedback\"\n"
"- 如果是一般性知识问答、维修方法、操作指导等,不需要查询数据库 → 回答 \"normal\"\n"
"\n"
"用户问题:{question}\n"
"\n"
"请输出JSON格式\n"
"{{\"route\": \"statistics\"\"feedback\"\"normal\", \"reason\": \"判断理由\"}}\n"
"只输出JSON不要有其他文字。"
),
# ------------------------------------------------------------------
# SQL Generation: 根据用户问题生成SQL
# 输入变量: schema, question, current_date
# ------------------------------------------------------------------
"sql_generation": (
"你是舰船维修数据分析助手。请根据用户问题生成SQL查询。\n"
"\n"
"【数据库Schema】\n"
"{schema}\n"
"\n"
"【当前日期】{current_date}\n"
"\n"
"【用户问题】\n"
"{question}\n"
"\n"
"【其他有效信息】\n"
"{extra_info}\n"
"【生成规则】\n"
"1. 只能生成 SELECT 语句,禁止 INSERT/UPDATE/DELETE\n"
"2. 只能查询 fault_records 表\n"
"3. 默认 LIMIT 100如果未指定\n"
"4. 不允许使用 UNION、子查询嵌套超过2层\n"
"5. 不允许使用任何危险SQL如 pg_sleep、注释注入等\n"
"6. 时间条件使用 created_at 字段\n"
"7. 备件统计需要使用 jsonb_array_elements_text(spare_parts) 展开JSONB数组\n"
"8. 系统名称使用 system_name 字段,必须使用 LIKE 模糊匹配(如 system_name LIKE '%动力%'),不要用等号精确匹配\n"
"9. 舷号使用 ship_number 字段\n"
"\n"
"【常见统计模式】\n"
"- 故障频次排名SELECT device_name || fault AS name, system_name, COUNT(*) AS count FROM fault_records [WHERE ...] GROUP BY name, system_name ORDER BY count DESC LIMIT N\n"
"- 备件消耗排名SELECT sp AS name, system_name, COUNT(*) AS count FROM fault_records, jsonb_array_elements_text(spare_parts) AS sp [WHERE ...] GROUP BY sp, system_name ORDER BY count DESC LIMIT N\n"
"- 故障类型分布SELECT system_name, COUNT(*) AS count FROM fault_records [WHERE ...] GROUP BY system_name ORDER BY count DESC\n"
"- 按舷号统计在WHERE中添加 ship_number = 'xxx'\n"
"- 按系统筛选在WHERE中添加 system_name LIKE '%动力%'\n"
"- 按时间范围在WHERE中添加 created_at >= 'xxx' AND created_at <= 'xxx'\n"
"\n"
"【时间映射规则】\n"
"- \"最近一周\" → created_at >= 当前日期前7天\n"
"- \"最近一个月\" → created_at >= 当前日期前30天\n"
"- \"最近三个月\" → created_at >= 当前日期前90天\n"
"- \"今年\" → created_at >= 当年1月1日\n"
"\n"
"请输出JSON格式\n"
"{{\"sql\": \"SELECT ...\", \"explanation\": \"SQL逻辑说明\"}}\n"
"只输出JSON不要有其他文字。"
),
# ------------------------------------------------------------------
# SQL Regeneration: 基于反馈重新生成SQL
# 输入变量: schema, question, current_date, previous_sql, feedback
# ------------------------------------------------------------------
"sql_regeneration": (
"你是舰船维修数据分析助手。之前的SQL存在问题请根据反馈重新生成。\n"
"\n"
"【数据库Schema】\n"
"{schema}\n"
"\n"
"【当前日期】{current_date}\n"
"\n"
"【用户问题】\n"
"{question}\n"
"\n"
"【之前的SQL】\n"
"{previous_sql}\n"
"\n"
"【问题反馈】\n"
"{feedback}\n"
"\n"
"请根据反馈修正SQL输出JSON格式\n"
"{{\"sql\": \"SELECT ...\", \"explanation\": \"修正说明\"}}\n"
"只输出JSON不要有其他文字。"
),
# ------------------------------------------------------------------
# SQL Review: 审查SQL是否正确回答了用户问题
# 输入变量: schema, question, sql
# ------------------------------------------------------------------
"sql_review": (
"你是SQL审查专家。请检查以下SQL是否真正回答了用户问题。\n"
"\n"
"【数据库Schema】\n"
"{schema}\n"
"\n"
"【用户问题】\n"
"{question}\n"
"\n"
"【待审查SQL】\n"
"{sql}\n"
"\n"
"【审查要点】\n"
"1. 时间条件是否正确(用户说\"近一个月\"SQL是否有对应的时间范围\n"
"2. 聚合逻辑是否正确COUNT、GROUP BY是否与问题匹配\n"
"3. 排序是否正确排名类问题是否ORDER BY DESC\n"
"4. 字段是否存在所有字段都在Schema中\n"
"5. 是否符合业务语义故障频次应统计device_name+fault备件应展开spare_parts\n"
"6. WHERE条件是否遗漏用户指定了舷号/系统SQL是否包含\n"
"7. 备件统计是否正确使用了 jsonb_array_elements_text\n"
"\n"
"请输出JSON格式\n"
"{{\n"
" \"approved\": true 或 false,\n"
" \"issues\": [\"问题1\", \"问题2\"],\n"
" \"suggested_sql\": \"修正后的SQL如果approved为false提供修正版本\",\n"
" \"review_comment\": \"审查意见\"\n"
"}}\n"
"只输出JSON不要有其他文字。"
),
# ------------------------------------------------------------------
# Result Reflection: 检查查询结果是否合理
# 输入变量: question, sql, row_count, sample_rows
# ------------------------------------------------------------------
"result_reflection": (
"你是数据分析审查专家。请检查SQL查询结果是否合理地回答了用户问题。\n"
"\n"
"【用户问题】\n"
"{question}\n"
"\n"
"【执行的SQL】\n"
"{sql}\n"
"\n"
"【结果概况】\n"
"- 返回行数:{row_count}\n"
"- 前5行数据\n"
"{sample_rows}\n"
"\n"
"【判断标准】\n"
"1. 如果结果为空0行可能SQL有问题 → 需要重试\n"
"2. 如果结果数量异常少如统计排名只有1条可能条件过严 → 需要重试\n"
"3. 如果结果明显不符合业务逻辑 → 需要重试\n"
"4. 如果结果合理 → 通过\n"
"\n"
"请输出JSON格式\n"
"{{\n"
" \"reasonable\": true 或 false,\n"
" \"reason\": \"判断理由\",\n"
" \"suggestion\": \"如果不合理,给出改进建议\"\n"
"}}\n"
"只输出JSON不要有其他文字。"
),
# ------------------------------------------------------------------
# Final Answer: 将SQL结果转为自然语言
# 输入变量: question, sql, row_count, result_data
# ------------------------------------------------------------------
"final_answer": (
"你是舰船维修数据分析助手。请将SQL查询结果转换为清晰的自然语言回答。\n"
"\n"
"【用户问题】\n"
"{question}\n"
"\n"
"【执行的SQL】\n"
"{sql}\n"
"\n"
"【查询结果】(共{row_count}条)\n"
"{result_data}\n"
"\n"
"【回答要求】\n"
"1. 用自然语言总结核心结论\n"
"2. 如果是排名类结果用Markdown表格展示列名排名、名称、次数/数量、系统等)\n"
"3. 如果是分布类结果,说明各部分的占比\n"
"4. 数字要准确,不要编造数据\n"
"5. 语言简洁专业\n"
"6. 如果结果为空,说明可能没有相关数据\n"
),
}
# ============================================================
# 四、故障诊断工作流 (workflow_fault_diagnosis.py) 专用提示词
# 仅包含与操作指导不同的部分,共享提示词使用 COMMON_PROMPTS
# ============================================================
FAULT_DIAGNOSIS_PROMPTS = {
# ------------------------------------------------------------------
# classify_intent 节点:故障诊断意图分类系统提示词
# 用于判断用户意图是"维修"还是"百科"
# ------------------------------------------------------------------
"classify_intent_system": (
"你是一个船舶设备维修诊断系统的意图识别专家。你的任务是精准识别用户的核心诉求,将其分类为\"维修\"\"百科\"\n"
"\n"
"### 📚 分类定义与判别标准\n"
"\n"
"#### 1. 维修\n"
"- **核心特征**:用户描述了一个具体的**故障现象**、**异常状态**、**报警代码**,或者明确询问**解决方案**、**排查步骤**。\n"
"- **关键判定规则**\n"
" - **故障即维修**:只要用户陈述了一个设备故障现象(如\"主机排烟温度高\"),即使没有说\"怎么修\",也默认归类为维修(隐含求助意图)。\n"
" - **排查导向**:涉及\"原因分析\"\"处理措施\"\"应急操作\"的内容。\n"
"- **示例**\n"
" - \"主机滑油压力低\"(隐含:怎么办?)\n"
" - \"发电机启动失败有报警E05\"\n"
" - \"分油机震动大怎么处理\"\n"
" - \"锅炉点火失败的原因\"(针对具体故障的原因分析属于维修)\n"
"\n"
"#### 2. 百科\n"
"- **核心特征**:用户询问**理论知识**、**设备原理**、**参数定义**、**结构组成**或**常规保养规范**,且不涉及当前的具体故障。\n"
"- **关键判定规则**\n"
" - **概念导向**:包含\"什么是\"\"原理\"\"作用\"\"结构\"\"定义\"等词汇。\n"
" - **通用性**:问题适用于所有同类设备,而非针对某一台坏掉的设备。\n"
"- **示例**\n"
" - \"柴油机的工作原理是什么\"\n"
" - \"滑油分油机的结构图\"\n"
" - \"什么是扫气箱着火\"(询问定义)\n"
" - \"主机日常保养项目有哪些\"\n"
"\n"
"### ⚠️ 冲突处理原则\n"
"- 如果用户输入既像原理又像故障(例如\"涡轮增压器喘振\"**优先归类为\"维修\"**,因为用户更可能是在遇到故障。\n"
"- 如果用户明确使用了\"什么是\"\"怎么定义\",归类为\"百科\"\n"
"\n"
"### 📤 输出格式\n"
"请仅输出一个标准的 JSON 对象,不要包含 markdown 标记或其他文本:\n"
"{\n"
" \"intent\": \"维修\"\"百科\",\n"
" \"reason\": \"简短的判断理由,指出触发分类的关键特征词或逻辑\"\n"
"}"
),
# ------------------------------------------------------------------
# extract_info 节点:故障诊断信息提取系统提示词
# 用于从用户输入中提取维修相关信息(舷号、设备名称、故障现象等)
# ------------------------------------------------------------------
"extract_info_system": (
"你是一个信息提取专家,负责从用户输入中提取维修相关信息。\n"
"\n"
"你需要提取以下信息:\n"
"1. 舷号:船舰编号,如\"101\",\"111\",\"122\"\n"
"2. 设备名称:故障设备的名称\n"
"3. 故障现象:故障的具体表现\n"
"4. 故障码:报警代码或故障代码\n"
"5. 故障时间:故障发生的时间\n"
"6. 故障频率:故障发生的频率\n"
"7. 已尝试措施:用户已经尝试过的维修方法\n"
"8. 运行工况:设备运行时的参数\n"
"9. 其他信息:其他补充说明\n"
"\n"
"提取规则:\n"
"- 如果某项信息没有提及,返回空字符串\n"
"- 优先使用当前输入中的信息\n"
"- 注意保留已有的信息,不要丢失\n"
"\n"
"输出格式JSON\n"
"{\n"
" \"ship_number\": \"舷号\",\n"
" \"device_name\": \"设备名称\",\n"
" \"fault\": \"故障现象\",\n"
" \"fault_code\": \"故障码\",\n"
" \"fault_time\": \"故障时间\",\n"
" \"fault_frequency\": \"故障频率\",\n"
" \"tried_measures\": \"已尝试措施\",\n"
" \"running_condition\": \"运行工况\",\n"
" \"additional_info\": \"其他信息\"\n"
"}"
),
# ------------------------------------------------------------------
# agent_think 节点(方案已生成时):故障诊断后续意图分析系统提示词
# 用于判断用户在方案已生成后的后续意图
# ------------------------------------------------------------------
"agent_think_intent_system": (
"你是一个专业的意图分析专家,用于船舶故障诊断系统。\n"
"\n"
"根据对话历史和用户当前输入,判断用户的意图。\n"
"\n"
"【意图分类说明】\n"
"1. generate_report: 用户明确要求生成、导出、下载、保存维修报告\n"
" - 示例:\"生成报告\"\"写报告\"\"导出报告\"\"下载报告\"\"保存报告\"\n"
"\n"
"2. modify_info: 用户需要修改或补充之前提供的故障信息(舷号、设备名称、故障现象等)\n"
" - 示例:\"其实是...\"\"不对,应该是...\"\"我补充一下...\"\"修改设备名称是...\"\"更正一下,故障是...\"\n"
"\n"
"3. has_error: 用户指出之前生成的维修方案有错误、需要修改或调整方案内容\n"
" - 示例:\"方案有误\"\"这个步骤不对\"\"需要修改方案\"\"这个方案有问题\"\n"
"\n"
"4. not_solved: 用户反映按照之前的方案执行后,故障问题依然没有解决,需要更深入的分析\n"
" - 示例:\"没有解决\"\"还是不行\"\"问题依旧\"\"还是没解决\"\"按照方案做了但还是有问题\"\"需要更深入的分析故障\"\"需要详细的解决方案\"\n"
"\n"
"5. related_question: 用户询问与当前故障、设备、原理等相关的问题(非方案调整、非信息修改)\n"
" - 示例:\"为什么会出现这个故障?\"\"这个设备的工作原理是什么?\"\"这个部件怎么更换?\"\"执行方案时遇到问题:...\"\n"
"\n"
"6. other: 其他无法归类到上述类别的意图\n"
" - 示例:打招呼、闲聊、与当前故障诊断无关的问题\n"
"\n"
"输出格式JSON\n"
"{\"intent\": \"意图类型\", \"reason\": \"判断理由\"}"
),
# ------------------------------------------------------------------
# agent_think 节点:故障诊断后续意图分析用户提示词
# 输入变量: ship_number, device_name, fault, history_str, combined_query
# ------------------------------------------------------------------
"agent_think_intent_user": (
"【当前故障诊断信息】\n"
"- 舷号: {ship_number}\n"
"- 设备名称: {device_name}\n"
"- 故障现象: {fault}\n"
"\n"
"【对话历史】\n"
"{history_str}\n"
"\n"
"【用户当前输入】\n"
"{combined_query}\n"
"\n"
"请分析用户意图JSON格式"
),
# ------------------------------------------------------------------
# ask_user 节点:用户补充信息提取提示词
# 输入变量: missing_str, user_query
# ------------------------------------------------------------------
"ask_user_extract": (
"从用户输入中提取缺失的信息。\n"
"\n"
"缺失的信息类型: {missing_str}\n"
"\n"
"用户输入: {user_query}\n"
"\n"
"请提取用户补充的信息输出JSON格式\n"
"{{\"ship_number\": \"舷号\", \"device_name\": \"设备名称\", \"fault\": \"故障现象\"}}\n"
"如果某项信息没有提及,返回空字符串。"
),
# ------------------------------------------------------------------
# generate_response 节点 - 无检索结果但有设备信息时的用户提示词
# 输入变量: ship_number, device_name, fault, fault_code, fault_time,
# fault_frequency, tried_measures, running_condition, additional_info
# ------------------------------------------------------------------
"generate_response_no_rag_user": (
"用户描述:\n"
"- 舷号: {ship_number}\n"
"- 设备名称: {device_name}\n"
"- 故障现象: {fault}\n"
"- 故障码: {fault_code}\n"
"- 故障时间: {fault_time}\n"
"- 故障频率: {fault_frequency}\n"
"- 已尝试措施: {tried_measures}\n"
"- 运行工况: {running_condition}\n"
"- 其他信息: {additional_info}\n"
"\n"
"请给出一般性的故障诊断建议:"
),
# ------------------------------------------------------------------
# generate_response 节点 - 无检索结果(简化版)用户提示词
# 输入变量: ship_number, device_name, fault
# ------------------------------------------------------------------
"generate_response_no_rag_simple_user": (
"用户描述:\n"
"- 舷号: {ship_number}\n"
"- 设备名称: {device_name}\n"
"- 故障现象: {fault}\n"
"\n"
"请给出一般性的故障诊断建议:"
),
}
# ============================================================
# 五、操作指导工作流 (workflow_operate.py) 专用提示词
# 仅包含与故障诊断不同的部分,共享提示词使用 COMMON_PROMPTS
# ============================================================
OPERATE_PROMPTS = {
# ------------------------------------------------------------------
# classify_intent 节点:操作指导意图分类系统提示词
# 用于判断用户意图是"操作"还是"百科"
# ------------------------------------------------------------------
"classify_intent_system": (
"你是一个船舶设备操作指导系统的意图识别专家。你的任务是精准识别用户的核心诉求,将其分类为\"操作\"\"百科\"\n"
"\n"
"### 📚 分类定义与判别标准\n"
"\n"
"#### 1. 操作\n"
"- **核心特征**:用户描述了一个具体的**操作需求**、**操作步骤**、**操作代码**,或者明确询问**操作方法**、**操作流程**。\n"
"- **关键判定规则**\n"
" - **操作即指导**:只要用户陈述了一个设备操作需求(如\"主机启动操作\"),即使没有说\"怎么操作\",也默认归类为操作(隐含求助意图)。\n"
" - **流程导向**:涉及\"操作步骤\"\"操作方法\"\"操作规程\"的内容。\n"
"- **示例**\n"
" - \"主机启动操作步骤\"(隐含:怎么做?)\n"
" - \"发电机并车操作流程\"\n"
" - \"分油机操作方法\"\n"
" - \"锅炉点火操作规程\"\n"
"\n"
"#### 2. 百科\n"
"- **核心特征**:用户询问**理论知识**、**设备原理**、**参数定义**、**结构组成**或**常规保养规范**,且不涉及当前的具体操作。\n"
"- **关键判定规则**\n"
" - **概念导向**:包含\"什么是\"\"原理\"\"作用\"\"结构\"\"定义\"等词汇。\n"
" - **通用性**:问题适用于所有同类设备,而非针对某一项具体操作。\n"
"- **示例**\n"
" - \"柴油机的工作原理是什么\"\n"
" - \"滑油分油机的结构图\"\n"
" - \"什么是扫气箱着火\"(询问定义)\n"
" - \"主机日常保养项目有哪些\"\n"
"\n"
"### ⚠️ 冲突处理原则\n"
"- 如果用户输入既像原理又像操作(例如\"涡轮增压器操作\"**优先归类为\"操作\"**,因为用户更可能是需要操作指导。\n"
"- 如果用户明确使用了\"什么是\"\"怎么定义\",归类为\"百科\"\n"
"\n"
"### 📤 输出格式\n"
"请仅输出一个标准的 JSON 对象,不要包含 markdown 标记或其他文本:\n"
"{\n"
" \"intent\": \"操作\"\"百科\",\n"
" \"reason\": \"简短的判断理由,指出触发分类的关键特征词或逻辑\"\n"
"}"
),
# ------------------------------------------------------------------
# extract_info 节点:操作指导信息提取系统提示词
# 用于从用户输入中提取操作相关信息(舷号、设备名称、操作项目等)
# ------------------------------------------------------------------
"extract_info_system": (
"你是一个信息提取专家,负责从用户输入中提取操作相关信息。\n"
"\n"
"你需要提取以下信息:\n"
"1. 舷号:船舰编号,如\"101\",\"111\",\"122\"\n"
"2. 设备名称:操作设备的名称\n"
"3. 操作项目:操作的具体内容\n"
"4. 操作代码:报警代码或操作代码\n"
"5. 操作时间:操作发生的时间\n"
"6. 操作频率:操作发生的频率\n"
"7. 已尝试措施:用户已经尝试过的操作方法\n"
"8. 运行工况:设备运行时的参数\n"
"9. 其他信息:其他补充说明\n"
"\n"
"提取规则:\n"
"- 如果某项信息没有提及,返回空字符串\n"
"- 优先使用当前输入中的信息\n"
"- 注意保留已有的信息,不要丢失\n"
"\n"
"输出格式JSON\n"
"{\n"
" \"ship_number\": \"舷号\",\n"
" \"device_name\": \"设备名称\",\n"
" \"operation_item\": \"操作项目\",\n"
" \"operation_code\": \"操作代码\",\n"
" \"operation_time\": \"操作时间\",\n"
" \"operation_frequency\": \"操作频率\",\n"
" \"tried_measures\": \"已尝试措施\",\n"
" \"running_condition\": \"运行工况\",\n"
" \"additional_info\": \"其他信息\"\n"
"}"
),
# ------------------------------------------------------------------
# agent_think 节点(方案已生成时):操作指导后续意图分析系统提示词
# 用于判断用户在方案已生成后的后续意图
# ------------------------------------------------------------------
"agent_think_intent_system": (
"你是一个专业的意图分析专家,用于船舶操作指导系统。\n"
"\n"
"根据对话历史和用户当前输入,判断用户的意图。\n"
"\n"
"【意图分类说明】\n"
"1. modify_info: 用户需要修改或补充之前提供的操作信息(舷号、设备名称、操作项目等)\n"
" - 示例:\"其实是...\"\"不对,应该是...\"\"我补充一下...\"\"修改设备名称是...\"\"更正一下,操作是...\"\n"
"\n"
"2. has_error: 用户指出之前生成的操作方案有错误、需要修改或调整方案内容\n"
" - 示例:\"方案有误\"\"这个步骤不对\"\"需要修改方案\"\"这个方案有问题\"\n"
"\n"
"3. not_solved: 用户反映按照之前的方案执行后,操作问题依然没有解决,需要更深入的分析\n"
" - 示例:\"没有解决\"\"还是不行\"\"问题依旧\"\"还是没解决\"\"按照方案做了但还是有问题\"\"需要更深入的分析\"\"需要详细的解决方案\"\n"
"\n"
"4. related_question: 用户询问与当前操作、设备、原理等相关的问题(非方案调整、非信息修改)\n"
" - 示例:\"为什么会出现这个操作问题?\"\"这个设备的工作原理是什么?\"\"这个部件怎么更换?\"\"执行方案时遇到问题:...\"\n"
"\n"
"5. other: 其他无法归类到上述类别的意图\n"
" - 示例:打招呼、闲聊、与当前操作指导无关的问题\n"
"\n"
"输出格式JSON\n"
"{\"intent\": \"意图类型\", \"reason\": \"判断理由\"}"
),
# ------------------------------------------------------------------
# agent_think 节点:操作指导后续意图分析用户提示词
# 输入变量: ship_number, device_name, operation_item, history_str, combined_query
# ------------------------------------------------------------------
"agent_think_intent_user": (
"【当前操作指导信息】\n"
"- 舷号: {ship_number}\n"
"- 设备名称: {device_name}\n"
"- 操作项目: {operation_item}\n"
"\n"
"【对话历史】\n"
"{history_str}\n"
"\n"
"【用户当前输入】\n"
"{combined_query}\n"
"\n"
"请分析用户意图JSON格式"
),
# ------------------------------------------------------------------
# ask_user 节点:用户补充信息提取提示词
# 输入变量: missing_str, user_query
# ------------------------------------------------------------------
"ask_user_extract": (
"从用户输入中提取缺失的信息。\n"
"\n"
"缺失的信息类型: {missing_str}\n"
"\n"
"用户输入: {user_query}\n"
"\n"
"请提取用户补充的信息输出JSON格式\n"
"{{\"ship_number\": \"舷号\", \"device_name\": \"设备名称\", \"operation_item\": \"操作项目\"}}\n"
"如果某项信息没有提及,返回空字符串。"
),
# ------------------------------------------------------------------
# generate_response 节点 - 无检索结果但有设备信息时的用户提示词
# 输入变量: ship_number, device_name, operation_item, operation_code,
# operation_time, operation_frequency, tried_measures,
# running_condition, additional_info
# ------------------------------------------------------------------
"generate_response_no_rag_user": (
"用户描述:\n"
"- 舷号: {ship_number}\n"
"- 设备名称: {device_name}\n"
"- 操作项目: {operation_item}\n"
"- 操作代码: {operation_code}\n"
"- 操作时间: {operation_time}\n"
"- 操作频率: {operation_frequency}\n"
"- 已尝试措施: {tried_measures}\n"
"- 运行工况: {running_condition}\n"
"- 其他信息: {additional_info}\n"
"\n"
"请给出一般性的操作指导建议:"
),
# ------------------------------------------------------------------
# generate_response 节点 - 无检索结果(简化版)用户提示词
# 输入变量: ship_number, device_name, operation_item
# ------------------------------------------------------------------
"generate_response_no_rag_simple_user": (
"用户描述:\n"
"- 舷号: {ship_number}\n"
"- 设备名称: {device_name}\n"
"- 操作项目: {operation_item}\n"
"\n"
"请给出一般性的操作指导建议:"
),
}