diff --git a/flask_app/general/json_utils.py b/flask_app/general/json_utils.py index 1e0d7e1..9cfe879 100644 --- a/flask_app/general/json_utils.py +++ b/flask_app/general/json_utils.py @@ -239,20 +239,17 @@ def add_keys_to_json(target_dict, source_dict): return target_dict -def rename_outer_key(original_data,new_key): - # 定义新的键名 - # new_key = "重新招标, 不再招标和终止招标" - - # 提取原始数据中的唯一外层值(假设只有一个外层键) +def add_outer_key(original_data, new_key): + """ + 在传入的字典外部增加一个新的外键,原始数据保持不变。 + """ + # 检查输入是否为有效的字典 if not original_data or not isinstance(original_data, dict): - print("json_utils: Error: Invalid input or input is not a dictionary.") # 如果输入无效或不是字典,则返回空字典 + print("json_utils: Error: Invalid input or input is not a dictionary.") # 输入无效或不是字典 return {} - # 使用 next(iter(...)) 提取第一个键的值 - original_value = next(iter(original_data.values()), {}) - - # 创建一个新的字典,使用新的键名 - new_data = {new_key: original_value} + # 在原始数据外层增加一个新键 + new_data = {new_key: original_data} return new_data def transform_json_values(data): diff --git a/flask_app/general/static/插入位置.json b/flask_app/general/static/插入位置.json deleted file mode 100644 index 4482b6a..0000000 --- a/flask_app/general/static/插入位置.json +++ /dev/null @@ -1,169 +0,0 @@ -{ - "营业执照": { - "章节": [ - "具有独立承担民事责任能力的法人", - "投标人基本信息表", - "法人或者其他组织的营业执照等证明文件,自然人的身份证明", - "投标人情况介绍", - "投标人简介", - "企业相关证件" - ], - "关键字": [ - "营业执照", - "自然人的身份证明" - ] - }, - "开户信息": { - "章节": [ - "投标人基本信息表", - "开户信息、银行开户信息、开户证明、开户银行", - "投标人情况介绍", - "企业相关证件", - "履行合同所必需的设备和专业技术能力的证明材料" - ], - "关键字": [ - "开户信息", - "银行开户信息", - "开户证明", - "开户银行" - ] - }, - "法定代表人身份证": { - "章节": [ - "法人代表身份证(正、反面复印件)", - "法定代表人(负责人)证明" - ], - "关键字": [ - "法定代表", - "法人代表", - "法定代表人身份证" - ] - }, - "法定代表人授权人身份证": { - "章节": [ - "法人代表授权人身份证复印件", - "法定代表人授权证明" - ], - "关键字": [ - "法定代表人授权", - "授权人身份证" - ] - }, - "人员证书": { - "章节": [ - "拟任本项目管理及技术人员情况" - ], - "关键字": [ - "技术人员情况", - "证书", - "人员资质证书" - ] - }, - "人员社保资料": { - "章节": [ - "拟任本项目管理及技术人员情况", - "项目管理机构主要人员表", - "人员社保资料" - ], - "关键字": [ - "人员情况", - "社保资料", - "社会保险证明", - "社保证明" - ] - }, - "劳动合同": { - "章节": [ - "拟任本项目管理及技术人员情况", - "履行合同所必需的设备和专业技术能力的证明材料" - ], - "关键字": [ - "劳动合同", - "聘用合同书" - ] - }, - "企业证书": { - "章节": [ - "企业实力", - "企业资质文件", - "履行合同所必需的设备和专业技术能力的证明材料", - "按照“供应商资格要求”规定提交的相关证明材料", - "投标人认为需要提供的其他证明材料", - "投标人基本情况表", - "供应商认为有必要提供的其他资料及方案" - ], - "关键字": [ - "企业实力", - "企业资质证书", - "安全生产许可证", - "认证证书" - ] - }, - "企业业绩": { - "章节": [ - "近三年同类项目经验案例", - "类似项目业绩表", - "企业业绩一览表", - "相同或类似项目业绩情况表", - "案例与业绩", - "企业经营业绩" - ], - "关键字": [ - "企业业绩", - "类似项目", - "案例", - "项目情况", - "施工项目" - ] - }, - "财务审计报告": { - "章节": [ - "提供依法缴纳税收和社会保障资金的相关材料", - "具有依法缴纳税收和社会保障资金的良好记录", - "财务状况报告、依法缴纳税收和社会保障资金的相关材料", - "按照“供应商资格要求”规定提交的相关证明材料", - "近年财务状况", - "费用标准证书", - "投标人资质证明文件", - "资格审查资料" - ], - "关键字": [ - "财务报告", - "财务状况", - "财务会计报表" - ] - }, - "缴纳税收证明": { - "章节": [ - "提供依法缴纳税收和社会保障资金的相关材料", - "具有依法缴纳税收和社会保障资金的良好记录", - "财务状况报告、依法缴纳税收和社会保障资金的相关材料", - "投标人简介", - "按照“供应商资格要求”规定提交的相关证明材料", - "用于评审的证明材料", - "费用标准证书", - "投标人资质证明文件", - "资格审查资料" - ], - "关键字": [ - "缴纳税收", - "税收缴纳证明" - ] - }, - "公司缴纳社保证明": { - "章节": [ - "投标人资质证明文件", - "按照“供应商资格要求”规定提交的相关证明材料", - "用于评审的证明材料", - "费用标准证书", - "社会保障资金", - "资格审查资料" - ], - "关键字": [ - "社会保障资金", - "社保资料", - "社会保险证明", - "社保证明" - ] - } -} \ No newline at end of file diff --git a/flask_app/general/投标人须知正文提取指定内容.py b/flask_app/general/投标人须知正文提取指定内容.py index c1eb081..4cdf23d 100644 --- a/flask_app/general/投标人须知正文提取指定内容.py +++ b/flask_app/general/投标人须知正文提取指定内容.py @@ -354,27 +354,42 @@ def get_requirements_with_gpt(merged_baseinfo_path, selection): # } # } # """, - 1:""" - 该招标文件中对投标文件的要求有哪些?请以json格式给我返回结果,外层键名为文中提到的有关投标文件的若干要求,对于各子要求,你可以用嵌套键值对组织回答,其中嵌套键名为你对相关子要求的总结或是原文中的标题,而最内层的键值应该完全与原文内容保持一致;若存在多个并列内容,那么键值为一个列表,列表中包含若干描述该要求的字符串,要求键值与原文内容一致,不得总结、删减。 - 其他要求: - 1.若原文中为对应内容有表格表述,请将该表格用markdown语法返回,每行写在键值中的一个字符串中。 + 1:"""请根据提供的招标文件内容,提取其中有关投标文件的要求、内容,并以 JSON 格式返回结果。 + 格式要求: + - 外层键名应为文中提到的有关投标文件相关要求、内容的大项概览性标题。 + - 对于每个大项下的具体要求内容,有以下两种组织方式: + -不使用嵌套键值对: + - 如果要求是单一内容,键值应为单独的字符串,内容必须与原文保持一致,不得总结或删减。 + - 如果要求包含多个并列内容,键值应为一个字符串列表(数组),其中每个元素都是一条子要求。 + -使用嵌套键值对。 + -嵌套键名应为原文中的具体标题或对相关子要求的简明总结。 + -最内层的键值应与原文内容保持一致,不得进行任何总结、删减或改写。默认键值是单独的字符串,如果一个子要求包含多个并列内容,键值应为一个字符串列表(数组),其中每个元素都是子要求内容。 + 表格内容处理: + - 如果原文中对应内容以表格形式呈现,请使用 Markdown 语法准确重现该表格。 + - 表格的每一行应作为键值中的一个独立字符串,保持表格结构和内容的完整性。 + 禁止内容: + - 确保所有输出内容均基于提供的实际招标文件内容,不使用任何预设的示例作为回答。 + - 预设的示例中的外层键名仅供格式参考,以文中实际内容为主。 - 示例如下,仅供格式参考: - { - "编写要求":"编写要求xxx", - "格式要求":{ - "投标文件格式要求":"投标文件格式要求", - "标记要求":"投标文件标记要求", - "装订要求":"投标文件装订要求", - "文件数量":"投标文件文件数量要求" - }, - "承诺书要求":"承诺书要求xxx", - "递交要求":{ - "递交投标文件的截止日期及递交地点":["递交投标文件的截止日期","递交投标文件的递交地点"], - "投标文件交标方式":"交标方式", - "投标文件的修改与撤回":["投标文件的修改相关要求","投标文件的撤回相关要求"] - } - } + 示例格式(**不要**在回答中包含此内容,仅供参考): + { + "投标的语言":"投标人提交的投标文件以及投标人与集中采购机构或采购人就有关投标的所有来往函电均应使用中文。", + "格式要求":{ + "投标文件格式要求":"投标文件格式要求", + "标记要求":"投标文件标记要求", + "装订要求":"投标文件装订要求", + "文件数量":"投标文件文件数量要求" + }, + "投标报价":[ + "投标人所提供的货物(工程或服务)均以人民币计价。", + "应包含所有相关费用;" + ] + "递交要求":{ + "递交投标文件的截止日期及递交地点":["递交投标文件的截止日期xxx","递交投标文件的递交地点xxx"], + "投标文件交标方式":"交标方式xxx", + "投标文件的修改与撤回":["投标文件的修改相关要求xxx","投标文件的撤回相关要求xxx"] + } + } """, # 2: """ # 该招标文件中开标、评标、定标要求(或磋商流程内容)是什么?你需要从'开标'、'开标异议'、'评标'、'定标'四个角度回答,其中'评标'可以从特殊情况的处置、评标办法及流程、评标委员会的组建角度来说明,'定标'可以从定标流程、履约能力的审查角度来说明,请以json格式返回给我结果,外层键名分别为'开标'、'开标异议'、'评标'、'定标',你可以用嵌套键值对组织回答,嵌套键名为你对相关子要求的总结,而嵌套键值应该完全与原文内容保持一致,不得擅自总结删减,如果原文中未提及相关内容,在键值中填'未知'。输出格式示例如下: @@ -392,28 +407,43 @@ def get_requirements_with_gpt(merged_baseinfo_path, selection): # } # } # """, - 2:""" - 该招标文件中开评定标要求(或磋商流程内容)是什么?请以json格式给我返回结果,外层键名为文中提到的有关开评定标要求(或磋商流程内容)的若干要求,对于各子要求,你可以用嵌套键值对组织回答,其中嵌套键名为你对相关子要求的总结或是原文中的标题,而最内层的键值应该完全与原文内容保持一致;若存在多个并列内容,那么键值为一个列表,列表中包含若干描述该要求的字符串,要求键值与原文内容一致,不得总结、删减。 - 其他要求: - 1.若原文中为对应内容有表格表述,请将该表格用markdown语法返回,每行写在键值中的一个字符串中。 + 2:"""该招标文件中有关开标、评标、定标、中标要求、内容(或磋商流程内容)是什么?请以 JSON 格式返回结果。 + 格式要求: + - 外层键名应为文中提到的有关开标、评标、定标、中标要求或磋商流程内容的大项概览性标题。 + - 对于每个大项下的子要求,使用嵌套的键值对进行组织。 + -其中嵌套键名应为原文中的具体标题或对相关子要求的简明总结。 + -最内层的键值应与原文内容保持一致,不得进行任何总结、删减或改写。默认键值是单独的字符串,如果一个子要求包含多个并列内容,键值应为一个字符串列表(数组),其中每个元素都是子要求内容。 + 表格内容处理: + - 如果原文中对应内容以表格形式呈现,请使用 Markdown 语法准确重现该表格。 + - 表格的每一行应作为键值中的一个独立字符串,保持表格结构和内容的完整性。 + 禁止内容: + - 确保所有输出内容均基于提供的实际招标文件内容,不使用任何预设的示例作为回答。 + - 预设的示例中的外层键名仅供格式参考,以文中实际内容为主。 - 示例如下,仅供格式参考: - { - "开标":"招标文件关于项目开标的要求", - "开标异议":"招标文件中关于开标异议的项", - "评标":{ - "特殊情况的处置":"因“电子交易系统”系统故障导致无法投标的,交易中心及时通知招标人,招标人视情况决定是否顺延投标截止时间。因投标人自身原因导致无法完成投标的,由投标人自行承担后果。", - "评标办法及流程":"评标流程", - "评标委员会的组建":"评标由招标人依法组建的评标委员会负责。评标委员会由招标人或其委托的招标代理机构熟悉相关业务的代表,以及有关技术、经济等方面的专家组成。" - }, - "定标":{ - "定标流程":"定标流程", - "履约能力的审查":"履约能力的审查" - } - } + 示例格式(**不要**在回答中包含此内容,仅供参考): + { + "开标": { + "开标时间":"2024.10.30", + "开标地点":"洪山区人民政府", + "资格审查":[ + "公开招标采购项目开标结束后,采购人与集中采购机构依据法律、法规及招标文件的规定", + "资格审查详见第四章“资格审查方法及标准”。" + ], + }, + "评标": { + "特殊情况的处置": "因“电子交易系统”系统故障导致无法投标的,交易中心及时通知招标人,招标人视情况决定是否顺延投标截止时间。因投标人自身原因导致无法完成投标的,由投标人自行承担后果。", + "评标办法及流程": "评标流程", + "评标委员会的组建": "评标由招标人依法组建的评标委员会负责。评标委员会由招标人或其委托的招标代理机构熟悉相关业务的代表,以及有关技术、经济等方面的专家组成。" + }, + "定标": { + "定标流程": ["定标流程1","定标流程2"], + "履约能力的审查": "履约能力的审查" + } + } """, 3: """ - 该招标文件中重新招标(或重新采购)、不再招标(或不再采购)、终止招标(或终止采购)的情况分别是什么?请以json格式返回给我结果,键名分别为'重新招标','不再招标','终止招标',键值应该完全与原文内容保持一致,不得擅自总结删减,如果原文中未提及相关内容,在键值中填'未知'。示例输出如下: + 该招标文件中重新招标(或重新采购)、不再招标(或不再采购)、终止招标(或终止采购)的情况分别是什么?请以json格式返回给我结果,键名分别为'重新招标','不再招标','终止招标',键值应该完全与原文内容保持一致,不得擅自总结删减,如果原文中未提及相关内容,在键值中填'未知'。 + 示例输出如下,仅供格式参考: { "重新招标":"有下列情形之一的,招标人将重新招标:(1)投标截止时间止,投标人少于3个的;(2)经评标委员会评审后否决所有投标的;", "不再招标":"重新招标后投标人仍少于3个或者所有投标被否决的,属于必须审批或核准的工程建设项目,经原审批或核准部门批准后不再进行招标。", @@ -429,14 +459,14 @@ def get_requirements_with_gpt(merged_baseinfo_path, selection): return {"error": f"无效的 selection 值: {selection}. 请选择 1、2 或 3。"} # 调用大模型并处理响应 try: - res = qianwen_long_stream(file_id, user_query,1) + res = qianwen_long_stream(file_id, user_query,2) cleaned_res = clean_json_string(res) return cleaned_res except Exception as e: return {"error": "调用大模型失败"} if __name__ == "__main__": - merged_baseinfo_path = r"D:\flask_project\flask_app\static\output\output1\648e094b-e677-47ce-9073-09e0c82af210\ztbfile_merged_baseinfo.pdf" - selection=2 + merged_baseinfo_path = r"D:\flask_project\flask_app\static\output\output1\ce279982-aeeb-4f08-ab39-df6ee2732eae\ztbfile.pdf" + selection=1 res=get_requirements_with_gpt(merged_baseinfo_path,selection) print(json.dumps(res,ensure_ascii=False,indent=4)) \ No newline at end of file diff --git a/flask_app/general/通义千问long.py b/flask_app/general/通义千问long.py index 99bf9a6..cc12350 100644 --- a/flask_app/general/通义千问long.py +++ b/flask_app/general/通义千问long.py @@ -43,7 +43,7 @@ def upload_file(file_path,output_folder=""): return file_id @sleep_and_retry -@limits(calls=4, period=1) # 每秒最多调用4次 +@limits(calls=8, period=1) # 每秒最多调用4次 def rate_limiter(): pass # 这个函数本身不执行任何操作,只用于限流 diff --git a/flask_app/old_version/解析old_old.py b/flask_app/old_version/解析old_old.py index 6fc50ab..368f12c 100644 --- a/flask_app/old_version/解析old_old.py +++ b/flask_app/old_version/解析old_old.py @@ -10,7 +10,7 @@ from flask_app.general.json_utils import transform_json_values from flask_app.工程标.无效标和废标和禁止投标整合 import combine_find_invalid from flask_app.工程标.投标人须知正文提取指定内容工程标 import extract_from_notice import concurrent.futures -from flask_app.工程标.基础信息整合快速版 import combine_basic_info +from flask_app.工程标.基础信息整合工程标 import combine_basic_info from flask_app.工程标.资格审查模块 import combine_review_standards from flask_app.old_version.商务评分技术评分整合 import combine_evaluation_standards from flask_app.general.format_change import pdf2docx, docx2pdf,doc2docx diff --git a/flask_app/routes/工程标解析main.py b/flask_app/routes/工程标解析main.py index 328f536..af5f1be 100644 --- a/flask_app/routes/工程标解析main.py +++ b/flask_app/routes/工程标解析main.py @@ -14,7 +14,7 @@ from flask_app.general.json_utils import transform_json_values from flask_app.general.无效标和废标公共代码 import combine_find_invalid from flask_app.工程标.投标人须知正文提取指定内容工程标 import extract_from_notice import concurrent.futures -from flask_app.工程标.基础信息整合快速版 import combine_basic_info +from flask_app.工程标.基础信息整合工程标 import combine_basic_info from flask_app.工程标.资格审查模块 import combine_review_standards from flask_app.general.商务技术评分提取 import combine_evaluation_standards from flask_app.general.format_change import pdf2docx, docx2pdf diff --git a/flask_app/工程标/基础信息整合快速版.py b/flask_app/工程标/基础信息整合工程标.py similarity index 98% rename from flask_app/工程标/基础信息整合快速版.py rename to flask_app/工程标/基础信息整合工程标.py index 042555a..a2e6065 100644 --- a/flask_app/工程标/基础信息整合快速版.py +++ b/flask_app/工程标/基础信息整合工程标.py @@ -2,7 +2,7 @@ import copy import json import time import concurrent.futures -from flask_app.general.json_utils import clean_json_string, rename_outer_key +from flask_app.general.json_utils import clean_json_string, add_outer_key from flask_app.general.通用功能函数 import judge_consortium_bidding, process_judge_questions from flask_app.工程标.投标人须知正文提取指定内容工程标 import extract_from_notice from flask_app.工程标.判断是否分包等 import read_questions_from_judge, merge_json_to_list @@ -180,7 +180,7 @@ def combine_basic_info(merged_baseinfo_path,merged_baseinfo_path_more, tobidders rebidding_situation = future3.result() # 获取提取失败的情况 updated_list = update_baseinfo_lists(baseinfo_list1, baseinfo_list2) - update_json = rename_outer_key(rebidding_situation, "重新招标、不再招标和终止招标") + update_json = add_outer_key(rebidding_situation, "重新招标、不再招标和终止招标") updated_list.append(update_json) aggregated_baseinfo = aggregate_basic_info_engineering(updated_list) diff --git a/flask_app/货物标/基础信息解析main.py b/flask_app/货物标/基础信息解析main.py index 3268514..da0afe0 100644 --- a/flask_app/货物标/基础信息解析main.py +++ b/flask_app/货物标/基础信息解析main.py @@ -3,7 +3,7 @@ import json import threading import time import concurrent.futures -from flask_app.general.json_utils import clean_json_string, rename_outer_key +from flask_app.general.json_utils import clean_json_string, add_outer_key from flask_app.general.通用功能函数 import judge_consortium_bidding, process_judge_questions from flask_app.general.多线程提问 import read_questions_from_file, multi_threading from flask_app.general.通义千问long import upload_file @@ -154,7 +154,7 @@ def get_base_info(merged_baseinfo_path,clause_path): # 等待两个任务完成并获取结果 future1.result() # process_judge_questions 直接修改 baseinfo_list,不需要返回值 rebidding_situation = future2.result() - update_json = rename_outer_key(rebidding_situation, "重新招标、不再招标和终止招标") + update_json = add_outer_key(rebidding_situation, "重新招标、不再招标和终止招标") baseinfo_list.append(update_json) # # judge_file_path = 'D:\\flask_project\\flask_app\\static\\提示词\\是否相关问题货物标.txt' diff --git a/flask_app/货物标/投标人须知正文提取指定内容货物标版.py b/flask_app/货物标/投标人须知正文提取指定内容货物标版.py index 339709b..7b4258b 100644 --- a/flask_app/货物标/投标人须知正文提取指定内容货物标版.py +++ b/flask_app/货物标/投标人须知正文提取指定内容货物标版.py @@ -88,11 +88,11 @@ def extract_from_notice(merged_baseinfo_path, clause_path, type): #TODO:可以通过判断格式来看是否需要调用GPT 1.1 2.1.... if __name__ == "__main__": - clause_path = r'C:\Users\Administrator\Desktop\fsdownload\550424e5-c105-4ae4-969e-4a80447b4e3f\clause1.json' - merged_baseinfo_path=r"C:\Users\Administrator\Desktop\fsdownload\550424e5-c105-4ae4-969e-4a80447b4e3f\ztbfile_merged_baseinfo.pdf" + clause_path = r'D:\flask_project\flask_app\static\output\output1\ce279982-aeeb-4f08-ab39-df6ee2732eae\clause1.json' + merged_baseinfo_path=r"D:\flask_project\flask_app\static\output\output1\ce279982-aeeb-4f08-ab39-df6ee2732eae\ztbfile.pdf" # file_path = 'D:\\flask_project\\flask_app\\static\\output\\fee18877-0c60-4c28-911f-9a5f7d1325a7\\clause1.json' try: - res = extract_from_notice(merged_baseinfo_path,clause_path, 2) # 可以改变此处的 type 参数测试不同的场景 + res = extract_from_notice(merged_baseinfo_path,clause_path, 3) # 可以改变此处的 type 参数测试不同的场景 res2=json.dumps(res,ensure_ascii=False,indent=4) print(res2) except ValueError as e: