diff --git a/backend/unit_test/FeeCollectionTable.json b/backend/unit_test/FeeCollectionTable.json deleted file mode 100644 index e20c2ed..0000000 --- a/backend/unit_test/FeeCollectionTable.json +++ /dev/null @@ -1,202 +0,0 @@ -[ - { - "question": "人工费的费率是多少?", - "answer": "费率是100.0000000000" - }, - { - "question": "临时设施费的费率是多少?", - "answer": "费率是6.3500000000" - }, - { - "question": "乙供装置性材料费的费率是多少?", - "answer": "费率是100.0000000000" - }, - { - "question": "直接费的费率是多少?", - "answer": "费率是100.0000000000" - }, - { - "question": "甲供装置性材料费的费率是多少?", - "answer": "费率是100.0000000000" - }, - { - "question": "直接费的费率是多少?", - "answer": "费率是100.0000000000" - }, - { - "question": "夜间施工增加费的费率是多少?", - "answer": "费率是0E-10" - }, - { - "question": "装置性材料费的费率是多少?", - "answer": "费率是100.0000000000" - }, - { - "question": "冬雨季施工增加费的费率是多少?", - "answer": "费率是3.5700000000" - }, - { - "question": "材料费的费率是多少?", - "answer": "费率是100.0000000000" - }, - { - "question": "机械价差的费率是多少?", - "answer": "费率是100.0000000000" - }, - { - "question": "规费的费率是多少?", - "answer": "费率是100.0000000000" - }, - { - "question": "直接工程费的费率是多少?", - "answer": "费率是100.0000000000" - }, - { - "question": "安全文明施工费的费率是多少?", - "answer": "费率是3.5500000000" - }, - { - "question": "企业管理费的费率是多少?", - "answer": "费率是35.7600000000" - }, - { - "question": "税金的费率是多少?", - "answer": "费率是9.0000000000" - }, - { - "question": "直接费的费率是多少?", - "answer": "费率是100.0000000000" - }, - { - "question": "安全文明施工费的费率是多少?", - "answer": "费率是3.5500000000" - }, - { - "question": "合计的费率是多少?", - "answer": "费率是100.0000000000" - }, - { - "question": "税金的费率是多少?", - "answer": "费率是9.0000000000" - }, - { - "question": "安全文明施工费的费率是多少?", - "answer": "费率是3.5500000000" - }, - { - "question": "直接工程费的费率是多少?", - "answer": "费率是100.0000000000" - }, - { - "question": "税金的费率是多少?", - "answer": "费率是9.0000000000" - }, - { - "question": "社会保险费的费率是多少?", - "answer": "费率是15.0000000000" - }, - { - "question": "间接费的费率是多少?", - "answer": "费率是100.0000000000" - }, - { - "question": "合计的费率是多少?", - "answer": "费率是100.0000000000" - }, - { - "question": "临时设施费的费率是多少?", - "answer": "费率是0E-10" - }, - { - "question": "利润的费率是多少?", - "answer": "费率是5.2400000000" - }, - { - "question": "税金的费率是多少?", - "answer": "费率是9.0000000000" - }, - { - "question": "社会保险费的费率是多少?", - "answer": "费率是15.0000000000" - }, - { - "question": "直接工程费的费率是多少?", - "answer": "费率是100.0000000000" - }, - { - "question": "乙供设备不含税价的费率是多少?", - "answer": "费率是100.0000000000" - }, - { - "question": "企业管理费的费率是多少?", - "answer": "费率是17.1300000000" - }, - { - "question": "企业管理费的费率是多少?", - "answer": "费率是35.7600000000" - }, - { - "question": "夜间施工增加费的费率是多少?", - "answer": "费率是0E-10" - }, - { - "question": "直接费的费率是多少?", - "answer": "费率是100.0000000000" - }, - { - "question": "夜间施工增加费的费率是多少?", - "answer": "费率是0E-10" - }, - { - "question": "甲供设备含税价的费率是多少?", - "answer": "费率是100.0000000000" - }, - { - "question": "施工机械使用费的费率是多少?", - "answer": "费率是100.0000000000" - }, - { - "question": "安全文明施工费的费率是多少?", - "answer": "费率是3.5500000000" - }, - { - "question": "定额直接费的费率是多少?", - "answer": "费率是100.0000000000" - }, - { - "question": "主材费的费率是多少?", - "answer": "费率是100.0000000000" - }, - { - "question": "直接费的费率是多少?", - "answer": "费率是100.0000000000" - }, - { - "question": "施工企业配合调试费的费率是多少?", - "answer": "费率是0E-10" - }, - { - "question": "施工机械使用费的费率是多少?", - "answer": "费率是100.0000000000" - }, - { - "question": "临时设施费的费率是多少?", - "answer": "费率是6.3500000000" - }, - { - "question": "施工工具用具使用费的费率是多少?", - "answer": "费率是3.8200000000" - }, - { - "question": "措施费的费率是多少?", - "answer": "费率是100.0000000000" - }, - { - "question": "材料价差的费率是多少?", - "answer": "费率是100.0000000000" - }, - { - "question": "措施费的费率是多少?", - "answer": "费率是100.0000000000" - } -] \ No newline at end of file diff --git a/backend/unit_test/OtherFee.json b/backend/unit_test/OtherFee.json deleted file mode 100644 index b6e03d2..0000000 --- a/backend/unit_test/OtherFee.json +++ /dev/null @@ -1,202 +0,0 @@ -[ - { - "question": "前期工作管理费用的金额是多少?", - "answer": "金额是0E-10" - }, - { - "question": "特种设备安全监测费的金额是多少?", - "answer": "金额是0E-10" - }, - { - "question": "工程监理费的金额是多少?", - "answer": "金额是131009.9200000000" - }, - { - "question": "水土保持方案编审费用的金额是多少?", - "answer": "金额是0E-10" - }, - { - "question": "生产准备费的金额是多少?", - "answer": "金额是472373669.4635599852" - }, - { - "question": "电力工程技术经济标准编制费的金额是多少?", - "answer": "金额是84352440.9756360054" - }, - { - "question": "项目建设技术服务费的金额是多少?", - "answer": "金额是16855957065.4302005768" - }, - { - "question": "工程保险费的金额是多少?", - "answer": "金额是0E-10" - }, - { - "question": "其他的金额是多少?", - "answer": "金额是0E-10" - }, - { - "question": "施工图文件评审费的金额是多少?", - "answer": "金额是24940.0000000000" - }, - { - "question": "节能评估费用的金额是多少?", - "answer": "金额是0E-10" - }, - { - "question": "桩基检测费的金额是多少?", - "answer": "金额是0E-10" - }, - { - "question": "项目前期工作费的金额是多少?", - "answer": "金额是0E-10" - }, - { - "question": "其他的金额是多少?", - "answer": "金额是0E-10" - }, - { - "question": "项目法人管理费的金额是多少?", - "answer": "金额是986923559.4149370193" - }, - { - "question": "专业爆破服务费的金额是多少?", - "answer": "金额是0E-10" - }, - { - "question": "节能评估费用的金额是多少?", - "answer": "金额是0E-10" - }, - { - "question": "用地预审费用的金额是多少?", - "answer": "金额是0E-10" - }, - { - "question": "设备材料监造费的金额是多少?", - "answer": "金额是0E-10" - }, - { - "question": "环境监测及环境保护验收费的金额是多少?", - "answer": "金额是0E-10" - }, - { - "question": "环境监测及环境保护验收费的金额是多少?", - "answer": "金额是0E-10" - }, - { - "question": "设备材料监造费的金额是多少?", - "answer": "金额是0E-10" - }, - { - "question": "勘察费的金额是多少?", - "answer": "金额是12122154260.0000000000" - }, - { - "question": "项目法人管理费的金额是多少?", - "answer": "金额是986923559.4149370193" - }, - { - "question": "社会稳定风险评估费用的金额是多少?", - "answer": "金额是0E-10" - }, - { - "question": "勘察费的金额是多少?", - "answer": "金额是12122154260.0000000000" - }, - { - "question": "环境影响评价费用的金额是多少?", - "answer": "金额是0E-10" - }, - { - "question": "水土保持方案编审费用的金额是多少?", - "answer": "金额是0E-10" - }, - { - "question": "使用林地可行性研究费用的金额是多少?", - "answer": "金额是0E-10" - }, - { - "question": "环境监测及环境保护验收费的金额是多少?", - "answer": "金额是0E-10" - }, - { - "question": "桩基检测费的金额是多少?", - "answer": "金额是0E-10" - }, - { - "question": "设计费的金额是多少?", - "answer": "金额是4042055949.4299998283" - }, - { - "question": "环境监测及环境保护验收费的金额是多少?", - "answer": "金额是0E-10" - }, - { - "question": "建设场地征用及清理费的金额是多少?", - "answer": "金额是16831284.2287110016" - }, - { - "question": "施工图文件评审费的金额是多少?", - "answer": "金额是24940.0000000000" - }, - { - "question": "项目后评价费的金额是多少?", - "answer": "金额是421762204.8781780005" - }, - { - "question": "水土保持方案编审费用的金额是多少?", - "answer": "金额是0E-10" - }, - { - "question": "勘察设计费的金额是多少?", - "answer": "金额是16164210209.4300003052" - }, - { - "question": "前期工作管理费用的金额是多少?", - "answer": "金额是0E-10" - }, - { - "question": "节能评估费用的金额是多少?", - "answer": "金额是0E-10" - }, - { - "question": "初步设计文件评审费的金额是多少?", - "answer": "金额是18560.0000000000" - }, - { - "question": "特种设备安全监测费的金额是多少?", - "answer": "金额是0E-10" - }, - { - "question": "初步设计文件评审费的金额是多少?", - "answer": "金额是18560.0000000000" - }, - { - "question": "桩基检测费的金额是多少?", - "answer": "金额是0E-10" - }, - { - "question": "矿产压覆评估费用的金额是多少?", - "answer": "金额是0E-10" - }, - { - "question": "设计费的金额是多少?", - "answer": "金额是4042055949.4299998283" - }, - { - "question": "水土保持方案编审费用的金额是多少?", - "answer": "金额是0E-10" - }, - { - "question": "电力工程技术经济标准编制费的金额是多少?", - "answer": "金额是84352440.9756360054" - }, - { - "question": "桩基检测费的金额是多少?", - "answer": "金额是0E-10" - }, - { - "question": "矿产压覆评估费用的金额是多少?", - "answer": "金额是0E-10" - } -] \ No newline at end of file diff --git a/backend/unit_test/ProjectDivision.json b/backend/unit_test/ProjectDivision.json deleted file mode 100644 index d583af5..0000000 --- a/backend/unit_test/ProjectDivision.json +++ /dev/null @@ -1,202 +0,0 @@ -[ - { - "question": "新增项目名称的合价是多少?", - "answer": "合价是0E-10" - }, - { - "question": "预制基础的合价是多少?", - "answer": "合价是40567.2639480000" - }, - { - "question": "绝缘子串及金具安装的合价是多少?", - "answer": "合价是2897171.9878110001" - }, - { - "question": "杆塔工程材料工地运输的合价是多少?", - "answer": "合价是0E-10" - }, - { - "question": "基础防护的合价是多少?", - "answer": "合价是0E-10" - }, - { - "question": "护坡、挡土墙及排洪沟土石方工程的合价是多少?", - "answer": "合价是0E-10" - }, - { - "question": "新增项目名称的合价是多少?", - "answer": "合价是0E-10" - }, - { - "question": "(1)拆除后能利用的合价是多少?", - "answer": "合价是0E-10" - }, - { - "question": "地基处理的合价是多少?", - "answer": "合价是0E-10" - }, - { - "question": "灌注桩基础的合价是多少?", - "answer": "合价是43466660.0544390008" - }, - { - "question": "(1)拆除后能利用的合价是多少?", - "answer": "合价是0E-10" - }, - { - "question": "悬垂绝缘子串及金具安装的合价是多少?", - "answer": "合价是1251465.0340440001" - }, - { - "question": "护坡、挡土墙及排洪沟土石方工程的合价是多少?", - "answer": "合价是0E-10" - }, - { - "question": "附件安装工程的合价是多少?", - "answer": "合价是0E-10" - }, - { - "question": "导地线跨越架设的合价是多少?", - "answer": "合价是0E-10" - }, - { - "question": "辅助工程的合价是多少?", - "answer": "合价是0E-10" - }, - { - "question": "新增项目名称的合价是多少?", - "answer": "合价是0E-10" - }, - { - "question": "绝缘子串及金具安装的合价是多少?", - "answer": "合价是0E-10" - }, - { - "question": "护坡、挡土墙及排洪沟砌筑的合价是多少?", - "answer": "合价是709931.9013930000" - }, - { - "question": "锚杆基础的合价是多少?", - "answer": "合价是15344967.9002950005" - }, - { - "question": "建筑工程的合价是多少?", - "answer": "合价是25411.2790780000" - }, - { - "question": "辅助工程的合价是多少?", - "answer": "合价是1046253.4135240000" - }, - { - "question": "导地线跨越架设的合价是多少?", - "answer": "合价是0E-10" - }, - { - "question": "电缆工程的合价是多少?", - "answer": "合价是0E-10" - }, - { - "question": "输、送电线路试运的合价是多少?", - "answer": "合价是0E-10" - }, - { - "question": "基础土石方工程的合价是多少?", - "answer": "合价是32872843180.7429008484" - }, - { - "question": "基础永久性围堰的合价是多少?", - "answer": "合价是0E-10" - }, - { - "question": "基础永久性围堰的合价是多少?", - "answer": "合价是0E-10" - }, - { - "question": "混凝土及钢筋混凝土结构的合价是多少?", - "answer": "合价是0E-10" - }, - { - "question": "输、送电线路试运的合价是多少?", - "answer": "合价是0E-10" - }, - { - "question": "混合结构的合价是多少?", - "answer": "合价是16967.5193850000" - }, - { - "question": "杆塔组立的合价是多少?", - "answer": "合价是2253906.0859830002" - }, - { - "question": "附件安装工程的合价是多少?", - "answer": "合价是0E-10" - }, - { - "question": "接地工程材料工地运输的合价是多少?", - "answer": "合价是0E-10" - }, - { - "question": "新增项目名称的合价是多少?", - "answer": "合价是27148.0310160000" - }, - { - "question": "导地线架设的合价是多少?", - "answer": "合价是0E-10" - }, - { - "question": "护坡、挡土墙及排洪沟的合价是多少?", - "answer": "合价是709931.9013930000" - }, - { - "question": "(1)拆除后能利用的合价是多少?", - "answer": "合价是0E-10" - }, - { - "question": "基础永久性围堰砌筑的合价是多少?", - "answer": "合价是0E-10" - }, - { - "question": "(2)拆除后不能利用的合价是多少?", - "answer": "合价是0E-10" - }, - { - "question": "安装工程的合价是多少?", - "answer": "合价是65324.9496330000" - }, - { - "question": "尖峰、施工基面土石方工程的合价是多少?", - "answer": "合价是325205.4178770000" - }, - { - "question": "架线工程的合价是多少?", - "answer": "合价是4844399648.0778598785" - }, - { - "question": "杆塔组立的合价是多少?", - "answer": "合价是0E-10" - }, - { - "question": "架线工程材料工地运输的合价是多少?", - "answer": "合价是2088570123.2409000397" - }, - { - "question": "导地线架设的合价是多少?", - "answer": "合价是0E-10" - }, - { - "question": "耐张绝缘子串及金具安装的合价是多少?", - "answer": "合价是1645706.9537680000" - }, - { - "question": "架线工程材料工地运输的合价是多少?", - "answer": "合价是2088570123.2409000397" - }, - { - "question": "其他基础的合价是多少?", - "answer": "合价是3839666.7656879998" - }, - { - "question": "架线工程材料工地运输的合价是多少?", - "answer": "合价是0E-10" - } -] \ No newline at end of file diff --git a/backend/unit_test/ProjectDivisions_CostPreview.json b/backend/unit_test/ProjectDivisions_CostPreview.json deleted file mode 100644 index 4f17f26..0000000 --- a/backend/unit_test/ProjectDivisions_CostPreview.json +++ /dev/null @@ -1,202 +0,0 @@ -[ - { - "question": "线路取费表的直接费是多少?", - "answer": "直接费是440877984.9458540082" - }, - { - "question": "线路取费表(拆除)的直接费是多少?", - "answer": "直接费是0E-10" - }, - { - "question": "线路取费表的直接费是多少?", - "answer": "直接费是0E-10" - }, - { - "question": "线路取费表的直接费是多少?", - "answer": "直接费是1086586.9018659999" - }, - { - "question": "线路取费表的直接费是多少?", - "answer": "直接费是0E-10" - }, - { - "question": "线路取费表(拆除)的直接费是多少?", - "answer": "直接费是0E-10" - }, - { - "question": "线路取费表的直接费是多少?", - "answer": "直接费是51486.7898090000" - }, - { - "question": "线路取费表的直接费是多少?", - "answer": "直接费是3321.8139230000" - }, - { - "question": "线路取费表的直接费是多少?", - "answer": "直接费是78005.0340730000" - }, - { - "question": "的直接费是多少?", - "answer": "直接费是3535892767.0972299576" - }, - { - "question": "线路取费表的直接费是多少?", - "answer": "直接费是24045.2334060000" - }, - { - "question": "的直接费是多少?", - "answer": "直接费是336253.7482950000" - }, - { - "question": "线路取费表的直接费是多少?", - "answer": "直接费是142270.1346780000" - }, - { - "question": "的直接费是多少?", - "answer": "直接费是61049.8665780000" - }, - { - "question": "线路取费表(拆除)的直接费是多少?", - "answer": "直接费是0E-10" - }, - { - "question": "线路取费表的直接费是多少?", - "answer": "直接费是933061.7795919999" - }, - { - "question": "线路取费表的直接费是多少?", - "answer": "直接费是0E-10" - }, - { - "question": "的直接费是多少?", - "answer": "直接费是182949.5997350000" - }, - { - "question": "的直接费是多少?", - "answer": "直接费是0E-10" - }, - { - "question": "线路取费表(余物清理)的直接费是多少?", - "answer": "直接费是0E-10" - }, - { - "question": "线路取费表(拆除)的直接费是多少?", - "answer": "直接费是0E-10" - }, - { - "question": "线路取费表的直接费是多少?", - "answer": "直接费是21220645.1637400016" - }, - { - "question": "线路取费表的直接费是多少?", - "answer": "直接费是933061.7795919999" - }, - { - "question": "线路取费表的直接费是多少?", - "answer": "直接费是2501470269.7231497765" - }, - { - "question": "线路取费表的直接费是多少?", - "answer": "直接费是51486.7898090000" - }, - { - "question": "的直接费是多少?", - "answer": "直接费是55265.9111100000" - }, - { - "question": "的直接费是多少?", - "answer": "直接费是442897633.6273120046" - }, - { - "question": "线路取费表(拆除)的直接费是多少?", - "answer": "直接费是0E-10" - }, - { - "question": "线路取费表的直接费是多少?", - "answer": "直接费是0E-10" - }, - { - "question": "的直接费是多少?", - "answer": "直接费是1057484.3306960000" - }, - { - "question": "的直接费是多少?", - "answer": "直接费是442897633.6273120046" - }, - { - "question": "的直接费是多少?", - "answer": "直接费是0E-10" - }, - { - "question": "线路取费表的直接费是多少?", - "answer": "直接费是21220645.1637400016" - }, - { - "question": "线路取费表(余物清理)的直接费是多少?", - "answer": "直接费是0E-10" - }, - { - "question": "的直接费是多少?", - "answer": "直接费是336253.7482950000" - }, - { - "question": "的直接费是多少?", - "answer": "直接费是0E-10" - }, - { - "question": "的直接费是多少?", - "answer": "直接费是0E-10" - }, - { - "question": "的直接费是多少?", - "answer": "直接费是61049.8665780000" - }, - { - "question": "线路取费表(余物清理)(1)的直接费是多少?", - "answer": "直接费是61049.8665780000" - }, - { - "question": "线路取费表的直接费是多少?", - "answer": "直接费是24045.2334060000" - }, - { - "question": "线路取费表(拆除)的直接费是多少?", - "answer": "直接费是0E-10" - }, - { - "question": "线路取费表(拆除)的直接费是多少?", - "answer": "直接费是0E-10" - }, - { - "question": "线路取费表的直接费是多少?", - "answer": "直接费是0E-10" - }, - { - "question": "线路取费表(余物清理)的直接费是多少?", - "answer": "直接费是0E-10" - }, - { - "question": "线路取费表(拆除)的直接费是多少?", - "answer": "直接费是0E-10" - }, - { - "question": "线路取费表(拆除)的直接费是多少?", - "answer": "直接费是0E-10" - }, - { - "question": "线路取费表的直接费是多少?", - "answer": "直接费是0E-10" - }, - { - "question": "线路取费表的直接费是多少?", - "answer": "直接费是659466.5955000001" - }, - { - "question": "线路取费表(拆除)的直接费是多少?", - "answer": "直接费是0E-10" - }, - { - "question": "线路取费表的直接费是多少?", - "answer": "直接费是2501470269.7231497765" - } -] \ No newline at end of file diff --git a/backend/unit_test/ProjectProperties.json b/backend/unit_test/ProjectProperties.json deleted file mode 100644 index 90afa22..0000000 --- a/backend/unit_test/ProjectProperties.json +++ /dev/null @@ -1,202 +0,0 @@ -[ - { - "question": "降阻剂_数量的属性值是多少?", - "answer": "属性值是f" - }, - { - "question": "导线2_单位单价的属性值是多少?", - "answer": "属性值是9" - }, - { - "question": "导线_单公里用量的属性值是多少?", - "answer": "属性值是36" - }, - { - "question": "线路参数_导地线防震措施的属性值是多少?", - "answer": "属性值是457" - }, - { - "question": "合成绝缘子_数量的属性值是多少?", - "answer": "属性值是5" - }, - { - "question": "基础垫层的属性值是多少?", - "answer": "属性值是" - }, - { - "question": "其中:基础护壁用量的属性值是多少?", - "answer": "属性值是74394.212" - }, - { - "question": "铺石加混凝土的属性值是多少?", - "answer": "属性值是0.0" - }, - { - "question": "导线用量(西北)的属性值是多少?", - "answer": "属性值是-795976.0855" - }, - { - "question": "导线单公里用量(西北)的属性值是多少?", - "answer": "属性值是-159195.2171" - }, - { - "question": "灰土垫层单公里用量(西北)的属性值是多少?", - "answer": "属性值是8.0" - }, - { - "question": "地线瓷绝缘子单公里用量(西北)的属性值是多少?", - "answer": "属性值是738.253" - }, - { - "question": "地形条件_高山的属性值是多少?", - "answer": "属性值是7" - }, - { - "question": "流砂坑比例的属性值是多少?", - "answer": "属性值是0.001" - }, - { - "question": "碎石_数量的属性值是多少?", - "answer": "属性值是12" - }, - { - "question": "线路参数_导地线防震措施的属性值是多少?", - "answer": "属性值是457" - }, - { - "question": "灰土垫层的属性值是多少?", - "answer": "属性值是40.0" - }, - { - "question": "交叉跨越_弱电线路的属性值是多少?", - "answer": "属性值是45" - }, - { - "question": "地线1_根数的属性值是多少?", - "answer": "属性值是12" - }, - { - "question": "土质比例_岩石(人凿)的属性值是多少?", - "answer": "属性值是49" - }, - { - "question": "耐张混凝土杆基数的属性值是多少?", - "answer": "属性值是26.0" - }, - { - "question": "设计单位的属性值是多少?", - "answer": "属性值是3" - }, - { - "question": "接地钢的属性值是多少?", - "answer": "属性值是" - }, - { - "question": "间隔棒_单公里用量的属性值是多少?", - "answer": "属性值是r" - }, - { - "question": "导线其中:跳线和导线弧垂单公里用量(西北)的属性值是多少?", - "answer": "属性值是159203.0171" - }, - { - "question": "桩基础的属性值是多少?", - "answer": "属性值是310.0" - }, - { - "question": "降阻剂的属性值是多少?", - "answer": "属性值是" - }, - { - "question": "可抵扣增值税(万元)的属性值是多少?", - "answer": "属性值是2005241.808822" - }, - { - "question": "主要技术经济指标2的属性值是多少?", - "answer": "属性值是" - }, - { - "question": "合成绝缘子_数量的属性值是多少?", - "answer": "属性值是5" - }, - { - "question": "土质比例_水坑的属性值是多少?", - "answer": "属性值是47" - }, - { - "question": "基础_插入式的属性值是多少?", - "answer": "属性值是3" - }, - { - "question": "耐张角钢塔比例的属性值是多少?", - "answer": "属性值是250%" - }, - { - "question": "地线的属性值是多少?", - "answer": "属性值是" - }, - { - "question": "回路数的属性值是多少?", - "answer": "属性值是三回" - }, - { - "question": "导线其中:跳线和导线弧垂用量的属性值是多少?", - "answer": "属性值是796015.0855" - }, - { - "question": "OPGW用量(西北)的属性值是多少?", - "answer": "属性值是2904.737" - }, - { - "question": "现浇混凝土_单公里用量的属性值是多少?", - "answer": "属性值是22" - }, - { - "question": "架线工程费用(万元)(含价差)的属性值是多少?", - "answer": "属性值是3203726.0" - }, - { - "question": "耐张钢管塔比例的属性值是多少?", - "answer": "属性值是300%" - }, - { - "question": "单公里土石方量_基面的属性值是多少?", - "answer": "属性值是8*8" - }, - { - "question": "地线2的属性值是多少?", - "answer": "属性值是" - }, - { - "question": "降阻剂的属性值是多少?", - "answer": "属性值是" - }, - { - "question": "土质比例的属性值是多少?", - "answer": "属性值是" - }, - { - "question": "地线1_单位单价的属性值是多少?", - "answer": "属性值是113" - }, - { - "question": "绝缘子串型式_悬垂串的属性值是多少?", - "answer": "属性值是48" - }, - { - "question": "基坑土石方量(西北)的属性值是多少?", - "answer": "属性值是405403506.156" - }, - { - "question": "基坑坚土的属性值是多少?", - "answer": "属性值是25585167.713" - }, - { - "question": "基坑普通土的属性值是多少?", - "answer": "属性值是313873965.334" - }, - { - "question": "瓷绝缘子单公里用量(西北)的属性值是多少?", - "answer": "属性值是201.0" - } -] \ No newline at end of file diff --git a/backend/unit_test/ProjectQuantities.json b/backend/unit_test/ProjectQuantities.json deleted file mode 100644 index 5349024..0000000 --- a/backend/unit_test/ProjectQuantities.json +++ /dev/null @@ -1,202 +0,0 @@ -[ - { - "question": "电杆坑、塔坑、拉线坑人工挖方(或爆破)及回填 水坑 坑深2.0m以内的编码是多少?", - "answer": "编码是YX2-72" - }, - { - "question": "钢筋加工及制作的编码是多少?", - "answer": "编码是YX3-43" - }, - { - "question": "船舶运输 线材 每件重400kg以内 运输的编码是多少?", - "answer": "编码是YX1-132" - }, - { - "question": "船舶运输 钢管塔材 运输的编码是多少?", - "answer": "编码是YX1-152" - }, - { - "question": "碎石的编码是多少?", - "answer": "编码是C10020103" - }, - { - "question": "混凝土(保护帽)的编码是多少?", - "answer": "编码是ZH1001" - }, - { - "question": "船舶运输 金具、绝缘子、零星钢材 运输的编码是多少?", - "answer": "编码是YX1-144" - }, - { - "question": "人力运输 混凝土杆 每件重500kg以内的编码是多少?", - "answer": "编码是YX1-1" - }, - { - "question": "船舶运输 线材 每件重1000kg以内 运输的编码是多少?", - "answer": "编码是YX1-136" - }, - { - "question": "混凝土搅拌及浇制 每基基础联系梁混凝土量20m³以内的编码是多少?", - "answer": "编码是YX3-69" - }, - { - "question": "索道运输 循环式 塔材 荷载1t以内 装卸的编码是多少?", - "answer": "编码是YX1-185" - }, - { - "question": "人力运输 混凝土预制品 每件重100kg以内的编码是多少?", - "answer": "编码是YX1-6" - }, - { - "question": "船舶运输 混凝土杆 每件重1500kg以上 运输的编码是多少?", - "answer": "编码是YX1-118" - }, - { - "question": "碎石的编码是多少?", - "answer": "编码是C10020103" - }, - { - "question": "电杆坑、塔坑、拉线坑人工挖方(或爆破)及回填 泥水 坑深8.0m以上的编码是多少?", - "answer": "编码是YX2-55" - }, - { - "question": "机械施工土方 场地平整的编码是多少?", - "answer": "编码是GT1-1" - }, - { - "question": "汽车运输 混凝土预制品 每件重100kg以内 装卸的编码是多少?", - "answer": "编码是YX1-69" - }, - { - "question": "汽车运输 其他建筑安装材料 运输的编码是多少?", - "answer": "编码是YX1-108" - }, - { - "question": "钻孔灌注桩基础 混凝土搅拌及浇制 孔深10m以内的编码是多少?", - "answer": "编码是YX3-171" - }, - { - "question": "线路复测及分坑 直线双杆及拉线塔的编码是多少?", - "answer": "编码是YX2-3" - }, - { - "question": "氧化锌避雷器安装 35kV的编码是多少?", - "answer": "编码是YX7-32" - }, - { - "question": "混凝土(保护帽)的编码是多少?", - "answer": "编码是ZH1002" - }, - { - "question": "汽车运输 其他建筑安装材料 装卸的编码是多少?", - "answer": "编码是YX1-107" - }, - { - "question": "船舶运输 混凝土杆 每件重500kg以内 装卸的编码是多少?", - "answer": "编码是YX1-109" - }, - { - "question": "混凝土(保护帽)的编码是多少?", - "answer": "编码是ZH1001" - }, - { - "question": "人力运输 混凝土杆 每件重500kg以内的编码是多少?", - "answer": "编码是YX1-1" - }, - { - "question": "人力运输 混凝土杆 每件重500kg以内的编码是多少?", - "answer": "编码是YX1-1" - }, - { - "question": "普通硅酸盐水泥的编码是多少?", - "answer": "编码是C09010102" - }, - { - "question": "拖拉机运输 钢管塔材 运输的编码是多少?", - "answer": "编码是YX1-44" - }, - { - "question": "尖峰及施工基面挖方(或爆破) 普通土的编码是多少?", - "answer": "编码是YX2-226" - }, - { - "question": "汽车运输 角钢塔材 装卸的编码是多少?", - "answer": "编码是YX1-103" - }, - { - "question": "接地槽挖方(或爆破)及回填 普通土的编码是多少?", - "answer": "编码是YX2-213" - }, - { - "question": "水的编码是多少?", - "answer": "编码是C21010101" - }, - { - "question": "直线(直线换位、直线转角)杆塔绝缘子串悬挂安装 35kV 针式单联串(悬垂串)的编码是多少?", - "answer": "编码是YX6-21" - }, - { - "question": "直线(直线换位、直线转角)杆塔绝缘子串悬挂安装 35kV I型双联串(悬垂串)的编码是多少?", - "answer": "编码是YX6-22" - }, - { - "question": "钻孔灌注桩基础 机械推钻成孔 砂砾石 孔深20m以内 孔径1.0m以内的编码是多少?", - "answer": "编码是YX3-117" - }, - { - "question": "线路复测及分坑 直线自立塔的编码是多少?", - "answer": "编码是YX2-6" - }, - { - "question": "钻孔灌注桩基础 凿桩头 桩径0.8m以上的编码是多少?", - "answer": "编码是YX3-180" - }, - { - "question": "线路复测及分坑 耐张(转角)单杆的编码是多少?", - "answer": "编码是YX2-2" - }, - { - "question": "中砂的编码是多少?", - "answer": "编码是C10010101" - }, - { - "question": "人力运输 混凝土杆 每件重500kg以内的编码是多少?", - "answer": "编码是YX1-1" - }, - { - "question": "带电跨越电力线 被跨线电压等级 35kV的编码是多少?", - "answer": "编码是YX5-186" - }, - { - "question": "人工挖土方 普土 深2m以内的编码是多少?", - "answer": "编码是YT1-1" - }, - { - "question": "混凝土杆的编码是多少?", - "answer": "编码是" - }, - { - "question": "接地模块安装的编码是多少?", - "answer": "编码是YX3-213" - }, - { - "question": "拖拉机运输 线材 每件重400kg以内 运输的编码是多少?", - "answer": "编码是YX1-34" - }, - { - "question": "拖拉机运输 其他建筑安装材料 装卸的编码是多少?", - "answer": "编码是YX1-45" - }, - { - "question": "普通硅酸盐水泥的编码是多少?", - "answer": "编码是C09010102" - }, - { - "question": "船舶运输 线材 每件重4000kg以内 装卸的编码是多少?", - "answer": "编码是YX1-139" - }, - { - "question": "水的编码是多少?", - "answer": "编码是C21010101" - } -] \ No newline at end of file diff --git a/backend/unit_test/TotalCalculateTable.json b/backend/unit_test/TotalCalculateTable.json deleted file mode 100644 index fce3d01..0000000 --- a/backend/unit_test/TotalCalculateTable.json +++ /dev/null @@ -1,202 +0,0 @@ -[ - { - "question": "架空输电线路本体工程的金额是多少?", - "answer": "金额是55105688268.5176010132" - }, - { - "question": "价差预备费的金额是多少?", - "answer": "金额是22731130869.6655998230" - }, - { - "question": "工程静态投资的金额是多少?", - "answer": "金额是715035853336.3909912109" - }, - { - "question": "工程动态投资的金额是多少?", - "answer": "金额是776282009093.5660400391" - }, - { - "question": "其中:工程建设检测费的金额是多少?", - "answer": "金额是185575370.1463980079" - }, - { - "question": "工程静态投资的金额是多少?", - "answer": "金额是715035853336.3909912109" - }, - { - "question": "建设期贷款利息的金额是多少?", - "answer": "金额是38515024887.5095977783" - }, - { - "question": "特殊项目的金额是多少?", - "answer": "金额是0E-10" - }, - { - "question": "动态费用的金额是多少?", - "answer": "金额是61246155757.1752014160" - }, - { - "question": "动态费用的金额是多少?", - "answer": "金额是61246155757.1752014160" - }, - { - "question": "小计的金额是多少?", - "answer": "金额是458257942570.3129882812" - }, - { - "question": "其他费用的金额是多少?", - "answer": "金额是210942912572.8689880371" - }, - { - "question": "基本预备费的金额是多少?", - "answer": "金额是14020310849.7332000732" - }, - { - "question": "其中:水土保持监测及验收费的金额是多少?", - "answer": "金额是0E-10" - }, - { - "question": "其中:工程建设检测费的金额是多少?", - "answer": "金额是185575370.1463980079" - }, - { - "question": "其中:特种设备安全监测费的金额是多少?", - "answer": "金额是0E-10" - }, - { - "question": "工程静态投资的金额是多少?", - "answer": "金额是715035853336.3909912109" - }, - { - "question": "其中:水土保持监测及验收费的金额是多少?", - "answer": "金额是0E-10" - }, - { - "question": "架空输电线路本体工程的金额是多少?", - "answer": "金额是55105688268.5176010132" - }, - { - "question": "基本预备费的金额是多少?", - "answer": "金额是14020310849.7332000732" - }, - { - "question": "其中:水土保持监测及验收费的金额是多少?", - "answer": "金额是0E-10" - }, - { - "question": "小计的金额是多少?", - "answer": "金额是458257942570.3129882812" - }, - { - "question": "编制基准期价差的金额是多少?", - "answer": "金额是29246752707.1180000305" - }, - { - "question": "其中:水土保持监测及验收费的金额是多少?", - "answer": "金额是0E-10" - }, - { - "question": "小计的金额是多少?", - "answer": "金额是458257942570.3129882812" - }, - { - "question": "其他费用的金额是多少?", - "answer": "金额是210942912572.8689880371" - }, - { - "question": "特殊项目的金额是多少?", - "answer": "金额是0E-10" - }, - { - "question": "编制基准期价差的金额是多少?", - "answer": "金额是29246752707.1180000305" - }, - { - "question": "特殊项目的金额是多少?", - "answer": "金额是0E-10" - }, - { - "question": "小计的金额是多少?", - "answer": "金额是458257942570.3129882812" - }, - { - "question": "工程动态投资的金额是多少?", - "answer": "金额是776282009093.5660400391" - }, - { - "question": "其中:建设场地征用及清理费的金额是多少?", - "answer": "金额是16831284.2287110016" - }, - { - "question": "其中:可抵扣增值税额的金额是多少?", - "answer": "金额是20069645492.2888984680" - }, - { - "question": "小计的金额是多少?", - "answer": "金额是458257942570.3129882812" - }, - { - "question": "动态费用的金额是多少?", - "answer": "金额是61246155757.1752014160" - }, - { - "question": "建设期贷款利息的金额是多少?", - "answer": "金额是38515024887.5095977783" - }, - { - "question": "工程静态投资的金额是多少?", - "answer": "金额是715035853336.3909912109" - }, - { - "question": "其中:建设场地征用及清理费的金额是多少?", - "answer": "金额是16831284.2287110016" - }, - { - "question": "建设期贷款利息的金额是多少?", - "answer": "金额是38515024887.5095977783" - }, - { - "question": "工程动态投资的金额是多少?", - "answer": "金额是776282009093.5660400391" - }, - { - "question": "架空输电线路本体工程的金额是多少?", - "answer": "金额是55105688268.5176010132" - }, - { - "question": "其中:工程建设检测费的金额是多少?", - "answer": "金额是185575370.1463980079" - }, - { - "question": "其中:水土保持监测及验收费的金额是多少?", - "answer": "金额是0E-10" - }, - { - "question": "工程动态投资的金额是多少?", - "answer": "金额是776282009093.5660400391" - }, - { - "question": "其中:可抵扣增值税额的金额是多少?", - "answer": "金额是20069645492.2888984680" - }, - { - "question": "价差预备费的金额是多少?", - "answer": "金额是22731130869.6655998230" - }, - { - "question": "一般线路本体工程的金额是多少?", - "answer": "金额是55105688268.5176010132" - }, - { - "question": "其中:工程建设检测费的金额是多少?", - "answer": "金额是185575370.1463980079" - }, - { - "question": "基本预备费的金额是多少?", - "answer": "金额是14020310849.7332000732" - }, - { - "question": "设备购置费的金额是多少?", - "answer": "金额是2567934636.3574500084" - } -] \ No newline at end of file diff --git a/backend/unit_test/prompts.py b/backend/unit_test/prompts.py new file mode 100644 index 0000000..d5de592 --- /dev/null +++ b/backend/unit_test/prompts.py @@ -0,0 +1,61 @@ +Attribute_Prompt = ( + "你是一个电力造价工程相关的项目经理,现在给你一些上下文信息," + "你需要根据现有的上下文信息,来生成{num_questions_per_chunk}个电力造价工程相关的问题和对应的回答," + "现在需要你针对数据中属性一列进行提问和回答。" + "问题和回答的示例应该是这种类型的,示例:工程总投资(万元),工程总投资(万元)是77469835.590045万元;尖峰及施工基面土石方量,尖峰及施工基面土石方量是8377.6;截止阀的编码,截止阀的编码是F01010203。" + "你生成的回答必须严格按照示例中的格式:('问题, 回答')。不允许有丝毫的变动,问题和回答应该在一个单引号内。" + "这种类似的问题和答案,生成的问题和答案必须一一对应,要符合文件里的内容,不要生成一些无关的问题,不要生成一些重复的问题," + "不要生成一些过于简单的问题,不要生成一些过于复杂的问题。" +) + + +# Amount_Prompt = ( +# "你是一个电力造价工程相关的项目经理,现在给你一些上下文信息," +# "你需要根据现有的上下文信息,来生成{num_questions_per_chunk}个电力造价工程相关的问题和对应的回答," +# "现在需要你针对上下文信息中的金额或者合价进行提问和回答。" +# "问题和回答的示例应该是这种类型的,示例:项目建设技术服务费的金额,项目建设技术服务费的金额是16855957065.4302; 架空输电线路本体工程的金额,架空输电线路本体工程的金额是55105688268.5176; 工程静态投资的金额,工程静态投资的金额是715035853336.391。" +# "你生成的回答必须严格按照示例中的格式:('问题, 回答')。不允许有丝毫的变动,问题和回答应该在一个单引号内。" +# "这种类似的问题和答案,生成的问题和答案必须一一对应,要符合文件里的内容,不要生成一些无关的问题,不要生成一些重复的问题," +# "不要生成一些过于简单的问题,不要生成一些过于复杂的问题。" +# ) + + +Amount_Prompt = """\ + 上下文信息是一张JSON格式的数据表,请根据数据表中内容进行生成{num_questions_per_chunk}个和金额有关的问题。 + 生成规则推荐使用表中记录行的“代码、其他费、单位投资、合计费、安装费、序号"等字段的值来查询“金额”字段的值是多少钱的方式。 例如: + 记录行中代码字段的值是3A000000,则生成的问题为:代码为3A000000的金额是多少? +""" + + +Units_Prompt = ( + "你是一个电力造价工程相关的项目经理,现在给你一些上下文信息," + "你需要根据现有的上下文信息,来生成{num_questions_per_chunk}个电力造价工程相关的问题和对应的回答," + "现在需要你针对上下文信息来进行单位转化问题提问和回答。" + "问题和回答的示例应该是这种类型的,示例:工程总投资(万元)结果用元表示,工程总投资(万元)是774698355900.45元;本体工程(元)结果用万元表示,本体工程(元)是5490494.261046万元。" + "你生成的回答必须严格按照示例中的格式:('问题, 回答')。不允许有丝毫的变动,问题和回答应该在一个单引号内。" + "这种类似的问题和答案,生成的问题和答案必须一一对应,要符合文件里的内容,不要生成一些无关的问题,不要生成一些重复的问题," + "不要生成一些过于简单的问题,不要生成一些过于复杂的问题。" +) + +Name_Prompt = ( + "你是一个电力造价工程相关的项目经理,现在给你一些上下文信息," + "你需要根据现有的上下文信息,来生成{num_questions_per_chunk}个电力造价工程相关的问题和对应的回答," + "现在需要你针对上下文信息中的重名问题进行提问和回答。" + "问题和回答的示例应该是这种类型的,示例:专业类型为线路的杆塔工程项目划分的合价,专业类型为线路的杆塔工程项目划分的合价是220969744.905856;专业类型为线路清理的杆塔工程项目划分的合价,电缆工程的合价是0。" + "你生成的回答必须严格按照示例中的格式:('问题, 回答')。不允许有丝毫的变动,问题和回答应该在一个单引号内。" + "这种类似的问题和答案,生成的问题和答案必须一一对应,要符合文件里的内容,不要生成一些无关的问题,不要生成一些重复的问题," + "不要生成一些过于简单的问题,不要生成一些过于复杂的问题。" +) + + +All_Amount_Prompt = ( + "你是一个电力造价工程相关的项目经理,现在给你一些上下文信息," + "你需要根据现有的上下文信息,来生成{num_questions_per_chunk}个电力造价工程相关的问题和对应的回答," + "现在需要你针对上下文信息中的总体金额进行提问和回答。" + "问题和回答的示例应该是这种类型的,示例:架空输电线路本体工程的总体金额,架空输电线路本体工程的总体金额是7.706703;工程静态投资的总体金额,工程静态投资的总体金额是100。" + "你生成的回答必须严格按照示例中的格式:('问题, 回答')。不允许有丝毫的变动,问题和回答应该在一个单引号内。" + "这种类似的问题和答案,生成的问题和答案必须一一对应,要符合文件里的内容,不要生成一些无关的问题,不要生成一些重复的问题," + "不要生成一些过于简单的问题,不要生成一些过于复杂的问题。" +) + + diff --git a/backend/unit_test/test.json b/backend/unit_test/test.json deleted file mode 100644 index 61684d3..0000000 --- a/backend/unit_test/test.json +++ /dev/null @@ -1,10 +0,0 @@ -[ - { - "question": "人工费的费率是多少?", - "answer": "费率是100.0000000000" - }, - { - "question": "临时设施费的费率是多少?", - "answer": "费率是6.3500000000" - } -] \ No newline at end of file diff --git a/backend/unit_test/test_answer.py b/backend/unit_test/test_answer.py new file mode 100644 index 0000000..bb6ba7f --- /dev/null +++ b/backend/unit_test/test_answer.py @@ -0,0 +1,67 @@ +from dotenv import load_dotenv +load_dotenv() + +import os,json,asyncio,nest_asyncio +from typing import Dict +from app.engine import get_chat_engine +from app.observability import init_observability +from app.settings import init_settings + +init_settings() +init_observability() +nest_asyncio.apply() + +# 开始答题 +async def run_answer(prjflag:str,title:str,content:Dict[str,str], output_file:str): + results = [] + for question,answer in content.items(): + param = {'prjFalg':prjflag} + chat_engine = get_chat_engine(params = param) + response = await chat_engine.astream_chat(question) + + final_response = '' + async for token in response.async_response_gen(): + final_response += token + + if final_response!=' ': + content_str = final_response + else: + content_str = "<无回答>" + + result_dict = { + "问题": question, + "答案": answer, + "回答": content_str + } + results.append(result_dict) + + outInfo = {f'{title}':results} + with open(output_file, 'a', encoding='utf-8') as f: + f.write(json.dumps(outInfo, ensure_ascii=False, indent=4)) + f.write(',\n') + +# 主异步函数 +async def excute(prjflag:str,filePath:str,outFilePath:str): + with open(filePath, 'r', encoding='utf-8') as f: + data:dict= json.load(f) + for title, items in data.items(): + content = {} + for index, item in enumerate(items, start=1): + question = item['question'] + answer = item['answer'] + content[question] = answer + await run_answer(prjflag,title,content,outFilePath) + +async def main(): + que_Dir = os.path.join(os.getcwd(),f'unit_test\\Quetions') + ans_dir = os.path.join(os.getcwd(),f'unit_test\\Answers') + que_files = [f for f in os.listdir(que_Dir) if f.endswith('.json')] + for que_file in que_files: + prjflag = os.path.splitext(que_file)[0] + filePath =os.path.join(que_Dir,que_file) + os.makedirs(ans_dir,exist_ok = True) + output_file_path = os.path.join(ans_dir,f'{que_file}') + await excute(prjflag,filePath,output_file_path) + +# 运行主协程 +asyncio.run(main()) \ No newline at end of file diff --git a/backend/unit_test/corr_test.py b/backend/unit_test/test_evaluate.py similarity index 51% rename from backend/unit_test/corr_test.py rename to backend/unit_test/test_evaluate.py index d97e902..91f313c 100644 --- a/backend/unit_test/corr_test.py +++ b/backend/unit_test/test_evaluate.py @@ -1,8 +1,16 @@ -import json from dotenv import load_dotenv -import asyncio -import nest_asyncio +load_dotenv() + +import os,json,asyncio,nest_asyncio +from typing import Dict +from llama_index.core.evaluation import CorrectnessEvaluator +from app.observability import init_observability +from app.settings import init_settings + +init_settings() +init_observability() nest_asyncio.apply() + from llama_index.core.prompts import ( ChatMessage, ChatPromptTemplate, @@ -55,64 +63,61 @@ DEFAULT_EVAL_TEMPLATE = ChatPromptTemplate( ] ) -from app.api.routers.models import ChatData, Message -from llama_index.core.chat_engine.types import BaseChatEngine, NodeWithScore -from llama_index.core.vector_stores.types import MetadataFilter, MetadataFilters -from llama_index.core.evaluation import CorrectnessEvaluator -from app.engine import get_chat_engine -from app.api.routers.chat import generate_filters -from app.engine.index import get_index -from app.observability import init_observability -from app.settings import init_settings - - -load_dotenv() - - -init_settings() -init_observability() - -index = get_index() # 初始化聊天引擎和评估器 -chat_engine = get_chat_engine() corr_evaluator_qwen = CorrectnessEvaluator() -# 加载本地问题回答文件 -file_path = 'D:/LLM_model/text2sql/zjdataai-app-test/backend/unit_test/test.json' -output_file_path = file_path.replace('.json', '_test.json') - -with open(file_path, 'r', encoding='utf-8') as f: - data = json.load(f) # 异步函数用于评估查询 -async def evaluate_query(question, answer, index, output_file): - response = await chat_engine.astream_chat(question) - content_str = str(response.sources[0]) - - result = corr_evaluator_qwen.evaluate( - query=question, - response=content_str, - reference=answer, - ) - - result_dict = { - "编号": index, - "问题": question, - "答案": answer, - "回答": result.response, - "得分(0~5)": result.score, - "评价": result.feedback - } - +async def evaluate_query(title:str,contents:list, output_file:str): + index = 0 + results = [] + for content in contents: + question = content[0] + answer = content[1] + response = content[2] + result = corr_evaluator_qwen.evaluate( + query=question, + response=response, + reference=answer, + ) + + result_dict = { + "编号": index, + "问题": question, + "答案": answer, + "回答": result.response, + "得分(1~5)": result.score, + "评价": result.feedback + } + results.append(result_dict) + outInfo = {f'{title}':results} with open(output_file, 'a', encoding='utf-8') as f: - f.write(json.dumps(result_dict, ensure_ascii=False, indent=4)) - f.write(',') + f.write(json.dumps(outInfo, ensure_ascii=False, indent=4)) + f.write(',\n') # 主异步函数 +async def excute(filePath:str,outFilePath:str): + with open(filePath, 'r', encoding='utf-8') as f: + data:dict= json.load(f) + for title, items in data.items(): + content = [] + for index, item in enumerate(items, start=1): + question = item['问题'] + answer = item['答案'] + response = item['回答'] + content.append((question,answer,response)) + await evaluate_query(title,content,outFilePath) + async def main(): - for index, item in enumerate(data, start=1): - await evaluate_query(item['question'], item['answer'], index, output_file_path) + ans_Dir = os.path.join(os.getcwd(),f'unit_test\\Answers') + eva_Dir = os.path.join(os.getcwd(),f'unit_test\\Evaluate') + ans_files = [f for f in os.listdir(ans_Dir) if f.endswith('.json')] + for ans_file in ans_files: + filePath = os.path.join(ans_Dir, ans_file) + os.makedirs(eva_Dir,exist_ok = True) + output_file_path = os.path.join(eva_Dir,f'{ans_file}') + await excute(filePath,output_file_path) # 运行主协程 asyncio.run(main()) \ No newline at end of file diff --git a/backend/unit_test/test_question.py b/backend/unit_test/test_question.py new file mode 100644 index 0000000..b7c65cf --- /dev/null +++ b/backend/unit_test/test_question.py @@ -0,0 +1,190 @@ + +from dotenv import load_dotenv +load_dotenv() + +from typing import List,Dict +import json,sys,os +from app.observability import init_observability +from app.settings import init_settings + +import nest_asyncio +nest_asyncio.apply() + +from llama_index.core import SimpleDirectoryReader +from llama_index.core.evaluation import DatasetGenerator + +import prompts +from app.engine.loaders.markdownReader import ChunkMarkdownReader +from llama_index.core.readers.json import JSONReader +from llama_index.core.schema import Document +from llama_index.core.prompts.base import PromptTemplate +from llama_index.core.prompts.prompt_type import PromptType +from app.engine.loaders import get_document_Types,getFileCacahePath + +init_settings() +init_observability() + + +text_question_template = """\ +给定的上下文信息如下: +--------------------- +{context_str} +--------------------- +根据给定的上下文信息而非先验知识。 +仅围绕下面的问题描述生成多个问题。 +{query_str} +""" + +text_qa_template = """\ + 给定的上下文信息如下: + --------------------- + {context_str} + --------------------- + 根据给定的上下文信息而非先验知识,回答问题。 + 问题: {query_str} + 回答: +""" + +class FileLoader: + def __init__(self) -> None: + self._prjTabels:Dict[str,any] = {} + + def load(self): + rootPath = getFileCacahePath() + prjFlags = get_document_Types() + prjDocs = {} + for prjFlag in prjFlags: + filePath = os.path.join(rootPath,prjFlag.replace('_','\\')) + extrator = self._get_FileExtrator() + documents = SimpleDirectoryReader(input_dir = filePath,file_extractor = extrator).load_data() + prjDocs[prjFlag] = documents + self._add_tables(prjFlag,documents) + return prjDocs + + def get_TableNames(self): + return self._prjTabels + + def _add_tables(self,prjFlag:str,documents:List[Document]): + fileNames = [] + for doc in documents: + meta = doc.metadata + fileBaseName = meta['file_name'] + fileName = os.path.splitext(os.path.basename(fileBaseName))[0] + if fileName not in fileNames: + fileNames.append(fileName) + if len(fileNames) > 0: + self._prjTabels[prjFlag] = fileNames + + def _get_FileExtrator(self): + parser = { + ".md" : ChunkMarkdownReader(), + } + return parser + +# 定义中文提示词和Python代码中提示词名称的映射 +prompt_mapping = { + "普通属性": "Attribute_Prompt", + "金额查询": "Amount_Prompt", + "单位换算": "Units_Prompt", + "重名项目划分": "Name_Prompt", + "总体金额查询": "All_Amount_Prompt" +} + +# 定义表格与其对应的查询类别 +table_prompt_mapping = { + "工程信息": ["普通属性", "单位换算"], + "其他费用": ["金额查询", "单位换算"], + "取费表": ["金额查询"], + "总算表": ["金额查询"], + "工程量": ["普通属性", "重名项目划分"] +} + +# 根据表格名称选择特定的表格 +def select_documents(documents:List[Document], table_name:str): + docNodes = [] + for doc in documents: + meta = doc.metadata + fileBaseName = meta['file_name'] + fileName = os.path.splitext(os.path.basename(fileBaseName))[0] + if table_name == fileName: + docNodes.append(doc) + if len(docNodes) == 0: + raise ValueError(f"未找到名为 '{table_name}' 的节点") + return docNodes + +# 选择提示词 +def select_prompt(prompt_category): + prompt_name = prompt_mapping.get(prompt_category) + if not prompt_name: + raise ValueError(f"未找到名为 '{prompt_category}' 的提示词") + try: + return getattr(prompts, prompt_name) + except AttributeError: + raise ValueError(f"未找到提示词 '{prompt_name}' 对应的函数") + +def get_Prompts(tableName:str): + for name,prompts in table_prompt_mapping.items(): + if name in tableName: + return prompts + return [] + +# 生成问题和答案 +def generate_questions_from_document(document, quest_prompt, num_questions): + question_generator = DatasetGenerator.from_documents( + documents=document, + text_question_template = PromptTemplate(text_question_template), + question_gen_query=quest_prompt, + text_qa_template = PromptTemplate(text_qa_template, prompt_type=PromptType.QUESTION_ANSWER), + num_questions_per_chunk=num_questions + ) + + eval_questions = question_generator.generate_dataset_from_nodes(num_questions) + print(eval_questions) + + qa_pairs = [] + for qa in eval_questions.qr_pairs: + qa_pairs.append({ + "question": qa[0].strip(), + "answer": qa[1].strip() + }) + return qa_pairs + +# 主函数,控制生成多个表格的问题和使用多个提示词,并将结果合并到一个文件中 +def main(documents:List[Document], table_names:List[str],num_questions_per_prompt,filePath:str): + all_results = {} + for table_name in table_names: + table_name = table_name.strip() + tbDocs = select_documents(documents, table_name) + selected_prompts = get_Prompts(table_name) + for prompt_category in selected_prompts: + quest_prompt = select_prompt(prompt_category).format(num_questions_per_chunk=num_questions_per_prompt) + qa_pairs = generate_questions_from_document(tbDocs, quest_prompt, num_questions_per_prompt) + label = f"test:{table_name}_{prompt_category}" + all_results[label] = qa_pairs + + # 自动生成输出文件名 + with open(filePath, "w", encoding="utf-8") as f: + json.dump(all_results, f, ensure_ascii=False, indent=4) + +# 获取命令行参数 +if __name__ == "__main__": + if len(sys.argv) != 2: + raise ValueError("Usage: python script.py ") + table_names_input = sys.argv[0] + num_questions_per_prompt = int(sys.argv[1]) + + # table_names_input = '[总算表]' + # num_questions_per_prompt = 2 + + que_Dir = os.path.join(os.getcwd(),f'unit_test\\Quetions') + loader = FileLoader() + prjDocs = loader.load() + prjTableNames = loader.get_TableNames() + for prjFlg,documents in prjDocs.items(): + if table_names_input == "all": + table_names = prjTableNames[prjFlg] + else: + table_names = table_names_input.strip('[]').split(',') + os.makedirs(que_Dir,exist_ok = True) + filePath =os.path.join(que_Dir,f'{prjFlg}.json') + main(documents, table_names, num_questions_per_prompt,filePath) diff --git a/backend/unit_test/test_test.json b/backend/unit_test/test_test.json deleted file mode 100644 index e30b4fb..0000000 --- a/backend/unit_test/test_test.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "编号": 1, - "问题": "人工费的费率是多少?", - "答案": "费率是100.0000000000", - "实际回答": "人工费的费率是100.0。", - "得分": 4.5, - "评价": "生成的答案与参考答案一致,只是表达方式略有不同,但完全正确且相关。" -} -******************** -{ - "编号": 2, - "问题": "临时设施费的费率是多少?", - "答案": "费率是6.3500000000", - "实际回答": "在新的上下文中,临时设施费的计算应当基于取费定额人工费和取费定额机械费,但当前费率被设置为0.0,这意味着需要重新确认或调整费率。在没有具体费率的情况下,不能直接给出确定的费率值。如果需要计算临时设施费,应根据实际的取费定额人工费和取费定额机械费进行计算。参考之前的6.35%的费率可能是一个起点,但请注意,这需要根据项目的具体情况和最新的费用标准进行调整。", - "得分": 1.0, - "评价": "生成的答案与用户查询不相关,用户询问的是临时设施费的费率,而生成的答案提供的是一个关于如何计算临时设施费的解释,且提到了一个不相关的0.0费率,这与用户的问题不符。同时,即使提到了6.35%的费率,也没有明确指出这就是用户想要的答案,反而强调了需要根据项目具体情况调整,这增加了用户的困惑。" -} -********************