package com.supervision.pdfqaserver.cache; import java.util.HashMap; import java.util.Map; /** * 提示词缓存 */ public class PromptCache { public static final String DOERE_TEXT = "DOERE_TEXT"; public static final String DOERE_TABLE = "DOERE_TABLE"; public static final String TEXT_TO_CYPHER = "TEXT_TO_CYPHER"; public static final String GENERATE_ANSWER = "GENERATE_ANSWER"; public static final String CHINESE_TO_ENGLISH = "CHINESE_TO_ENGLISH"; public static final String ERE_TO_INSERT_CYPHER = "ERE_TO_INSERT_CYPHER"; public static final String CLASSIFY_TABLE = "CLASSIFY_TABLE"; public static final Map promptMap = new HashMap<>(); static { init(); } private static void init(){ promptMap.put(DOERE_TEXT, DOERE_TEXT_PROMPT); promptMap.put(DOERE_TABLE, DOERE_TABLE_PROMPT); promptMap.put(CHINESE_TO_ENGLISH, CHINESE_TO_ENGLISH_PROMPT); promptMap.put(ERE_TO_INSERT_CYPHER, ERE_TO_INSERT_CYPHER_PROMPT); promptMap.put(TEXT_TO_CYPHER, TEXT_TO_CYPHER_PROMPT); promptMap.put(GENERATE_ANSWER, GENERATE_ANSWER_PROMPT); promptMap.put(CLASSIFY_TABLE, CLASSIFY_TABLE_PROMPT); } private static final String DOERE_TEXT_PROMPT = """ 你是一个高级信息抽取引擎,请从给定文本中提取以下结构化信息并以JSON数据输出,不要进行解释: 1. **节点提取**: - 识别所有实体作为节点 - 自动推断每个节点的类型 - 记录节点的所有相关属性(键值对形式) 2. **关系提取**: - 识别所有节点间的关系 - 自动推断关系类型 - 记录关系的所有相关属性(键值对形式) 3. **类型化三元组**: - 生成由 (头节点类型, 关系类型, 尾节点类型) 组成的元组 **输出要求**: - 输出纯JSON格式,不要使用```json ```等任何Markdown标记包装 - 使用如下JSON Schema: { "nodes": [ { "name": "节点名称", "type": "节点类型", "attributes": { "属性名1": "属性值1", "属性名2": "属性值2" } } ], "relations": [ { "source": "头节点名称", "target": "尾节点名称", "type": "关系类型", "attributes": { "关系属性名1": "关系属性值1" } } ], "typed_triplets": [ ["头节点类型", "关系类型", "尾节点类型"] ] } **处理规则**: 1. 节点类型和关系类型由你根据上下文语义自动创建(如"科学家"/"发明"/"研究所") 2. 属性字段应包含文本中明确提及或可推导的特征(如数值、时间、状态等) 3. 对同一实体的不同指代需进行合并(如"特斯拉"和"埃隆·马斯克的公司") **示例文本**: "爱因斯坦在1905年发表了狭义相对论论文,这篇革命性理论后来被普林斯顿高等研究院深入研究" **期望输出**: { "nodes": [ { "name": "爱因斯坦", "type": "物理学家", "attributes": { "领域": "理论物理" } }, { "name": "狭义相对论", "type": "科学理论", "attributes": { "发表年份": 1905, "重要性": "革命性" } }, { "name": "普林斯顿高等研究院", "type": "科研机构", "attributes": { "研究领域": "理论科学" } } ], "relations": [ { "source": "爱因斯坦", "target": "狭义相对论", "type": "发表", "attributes": { "时间": 1905 } }, { "source": "普林斯顿高等研究院", "target": "狭义相对论", "type": "研究", "attributes": { "强度描述": "深入" } } ], "typed_triplets": [ ["物理学家", "发表", "科学理论"], ["科研机构", "研究", "科学理论"] ] } 请处理以下文本: {} """; private static final String DOERE_TABLE_PROMPT = """ 你是一个表格数据处理专家,请严格按以下要求从给出的表格中提取数据,直接给出结果,不进行解释: **处理规则:** 1. 完全保留原始表头字段名称,不做任何中英文转换或修改 2. 将每行数据转换为一个独立对象 3. 所有数值保留原始格式(包括逗号分隔符和小数点) 4. 表格第一列作为主键字段 **输出格式:** { "table_data": [ { "[第一列表头]": "[第一列值]", "[第二列表头]": "[第二列值]", "[第三列表头]": "[第三列值]" }, // 后续行... ] } **示例表格:** | 账龄 | 期末余额 | 年初余额 | | --- | --- | --- | | 1年以内 | 310,844,201.27 | 337,641,834.84 | | 1至2年 | 52,374,904.35 | 15,041,750.36 | **期望输出:** { "table_data": [ { "账龄": "1年以内", "期末余额": "310,844,201.27", "年初余额": "337,641,834.84" }, { "账龄": "1至2年", "期末余额": "52,374,904.35", "年初余额": "15,041,750.36" } ] } 请处理以下表格: {} """; private static final String TEXT_TO_CYPHER_PROMPT = """ 你是一个专业的 Neo4j Cypher 查询语句生成器,专门用于构建针对特定结构的查询语句。 --- **【数据库结构说明】** - **关系类型(relationType)**: {relationTypeList} - **源节点类型(sourceType)**: {sourceTypeList} - **目标节点类型(targetType)**: {targetTypeList} --- **【生成规则】** 1. 识别用户问题中的实体及意图,映射为 `Cypher 查询语句` 2. 使用无条件匹配,不假设任何属性名称,不添加 `WHERE` 子句过滤。 3. 返回所有满足该关系的查询语句,仅使用 c 表示源节点,r 表示关系,t 表示目标节点,并返回它们的所有属性。 4. 仅输出 字符串格式的 JSON 对象,格式为:\\{ "cypherQueries": [ "MATCH ... RETURN c, r, t", ... ] \\},不需要加任何解释或说明。 5. 如无法从结构中推断 relationType、sourceType 或 targetType,输出: "无法根据数据库结构生成查询" 6. 只能使用relationType、sourceType 或 targetType中的数据 --- **【示例】** 1. - **用户问题:** 龙源电力收购了哪些公司? - **生成的 Cypher 查询:** "\\{ "cypherQueries": [ "MATCH (c:`公司`)-[r:`收购`]->(t:`公司`) RETURN c, r, t", "MATCH (c:`公司`)-[r:`收购`]->(t:`上市公司`) RETURN c, r, t", ..... ] \\}" 2. - **用户问题:** 龙源电力包含了哪些报告? - **生成的 Cypher 查询:** "\\{ "cypherQueries": [ "MATCH (c:`公司`)-[r:`包含`]->(t:`报告`) RETURN c, r, t", ..... ] \\}" 【用户问题】 {query} 【你的任务】 根据以上数据库结构和用户问题,生成正确的Cypher查询语句。 """; private static final String GENERATE_ANSWER_PROMPT = """ 一、任务说明 你是一个审计报告的整理助手,你需要对用户询问的问题根据产考数据进行回答。 二、用户输入: {query} 三、参考文本: {example_text} 四、注意事项 1. 数据核实:需确认是否使用参考文本中的数据。 2. 信息时效:可能需要确认数据的时间。 3. 问题范围界定:当用户提问超出审计报告分析范畴时,统一采用以下话术回复: "您好!当前系统功能聚焦于审计报告相关内容分析,您的问题暂不在支持范围内。如需查询财务数据、票据详情或其他审计相关信息,请提供具体问题,我们将全力协助。" /no_think """; private static final String CHINESE_TO_ENGLISH_PROMPT = """ 你是一个Neo4j图数据库命名规范转换专家,请将以下中文短语转换为符合Neo4j命名规范的英文名称。要求: 1. **命名规范**: - 使用`UpperCamelCase`命名实体(如`ProductCategory`) - 禁止特殊字符(如空格、括号、引号、换行符等) - 优先选择技术领域通用术语 2. **转换规则**: - 直译或意译均可,但需确保语义清晰 - 若中文含多义词,选择最贴近技术场景的译法 - 对品牌/专有名词保留原始英文(如"腾讯"→ Tencent) 3. **输入输出示例**: - 输入: "用户订单" → 输出: UserOrder - 输入: "属于2023年" → 输出: BELONGS_TO_2023 - 输入: "5G网络设备" → 输出: 5GNetworkDevice - 输入: "评分大于90" → 输出: SCORE_ABOVE_90 4. **待转换文本**: {} 5. **输出要求**: - 不要使用``````等任何Markdown标记包装 - 只需返回转换后的英文名称,无需解释。 """; private static final String ERE_TO_INSERT_CYPHER_PROMPT = """ 请将以下三元组数据转换为Neo4j的Cypher语句,要求: 1. **节点**用`(n:Label {name: "Value"})`表示,其中`Label`是实体类型(如`Person`、`Company`); 2. **关系**用`[r:RELATION_TYPE]`表示,保持与三元组中关系一致; 3. 如果节点或关系已存在,使用`MERGE`避免重复创建; 4. 返回完整的Cypher语句,不要解释。 ### 输入三元组示例 [ {"source": "人物","sourceType": "Person", "relation": "创始人", "relationType": "FOUNDED","target": "公司","targetType": "Company"}, {"source": "公司","sourceType": "Company ", "relation": "位于", "relationType": "LOCATED_IN","target": "城市","targetType": "City "} ] ### 输出示例 MERGE (p:Person {name: "人物"}) MERGE (c:Company {name: "公司"}) MERGE (city:City {name: "城市"}) MERGE (p)-[r1:FOUNDED]->(c) MERGE (c)-[r2:LOCATED_IN]->(city) ### 规则补充 1. 实体类型映射: - "人物" → `Person` - "公司" → `Company` - "城市" → `City` 2. 关系类型映射: - "创始人" → `FOUNDED` - "位于" → `LOCATED_IN` 3. 属性统一用`name`字段存储实体名称。 ### 禁止行为 1. 不要为关系添加属性(除非明确提供); 2. 不要使用中文标签(如`人物`→`Person`); 3. 不要省略MERGE的安全约束。 ### 请转换以下三元组: {} """; private static final String CLASSIFY_TABLE_PROMPT = """ 你是一个表格数据处理专家,直接给出结果,不要解释。 **请根据表格行的标题类型,区分表格行标题是否是描述性标题:** 1. **描述性标题型定义** - 行标题为**描述性文本**(如审计事项说明、应对措施等) - 内容以**段落式文字**为主,而非结构化数据 - 列数较少(通常2列),且列标题为**概括性说明**(如"关键审计事项"、"审计应对") - 示例: ``` | 关键审计事项 | 在审计中如何应对该事项 | |---------------------------|-----------------------------| | 无形资产减值准备... | 我们对管理层...进行测试... | ``` 2. **分类标签型定义** - 行标题为**分类标签**(如会计科目、项目名称) - 内容以**结构化数据**为主(如数字、日期、代码) - 列数较多(通常≥6列),且列标题为**具体分类**(如"2023年12月31日"、"附注") - 示例: ``` | 项目 | 附注 | 2023年12月31日 | 2023年1月1日 | |--------------|------|---------------------|-------------------| | 货币资金 | 六.1 | 4,879,272,436.13 | 20,493,232,077.05 | ``` **输出要求** - 如果是描述性标题输出**是**,否则输出**否** - 不需要解释说明 **示例表格** | 三产收人确认 关键审计事项 | 在审计中如何应对该事项 | | --- | --- | | 如财务报表附注六注释49营业收入、营 业成本所示,2023年营业收入376\\.42亿 元与上年相比减少5\\.57%,由于收入是 龙源电力的关键绩效指标之一,我们将 其收入的确认作为关键审计事项。 | 我们对收入确认执行的审计程序包括: 1、评价管理层与销售和收款相关的内部控制的设 计和运行有效性;| **期望输出** 是 请处理以下表格: {} """; }