1.22 限制了招标公示网址的长度

This commit is contained in:
zy123 2025-01-22 14:52:32 +08:00
parent 3021594471
commit a000219b10
2 changed files with 139 additions and 140 deletions

View File

@ -110,7 +110,6 @@ def truncate_pdf_multiple(pdf_path, output_folder, logger,mode='goods',selection
logger.warning(f"合并失败,没有生成合并文件 for {pdf_path}") logger.warning(f"合并失败,没有生成合并文件 for {pdf_path}")
logger.info("已截取文件路径: " + str(truncate_files)) logger.info("已截取文件路径: " + str(truncate_files))
print(truncate_files)
return truncate_files return truncate_files
if __name__ == "__main__": if __name__ == "__main__":
@ -119,14 +118,14 @@ if __name__ == "__main__":
# input_path = r"C:\Users\Administrator\Desktop\new招标文件\工程标" # input_path = r"C:\Users\Administrator\Desktop\new招标文件\工程标"
# pdf_path=r"C:\Users\Administrator\Desktop\货物标\zbfiles\094定稿-湖北工业大学轻武器模拟射击设备采购项目招标文件.pdf" # pdf_path=r"C:\Users\Administrator\Desktop\货物标\zbfiles\094定稿-湖北工业大学轻武器模拟射击设备采购项目招标文件.pdf"
# pdf_path = r"C:\Users\Administrator\Desktop\货物标\zbfiles\zbtest4_evaluation_method.pdf" # pdf_path = r"C:\Users\Administrator\Desktop\货物标\zbfiles\zbtest4_evaluation_method.pdf"
pdf_path=r"C:\Users\Administrator\Desktop\新建文件夹 (3)\新建文件夹\(存储存在问题)惠安县招标文件.pdf" pdf_path=r"C:\Users\Administrator\Desktop\新建文件夹 (3)\新建文件夹 (2)\湖南开关实业有限公司采购习艺生产线台面、货架、工具柜、辅料柜项目(第二次).pdf"
# pdf_path=r"C:\Users\Administrator\Desktop\货物标\zbfiles\zbtest4_evaluation_method.pdf" # pdf_path=r"C:\Users\Administrator\Desktop\货物标\zbfiles\zbtest4_evaluation_method.pdf"
# input_path=r"C:\Users\Administrator\Desktop\招标文件\招标test文件夹\zbtest8.pdf" # input_path=r"C:\Users\Administrator\Desktop\招标文件\招标test文件夹\zbtest8.pdf"
output_folder = r"C:\Users\Administrator\Desktop\新建文件夹 (3)\新建文件夹" output_folder = r"C:\Users\Administrator\Desktop\新建文件夹 (3)\新建文件夹 (2)"
# selections = [1, 4] # 仅处理 selection 4、1 # selections = [1, 4] # 仅处理 selection 4、1
# selections = [1, 2, 3, 5] # selections = [1, 2, 3, 5]
# files = truncate_pdf_multiple(pdf_path, output_folder, logger, 'goods', selections) #engineering # files = truncate_pdf_multiple(pdf_path, output_folder, logger, 'goods', selections) #engineering
files = truncate_pdf_multiple(pdf_path, output_folder, logger, 'engineering') files = truncate_pdf_multiple(pdf_path, output_folder, logger, 'goods')
print(files) print(files)
# print(files[-1]) # print(files[-1])
# print(files[-2]) # print(files[-2])

View File

@ -531,142 +531,142 @@ def get_technical_requirements(invalid_path,processed_filepath,model_type=1):
model_res=qianwen_plus(user_query) model_res=qianwen_plus(user_query)
print(model_res) print(model_res)
# cleaned_res = clean_json_string(model_res) #转字典 cleaned_res = clean_json_string(model_res) #转字典
# if not cleaned_res: if not cleaned_res:
# print("本项目没有采购需求!!!") print("本项目没有采购需求!!!")
# return {"采购需求": {}} return {"采购需求": {}}
# preprocessed_data=preprocess_data(cleaned_res) #确保最内层为[] preprocessed_data=preprocess_data(cleaned_res) #确保最内层为[]
# processed_data=truncate_system_keys(preprocessed_data) #限制深度 processed_data=truncate_system_keys(preprocessed_data) #限制深度
# key_paths, grouped_paths, good_list, data_copy= generate_key_paths(processed_data) # 提取需要采购的货物清单 key_list交通监控视频子系统.高清视频抓拍像机 ... grouped_paths是同一系统下同时有'交换机-1'和'交换机-2',提取'交换机' 输出eg:{'交通标志.标志牌铝板', '交通信号灯.交换机'} key_paths, grouped_paths, good_list, data_copy= generate_key_paths(processed_data) # 提取需要采购的货物清单 key_list交通监控视频子系统.高清视频抓拍像机 ... grouped_paths是同一系统下同时有'交换机-1'和'交换机-2',提取'交换机' 输出eg:{'交通标志.标志牌铝板', '交通信号灯.交换机'}
# modified_data=rename_keys(data_copy) modified_data=rename_keys(data_copy)
# user_query_template = """请根据货物标中采购要求部分的内容,告诉我\"{}\"的技术参数或采购要求是什么。请以 JSON 格式返回结果,键名为\"{}\",键值为一个列表,列表中包含若干描述\"{}\"的技术参数或采购要求或功能说明的字符串,请按原文内容回答,保留三角▲、五角★或其他特殊符号(若有)和序号(若有),不可擅自增删内容,尤其是不可擅自添加序号。 user_query_template = """请根据货物标中采购要求部分的内容,告诉我\"{}\"的技术参数或采购要求是什么。请以 JSON 格式返回结果,键名为\"{}\",键值为一个列表,列表中包含若干描述\"{}\"的技术参数或采购要求或功能说明的字符串,请按原文内容回答,保留三角▲、五角★或其他特殊符号(若有)和序号(若有),不可擅自增删内容,尤其是不可擅自添加序号。
# **重要限制** **重要限制**
# - **仅提取技术参数或采购要求,不包括任何商务要求**。商务要求通常涉及供应商资格、报价条款、交货时间、质保等内容,是整体的要求;而技术参数或采购要求则具体描述产品的技术规格、功能、性能指标等。 - **仅提取技术参数或采购要求不包括任何商务要求**商务要求通常涉及供应商资格报价条款交货时间质保等内容是整体的要求而技术参数或采购要求则具体描述产品的技术规格功能性能指标等
# - **商务要求的关键词示例**(仅供参考,不限于此):报价、交货、合同、资质、认证、服务、保修期等。如果内容包含上述关键词,请仔细甄别是否属于商务要求 - **商务要求的关键词示例**仅供参考不限于此报价交货合同资质认证服务保修期等如果内容包含上述关键词请仔细甄别是否属于商务要求
#
# 要求与指南 要求与指南
# 1. 你的键值应该全面,不要遗漏 1. 你的键值应该全面不要遗漏
# -a.若技术参数或采购要求在表格中,那么单元格内的内容基本都要涵盖 -a.若技术参数或采购要求在表格中那么单元格内的内容基本都要涵盖
# -对于单元格内以序号分隔的各条参数要求,应逐条提取,并分别作为键值中的字符串列表项。 -对于单元格内以序号分隔的各条参数要求应逐条提取并分别作为键值中的字符串列表项
# -对于无序号标明且在同一单元格内的参数要求或功能说明,也要根据语义分别添加进键值中。 -对于无序号标明且在同一单元格内的参数要求或功能说明也要根据语义分别添加进键值中
# -b.若技术参数或采购要求在正文部分,应准确定位到与目标货物(设备、系统、功能模块)相关的内容,将其后的技术参数或采购要求或功能说明完整提取,逐一添加到键值的字符串列表中,不得擅自添加或修改序号。 -b.若技术参数或采购要求在正文部分应准确定位到与目标货物设备系统功能模块相关的内容将其后的技术参数或采购要求或功能说明完整提取逐一添加到键值的字符串列表中不得擅自添加或修改序号
# 2. 如果存在嵌套结构且原文为Markdown 的表格语法,如'摄像机|有效像素|≥900W像素' 请不要返回该Markdown语法而是使用冒号':'将相关信息拼接在一起,生成一条完整且清晰的技术参数(或采购要求)描述,作为列表中的一个字符串。如"摄像机有效像素≥900W像素" 2. 如果存在嵌套结构且原文为Markdown 的表格语法'摄像机|有效像素|≥900W像素' 请不要返回该Markdown语法而是使用冒号':'将相关信息拼接在一起生成一条完整且清晰的技术参数或采购要求描述作为列表中的一个字符串"摄像机有效像素≥900W像素"
# 3. 字符串中的内容为具体的技术参数要求或采购要求,请不要返回诸如'1高清录像功能'这种标题性质且不能体现要求的内容。 3. 字符串中的内容为具体的技术参数要求或采购要求请不要返回诸如'1高清录像功能'这种标题性质且不能体现要求的内容
# 4. 如果该货物没有相关采购要求或技术参数要求,键值应为空列表[]。 4. 如果该货物没有相关采购要求或技术参数要求键值应为空列表[]
#
# ### 示例输出1如下 ### 示例输出1如下
# {{ {{
# "摄像机控制键盘": [ "摄像机控制键盘": [
# "1、▲支持串行 RS232/RS422 和 IP 混合控制,允许在一个控制器上使用 RS232/RS422/IP 控制单个系统中的摄像机;", "1、▲支持串行 RS232/RS422 和 IP 混合控制,允许在一个控制器上使用 RS232/RS422/IP 控制单个系统中的摄像机;",
# "2、支持 2 组 RS422 串口 VISCA 协议菊花链控制 2x7 台摄像机。", "2、支持 2 组 RS422 串口 VISCA 协议菊花链控制 2x7 台摄像机。",
# "★能够自动对焦,提供检测报告" "★能够自动对焦,提供检测报告"
# ] ]
# }} }}
#
# ### 示例输出2如下包含嵌套结构 ### 示例输出2如下包含嵌套结构
# {{ {{
# "摄像机": [ "摄像机": [
# "摄像机有效像素≥900W像素", "摄像机有效像素≥900W像素",
# "摄像机最低照度彩色≤0.001lx", "摄像机最低照度彩色≤0.001lx",
# "协议routes 接口开放:具备;▲支持标准 ONVIF 协议与第三方厂家设备进行互联;支持 GB/T28181应提供 SDK" "协议routes 接口开放:具备;▲支持标准 ONVIF 协议与第三方厂家设备进行互联;支持 GB/T28181应提供 SDK"
# ] ]
# }} }}
#
# {} {}
# """ """
# user_query_template_two="""请根据货物标中采购要求部分的内容,告诉我\"{}\"的技术参数或采购要求是什么。由于该货物存在 {} 种不同的采购要求或技术参数,请逐一列出,并以 JSON 格式返回结果。请以'货物名-编号'区分多种型号,编号为从 1 开始的自然数,依次递增,即第一个键名为\"{}-1\";键值为一个列表,列表中包含若干描述\"{}\"的技术参数或采购要求或功能说明的字符串,请按原文内容回答,保留三角▲、五角★或其他特殊符号(若有)和序号(若有),不可擅自增删内容,尤其是不可擅自添加序号。 user_query_template_two="""请根据货物标中采购要求部分的内容,告诉我\"{}\"的技术参数或采购要求是什么。由于该货物存在 {} 种不同的采购要求或技术参数,请逐一列出,并以 JSON 格式返回结果。请以'货物名-编号'区分多种型号,编号为从 1 开始的自然数,依次递增,即第一个键名为\"{}-1\";键值为一个列表,列表中包含若干描述\"{}\"的技术参数或采购要求或功能说明的字符串,请按原文内容回答,保留三角▲、五角★或其他特殊符号(若有)和序号(若有),不可擅自增删内容,尤其是不可擅自添加序号。
#
# 要求与指南 要求与指南
# 1. 你的键值应该全面,不要遗漏 1. 你的键值应该全面不要遗漏
# -a.若技术参数或采购要求在表格中,那么单元格内的内容基本都要涵盖 -a.若技术参数或采购要求在表格中那么单元格内的内容基本都要涵盖
# -对于单元格内以序号分隔的各条参数要求,应逐条提取,并分别作为键值中的字符串列表项。 -对于单元格内以序号分隔的各条参数要求应逐条提取并分别作为键值中的字符串列表项
# -对于无序号标明且在同一单元格内的参数要求或功能说明,也要根据语义分别添加进键值中。 -对于无序号标明且在同一单元格内的参数要求或功能说明也要根据语义分别添加进键值中
# -b.若技术参数或采购要求在正文部分,应准确定位到与目标货物(设备、系统、功能模块)相关的内容,将其后的技术参数或采购要求或功能说明完整提取,逐一添加到键值的字符串列表中,不得擅自添加或修改序号。 -b.若技术参数或采购要求在正文部分应准确定位到与目标货物设备系统功能模块相关的内容将其后的技术参数或采购要求或功能说明完整提取逐一添加到键值的字符串列表中不得擅自添加或修改序号
# 2. 如果存在嵌套结构且原文为Markdown 的表格语法,如'摄像机|有效像素|≥900W像素' 请不要返回该Markdown语法而是使用冒号':'将相关信息拼接在一起,生成一条完整且清晰的技术参数(或采购要求)描述,作为列表中的一个字符串。如"摄像机有效像素≥900W像素" 2. 如果存在嵌套结构且原文为Markdown 的表格语法'摄像机|有效像素|≥900W像素' 请不要返回该Markdown语法而是使用冒号':'将相关信息拼接在一起生成一条完整且清晰的技术参数或采购要求描述作为列表中的一个字符串"摄像机有效像素≥900W像素"
# 3. 字符串中的内容为具体的技术参数要求或采购要求,请不要返回诸如'1高清录像功能'这种标题性质且不能体现要求的内容。 3. 字符串中的内容为具体的技术参数要求或采购要求请不要返回诸如'1高清录像功能'这种标题性质且不能体现要求的内容
# 4. 如果该货物没有相关采购要求或技术参数要求,键值应为空列表[]。 4. 如果该货物没有相关采购要求或技术参数要求键值应为空列表[]
#
# ### 示例输出1如下 ### 示例输出1如下
# {{ {{
# "交换机-1": [ "交换机-1": [
# "★1、支持固化千兆电口≥8 个固化千兆光口≥2 个,桌面型设备;", "★1、支持固化千兆电口≥8 个固化千兆光口≥2 个,桌面型设备;",
# "2、支持静态链路聚合" "2、支持静态链路聚合"
# ], ],
# "交换机-2": [ "交换机-2": [
# "1、交换容量≥52Gbps包转发率≥38.69Mpps", "1、交换容量≥52Gbps包转发率≥38.69Mpps",
# "2、提供国家强制性产品认证证书及测试报告3C", "2、提供国家强制性产品认证证书及测试报告3C",
# "★能实现信号控制独立传输" "★能实现信号控制独立传输"
# ] ]
# }} }}
#
# ### 示例输出2如下包含嵌套结构 ### 示例输出2如下包含嵌套结构
# {{ {{
# "摄像机-1": [ "摄像机-1": [
# "摄像机有效像素≥900W像素", "摄像机有效像素≥900W像素",
# "摄像机最低照度彩色≤0.001lx", "摄像机最低照度彩色≤0.001lx",
# "协议routes 接口开放:具备;▲支持标准 ONVIF 协议与第三方厂家设备进行互联;支持 GB/T28181应提供 SDK" "协议routes 接口开放:具备;▲支持标准 ONVIF 协议与第三方厂家设备进行互联;支持 GB/T28181应提供 SDK"
# ], ],
# "摄像机-2": [ "摄像机-2": [
# "支持夜视", "支持云存储" "支持夜视", "支持云存储"
# ] ]
# }} }}
#
# {} {}
# """ """
# queries = [] queries = []
# for key in key_paths: for key in key_paths:
# # 将键中的 '.' 替换为 '下的' # 将键中的 '.' 替换为 '下的'
# modified_key = key.replace('.', '下的') modified_key = key.replace('.', '下的')
# # 使用修改后的键填充第一个占位符,原始键填充第二个占位符 # 使用修改后的键填充第一个占位符,原始键填充第二个占位符
# if model_type==1: if model_type==1:
# new_query = user_query_template.format(modified_key, key, modified_key,f"文件内容:{full_text}") #转豆包后取消注释 new_query = user_query_template.format(modified_key, key, modified_key,f"文件内容:{full_text}") #转豆包后取消注释
# else: else:
# new_query = user_query_template.format(modified_key, key, modified_key,"") new_query = user_query_template.format(modified_key, key, modified_key,"")
# queries.append(new_query) queries.append(new_query)
#
# # 处理 grouped_paths 中的项,应用 user_query_template_two # 处理 grouped_paths 中的项,应用 user_query_template_two
# for grouped_dict in grouped_paths: for grouped_dict in grouped_paths:
# for grouped_key, grouped_key_cnt in grouped_dict.items(): for grouped_key, grouped_key_cnt in grouped_dict.items():
# # 将键中的 '.' 替换为 '下的' # 将键中的 '.' 替换为 '下的'
# modified_grouped_key = grouped_key.replace('.', '下的') modified_grouped_key = grouped_key.replace('.', '下的')
# if model_type==1: if model_type==1:
# new_query = user_query_template_two.format(modified_grouped_key, grouped_key_cnt, grouped_key, new_query = user_query_template_two.format(modified_grouped_key, grouped_key_cnt, grouped_key,
# modified_grouped_key, f"文件内容:{full_text}") modified_grouped_key, f"文件内容:{full_text}")
# else: else:
# new_query = user_query_template_two.format(modified_grouped_key, grouped_key_cnt, grouped_key, new_query = user_query_template_two.format(modified_grouped_key, grouped_key_cnt, grouped_key,
# modified_grouped_key, "") modified_grouped_key, "")
# queries.append(new_query) queries.append(new_query)
# if model_type==1: if model_type==1:
# results = multi_threading(queries, "", "", 3,True) # 豆包 results = multi_threading(queries, "", "", 3,True) # 豆包
# else: else:
# results = multi_threading(queries, "", file_id, 2,True) # qianwen-long results = multi_threading(queries, "", file_id, 2,True) # qianwen-long
# temp_final={} temp_final={}
# if not results: if not results:
# print("errror!未获得大模型的回答!") print("errror!未获得大模型的回答!")
# else: else:
# # 第一步:收集需要调用 `continue_answer` 的问题和解析结果 # 第一步:收集需要调用 `continue_answer` 的问题和解析结果
# questions_to_continue = [] # 存储需要调用 continue_answer 的 (question, parsed) questions_to_continue = [] # 存储需要调用 continue_answer 的 (question, parsed)
# max_tokens=3900 if model_type==1 else 5900 max_tokens=3900 if model_type==1 else 5900
# for question, response in results: for question, response in results:
# message=response[0] message=response[0]
# parsed = clean_json_string(message) parsed = clean_json_string(message)
# total_tokens=response[1] total_tokens=response[1]
# if not parsed and total_tokens>max_tokens: if not parsed and total_tokens>max_tokens:
# questions_to_continue.append((question, message)) questions_to_continue.append((question, message))
# else: else:
# temp_final.update(parsed) temp_final.update(parsed)
# # 第二步:多线程处理需要调用 `continue_answer` 的问题 # 第二步:多线程处理需要调用 `continue_answer` 的问题
# if questions_to_continue: if questions_to_continue:
# continued_results = process_continue_answers(questions_to_continue, model_type, file_id) continued_results = process_continue_answers(questions_to_continue, model_type, file_id)
# temp_final.update(continued_results) temp_final.update(continued_results)
#
# """根据所有键是否已添加处理技术要求""" """根据所有键是否已添加处理技术要求"""
# # 更新原始采购需求字典 # 更新原始采购需求字典
# final_res=combine_and_update_results(modified_data, temp_final) final_res=combine_and_update_results(modified_data, temp_final)
# ffinal_res=all_postprocess(final_res) ffinal_res=all_postprocess(final_res)
# ffinal_res["货物列表"] = good_list ffinal_res["货物列表"] = good_list
# # 输出最终的 JSON 字符串 # 输出最终的 JSON 字符串
# return {"采购需求":ffinal_res} return {"采购需求":ffinal_res}
def test_all_files_in_folder(input_folder, output_folder): def test_all_files_in_folder(input_folder, output_folder):
# 确保输出文件夹存在 # 确保输出文件夹存在