diff --git a/src/prompt_manager.py b/src/prompt_manager.py new file mode 100644 index 0000000..e629029 --- /dev/null +++ b/src/prompt_manager.py @@ -0,0 +1,135 @@ +# src/prompt_manager.py + +from dataclasses import dataclass +from langchain.prompts import ChatPromptTemplate +from langchain.schema import SystemMessage, HumanMessage + + +@dataclass +class CodeExecutorPrompts: + understand_prompt: ChatPromptTemplate + code_gen_prompt: ChatPromptTemplate + code_fix_prompt: ChatPromptTemplate + rewrite_prompt_template: ChatPromptTemplate + cypher_conversion_prompt: ChatPromptTemplate # 新增Cypher转换提示模板 + + +class PromptManager: + def __init__(self): + self.prompts = self._init_prompts() + + def _init_prompts(self) -> CodeExecutorPrompts: + understand_prompt = ChatPromptTemplate.from_template( + """ +你是一名电力造价业务专家,请基于以下工程文件业务结构,将用户自然语言问题改写成专业查询语句: + +**工程文件业务结构**: +{business_structure} + +**改写规则**: +1. **定位目标对象**:从业务结构中识别核心对象(如 `ProjectDivisionTree`→项目划分树、`FeeScheduleItem`→费用表)。 +2. **提取条件**:从用户输入中解析关键条件(如名称、量、类型),用【】标注变量。 +3. **构建专业语句**:格式为:`在[目标对象]中查找【条件】的项。` + - 使用业务术语(如“项目划分项”而非“项目”)。 + - 条件需明确属性(如【名称】、【量】、【类型】)。 +4. **精确映射结构**:若用户查询层级(如“叶节点”),需在条件中体现。 + +**用户输入**:{user_input} +**改写输出**:(仅输出改写后的语句) +""" + ) + + code_gen_prompt = ChatPromptTemplate.from_template( + """ +你是一个专业的Python工程师。我会给你一个用户问题,你需要将其转换为对应的Python代码 + +用户问题: +{user_request} + +上下文信息: +{context} + +工程数据访问库: +{bowei_api_docs} + +# 工作流程 +1. 从用户问题中提取关键信息(节点路径、节点类型、节点名称等) +2. 根据"用户问题"和"上下文信息"选择最匹配的"工程数据访问库"中的方法 +3. 生成可直接执行的Python代码 + +# 代码模板(必须严格遵循) +def neo4j_find_function(): + project = ProjectBuilder.build() + status, data, error, helper_info = project.[SELECTED_METHOD]([PARAMETERS]) + return status, data, error, helper_info + +# 执行规则 +- 参数必须从用户问题或上下文信息中提取 +- 必须确保生成的代码可以直接执行 +- 禁止修改代码模板结构 +- 禁止添加任何注释或解释 + +# 输出格式 +def neo4j_find_function(): + project = ProjectBuilder.build() + status, data, error, helper_info = project.[SELECTED_METHOD]([PARAMETERS]) + return status, data, error, helper_info +""" + ) + + code_fix_prompt = ChatPromptTemplate.from_template( + """ + +你是一个专业的Python工程师。我会给你一段错误python代码和错误信息,你需要帮我修复这段出错的代码 + +你的任务是: +1. 根据需要修改的代码{original_code}和代码的错误信息{error_info}来对代码和参数进行修改 +2. 如果错误信息中是代码的逻辑出现错误,那么就需要对代码本身整体结构进行修改 +3. 如果是代码中参数出现问题了,那么就需要结合错误信息中的帮助信息(helper_info)来对代码总的参数进行修改 +4. 修复后的代码应该完整,可以直接执行,并且能够返回查询结果 + +注意: +- 必须只输出最终的Python代码,不要添加任何解释、注释、推理过程或自然语言描述。 +- 不要以“以下是修正后的代码”、“修改如下”等语句开头。 +- 不要输出任何其他无关的内容。 +- 输出格式必须完全符合指定的函数模板。 +- 如果无法根据已有信息进行修改,请原样返回原始代码。 +- 禁止在代码前加上```python字样 +- 禁止在代码后加上```字样 + +请输出你修补后的代码: +""" + ) + + rewrite_prompt_template = ChatPromptTemplate.from_template( + """你是一个专业的工程业务助理,结合以下工程业务结构信息和相关知识: +{business_structure} + +相关知识内容: +{context} + +请根据用户的问题,结合上述信息,理解并改写成一个针对工程数据的访问请求(简洁明了的描述)。 +请只输出改写后的访问请求文本,不要多余解释。""" + ) + + cypher_conversion_prompt = ChatPromptTemplate.from_template( + """ +你是一个Neo4j专家。请将用户的自然语言问题转换成一个有效的Cypher查询语句,查询知识图谱中相关信息。 +只返回Cypher语句,不要任何解释,最多返回5条。 + +业务结构信息: +{business_structure} + +用户问题: +{user_input} +Cypher查询语句: +""" + ) + + return CodeExecutorPrompts( + understand_prompt=understand_prompt, + code_gen_prompt=code_gen_prompt, + code_fix_prompt=code_fix_prompt, + rewrite_prompt_template=rewrite_prompt_template, + cypher_conversion_prompt=cypher_conversion_prompt, + )