1.7 商务要求标题带星保留+评分项手动计算总分
This commit is contained in:
parent
4d5dc9ea4e
commit
1fc3535406
@ -75,12 +75,13 @@ def convert_file_to_markdown(file_path, file_name="extract1.txt"):
|
||||
'get_image': 'none'
|
||||
})
|
||||
|
||||
# 打印请求耗时
|
||||
print("request time: ", resp.elapsed.total_seconds())
|
||||
# 打印请求耗时(网络请求时间)
|
||||
print("Request network time: ", resp.elapsed.total_seconds(), "seconds")
|
||||
|
||||
# 解析响应内容
|
||||
data = json.loads(resp.text)
|
||||
|
||||
duration = data.get('duration',"错误!") # 提取 'duration'
|
||||
print("实际转换时间(ms):", duration)
|
||||
# 检查响应中是否包含Markdown内容
|
||||
if 'result' in data and 'markdown' in data['result']:
|
||||
markdown_content = data['result']['markdown']
|
||||
@ -101,6 +102,6 @@ def convert_file_to_markdown(file_path, file_name="extract1.txt"):
|
||||
|
||||
if __name__ == "__main__":
|
||||
# file_path=r"C:\Users\Administrator\Desktop\fsdownload\e702f1e6-095d-443d-bb7d-ef2e42037cb1\ztbfile_procurement.pdf"
|
||||
file_path=r"C:\Users\Administrator\Desktop\fsdownload\bbf7504f-3c75-45e5-b3e2-ab0a15ec9c14\tmp\ztbfile_procurement.pdf"
|
||||
file_path=r"D:\flask_project\flask_app\static\output\output1\f91db70d-8d96-44a5-b840-27d2f1ecbe95\ztbfile\ztbfile_11-16.pdf"
|
||||
res=convert_file_to_markdown(file_path)
|
||||
print(res)
|
@ -438,6 +438,28 @@ def add_outer_key(original_data, new_key):
|
||||
new_data = {new_key: original_data}
|
||||
|
||||
return new_data
|
||||
|
||||
|
||||
def rename_outer_key(data, new_key):
|
||||
"""
|
||||
将字典的最外层唯一键重命名为 new_key。
|
||||
|
||||
参数:
|
||||
data (dict): 只有一个外层键的字典。
|
||||
new_key (str): 新的键名。
|
||||
|
||||
返回:
|
||||
dict: 修改后的字典。
|
||||
"""
|
||||
if not isinstance(data, dict) or len(data) != 1:
|
||||
raise ValueError("输入数据必须是一个只有一个外层键的字典。")
|
||||
|
||||
# 获取原始键和值
|
||||
old_key, value = next(iter(data.items()))
|
||||
|
||||
# 构造新的字典
|
||||
return {new_key: value}
|
||||
|
||||
def transform_json_values(data):
|
||||
if isinstance(data, dict):
|
||||
return {key.replace(' ', ''): transform_json_values(value) for key, value in data.items()}
|
||||
@ -452,6 +474,7 @@ def transform_json_values(data):
|
||||
else:
|
||||
return data
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
data="""{
|
||||
"新内容": "六、残疾人福利性单位声明函(适用于货物类项目
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -2,14 +2,13 @@ import json
|
||||
import os
|
||||
import re
|
||||
import time
|
||||
from collections import defaultdict
|
||||
|
||||
from typing import Any, Dict
|
||||
from flask_app.general.doubao import read_txt_to_string
|
||||
from flask_app.general.file2markdown import convert_file_to_markdown
|
||||
from flask_app.general.format_change import get_pdf_page_count, pdf2docx
|
||||
from flask_app.general.json_utils import extract_content_from_json
|
||||
from flask_app.general.model_continue_query import process_continue_answers
|
||||
from flask_app.general.通义千问long import upload_file, qianwen_long, qianwen_plus
|
||||
from flask_app.general.通义千问long import upload_file, qianwen_long, qianwen_plus, qianwen_long_stream
|
||||
|
||||
|
||||
def remove_unknown_scores(data):
|
||||
@ -26,48 +25,105 @@ def remove_unknown_scores(data):
|
||||
def combine_technical_and_business(data):
|
||||
data = remove_unknown_scores(data)
|
||||
extracted_data = {
|
||||
'技术评分': {
|
||||
'技术评分': {} # 初始化技术评分
|
||||
},
|
||||
'商务评分': {
|
||||
'商务评分': {}, # 初始化商务评分
|
||||
'投标报价评分': {} # 初始化投标报价评分
|
||||
# '其他评分' 将在需要时动态添加
|
||||
}
|
||||
'技术评分': {},
|
||||
'商务评分': {}
|
||||
}
|
||||
|
||||
# 用于累加 '其他评分' 的总分
|
||||
other_total_score = 0
|
||||
other_items = {}
|
||||
def process_data(data: Dict[str, Any]) -> Dict[str, Any]:
|
||||
"""
|
||||
处理给定的数据字典,如果存在外键 '技术评分' 且其子键符合 '技术评分-<数字>' 格式,
|
||||
则删除外键 '技术评分' 并将其子键提升到更高层级。即'技术评分-1' '技术评分-2'作为外键
|
||||
Args:
|
||||
data (Dict[str, Any]): 输入的数据字典。
|
||||
|
||||
Returns:
|
||||
Dict[str, Any]: 处理后的数据字典。
|
||||
"""
|
||||
# 定义匹配 '技术评分-数字' 的正则表达式
|
||||
pattern = re.compile(r'^技术评分-\d+$')
|
||||
|
||||
# 创建一个新的字典以避免在遍历时修改原字典
|
||||
new_data = {}
|
||||
|
||||
for key, value in data.items():
|
||||
if key == "技术评分" and isinstance(value, dict):
|
||||
# 检查所有子键是否符合 '技术评分-<数字>' 格式
|
||||
if all(pattern.match(child_key) for child_key in value.keys()):
|
||||
# 如果符合,提升子键到更高层级
|
||||
new_data.update(value)
|
||||
else:
|
||||
# 如果不符合,保留原键值
|
||||
new_data[key] = process_data(value) if isinstance(value, dict) else value
|
||||
elif isinstance(value, dict):
|
||||
# 递归处理子字典
|
||||
new_data[key] = process_data(value)
|
||||
else:
|
||||
# 对于非字典类型的值,直接保留
|
||||
new_data[key] = value
|
||||
|
||||
return new_data
|
||||
|
||||
def extract_nested(data):
|
||||
nonlocal other_total_score, other_items
|
||||
if isinstance(data, dict):
|
||||
for key, value in data.items():
|
||||
# 区分 '技术评分'
|
||||
if key == '技术评分':
|
||||
total_score=compute_total_score({key:value})
|
||||
extracted_data['技术评分']['技术评分'] = value
|
||||
if key.startswith('技术评分'):
|
||||
total_score = compute_total_score({key: value})
|
||||
if 0 < total_score <= 100:
|
||||
new_key = f'{key}({total_score}分)'
|
||||
else:
|
||||
new_key = f'{key}'
|
||||
extracted_data['技术评分'][new_key] = value
|
||||
# 匹配到后,不再递归处理其子项
|
||||
continue
|
||||
|
||||
# 区分 '商务评分'
|
||||
elif key == '商务评分':
|
||||
extracted_data['商务评分']['商务评分'] = value
|
||||
total_score = compute_total_score({key: value})
|
||||
if 0 < total_score <= 100:
|
||||
new_key = f'商务评分({total_score}分)'
|
||||
else:
|
||||
new_key = '商务评分'
|
||||
extracted_data['商务评分'][new_key] = value
|
||||
# 匹配到后,不再递归处理其子项
|
||||
continue
|
||||
|
||||
# 区分 '投标报价评分'
|
||||
elif key == '投标报价评分':
|
||||
extracted_data['商务评分']['投标报价评分'] = value
|
||||
total_score = compute_total_score({key: value})
|
||||
if 0 < total_score <= 100:
|
||||
new_key = f'投标报价评分({total_score}分)'
|
||||
else:
|
||||
new_key = '投标报价评分'
|
||||
extracted_data['商务评分'][new_key] = value
|
||||
# 匹配到后,不再递归处理其子项
|
||||
continue
|
||||
|
||||
# 其他键名归为 '其他评分'
|
||||
else:
|
||||
if '其他评分' not in extracted_data['商务评分']:
|
||||
extracted_data['商务评分']['其他评分'] = {}
|
||||
extracted_data['商务评分']['其他评分'][key] = value
|
||||
continue
|
||||
# 计算当前项的总分
|
||||
current_score = compute_total_score({key: value})
|
||||
other_total_score += current_score
|
||||
# 保持原键名,不添加(分数)
|
||||
other_items[key] = value
|
||||
processed_data=process_data(data)
|
||||
extract_nested(processed_data)
|
||||
|
||||
# 如果有 '其他评分',替换为包含总分的键名
|
||||
if other_items:
|
||||
if other_total_score > 0:
|
||||
new_key = f'其他评分({other_total_score}分)'
|
||||
else:
|
||||
new_key = '其他评分'
|
||||
extracted_data['商务评分'][new_key] = other_items
|
||||
|
||||
extract_nested(data)
|
||||
return extracted_data
|
||||
|
||||
|
||||
# 防止外键只有一个'一包'的情况
|
||||
def process_data_based_on_key(data):
|
||||
exclude_word = ["包", "未知", "评分因素"]
|
||||
@ -102,8 +158,8 @@ def compute_total_score(data):
|
||||
# 获取唯一的外层键和值
|
||||
outer_key, outer_value = next(iter(data.items()))
|
||||
|
||||
# 更新后的正则表达式,匹配中英文括号中的分数,如 '(24分)' 或 '(24分)'
|
||||
score_pattern = re.compile(r'[((](\d+)分[))]')
|
||||
# 更新后的正则表达式,匹配中英文括号中的分数,如 '(24分)' 或 '(24分)' #考虑了空格的影响
|
||||
score_pattern = re.compile(r'[((]\s*(\d+)\s*分\s*[))]')
|
||||
|
||||
def process_node(node):
|
||||
nonlocal total
|
||||
@ -119,7 +175,7 @@ def compute_total_score(data):
|
||||
elif key == '评分':
|
||||
if isinstance(value, str):
|
||||
# 提取 '评分' 键的值中的数字,如 '20分'
|
||||
match_score = re.match(r'(\d+)分', value)
|
||||
match_score = re.match(r'\s*(\d+)\s*分\s*', value)
|
||||
if match_score:
|
||||
score = int(match_score.group(1))
|
||||
total += score
|
||||
@ -205,52 +261,32 @@ def combine_evaluation_standards(evaluation_method_path,invalid_path,zb_type):
|
||||
if not evaluation_method_path:
|
||||
return DEFAULT_EVALUATION_REVIEW.copy()
|
||||
|
||||
def run_first_query(file_path):
|
||||
print("判断有无评分")
|
||||
# 上传文件并获取文件ID
|
||||
file_id = upload_file(file_path)
|
||||
|
||||
# 定义用户查询
|
||||
query = (
|
||||
"""根据该文档,你判断它是否有关于技术评分或商务评分或投标报价的具体的评分及要求如果有,返回'是',否则返回'否'。
|
||||
要求与指南:
|
||||
1. 评分要求主要以表格形式呈现,且有评分因素及评分要求、标准。
|
||||
2. 竞争性磋商文件通常无评分要求,但若满足'1.'的内容,也请返回'是'。
|
||||
3. 仅返回'是'或'否',不需要其他解释或内容。
|
||||
"""
|
||||
) # 应对竞争性谈判这种无评分要求的情况
|
||||
|
||||
# 执行查询
|
||||
return qianwen_long(file_id, query),file_id
|
||||
def run_second_qeury(file_id,processed_filepath,model_type):
|
||||
print("获取评分项...")
|
||||
# 执行 user_query 相关的逻辑
|
||||
user_query_1 = (
|
||||
"""
|
||||
你是一个对招投标业务非常熟悉的专家。根据该文档中的评标办法表格,请你列出该文件的技术评分,商务评分,投标报价评分以及它们对应的具体评分要求,请以JSON格式返回结果。
|
||||
格式要求:
|
||||
def generate_prompt(zb_type):
|
||||
common_prompt="""你是一个对招投标业务非常熟悉的专家。根据该文档中的评标办法表格,请你列出该文件的技术评分,商务评分,投标报价评分以及它们对应的具体评分要求,请以JSON格式返回结果。
|
||||
**格式要求**:
|
||||
1.总体结构:
|
||||
-JSON 的最外层包含三个键:技术评分、商务评分 和 投标报价评分。
|
||||
-JSON 的最外层包含三个键:'技术评分'、'商务评分' 和 '投标报价评分'。
|
||||
-每个大项(如技术评分、商务评分)下包含具体的评分项,评分项按以下规则表示。
|
||||
2.评分项表示规则:
|
||||
-层级嵌套规则:
|
||||
若评分因素(内容)存在嵌套关系(通过表格结构判断):主评分因素需附加括号,括号中注明该主评分项的总分,若无具体评分,则无需添加该括号。例如:产品技术响应(8分);子评分因素作为嵌套键名,列在主评分因素之下,无需再附加括号表示评分。
|
||||
-每个评分项由评分因素和评分标准组成。
|
||||
-评分因素:
|
||||
若评分因素(内容、项)存在嵌套关系(通过表格结构判断):主评分因素需附加括号,括号中注明该主评分因素的总分,若无具体评分,则无需添加该括号,例如:产品技术响应(8分);子评分因素作为嵌套键名,列在主评分因素之下,无需再附加括号表示评分。
|
||||
-注意:禁止通过归纳、推测或自行总结来生成子评分因素,尤其不可根据'评分标准'中的打分要求来反向总结'子评分因素'。
|
||||
若评分因素(内容)不存在嵌套关系:键名直接为评分因素,无需附加括号表示总分。
|
||||
-评分项内容:
|
||||
-每个评分项最内层值都是列表,列表中包含描述评分标准或要求的字典。
|
||||
若评分因素(内容、项)不存在嵌套关系:键名直接为评分因素,无需附加括号表示总分。
|
||||
-评分标准:
|
||||
-评分因素的键值为评分标准,它是列表形式,列表中包含描述分值及评分要求的字典。
|
||||
-字典个数:
|
||||
默认为1个字典,若某评分因素包括多个评分标准(多个表格单元格),可以用多个并列字典表示。
|
||||
-字典结构如下:
|
||||
评分:该评分标准的总分(如 8分),字符串类型;不能是一个范围数字(如0-8分);若为定性指标(如“合格制”),可标明相应的定性指标;无评分时可删去'评分'键值对。
|
||||
要求:说明评分标准或要求。
|
||||
评分:该评分标准的分值即最高分(如'8分'),字符串类型;不能是一个范围数字(如0-8分);若为定性指标(如“合格制”),可标明相应的定性指标;无评分时可删去'评分'键值对。
|
||||
要求:评分标准或细则,一个表格单元格内的所有内容。
|
||||
-禁止情况:
|
||||
禁止将同个单元格内的内容拆分至多个字典中;禁止遗漏单元格内任何信息,包括注的内容。
|
||||
3.备注信息:
|
||||
-若评分部分包含附加信息(如大项评分的整体要求,未直接归属于具体评分项),需添加一个 备注 键,值为该附加信息。
|
||||
|
||||
要求与指南:
|
||||
1. 请首先定位评分表,不要回答有关资格审查、符合审查的内容,也不要从评标办法正文中提取回答。
|
||||
**要求与指南**:
|
||||
1. 请首先定位评分表,请不要遗漏任何一个评分表的信息,不要回答有关资格审查、符合审查的内容,也不要从评标办法正文中提取回答。
|
||||
2. 若表中的评分大项不是这三个,或者有额外的评分大项:
|
||||
-请你根据语义及你对招投标业务的熟悉,分别映射到'技术评分'、'商务评分'、'投标报价评分',而不必按照表格中大项名称。
|
||||
-映射关系可以是“一对一”或“多对一”,例如两个评分大项可以同时归类到“技术评分”。关键是不遗漏表中的评分大项,确保每个大项都被映射。
|
||||
@ -258,47 +294,51 @@ def combine_evaluation_standards(evaluation_method_path,invalid_path,zb_type):
|
||||
-请将评分因素正确地归类到'技术评分'、'商务评分'、'投标报价评分',不要遗漏任何一个评分因素。
|
||||
3. 若表格中商务和技术评分混合一起,或者有部分评分因素无法通过表格结构明确归类:
|
||||
-请根据你对招投标业务的熟悉,对表格中的评分因素进行准确分类。关键是确保每个评分因素都能被归类到'技术评分'或'商务评分'或'投标报价评分',不要遗漏任何一个评分因素。
|
||||
特殊情况:
|
||||
1. 最外层键名为各大评分项;但是如果该招标、采购活动有多个分包,则最外层键名为对应的包名,如'一包',内部格式不变。
|
||||
2. 若大项的'xx评分'要求未在文中说明,则键名'xx评分'的键值设为字符串'本项目无xx评分项',例如"技术评分":"本项目无技术评分项",而非默认的字典格式。
|
||||
3. 默认情况大项评分仅有'技术评分''商务评分''投标报价评分',若在充分归类之后,表格中仍有评分因素未被归类,才添加大项评分'其他'保存该内容。
|
||||
|
||||
**特殊情况**:
|
||||
1. 缺失评分项:若大项的'xx评分'要求未在文中说明,则键名'xx评分'的键值设为字符串'本项目无xx评分项',例如"技术评分":"本项目无技术评分项",而非默认的字典格式。
|
||||
2. 其他评分:默认情况大项评分仅有'技术评分''商务评分''投标报价评分',若在充分归类之后,表格中仍有评分因素未被归类,才添加大项评分'其他评分'保存该内容。
|
||||
3. 多包评分:默认只有一包,最外层键名为各大评分项,而不是'一包';但是如果该招标、采购活动有多个分包且每个分包有独自的评分表,则最外层键名为对应的包名,如'一包''二包',内部才是各大评分项。
|
||||
4. 多张技术评分表:若同一包下有多张技术评分表,请不要遗漏任何一个评分表的信息,此时最外层键名'技术评分'替换为'技术评分-d',d为自然数,从1开始,分别保存每张技术评分表的信息。
|
||||
-例如有'技术评分标准(1)其他项目','技术评分标准(2)施工类',算作两个技术评分表,最外层的键名分别为'技术评分-1''技术评分-2',替换默认的'技术评分'
|
||||
|
||||
禁止内容:
|
||||
**禁止内容**:
|
||||
1. 确保所有输出内容均基于提供的实际招标文件内容(除了最外层的三个评分大项名称),不使用任何预设的示例作为回答。
|
||||
2. 不得擅自添加不属于评审因素的键名以及 `'备注'` 之外的其他键名。
|
||||
3. 不得遗漏评分表中的任何评分因素,确保每个评分因素都被正确归类到评分大项下。
|
||||
|
||||
以下为示例输出,仅供格式参考:
|
||||
{
|
||||
"一包": {
|
||||
"技术评分": {
|
||||
"实施方案(16分)":{
|
||||
"总体实施方案":[
|
||||
{
|
||||
"评分":8,
|
||||
"要求":"根据投标人总体实施方案进行评分"
|
||||
}
|
||||
],
|
||||
"项目实施要点":[
|
||||
{
|
||||
"评分":8,
|
||||
"要求":"根据投标人对项目实施要点、难点进行评分。"
|
||||
}
|
||||
]
|
||||
},
|
||||
"设计创意": [
|
||||
{
|
||||
"评分": "10分",
|
||||
"要求": "主题突出,形式多样,内容与形式完美统一,得10分,其他酌情打分。"
|
||||
}
|
||||
],
|
||||
"备注": "技术标采用暗标形式,暗标不得出现投标人名称、人员姓名。"
|
||||
},
|
||||
"商务评分": {
|
||||
"主要监理岗位的职责": [
|
||||
{
|
||||
"评分": "4分",
|
||||
"要求": "1、总监理工程师的职责全面、清晰、合理得 2 分;一般的 1 分。2、其他主要监理人员及岗位的职责全面、清晰、合理得 2 分;一般的 1 分。"
|
||||
"""
|
||||
if zb_type == 1:
|
||||
example_output="""
|
||||
以下为示例输出,仅供格式参考:
|
||||
{
|
||||
"技术评分": {
|
||||
"实施方案(16分)":{
|
||||
"总体实施方案":[
|
||||
{
|
||||
"评分":8,
|
||||
"要求":"根据投标人总体实施方案进行评分"
|
||||
}
|
||||
],
|
||||
"项目实施要点":[
|
||||
{
|
||||
"评分":8,
|
||||
"要求":"根据投标人对项目实施要点、难点进行评分。"
|
||||
}
|
||||
]
|
||||
},
|
||||
"设计创意": [
|
||||
{
|
||||
"评分": "10分",
|
||||
"要求": "主题突出,形式多样,内容与形式完美统一,得10分,其他酌情打分。"
|
||||
}
|
||||
],
|
||||
"备注": "技术标采用暗标形式,暗标不得出现投标人名称、人员姓名。"
|
||||
},
|
||||
"商务评分": {
|
||||
"主要监理岗位的职责": [
|
||||
{
|
||||
"评分": "4分",
|
||||
"要求": "1、总监理工程师的职责全面、清晰、合理得 2 分;一般的 1 分。2、其他主要监理人员及岗位的职责全面、清晰、合理得 2 分;一般的 1 分。"
|
||||
}
|
||||
],
|
||||
"制造商实力": [
|
||||
@ -312,64 +352,20 @@ def combine_evaluation_standards(evaluation_method_path,invalid_path,zb_type):
|
||||
}
|
||||
]
|
||||
},
|
||||
"投标报价评分": {
|
||||
"投标报价是否出现违反计价规范": [
|
||||
{
|
||||
"评分": "合格制",
|
||||
"要求": "A:投标报价未违反计价规范的,评审意见为“合格”;B:投标报价违反计价规范的,评审意见为“不合格”"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
"""
|
||||
)
|
||||
user_query_2 = (
|
||||
"""
|
||||
你是一个对招投标业务非常熟悉的专家。根据该文档中的评标办法表格,请你列出该文件的技术评分,商务评分,投标报价评分以及它们对应的具体评分要求,请以JSON格式返回结果。
|
||||
格式要求:
|
||||
1.总体结构:
|
||||
-JSON 的最外层包含三个键:'技术评分'、'商务评分' 和 '投标报价评分'。
|
||||
-每个大项(如技术评分、商务评分)下包含具体的评分项,评分项按以下规则表示。
|
||||
2.评分项表示规则:
|
||||
-层级嵌套规则:
|
||||
若评分因素(内容)存在嵌套关系(通过表格结构判断):主评分因素需附加括号,括号中注明该主评分项的总分,若无具体评分,则无需添加该括号。例如:产品技术响应(8分);子评分因素作为嵌套键名,列在主评分因素之下,无需再附加括号表示评分。
|
||||
-注意:禁止通过归纳、推测或自行总结来生成子评分因素,尤其不可根据'评分标准'中的打分要求来反向总结'子评分因素'。
|
||||
若评分因素(内容)不存在嵌套关系:键名直接为评分因素,无需附加括号表示总分。
|
||||
-评分项内容:
|
||||
-每个评分项最内层值都是列表,列表中包含描述评分标准或要求的字典。
|
||||
-字典个数:
|
||||
默认为1个字典,若某评分因素包括多个评分标准(多个表格单元格),可以用多个并列字典表示。
|
||||
-字典结构如下:
|
||||
评分:该评分标准的总分(如 8分),字符串类型;不能是一个范围数字(如0-8分);若为定性指标(如“合格制”),可标明相应的定性指标;无评分时可删去'评分'键值对。
|
||||
要求:说明评分标准或要求。
|
||||
-禁止情况:
|
||||
禁止将同个单元格内的内容拆分至多个字典中;禁止遗漏单元格内任何信息,包括注的内容。
|
||||
|
||||
3.备注信息:
|
||||
-若评分部分包含附加信息(如大项评分的整体要求,未直接归属于具体评分项),需添加一个 '备注' 键,值为该附加信息。
|
||||
|
||||
要求与指南:
|
||||
1. 请首先定位评分表,不要回答有关资格审查、符合审查的内容,也不要从评标办法正文中提取回答。
|
||||
2. 若表中的评分大项不是这三个,或者有额外的评分大项:
|
||||
-请你根据语义及你对招投标业务的熟悉,分别映射到'技术评分'、'商务评分'、'投标报价评分',而不必按照表格中大项名称。
|
||||
-映射关系可以是“一对一”或“多对一”,例如两个评分大项可以同时归类到“技术评分”。关键是不遗漏表中的评分大项,确保每个大项都被映射。
|
||||
若表中只有评分因素而无评分大项:
|
||||
-请将评分因素正确地归类到'技术评分'、'商务评分'、'投标报价评分',不要遗漏任何一个评分因素。
|
||||
3. 若表格中商务和技术评分混合一起,或者有部分评分因素无法通过表格结构明确归类:
|
||||
-请根据你对招投标业务的熟悉,对表格中的评分因素进行准确分类。关键是确保每个评分因素都能被归类到'技术评分'或'商务评分'或'投标报价评分',不要遗漏任何一个评分因素。
|
||||
特殊情况:
|
||||
1. 最外层键名为各大评分项;但是如果该招标、采购活动有多个分包,则最外层键名为对应的包名,如'一包',内部格式不变。
|
||||
2. 若大项的'xx评分'要求未在文中说明,则键名'xx评分'的键值设为字符串'本项目无xx评分项',例如"技术评分":"本项目无技术评分项",而非默认的字典格式。
|
||||
3. 默认情况大项评分仅有'技术评分''商务评分''投标报价评分',若在充分归类之后,表格中仍有评分因素未被归类,才添加大项评分'其他'保存该内容。
|
||||
|
||||
禁止内容:
|
||||
1. 确保所有输出内容均基于提供的实际招标文件内容(除了最外层的三个评分大项名称),不使用任何预设的示例作为回答。
|
||||
2. 不得擅自添加不属于评审因素的键名以及 `'备注'` 之外的其他键名。
|
||||
|
||||
"投标报价评分": {
|
||||
"投标报价是否出现违反计价规范": [
|
||||
{
|
||||
"评分": "合格制",
|
||||
"要求": "A:投标报价未违反计价规范的,评审意见为“合格”;B:投标报价违反计价规范的,评审意见为“不合格”"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
"""
|
||||
elif zb_type == 2:
|
||||
example_output="""
|
||||
以下为示例输出,仅供格式参考:
|
||||
{
|
||||
"一包": {
|
||||
{
|
||||
"技术评分": {
|
||||
"产品技术响应(8分)":{
|
||||
"常规参数符合":[
|
||||
@ -420,11 +416,34 @@ def combine_evaluation_standards(evaluation_method_path,invalid_path,zb_type):
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
"""
|
||||
)
|
||||
# 执行第二个查询
|
||||
user_query = user_query_1 if zb_type == 1 else user_query_2
|
||||
else:
|
||||
raise ValueError("Invalid zb_type. 请输入 1 或 2。")
|
||||
# 拼接最终的提示内容
|
||||
final_prompt = common_prompt + example_output
|
||||
return final_prompt
|
||||
|
||||
def run_first_query(file_path):
|
||||
print("判断有无评分")
|
||||
# 上传文件并获取文件ID
|
||||
file_id = upload_file(file_path)
|
||||
|
||||
# 定义用户查询
|
||||
query = (
|
||||
"""根据该文档,你判断它是否有关于技术评分或商务评分或投标报价的具体的评分及要求如果有,返回'是',否则返回'否'。
|
||||
要求与指南:
|
||||
1. 评分要求主要以表格形式呈现,且有评分因素及评分要求、标准。
|
||||
2. 竞争性磋商文件通常无评分要求,但若满足'1.'的内容,也请返回'是'。
|
||||
3. 仅返回'是'或'否',不需要其他解释或内容。
|
||||
"""
|
||||
) # 应对竞争性谈判这种无评分要求的情况
|
||||
|
||||
# 执行查询
|
||||
return qianwen_long(file_id, query),file_id
|
||||
def run_second_qeury(file_id,processed_filepath,model_type):
|
||||
print("获取评分项...")
|
||||
# 执行 user_query 相关的逻辑
|
||||
user_query=generate_prompt(zb_type)
|
||||
if model_type==4:
|
||||
full_text = read_txt_to_string(processed_filepath)
|
||||
user_query += f"\n文件内容:\n{full_text}\n"
|
||||
@ -434,16 +453,16 @@ def combine_evaluation_standards(evaluation_method_path,invalid_path,zb_type):
|
||||
# evaluation_res=doubao_model(user_query,True)
|
||||
evaluation_res = qianwen_plus(user_query, True)
|
||||
else:
|
||||
evaluation_res = qianwen_long(file_id, user_query,2,1,True) # 有些重复的键名,只有qianwen_long_text能保留
|
||||
evaluation_res = qianwen_long_stream(file_id, user_query,2,1,True) # 有些重复的键名,只有qianwen_long_text能保留
|
||||
message = evaluation_res[0]
|
||||
# print(message)
|
||||
total_tokens = evaluation_res[1]
|
||||
# print(evaluation_res)
|
||||
# 清理和处理响应
|
||||
cleaned_evaluation_res = extract_content_from_json(message,True) # 带上True处理重复键名的情况-》生成列表
|
||||
# print(json.dumps(cleaned_evaluation_res,ensure_ascii=False,indent=4))
|
||||
max_tokens = 7900 if model_type == 4 else 5900
|
||||
if not cleaned_evaluation_res and total_tokens > max_tokens:
|
||||
print(f"total_tokens: {total_tokens}")
|
||||
questions_to_continue.append((user_query, evaluation_res))
|
||||
else:
|
||||
temp_final.update(cleaned_evaluation_res)
|
||||
@ -468,60 +487,66 @@ def combine_evaluation_standards(evaluation_method_path,invalid_path,zb_type):
|
||||
return final_res
|
||||
|
||||
try:
|
||||
judge_res,file_id = run_first_query(evaluation_method_path)
|
||||
# 检查 judge_res 的内容
|
||||
def get_default_result():
|
||||
return {
|
||||
'技术评分': '本招标文件没有技术评分!',
|
||||
'商务评分': '本招标文件没有商务评分!'
|
||||
}
|
||||
# 如果 judge_res 包含 '是',直接运行第二步查询
|
||||
if '是' in judge_res:
|
||||
if get_pdf_page_count(evaluation_method_path)<=20:
|
||||
model_type=4 #qianwen-plus
|
||||
processed_filepath = convert_file_to_markdown(evaluation_method_path,"extract2.txt") # 转markdown格式
|
||||
else:
|
||||
evaluation_method_docxpath=pdf2docx(evaluation_method_path)
|
||||
file_id=upload_file(evaluation_method_docxpath)
|
||||
model_type = 2 #qianwen-long
|
||||
processed_filepath = ""
|
||||
return run_second_qeury(file_id,processed_filepath,model_type)
|
||||
# 标准化路径,避免多种表示形式造成的误判
|
||||
judge_res, file_id = run_first_query(evaluation_method_path)
|
||||
eval_path = os.path.abspath(evaluation_method_path)
|
||||
invalid_eval_path = os.path.abspath(invalid_path)
|
||||
# 判断路径是否一致
|
||||
if eval_path == invalid_eval_path:
|
||||
# 如果路径一致,直接返回默认结果
|
||||
return get_default_result()
|
||||
# 路径不一致,尝试运行第一次查询
|
||||
judge_res, file_id = run_first_query(invalid_path)
|
||||
# 如果 judge_res 包含 '是',运行第二步查询
|
||||
# 获取 evaluation_method_path 所在的目录
|
||||
eval_dir = os.path.dirname(eval_path)
|
||||
# extract3.txt是invalid_path->markdown,不一定存在
|
||||
extract3_path = os.path.join(eval_dir, "extract3.txt")
|
||||
if '是' in judge_res:
|
||||
model_type = 0
|
||||
processed_filepath = ""
|
||||
if get_pdf_page_count(evaluation_method_path) <= 20:
|
||||
model_type = 4 # qianwen-plus
|
||||
processed_filepath = convert_file_to_markdown(evaluation_method_path, "extract2.txt")
|
||||
else:
|
||||
if eval_path == invalid_eval_path:
|
||||
if os.path.exists(extract3_path):
|
||||
print("qianwen-plus1:extract3.txt")
|
||||
processed_filepath = extract3_path
|
||||
model_type = 4 # 使用 qianwen-plus
|
||||
else:
|
||||
processed_filepath = ""
|
||||
file_id = upload_file(invalid_eval_path)
|
||||
model_type = 3 # 默认 qianwen-long-stream
|
||||
else:
|
||||
evaluation_method_docxpath = pdf2docx(evaluation_method_path)
|
||||
file_id = upload_file(evaluation_method_docxpath)
|
||||
processed_filepath = ""
|
||||
model_type = 3 # qianwen-long_stream
|
||||
return run_second_qeury(file_id, processed_filepath, model_type)
|
||||
# 默认返回结果
|
||||
return get_default_result()
|
||||
except Exception as e:
|
||||
print(f"Error in combine_evaluation_standards: {e}")
|
||||
# 在出错时返回默认的包含空字符串的字典
|
||||
|
||||
# 如果 judge_res 不包含 '是' 并且路径不同,处理 invalid_path
|
||||
if eval_path != invalid_eval_path:
|
||||
judge_res_invalid, file_id_invalid = run_first_query(invalid_path)
|
||||
if '是' in judge_res_invalid:
|
||||
if os.path.exists(extract3_path):
|
||||
print("qianwen-plus2:extract3.txt")
|
||||
processed_filepath = extract3_path
|
||||
model_type = 4 # qianwen-plus
|
||||
else:
|
||||
processed_filepath = ""
|
||||
model_type = 3 # 默认 qianwen-long_stream
|
||||
return run_second_qeury(file_id_invalid, processed_filepath, model_type)
|
||||
|
||||
# 如果路径相同或未找到 '是',返回默认结果
|
||||
return DEFAULT_EVALUATION_REVIEW.copy()
|
||||
|
||||
|
||||
#目前评分这块如果表格过长,会有问题,可以考虑textin+doubao,小于20页用text,>20页转word->qianwen-long
|
||||
#TODO:代码计算总分,商务评分修改
|
||||
#TODO:废标项,增加对表格的提取+排除重复项
|
||||
except Exception as e:
|
||||
print(f"Error in combine_evaluation_standards: {e}")
|
||||
# 出错时返回默认结果
|
||||
return DEFAULT_EVALUATION_REVIEW.copy()
|
||||
|
||||
if __name__ == "__main__":
|
||||
start_time=time.time()
|
||||
# truncate_file=r"C:\Users\Administrator\Desktop\招标文件-采购类\tmp2\2024-新疆-塔城地区公安局食药环分局快检实验室项目_evaluation_method.pdf"
|
||||
evaluation_method_path = r'D:\flask_project\flask_app\static\output\output1\f91db70d-8d96-44a5-b840-27d2f1ecbe95\invalid_del.docx'
|
||||
invalid_path=r'D:\flask_project\flask_app\static\output\output1\f91db70d-8d96-44a5-b840-27d2f1ecbe95\invalid_del.docx'
|
||||
evaluation_method_path = r'D:\flask_project\flask_app\static\output\output1\test\招标文件-第二章-第六章-172404【电能表标准设备172404-1305001-0002】_evaluation_method.pdf'
|
||||
invalid_path=r'D:\flask_project\flask_app\static\output\output1\test\招标文件-第二章-第六章-172404【电能表标准设备172404-1305001-0002】_invalid.docx'
|
||||
# truncate_file = "C:\\Users\\Administrator\\Desktop\\货物标\\output2\\2-招标文件(统计局智能终端二次招标)_evaluation_method.pdf"
|
||||
# truncate_file="C:\\Users\\Administrator\\Desktop\\货物标\\output2\\广水市妇幼招标文件最新(W改)_evaluation_method.pdf"
|
||||
# truncate_file = "C:\\Users\\Administrator\\Desktop\\fsdownload\\2d481945-1f82-45a5-8e56-7fafea4a7793\\ztbfile_evaluation_method.pdf"
|
||||
# truncate_file="C:\\Users\\Administrator\\Desktop\\fsdownload\\ztbfile_evaluation_method.pdf"
|
||||
res = combine_evaluation_standards(evaluation_method_path,invalid_path,2)
|
||||
print("------------------------------")
|
||||
print(json.dumps(res, ensure_ascii=False, indent=4))
|
||||
end_time=time.time()
|
||||
print("elapsed time:"+str(end_time-start_time))
|
@ -130,99 +130,6 @@ def rag_assistant(knowledge_name):
|
||||
)
|
||||
return assistant
|
||||
|
||||
#TODO:http格式,有bug还没修改
|
||||
def create_assistant(knowledge_name):
|
||||
"""
|
||||
Create an assistant using DashScope routes via HTTP request based on the provided knowledge name.
|
||||
|
||||
Parameters:
|
||||
knowledge_name (str): The name of the knowledge base to associate with the assistant.
|
||||
|
||||
Returns:
|
||||
dict: Response from the routes containing assistant details.
|
||||
|
||||
Raises:
|
||||
ValueError: If the DASHSCOPE_API_KEY environment variable is not set.
|
||||
Exception: If any error occurs during the HTTP request.
|
||||
"""
|
||||
# Step 1: Initialize the Retriever and get the Pipeline ID
|
||||
try:
|
||||
retriever = DashScopeCloudRetriever(knowledge_name)
|
||||
pipeline_id = str(retriever.pipeline_id)
|
||||
except Exception as e:
|
||||
print(f"Error retrieving pipeline ID for knowledge '{knowledge_name}': {e}")
|
||||
return None
|
||||
|
||||
# Step 2: Fetch the routes Key from Environment Variables
|
||||
api_key = os.getenv("DASHSCOPE_API_KEY")
|
||||
if not api_key:
|
||||
raise ValueError("DASHSCOPE_API_KEY environment variable is not set.")
|
||||
|
||||
# Step 3: Define the routes Endpoint and Headers
|
||||
url = 'https://dashscope.aliyuncs.com/api/v1/assistants'
|
||||
headers = {
|
||||
"Content-Type": "application/json",
|
||||
"Authorization": f"Bearer {api_key}"
|
||||
}
|
||||
|
||||
# Step 4: Construct the Instructions
|
||||
instructions = (
|
||||
"请记住以下材料,他们对回答问题有帮助,请你简洁准确地给出回答,不要给出无关内容。${documents}"
|
||||
)
|
||||
|
||||
# Step 5: Define the Tools
|
||||
tools = [
|
||||
{
|
||||
"type": "code_interpreter"
|
||||
},
|
||||
{
|
||||
"type": "rag",
|
||||
"prompt_ra": {
|
||||
"pipeline_id": pipeline_id,
|
||||
"parameters": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"query_word": {
|
||||
"type": "str",
|
||||
"value": "${documents}"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
]
|
||||
|
||||
# Step 6: Construct the Payload
|
||||
payload = {
|
||||
"model": "qwen-max",
|
||||
"name": "智能小助手", # "Smart Helper" in Chinese
|
||||
"description": "智能助手,支持知识库查询和插件调用。",
|
||||
"temperature": 0.3,
|
||||
"instructions": instructions,
|
||||
"tools": tools,
|
||||
"file_ids": [], # Add file IDs if necessary
|
||||
"metadata": {} # Add metadata if necessary
|
||||
}
|
||||
|
||||
# Optional: If you have specific file_ids or metadata, you can modify the payload accordingly
|
||||
# For example:
|
||||
# payload["file_ids"] = ["file_id_1", "file_id_2"]
|
||||
# payload["metadata"] = {"key1": "value1", "key2": "value2"}
|
||||
|
||||
# Step 7: Make the HTTP POST Request
|
||||
try:
|
||||
response = requests.post(url, headers=headers, data=json.dumps(payload))
|
||||
response.raise_for_status() # Raises HTTPError for bad responses (4xx or 5xx)
|
||||
assistant = response.json()
|
||||
print("Assistant created successfully:")
|
||||
print(json.dumps(assistant, indent=4, ensure_ascii=False))
|
||||
return assistant
|
||||
except requests.exceptions.HTTPError as http_err:
|
||||
print(f"HTTP error occurred: {http_err} - Response: {response.text}")
|
||||
except Exception as err:
|
||||
print(f"An error occurred: {err}")
|
||||
|
||||
|
||||
def pure_assistant():
|
||||
assistant = Assistants.create(
|
||||
model='qwen-max',
|
||||
|
@ -19,7 +19,6 @@ def get_start_and_common_header(input_path,end_page):
|
||||
)
|
||||
# 新增目录匹配模式
|
||||
catalog_pattern = regex.compile(r'\s*目\s*录\s*$', regex.MULTILINE)
|
||||
|
||||
pdf_document = PdfReader(input_path)
|
||||
for i, page in enumerate(pdf_document.pages):
|
||||
if i > end_page:
|
||||
@ -261,7 +260,7 @@ def get_invalid_file(file_path, output_folder, common_header,begin_page):
|
||||
return ""
|
||||
|
||||
if __name__ == "__main__":
|
||||
file_path=r'C:\Users\Administrator\Desktop\new招标文件\货物标\HBDL-2024-0310-001-招标文件.pdf'
|
||||
output_folder=r'C:\Users\Administrator\Desktop\new招标文件\货物标\tmp'
|
||||
res=get_invalid_file(file_path,output_folder,"")
|
||||
file_path=r'D:\flask_project\flask_app\static\output\output1\f91db70d-8d96-44a5-b840-27d2f1ecbe95\ztbfile.pdf'
|
||||
output_folder=r'D:\flask_project\flask_app\static\output\output1\f91db70d-8d96-44a5-b840-27d2f1ecbe95\tmp'
|
||||
res=get_invalid_file(file_path,output_folder,"",0)
|
||||
|
||||
|
@ -896,7 +896,6 @@ def combine_find_invalid(invalid_docpath, output_dir):
|
||||
print("无效标与废标done...")
|
||||
return {"无效标与废标项": combined_dict}
|
||||
|
||||
#TODO:添加到txt中也要做一个去重。
|
||||
if __name__ == '__main__':
|
||||
start_time = time.time()
|
||||
# truncate_json_path = "C:\\Users\\Administrator\\Desktop\\货物标\\output4\\tmp2\\竞争性谈判文件(3)_tobidders_notice_part1\\truncate_output.json"
|
||||
|
@ -376,7 +376,6 @@ def qianwen_plus(user_query, need_extra=False):
|
||||
else:
|
||||
return ""
|
||||
|
||||
#TODO:若采购需求和评分那块响应超时比较多,考虑都改为流式
|
||||
if __name__ == "__main__":
|
||||
# Example file path - replace with your actual file path
|
||||
|
||||
|
@ -5,7 +5,7 @@ from copy import deepcopy
|
||||
|
||||
from flask_app.general.doubao import doubao_model
|
||||
from flask_app.general.format_change import pdf2docx, docx2pdf,doc2docx
|
||||
from flask_app.general.json_utils import clean_json_string
|
||||
from flask_app.general.json_utils import clean_json_string, rename_outer_key
|
||||
from flask_app.general.merge_pdfs import merge_pdfs
|
||||
from flask_app.general.通义千问long import qianwen_plus
|
||||
from flask_app.general.通用功能函数 import get_global_logger
|
||||
@ -343,7 +343,7 @@ def extract_business_deviation(busi_requirements_dict):
|
||||
1. 每个以★、▲或其他特殊符号开头的要求项应作为单独的字符串。
|
||||
2. 每条内容需要有实际的含义、要求,不能光有标题性质的表述如'★售后服务期限(质保期)及要求';对于类似'技术要求中带★条款项不满足的视为无效投标'这种描述带星★或带三角▲或带特殊符号的响应情况的,它本身不属于具体的★、▲商务要求,因此不需要添加进字符串列表中。
|
||||
3. 你的回答内容需从所给文本中提取,尽量不改变原文的表达(除非以下要求与指南3.的特殊情况),请勿擅自添加三角▲、五角星★,请勿返回普通的商务要求。
|
||||
4. 若无重要商务要求(★、▲或其他特殊符号开头的商务要求项),键值为空列表,即[],无需额外返回说明性文字。
|
||||
4. 若无重要商务要求(即★、▲或其他特殊符号开头的商务要求项),键值为空列表,即[],无需额外返回说明性文字。
|
||||
5. 若输入文本中存在嵌套键值对格式,且键值本身语义完整且符合'重要商务要求',可直接将其添加至'商务要求'的键值中;若键值字符串本身语义表达不完整,可将键值对用冒号':'拼接之后作为一条商务要求,若键值字符串以★、▲或其他特殊符号开头,将符号移至拼接后的开头,例如'"★交货地点:采购人指定地点"'。
|
||||
6. 对于以三角▲或五角星★或其他特殊符号开头的字符串:
|
||||
a. 如果该字符串仅为标题性质的表述且不具备实际商务要求的含义,请根据语义关联性将其开头的三角▲或五角星★添加到紧随其后的若干(可为一)内容之后,形成完整的商务要求,并确保整个内容连贯。
|
||||
@ -369,7 +369,7 @@ def extract_business_deviation(busi_requirements_dict):
|
||||
c. 无论哪种情况,都需确保不遗漏任何以三角▲或五角星★或其他特殊符号开头的重要信息。
|
||||
|
||||
**禁止内容**:
|
||||
确保所有输出内容均基于提供的实际文本内容,不使用任何预设的示例作为回答。
|
||||
确保所有输出内容均基于提供的实际文本内容,不使用任何预设的示例作为回答,禁止编造回答。
|
||||
|
||||
**示例输入如下**:
|
||||
{{
|
||||
@ -415,6 +415,7 @@ def extract_business_deviation(busi_requirements_dict):
|
||||
# 分配结果到相应的变量,未处理的结果使用默认值
|
||||
business_req_deviation = results[0] if results[0] is not None else default_return[0]
|
||||
business_star_req_deviation = results[1] if results[1] is not None else default_return[1]
|
||||
business_star_req_deviation=rename_outer_key(business_star_req_deviation,"商务要求带星")
|
||||
|
||||
return business_req_deviation, business_star_req_deviation
|
||||
|
||||
|
@ -67,7 +67,7 @@ def little_parse_engineering(output_folder, pdf_path,logger):
|
||||
# 假设最后一个文件是需要处理的基础信息文件
|
||||
baseinfo_file_path = files[-1]
|
||||
if not baseinfo_file_path:
|
||||
baseinfo_file_path=files[-2]
|
||||
baseinfo_file_path=files[-2] #invalid_path
|
||||
# 上传文件并获取文件 ID
|
||||
file_id = upload_file(baseinfo_file_path)
|
||||
# 注意:以下路径被硬编码,确保该路径存在并且正确
|
||||
@ -140,10 +140,10 @@ if __name__ == "__main__":
|
||||
# zb_type=2 #1:工程标 2:货物标
|
||||
# input_file = "C:\\Users\\Administrator\\Desktop\\货物标\\zbfiles\\ztbfile.pdf"
|
||||
|
||||
output_folder=r"C:\Users\Administrator\Desktop\货物标\zbfiles\tmp"
|
||||
zb_type=2 #1:工程 2:货物
|
||||
output_folder=r"C:\Users\Administrator\Desktop\fsdownload\b18e9c17-e866-4116-8db3-aaab722d1463\tmp"
|
||||
zb_type=1 #1:工程 2:货物
|
||||
# input_file=r"C:\Users\Administrator\Desktop\fsdownload\865a5d46-a5f8-467a-8374-c71c415d0af9\ztbfile.pdf"
|
||||
input_file=r"C:\Users\Administrator\Desktop\货物标\zbfiles\2020-安徽-安徽省生态环境厅电梯采购.pdf"
|
||||
input_file=r"C:\Users\Administrator\Desktop\fsdownload\b18e9c17-e866-4116-8db3-aaab722d1463\ztbfile.pdf"
|
||||
final_json_path=little_parse_main(output_folder, input_file, file_type, zb_type,"122334")
|
||||
with open(final_json_path, 'r', encoding='utf-8') as f:
|
||||
# logger.info('final_json_path:' + final_json_path)
|
||||
|
@ -210,7 +210,6 @@ def post_process_baseinfo(base_info,logger):
|
||||
logger.error(f"Error in post_process_baseinfo: {e}")
|
||||
return base_info, [] # 返回空列表
|
||||
|
||||
#TODO:错误处理,通过返回值completion来错误处理,而不是正则表达 学习装饰器、 整体后处理
|
||||
def goods_bid_main(output_folder, file_path, file_type, unique_id):
|
||||
logger = get_global_logger(unique_id)
|
||||
# 预处理文件,获取处理后的数据
|
||||
@ -277,9 +276,10 @@ def goods_bid_main(output_folder, file_path, file_type, unique_id):
|
||||
|
||||
#TODO: ec7d5328-9c57-450f-baf4-2e5a6f90ed1d
|
||||
|
||||
#TODO:1.先截取合同、投标文件格式之前的页码 即 invalid 如果页码小于50页,那么剩下的不切了直接仍。
|
||||
#TODO:
|
||||
# 2.废标项这边,考虑大模型+正则并用
|
||||
# 3.限制评分项的因素。
|
||||
# 废标项,增加对表格的提取+排除重复项
|
||||
# 考虑将工程标和货物标的 投标人须知那块结合
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
|
@ -41,8 +41,6 @@ def create_app():
|
||||
logger.info("清理完毕!")
|
||||
return app
|
||||
|
||||
#TODO:培训要求、总体要求、进度要求、'建设要求'到技术要求中,归类到其他要求中
|
||||
|
||||
if __name__ == '__main__':
|
||||
app = create_app()
|
||||
app.run(debug=True, host='0.0.0.0', port=5000)
|
||||
|
@ -36,4 +36,4 @@
|
||||
"开标地点":"线上开标"
|
||||
}
|
||||
|
||||
8.请你根据招标文件信息,投标人需要递交的投标保证金(或磋商保证金)是多少?请按json格式给我提供信息,键名为'投标保证金额',键值为原文中的具体金额,如果不需要递交保证金或者金额未知,键值为"其他"。
|
||||
8.请你根据招标文件信息,投标人需要递交的投标保证金(或磋商保证金)是多少?请按json格式给我提供信息,键名为'投标保证金额',键值为原文中的具体金额;如果不需要递交保证金或者金额未知,键值为"其他",请不要返回其他说明信息,保持回答的简洁。
|
@ -36,7 +36,7 @@
|
||||
"开标地点":"供应商通过供应商客户端进入江夏区政府采购电子交易系统开标大厅中进行远程开启"
|
||||
}
|
||||
|
||||
8.请你根据招标文件信息,投标人需要递交的投标保证金(或磋商保证金)是多少?请按json格式给我提供信息,键名为'投标保证金额',键值为原文中的具体金额的完整表述,如果不需要递交保证金或者金额未知,键值为"其他"。
|
||||
8.请你根据招标文件信息,投标人需要递交的投标保证金(或磋商保证金)是多少?请按json格式给我提供信息,键名为'投标保证金额',键值为原文中的具体金额;如果不需要递交保证金或者金额未知,键值为"其他",请不要返回其他说明信息,保持回答的简洁。
|
||||
|
||||
|
||||
|
||||
|
202
flask_app/test_case/商务技术评分数据.py
Normal file
202
flask_app/test_case/商务技术评分数据.py
Normal file
@ -0,0 +1,202 @@
|
||||
data={
|
||||
"技术评分": {
|
||||
"技术评分-1": {
|
||||
"一、技术方案(24分)": [
|
||||
{
|
||||
"评分": "24分",
|
||||
"要求": "方案的先进性:好4-3分,一般2-1分,不好0分。方案的创新性:好4-3分,一般2-1分,不好0分。方案的技术指标:好4-3分,一般2-1分,不好0分。方案的经济指标:好4-3分,一般2-1分,不好0分。方案的质量指标:好4-3分,一般2-1分,不好0分。方案的风险:低4-3分,中等2-1分,高0分。"
|
||||
}
|
||||
],
|
||||
"二、安全保障(10分)": [
|
||||
{
|
||||
"评分": "10分",
|
||||
"要求": "安全保障体系完整、措施得力10-9分;体系及措施完善,一般8-4 分;有保障措施,但不完善、不完整、不得力3-1分;没有0分。"
|
||||
}
|
||||
],
|
||||
"三、质量保障(10分)": [
|
||||
{
|
||||
"评分": "10分",
|
||||
"要求": "质量保障体系完整、措施得力10-9分;体系及措施完善,一般8-4 分;有保障措施,但不完善、不完整、不得力3-1分;没有0分。"
|
||||
}
|
||||
],
|
||||
"四、进度保障(6分)": [
|
||||
{
|
||||
"评分": "6分",
|
||||
"要求": "工作进度计划控制措施得力6-5分,工作计划合理,一般4-3分,有保障措施,但不完善、不完整、不得力2-1分,没有0分。"
|
||||
}
|
||||
],
|
||||
"五、管理机构及人员(15分)": [
|
||||
{
|
||||
"评分": "15分",
|
||||
"要求": "项目主要负责人的资历及业绩情况优良8-6分,一般5-3分,差2-1 分,没有0分。水平优良7-5分,项目队伍成员全部具备相关资质,主要工作人员从事相关工作时间在5年及以上;组织机构完善,分工合理,职责、界面清晰,工作有计划、有监督、有检查。水平一般4-3分,主要工作人员及部分工作人员具备相关资质,主要工作人员从事相关工作时间在5年以下;组织机构较完善,分工合理,职责、界面清晰,工作有计划。水平差2-1分,主要工作人员具备相关资质,从事相关工作时间在5年以下;组织机构不完善,职责、界面有缺陷。没有0分,主要工作人员不具备相关资质;无组织机构。"
|
||||
}
|
||||
],
|
||||
"六、后续服务承诺(5分)": [
|
||||
{
|
||||
"评分": "5分",
|
||||
"要求": "根据后续服务承诺内容合理性、针对性酌情打分,5-0分。"
|
||||
}
|
||||
],
|
||||
"七、类似项目业绩和实施经验(10分)": [
|
||||
{
|
||||
"评分": "10分",
|
||||
"要求": "近3年同类项目经历每个得2分,最高10分。"
|
||||
}
|
||||
],
|
||||
"八、对投标人评价(20分)": [
|
||||
{
|
||||
"评分": "20分",
|
||||
"要求": "根据最近一年度业主单位对供应商的评价结果进行评分,95分及以上得20分,每降低5分,扣2分,扣完为止;未取得业主单位评价结果的供应商或业主单位未开展供应商年度评价的,按供应商提供的最近一年度履约评价证明材料(业主单位满意度调查表、资信评价等),提供评价结果为满意或优良的,每份得4分,最高得20分。"
|
||||
}
|
||||
]
|
||||
},
|
||||
"技术评分-2": {
|
||||
"1.工程业绩(12分)": [
|
||||
{
|
||||
"评分": "12分",
|
||||
"要求": "对满足招标公告要求的业绩进行评审,按照业绩数量从高到低对投标人进行排序并评价。优:排序为前30%(含)的。11-12分良:排序为前30%(不含)-70%(含)的。9-10分一般:剩余排序的。7-8分注:按以上百分比规则计算时,四舍五入取整。"
|
||||
}
|
||||
],
|
||||
"2.施工组织机构(11分)": [
|
||||
{
|
||||
"评分": "11分",
|
||||
"要求": "对施工组织机构、进度计划及施工工期保证措施进行评价。优:组织机构、进度计划及施工工期保证措施科学合理。10-11分良:组织机构、进度计划及施工工期保证措施满足施工要求。8-9分一般:组织机构、进度计划及施工工期保证措施一般或不合理。6-7分"
|
||||
}
|
||||
],
|
||||
"3.主要施工方法(10分)": [
|
||||
{
|
||||
"评分": "10分",
|
||||
"要求": "对根据项目特点编制的施工方法进行评价。优:施工方法优良,工艺先进。9-10分良:施工方法较好,工艺可行。7-8 分一般:施工方法一般,工艺简单。6分"
|
||||
}
|
||||
],
|
||||
"4.安全管理(5分)": [
|
||||
{
|
||||
"评分": "5分",
|
||||
"要求": "对安全目标、安全保证管理体系、安全组织机构、安全管控实施方案进行评价。优:安全管理组织详细,可控性高。5分良:安全管理组织可行,有一定可控性。4分一般:安全管理组织模糊,可控性低。3分"
|
||||
}
|
||||
],
|
||||
"5.主要施工机械组织(5分)": [
|
||||
{
|
||||
"评分": "5分",
|
||||
"要求": "对新施工机械、机具及施工工艺保证措施进行评价。优:施工机械组织周密,可控性强。5分良:施工机械组织可行,有一定可控性。4分一般:施工机械组织简单,可控性低。3分"
|
||||
}
|
||||
],
|
||||
"6.劳动力安排组织(8分)": [
|
||||
{
|
||||
"评分": "8分",
|
||||
"要求": "对劳动力安排组织进行评价。优:劳动力安排组织周密,劳动力配备科学合理,可控性强。7-8分良:劳动力安排组织可行,劳动力配备基本满足,有一定可控性。-6分一般:劳动力安排组织简单,劳动力配备不足,可控性低。3-4分"
|
||||
}
|
||||
],
|
||||
"7.确保工程质量的技术组织措施(5分)": [
|
||||
{
|
||||
"评分": "5分",
|
||||
"要求": "对确保工程质量的技术组织措施进行评价。优:工程质量技术组织措施科学,全面,对影响工程质量的相关因素分析和考虑全面,针对性强。5分良:工程质量技术组织措施合理,对影响工程质量的相关因素分析和考虑不全面,具备一定针对性。4分一般:工程质量技术组织措施简单,未考虑影响工程质量的相关因素,针对性低。3分"
|
||||
}
|
||||
],
|
||||
"8.确保安全生产的技术组织措施(5分)": [
|
||||
{
|
||||
"评分": "5分",
|
||||
"要求": "对确保安全生产的技术组织方案进行评价。优:安全技术组织措施科学,全面,针对性强。5分良:安全技术组织措施合理,具备一定针对性。4分一般:安全技术组织措施简单,针对性低。3分"
|
||||
}
|
||||
],
|
||||
"9.应急抢险措施(5分)": [
|
||||
{
|
||||
"评分": "5分",
|
||||
"要求": "对应急抢险措施方案进行评价。优:应急抢险措施科学,全面,针对性强。5分良:应急抢险措施合理,具备一定针对性。4分一般:应急抢险措施简单,针对性低。3分"
|
||||
}
|
||||
],
|
||||
"10.确保工期的技术组织措施(5分)": [
|
||||
{
|
||||
"评分": "5分",
|
||||
"要求": "对确保工期的技术组织方案进行评价。优:工期技术组织措施科学,全面,针对性强。5分良:工期技术组织措施合理,具备一定针对性。4分一般:工期技术组织措施简单,针对性低。3分"
|
||||
}
|
||||
],
|
||||
"11.确保文明施工的技术组织措施(9分)": [
|
||||
{
|
||||
"评分": "9分",
|
||||
"要求": "对文明施工及环保措施的有效性、可操作性进行评价。优:文明施工五牌一图制作规范,着装统一整洁,施工现场防尘降噪等措施完备。8-9分良:五牌一图制作满足要求,有着装要求,施工现场防尘降噪等具备一定措施。6-7分一般:五牌一图制作欠规范,无着装要求,施工现场防尘降噪等措施一般。4-5分"
|
||||
}
|
||||
],
|
||||
"12、对投标人评价(20分)": [
|
||||
{
|
||||
"评分": "20分",
|
||||
"要求": "根据最近一年度业主单位对供应商的评价结果进行评分,95分及以上得20分,每降低5分,扣2分,扣完为止;未取得业主单位评价结果的供应商或业主单位未开展供应商年度评价的,按供应商提供的最近一年度履约评价证明材料(业主单位满意度调查表、资信评价等),提供评价结果为满意或优良的,每份得4分,最高得20分。"
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
"商务评分": {
|
||||
"1.诚信评价(0分)": [
|
||||
{
|
||||
"评分": "-30-0分",
|
||||
"要求": "不存在《国家电网有限公司供应商关系管理办法》中规定的不良行为;或存在《国家电网有限公司供应商关系管理办法》中规定的不良行为,但最近一次受到供应商不良行为处理解除之日,距离投标截止日超过3年,不扣分。至本项目投标截止日,存在《国家电网有限公司供应商关系管理办法》中规定的不良行为,且最近一次受到供应商不良行为处理解除之日,距离投标截止日超过2年但在3年以内(含),扣5 分,其中,存在行贿行为的,扣10分。至本项目投标截止日,存在《国家电网有限公司供应商关系管理办法》中规定的不良行为,且最近一次受到供应商不良行为处理解除之日,距离投标截止日超过1年但在2年以内(含),扣10 分,其中,存在行贿行为的,扣20分。至本项目投标截止日,存在《国家电网有限公司供应商关系管理办法》中规定的不良行为,且最近一次受到供应商不良行为处理解除之日1年以内(含),扣15分,其中,存在行贿行为的,扣30分。"
|
||||
},
|
||||
{
|
||||
"评分": "-10-0分",
|
||||
"要求": "不存在失信行为,或存在质量、诚信以外失信行为,情节轻微,行政处罚罚款累计在1万元以下,不扣分。存在质量、诚信以外失信行为,行政处罚罚款累计在1万元及以上30万元以下,扣5分。存在质量、诚信失信行为,或存在质量、诚信以外失信行为,但未纳入失信黑名单,行政处罚罚款累计在30万元及以上扣10分。"
|
||||
},
|
||||
{
|
||||
"评分": "-20-0分",
|
||||
"要求": "投标截止日近一年内,经查证核实,投标人存在打招呼、请托关照等可能影响评标工作公正性行为的,扣20分。无上述行为的,不扣分。"
|
||||
}
|
||||
],
|
||||
"2.绿色低碳评价(12分)": [
|
||||
{
|
||||
"评分": "2分",
|
||||
"要求": "对企业的绿色发展顶层规划及执行情况进行评价:建立了科学合理的绿色发展顶层规划并执行较好的,得2分;建立了科学合理的绿色发展顶层规划并执行一般的,得1分;未建立绿色发展顶层规划的,得0分。"
|
||||
},
|
||||
{
|
||||
"评分": "4分",
|
||||
"要求": "对国家级能源管理体系、质量管理体系、职业健康安全管理体系及环境管理体系证书认证情况进行评价:取得4项认证的得4分;取得1-3项认证的得2分;未取得认证的得0分。"
|
||||
},
|
||||
{
|
||||
"评分": "4分",
|
||||
"要求": "对企业发布ESG(环境、社会和公司治理)报告,取得环评/能评报告,取得废水/废气/废固报告情况进行评价:具有2类/3类报告的得4分;具有1类报告的得2分;未取得的得0分。如涉及环境行政处罚的,扣4分。"
|
||||
},
|
||||
{
|
||||
"评分": "2分",
|
||||
"要求": "对供应商电能消耗量中绿电的使用情况及取得绿色电力证书情况进行评价:情况良好的得2分;情况一般的得1分;情况较差的得0分。"
|
||||
}
|
||||
],
|
||||
"3.科研创新评价(7分)": [
|
||||
{
|
||||
"评分": "1分",
|
||||
"要求": "对供应商投标截止日近3年内取得的科技成果情况进行综合评价:取得过国家级科技创新成果的,得1分;取得过省级科技创新成果的,得0.5分;取得过其他级别创新成果的,得0.3分;未取得任何级别创新成果的,得0分。"
|
||||
},
|
||||
{
|
||||
"评分": "1分",
|
||||
"要求": "企业制定创新激励相关政策和机制的,得1分;企业未制定创新激励相关政策和机制的,得0分。"
|
||||
},
|
||||
{
|
||||
"评分": "3分",
|
||||
"要求": "拥有高级及以上职称人员和高级技师人员≥30人,得3分;拥有高级及以上职称人员和高级技师人员≥15人,得2分;拥有高级及以上职称人员和高级技师人员<15人,得1分;"
|
||||
},
|
||||
{
|
||||
"评分": "2分",
|
||||
"要求": "对供应商投标截止日近3年内科研经费投入进行评价:任一年研发投入占比达2%以上,得2分;有研发投入,得1分;无研发投入,得0分。"
|
||||
}
|
||||
],
|
||||
"4.综合评价(81分)": [
|
||||
{
|
||||
"评分": "36分",
|
||||
"要求": "对投标人的能力、人员、资质等综合实力进行评审。优:32-33分良:29-31分一般:26-28分"
|
||||
},
|
||||
{
|
||||
"评分": "2分",
|
||||
"要求": "获得中国质量奖、中国质量提名奖、全国质量奖及中国工业大奖任意一项及以上的,得2分;投标人具有各省、自治区、直辖市、计划单列市科技行政管理部门同本级财政、税务部门组成的本地区高新技术企业认定管理机构颁发的高新技术企业证书的,得1分。"
|
||||
},
|
||||
{
|
||||
"评分": "45分",
|
||||
"要求": "对商务投标文件的整体情况进行评审,根据是否按照招标文件规定的投标文件格式提交了完整的商务投标文件、有无制作投标文件目录、有无填写偏差表、遗漏项数、文件签署进行评审。优:提交了完整的商务投标文件且整体情况优良。14分良:提交了基本完整的商务投标文件且整体情况较好。13分一般:提交的商务投标文件存在多项缺漏项或整体情况一般。12 分报价质量:对投标报价完整性、准确性、规范性、合理性进行综合评审。优:30-31分"
|
||||
}
|
||||
]
|
||||
},
|
||||
"投标报价评分": {
|
||||
"投标报价评分标准": [
|
||||
{
|
||||
"评分": "100分",
|
||||
"要求": "计算基准价价格得分=100-100xnx(|投标人的评标价-基准价|/基准价)。四舍五入取小数点后两位。当投标人的评标价<基准价时, $n = 0 . 5 ;$当投标人的评标价>基准价时, $n = 2$O 基准价为所有通过技术、商务评审的合格投标人的评标价去掉部分高价和部分低价后(但不影响其参与价格分计算)的算术平均值x(1+浮动系数),浮动系数为C,开标现场随机抽取并公布,浮动系数抽取范围-3%-0%,以0.5%为级差。其中计算投标报价的基准价时,需要去除的投标报价情况如下:合格投标数量≤5时,直接计算;合格投标数量=6时,去掉一个最高价;合格投标数量≥7时,去掉一个最高价、一个最低价。注:1、公式中的评标价:各包通过技术、商务初评的合格投标人的投标报价经算术错误修正后并按以下公式折算后的价格。2、投标报价按照国家现行税收法律法规、部门规章、行业规范执行。"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
@ -1,175 +1,399 @@
|
||||
import json
|
||||
|
||||
from flask_app.general.doubao import doubao_model
|
||||
from flask_app.general.json_utils import clean_json_string
|
||||
|
||||
from flask_app.general.商务技术评分提取 import compute_total_score
|
||||
data={
|
||||
"服务要求": [
|
||||
"投标人和制造商在质量保证期内应当为采购人提供以下技术支持和服务:",
|
||||
"(1) 电话咨询中标人和制造商应当为采购人提供技术援助电话,解答采购人在使用中遇到的问题,及时为采购人提出解决问题的建议。",
|
||||
"▲(2) 现场响应采购人遇到使用及技术问题,电话咨询不能解决的, 中标人和制造商应在 2 小内到达现场(远郊区 4 小时内到达现场)进行处理,确保产品正常工作;无法在 8 小时内解决的,应在 24 小时内提供备用产品, 使采购人能够正常使用。",
|
||||
"(3) 技术升级在质保期内,如果中标人和制造商的产品技术升级,供应商应及时通知采购人,如 采购人有相应要求, 中标人和制造商应对采购人购买的产品进行升级服务。",
|
||||
"(4)在质保期内, 中标人每年至少主动为使用单位提供一次售后服务, 做好售后服务记录(使用单位签字盖章 ), 作为退还质保金的依据。",
|
||||
"▲(三) 备品备件及易损件",
|
||||
"中标人和制造商售后服务中,维修使用的备品备件及易损件应为原厂配件,未经采购人同意不得使用非原厂配件,常用的、容易损坏的备品备件及易损件的价格清单须在投标文件中列出。",
|
||||
"▲供应商对其提供产品的使用和操作应尽培训义务。供应商应提供对采购人的基本免费培训, 使采购人使用人员能够正常操作。"
|
||||
],
|
||||
"商务要求": [
|
||||
"★交货期要求/工期要求签到合同后 15 日历天/60 日历天",
|
||||
"★质保要求三年",
|
||||
"1. 交货期 、交货地点及验收方式",
|
||||
"(一) 交货期(或为: 实施时间)",
|
||||
"1 、 中标人应在采购合同签订后 15 个日历日内完成交货;",
|
||||
"2 、 中标人应在采购合同签订后 60个日历日内完成安装调试并可投入使用。",
|
||||
"(二) 交货地点(或为: 实施地点)",
|
||||
"1 、交货地点: 广水市市内各中小学。",
|
||||
"2 、交货要求:",
|
||||
"(1) 中标人提供的全部货物必须完全符合招标文件要求的品种和数量; 规格型号和技术参数必须完全满足招标文件和中标人在投标中承诺的正偏离的要求;货物的品牌 、生产厂家必须符合中标人在投标中承诺的品牌和生产厂家。",
|
||||
"(2) 中标人提供的货物未达到招标投标文件规定要求, 且对采购人造成损失的, 由中标人承担一切责任, 并赔偿所造成的损失。",
|
||||
"(3) 采购人需要制造商对中标人交付的产品(包括质量 、技术参数等) 进行确认的, 制造商应予以配合, 并出具书面意见。",
|
||||
"(4) 产品包装材料归采购人所有。注:本项目为采购人与使用人(用户)分离的项目 。中标人在送货前须按 采购人的要求 制作送货的相关的表格交采购人审核。",
|
||||
"(三) 验收方式",
|
||||
"1 、到货验收:到货验收由各项目单位(用户) 和中标人共同负责实施 。货物到达各项目单位(用户) 后, 由各项目单位(用户)组织人员和中标人代表在场当面开箱检查,核对货物的品牌、规格型号,查阅货物技术资料、装箱单、合格证等资, 检查外观, 核实货物数量 。到货验收合格条件如下:",
|
||||
"(1) 中标人在合同约定时间内完成交货;",
|
||||
"(2)货物的品牌 、规格型号符合中标人投标的承诺;",
|
||||
"(3)货物技术资料 、装箱单 、合格证等资料齐全;",
|
||||
"(4)货物全新 、完好无损;",
|
||||
"(5)货物数量符合采购人指定各项目单位(用户) 配备数量。",
|
||||
"2 、项目初验:各项目单位货物安装调试完成,运行正常,相关人员技术培训完成后 。中标人向项目单 位(用户)提供完整的项目实施资料(供货清单,货物和合格证、使用说明书、保修卡,货物安装布线图,培训资料,售后服务联系表。规范装订成册) 。 由各项目单位(用户)组织初验, 初验后按采购人要求填写初验合格证明。",
|
||||
"3 、项目终验:项目终验由采购人组织并成立验收小组验收 。项目终验合格条件如下:",
|
||||
"(1)设备技术参数与投标文件和采购合同一致, 性能指标达到 规定的标准;",
|
||||
"(2) 本项目所有项目单位(用户)初验合格(提供项单位初验合格证明 );",
|
||||
"(3) 项目实施资料完整(按采购人要求提供并规范装订成册 ) 。",
|
||||
"(4) 交货 、安装完成时间在合同规定时间内 完成。",
|
||||
"2. 报价要求",
|
||||
"本次报价须为人民币报价,包含:产品价、运输费( 含装卸费)、保险费、安装调试费、 税费、培训费等货到采购人指定地点并完成本项目的所有费用。因投标人自身原因造成漏报、 少报皆由其自行承担责任, 采购人不再补偿。",
|
||||
"3. 质量保证及售后服务",
|
||||
"▲ 1 、投标人应明确承诺: 所投设备免费质保期三年, 并提供设备生产厂家针对此项目的授权书及售后服务承诺函。",
|
||||
"2、投标产品属于国家规定“三包 ”范围的,其产品质量保证期不得低于“三包 ”规定。",
|
||||
"3 、投标人的质量保证期承诺优于国家“三包 ”规定的, 按招标文件要求, 投标人承诺执行。",
|
||||
"4 、投标产品由制造商(指产品生产制造商, 或其负责销售 、售后 服务机构, 以下同) 负责标准售后服务的, 应当在投标文件中予以明确说明,并附制造商售后服务承诺。",
|
||||
"2 、质保期外服务要求",
|
||||
"( 1) 质量保证期过后, 供应商和制造商应同样提供免费电话咨询服务, 并应承诺提供 产品上门维护服务。",
|
||||
"(2) 质量保证期过后, 采购人需要继续由原供应商和制造商提供售后服务 的, 该供应商和制造商应以优惠价格提供售后服务。",
|
||||
"4. 付款方式",
|
||||
"(一)中标人在合同约定时间内完成交货,经采购人审核确认后,中标人出具全额发票, 采购人在 10 个工作日内向市财政局提交申请, 支付合同全额的 40%;",
|
||||
"(二)中标人在合同约定时间内完成所供货物 的安装集成并投入正常使用,经采购人组织验收(终验)合格后, 付到合同总额的 9 5%, 余额 5%留作质保金。",
|
||||
"5. 知识产权",
|
||||
"采购人在中华人民共和国境内使用投标人提供的货物及服务时免受第三方提出的侵犯 其专利权或其它知识产权的起诉。如果第三方提出侵权指控, 中标人应承担由此而引起的一切法律责任和费用。",
|
||||
"6. 培训",
|
||||
"▲供应商对其提供产品的使用和操作应尽培训义务。供应商应提供对采购人的基本免费 培训, 使采购人使用人员能够正常操作。",
|
||||
"7. 投标人及产品制造商要求",
|
||||
"▲ (一) 投标人",
|
||||
"投标人(含集团公司旗下专业子公司) 获得 ISO9001 质量管理体系认证 、ISO 14001 环 境管理体系认证及 OHSAS18001 职业健康安全管理体系认证。投标人(含集团公司)具备工信部核发的《中华人民共和国基础电信业务经营许可证》, 具有合法电信网络运营商资格。以上证明资料提供复印件, 加盖制造商公章。",
|
||||
"▲( 二) 产品制造商",
|
||||
"为保证系统的安全性, 所投视频监控产品制造商需获得中国信息安全测评中心颁发的 《国家安全信息漏洞库(CNNVD) 技术支撑单位等级证书》。提供所投网络产品(交换机) 制造商, 近 2 年第三方权威咨询机构(IDC 或 CCW) 行 业销量排名数据证明。以上证明资料提供复印件, 加盖制造商公章。",
|
||||
"8. 其他",
|
||||
"(一)投标人必须在投标文件中对以上条款和服务承诺明确列出,承诺内容必须达到本 篇及招标文件其他条款的要求。",
|
||||
"(二) 其他未尽事宜由供需双方在采购合同中 详细约定。"
|
||||
]
|
||||
"技术评分": {
|
||||
"分标172404-1304085-9999 红外热成像仪技术详评细则": {
|
||||
"技术业绩(10--13)": [
|
||||
{
|
||||
"评分": "13分",
|
||||
"要求": "投标人提供了500台及以上红外热成像仪的供货业绩。"
|
||||
},
|
||||
{
|
||||
"评分": "12分",
|
||||
"要求": "投标人提供了100~499台红外热成像仪的供货业绩。"
|
||||
},
|
||||
{
|
||||
"评分": "10分",
|
||||
"要求": "投标人提供了1~99台红外热成像仪的供货业绩。"
|
||||
}
|
||||
],
|
||||
"关键技术能力(30--46)": [
|
||||
{
|
||||
"评分": "8分",
|
||||
"要求": "主要技术参数项目(带*号项目包括:探测器像素(分辨率)、热灵敏度(噪声等效温差,NETD)、测温准确度(准确度))完全响应且有1项及以上优于招标文件要求。"
|
||||
},
|
||||
{
|
||||
"评分": "6分",
|
||||
"要求": "主要技术参数项目完全响应。"
|
||||
},
|
||||
{
|
||||
"评分": "22分",
|
||||
"要求": "重要技术参数项目(包括:测温一致性、连续稳定工作时间)完全响应且有1项及以上优于招标文件要求。"
|
||||
},
|
||||
{
|
||||
"评分": "18分",
|
||||
"要求": "重要技术参数项目完全响应。"
|
||||
},
|
||||
{
|
||||
"评分": "14分",
|
||||
"要求": "重要技术参数项目一项不满足减2分,以2分为级差,最低得14分。"
|
||||
},
|
||||
{
|
||||
"评分": "8分",
|
||||
"要求": "其它技术参数及使用环境条件等完全响应且有1项及以上优于招标文件要求。"
|
||||
},
|
||||
{
|
||||
"评分": "6分",
|
||||
"要求": "其它技术参数及使用环境条件等完全响应。"
|
||||
},
|
||||
{
|
||||
"评分": "4分",
|
||||
"要求": "其它技术参数及使用环境条件等有1项及以上不满足招标文件要求。"
|
||||
},
|
||||
{
|
||||
"评分": "8分",
|
||||
"要求": "投标产品的检验报告与投标文件技术规范响应的技术参数、性能指标、使用环境条件等完全一致或检验报告值优于响应值。"
|
||||
},
|
||||
{
|
||||
"评分": "6分",
|
||||
"要求": "投标产品的检验报告与投标文件技术规范响应的技术参数、性能指标、使用环境条件等一项检验报告值低于响应值减1分,以1分为级差,最低得6分。"
|
||||
}
|
||||
],
|
||||
"人力资源(1--3)": [
|
||||
{
|
||||
"评分": "3分",
|
||||
"要求": "拥有高级及以上职称人员和高级技师人员≥30人。"
|
||||
},
|
||||
{
|
||||
"评分": "2分",
|
||||
"要求": "15≤拥有高级及以上职称人员和高级技师人员<30人。"
|
||||
},
|
||||
{
|
||||
"评分": "1分",
|
||||
"要求": "拥有高级及以上职称人员和高级技师人员<15人。"
|
||||
}
|
||||
],
|
||||
"工装设备(1--3)": [
|
||||
{
|
||||
"评分": "3分",
|
||||
"要求": "生产设备品种、数量和精度全部优于产品制造需要者,且检测设备先进,方法科学规范,具备全部型式试验项目试验能力。"
|
||||
},
|
||||
{
|
||||
"评分": "2分",
|
||||
"要求": "生产设备品种、数量和精度全部满足产品制造需要,且主要工装优于制造能力需要;且检测设备优良,方法严谨规范,具备部分型式试验项目试验能力。"
|
||||
},
|
||||
{
|
||||
"评分": "1分",
|
||||
"要求": "生产设备品种、数量和精度基本满足产品制造需要,且检测设备可靠,方法合理规范,仅满足出厂试验需要。"
|
||||
}
|
||||
],
|
||||
"关键组件/原材料(1--3)": [
|
||||
{
|
||||
"评分": "3分",
|
||||
"要求": "优于技术规范书中货物组件材料配置要求。"
|
||||
},
|
||||
{
|
||||
"评分": "2分",
|
||||
"要求": "完全满足技术规范书中货物组件材料配置要求。"
|
||||
},
|
||||
{
|
||||
"评分": "1分",
|
||||
"要求": "有一项不满足技术规范书中货物组件材料配置要求。"
|
||||
}
|
||||
],
|
||||
"制造环境(2--3)": [
|
||||
{
|
||||
"评分": "3分",
|
||||
"要求": "具有封闭厂房和净化车间,生产环境的温度、湿度、照明和降尘量等全部优于国家或行业规程规定。"
|
||||
},
|
||||
{
|
||||
"评分": "2分",
|
||||
"要求": "仅能满足一般制造能力需要。"
|
||||
}
|
||||
],
|
||||
"工艺方法(1--3)": [
|
||||
{
|
||||
"评分": "3分",
|
||||
"要求": "生产线及其工艺流程科学先进,针对关键工序节点的制造保障设备、措施设定设计管控科学有效,各工序的作业指导书、工艺控制文件齐全、统一、规范,产品工艺技术成熟、稳定,现场记录内容规范、详实,并具有可追溯性。"
|
||||
},
|
||||
{
|
||||
"评分": "2分",
|
||||
"要求": "生产线及其工艺流程满足质量保证需要,针对关键工序节点的制造保障设备、措施设定设计管控比较科学有效,主要工序的作业指导书、工艺控制文件齐全、统一、规范,产品工艺技术成熟、稳定,现场记录内容规范、详实,并具有可追溯性。"
|
||||
},
|
||||
{
|
||||
"评分": "1分",
|
||||
"要求": "生产线及其工艺流程满足质量保证需要,但各工序节点保障、管控水平一般,主要工序的作业指导书、工艺控制文件不够齐全、统一、规范,现场记录内容不够规范、详实,可追溯性较差。"
|
||||
}
|
||||
],
|
||||
"专项应答(0--3)": [
|
||||
{
|
||||
"评分": "3分",
|
||||
"要求": "对产品专项应答或招标文件要求的提升设备质量专项应答等进行响应,应答响应情况较好。"
|
||||
},
|
||||
{
|
||||
"评分": "2分",
|
||||
"要求": "对产品专项应答或招标文件要求的提升设备质量专项应答等进行响应,应答响应情况一般。"
|
||||
},
|
||||
{
|
||||
"评分": "0分",
|
||||
"要求": "未应答响应。"
|
||||
}
|
||||
],
|
||||
"绩效评价(0--20)": [
|
||||
{
|
||||
"评分": "20分",
|
||||
"要求": "重点考虑供应商在运行质量方面的表现,同时考虑供应商在生产制造、履约协调、现场安装、全寿命周期等方面的综合表现,根据评价结果进行评审。"
|
||||
}
|
||||
],
|
||||
"投标响应(1--3)": [
|
||||
{
|
||||
"评分": "3分",
|
||||
"要求": "投标文件响应情况良好。"
|
||||
},
|
||||
{
|
||||
"评分": "2分",
|
||||
"要求": "投标文件响应情况一般。"
|
||||
},
|
||||
{
|
||||
"评分": "1分",
|
||||
"要求": "投标文件响应情况较差。"
|
||||
}
|
||||
]
|
||||
},
|
||||
"分标172404-1701016-9999防火板技术详评细则": {
|
||||
"投标文件对招标文件响应情况(5--10)": [
|
||||
{
|
||||
"评分": "7分",
|
||||
"要求": "投标文件的对应性、规范性、全面性最优者。"
|
||||
},
|
||||
{
|
||||
"评分": "3分",
|
||||
"要求": "认真填写技术偏差表或清楚地说明无技术偏差。"
|
||||
},
|
||||
{
|
||||
"评分": "1分",
|
||||
"要求": "无技术偏差但在表中无说明。"
|
||||
},
|
||||
{
|
||||
"评分": "0分",
|
||||
"要求": "有技术偏差而不列出。"
|
||||
}
|
||||
],
|
||||
"投标设备对技术规范书的响应情况(23--35)": [
|
||||
{
|
||||
"评分": "10分",
|
||||
"要求": "投标文件所述产品主要经济技术指标全部响应。"
|
||||
},
|
||||
{
|
||||
"评分": "6分",
|
||||
"要求": "投标文件所述产品主要经济技术指标每出现1项不符合项扣1分,最低得6分。"
|
||||
},
|
||||
{
|
||||
"评分": "25分",
|
||||
"要求": "对招标文件主要参数的响应情况全部满足技术规范要求。"
|
||||
},
|
||||
{
|
||||
"评分": "17分",
|
||||
"要求": "对招标文件主要参数的响应情况每出现1项不符合项扣1分,最低得17分。"
|
||||
}
|
||||
],
|
||||
"合同业绩(9--15)": [
|
||||
{
|
||||
"评分": "15分",
|
||||
"要求": "超过公告要求200%及以上。"
|
||||
},
|
||||
{
|
||||
"评分": "13分",
|
||||
"要求": "超过公告要求100%及以上。"
|
||||
},
|
||||
{
|
||||
"评分": "11分",
|
||||
"要求": "超过公告要求50%及以上。"
|
||||
},
|
||||
{
|
||||
"评分": "9分",
|
||||
"要求": "业绩满足公告要求。"
|
||||
}
|
||||
],
|
||||
"资源实力(5--20)": [
|
||||
{
|
||||
"评分": "5分",
|
||||
"要求": "生产和试验装备满足要求。"
|
||||
},
|
||||
{
|
||||
"评分": "3分",
|
||||
"要求": "生产和试验装备一般。"
|
||||
},
|
||||
{
|
||||
"评分": "1分",
|
||||
"要求": "生产和试验装备较差。"
|
||||
},
|
||||
{
|
||||
"评分": "5分",
|
||||
"要求": "工艺水平满足要求。"
|
||||
},
|
||||
{
|
||||
"评分": "3分",
|
||||
"要求": "工艺水平一般。"
|
||||
},
|
||||
{
|
||||
"评分": "1分",
|
||||
"要求": "工艺水平较差。"
|
||||
},
|
||||
{
|
||||
"评分": "5分",
|
||||
"要求": "人员实力强。"
|
||||
},
|
||||
{
|
||||
"评分": "3分",
|
||||
"要求": "人员实力一般。"
|
||||
},
|
||||
{
|
||||
"评分": "1分",
|
||||
"要求": "人员实力较差。"
|
||||
},
|
||||
{
|
||||
"评分": "5分",
|
||||
"要求": "剩余生产能力按照采购文件要求酌情打分。"
|
||||
}
|
||||
],
|
||||
"质量控制(3--10)": [
|
||||
{
|
||||
"评分": "5分",
|
||||
"要求": "外购外协组件材料优秀可靠水平较高。"
|
||||
},
|
||||
{
|
||||
"评分": "4分",
|
||||
"要求": "外购外协组件材料等同于采购文件要求。"
|
||||
},
|
||||
{
|
||||
"评分": "3分",
|
||||
"要求": "外购外协组件材料略有差异,但基本满足采购文件要求。"
|
||||
},
|
||||
{
|
||||
"评分": "5分",
|
||||
"要求": "质量保证措施得力。"
|
||||
},
|
||||
{
|
||||
"评分": "1分",
|
||||
"要求": "质量保证措施一般。"
|
||||
},
|
||||
{
|
||||
"评分": "0分",
|
||||
"要求": "没有质量保证措施。"
|
||||
}
|
||||
],
|
||||
"服务合作(3--10)": [
|
||||
{
|
||||
"评分": "3分",
|
||||
"要求": "技术服务措施、技术力量、管理水平良好。"
|
||||
},
|
||||
{
|
||||
"评分": "2分",
|
||||
"要求": "技术服务措施、技术力量、管理水平一般。"
|
||||
},
|
||||
{
|
||||
"评分": "1分",
|
||||
"要求": "技术服务措施、技术力量、管理水平较差。"
|
||||
},
|
||||
{
|
||||
"评分": "3分",
|
||||
"要求": "维修、售后服务的承诺书和实施细则良好。"
|
||||
},
|
||||
{
|
||||
"评分": "2分",
|
||||
"要求": "维修、售后服务的承诺书和实施细则一般。"
|
||||
},
|
||||
{
|
||||
"评分": "1分",
|
||||
"要求": "维修、售后服务的承诺书和实施细则较差。"
|
||||
}
|
||||
],
|
||||
"合同执行相关人员描述(1-4分)": [
|
||||
{
|
||||
"评分": "4分",
|
||||
"要求": "良好。"
|
||||
},
|
||||
{
|
||||
"评分": "2-3分",
|
||||
"要求": "一般。"
|
||||
},
|
||||
{
|
||||
"评分": "1分",
|
||||
"要求": "较差。"
|
||||
}
|
||||
]
|
||||
},
|
||||
"分标172404-1802010-9999防火涂料技术详评细则": {
|
||||
"一、投标文件对招标文件要求的功能及技术参数响应情况(3--10)": [
|
||||
{
|
||||
"评分": "10分",
|
||||
"要求": "投标文件所述产品主要技术参数/物料描述/物料扩展描述响应情况。"
|
||||
}
|
||||
],
|
||||
"二、检测设备、检验报告响应情况(6--10)": [
|
||||
{
|
||||
"评分": "10分",
|
||||
"要求": "产品检测流程严谨,检测设备的性能、数量、种类等满足要求,检测试验报告齐全。"
|
||||
},
|
||||
{
|
||||
"评分": "6分",
|
||||
"要求": "检测报告不全者,以1分为级差扣分,最低得6分。"
|
||||
}
|
||||
],
|
||||
"三、制造厂工装设备、质量管理体系响应情况(6--10)": [
|
||||
{
|
||||
"评分": "5分",
|
||||
"要求": "产品工装设备的性能、数量、种类等方面水平较高。"
|
||||
},
|
||||
{
|
||||
"评分": "3分",
|
||||
"要求": "产品工装设备的性能、数量、种类等方面水平较低。"
|
||||
},
|
||||
{
|
||||
"评分": "5分",
|
||||
"要求": "产品质量管理体系及有关流程的响应情况明确的质量管理流程,制造工艺及质量保证措施全面可行,执行的质量标准符合国家现行各项标准要求。"
|
||||
},
|
||||
{
|
||||
"评分": "3分",
|
||||
"要求": "产品质量管理体系及有关流程的响应情况不符合要求。"
|
||||
}
|
||||
],
|
||||
"四、原材料、组部件、配套件响应情况(6--10)": [
|
||||
{
|
||||
"评分": "5分",
|
||||
"要求": "原材料质量水平、检测报告等响应情况好。"
|
||||
},
|
||||
{
|
||||
"评分": "3分",
|
||||
"要求": "原材料质量水平、检测报告等响应情况一般。"
|
||||
},
|
||||
{
|
||||
"评分": "5分",
|
||||
"要求": "组部件、配套件种类齐全并附有合格的检测报告。"
|
||||
},
|
||||
{
|
||||
"评分": "3分",
|
||||
"要求": "组部件、配套件种类不齐全或检测报告不合格。"
|
||||
}
|
||||
],
|
||||
"五、销售业绩(10--30)": [
|
||||
{
|
||||
"评分": "30分",
|
||||
"要求": "根据投标人提供的有效的供货业绩证明(以增值税发票累计金额为准)酌情评分。"
|
||||
}
|
||||
],
|
||||
"六、履约评价(0--30)": [
|
||||
{
|
||||
"评分": "10分",
|
||||
"要求": "根据取得好评履约评价意见的情况,进行评分,无评价意见不得分。"
|
||||
},
|
||||
{
|
||||
"评分": "20分",
|
||||
"要求": "如供应商为经销商,根据取得的制造商授权书数量,酌情评分,如为制造商则得满分。"
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
}
|
||||
def extract_business_deviation(procurement):
|
||||
new_data = {}
|
||||
counter = 1
|
||||
if "服务要求" in procurement:
|
||||
new_data[f"招标要求{counter}"] = procurement["服务要求"]
|
||||
counter += 1
|
||||
|
||||
# Extract "商务要求"
|
||||
if "商务要求" in procurement:
|
||||
new_data[f"招标要求{counter}"] = procurement["商务要求"]
|
||||
counter += 1
|
||||
|
||||
# Extract "其他要求"
|
||||
if "其他要求" in procurement:
|
||||
new_data[f"招标要求{counter}"] = procurement["其他要求"]
|
||||
counter += 1
|
||||
|
||||
business_requirements_string = json.dumps(new_data, ensure_ascii=False, indent=4)
|
||||
# print(business_requirements_string)
|
||||
prompt_template1 = """请帮我从以下文本中摘取商务要求部分,并将信息重新组织,键名为'商务要求',键值为字符串列表,其中每个字符串为一条商务要求,保留三角▲、五角星★(若有),但是去除开头的序号(若有)。
|
||||
#角色
|
||||
你是一个专业的招投标业务专家,擅长从招标文件中总结商务要求的部分,并逐条列出,作为编写商务要求偏离表的前置准备。
|
||||
|
||||
#要求与指南:
|
||||
1. 每条内容需要有实际的含义、要求,不能光有标题性质的表述如'售后服务期限(质保期)及要求'。
|
||||
2. 你的回答内容需从所给文本中整理,尽量不改变原文的表达,请勿擅自添加三角▲、五角星★(除非以下要求与指南3.的特殊情况)
|
||||
3. 若输入文本中存在嵌套键值对格式,且键值本身语义完整且符合'商务要求',可直接将其添加至'商务要求'的键值中;若键值本身语义表达不完整,可将键值对用冒号':'拼接之后作为一条商务要求。
|
||||
4. 对于以三角▲或五角星★开头的字符串:
|
||||
a. 如果该字符串仅为标题性质的表述且不具备实际商务要求的含义,请根据语义关联性将其开头的三角▲或五角星★添加到紧随其后的若干(可为一)内容之后,形成完整的商务要求,并确保整个内容连贯。
|
||||
注:默认在该字符串后面的一个字符串开头添加三角▲或五角星★,若有明确的序号或者语义表示了其后若干字符串之间的相关性,那么可在这些字符串开头都添加三角▲或五角星★,作为若干商务要求。
|
||||
b. 如果该字符串已经包含实际的商务要求,那么该内容作为一条完整的商务要求,保留开头的三角▲或五角星★。
|
||||
- 示例输入:
|
||||
```
|
||||
"★ 提供高质量的售后服务,服务期限不少于两年。"
|
||||
```
|
||||
- 示例输出:
|
||||
```
|
||||
"★ 提供高质量的售后服务,服务期限不少于两年。"
|
||||
```
|
||||
c. 无论哪种情况,都需确保不遗漏任何以三角▲或五角星★开头的重要信息。
|
||||
5. 若无商务要求,键值为空列表,即[]
|
||||
|
||||
### 示例输入如下:
|
||||
{{
|
||||
"招标要求1": ["▲(1)整个平台运行运维服务,须安排人员驻场对平台进行运行维护,采用 4人轮流值班,依照 7×12小时对可视化督察巡控平台进行操作,确保平台稳定运行。","▲ (一) 投标人","1.投标人需要获得 ISO9001 质量管理体系认证 、ISO 14001 环境管理体系认证及 OHSAS18001 职业健康安全管理体系认证。","2.投标人具备网络运营商资格。"]
|
||||
"招标要求2": {{
|
||||
"合同履行期限": ["★交货期(工期):合同签订之日起 15个日历天内完成,并通过项目验收。"],
|
||||
"交货地点": ["采购人指定地点"],
|
||||
"报价方式": ["(1)本项目报价须为固定总价,包含但不限于:采购、实施、调试、试运行、验收、运维等所有完成本项目相关的一切费用。","(2)因投标人自身原因造成漏报、少报皆由其自行承担责任,采购人不再补偿。"],
|
||||
"其他要求": ["无。"]
|
||||
}}
|
||||
}}
|
||||
### 对应的参考输出如下:
|
||||
{{
|
||||
"商务要求":[
|
||||
"▲整个平台运行运维服务,须安排人员驻场对平台进行运行维护,采用 4人轮流值班,依照 7×12小时对可视化督察巡控平台进行操作,确保平台稳定运行。",
|
||||
"▲投标人 获得 ISO9001 质量管理体系认证 、ISO 14001 环境管理体系认证及 OHSAS18001 职业健康安全管理体系认证。",
|
||||
"▲投标人具备网络运营商资格"
|
||||
"★交货期(工期):合同签订之日起 15个日历天内完成,并通过项目验收。",
|
||||
"交货地点:采购人指定地点",
|
||||
"本项目报价须为固定总价,包含但不限于:采购、实施、调试、试运行、验收、运维等所有完成本项目相关的一切费用。",
|
||||
"因投标人自身原因造成漏报、少报皆由其自行承担责任,采购人不再补偿。"
|
||||
]
|
||||
}}
|
||||
|
||||
文本内容:{full_text}
|
||||
"""
|
||||
user_query1 = prompt_template1.format(full_text=business_requirements_string)
|
||||
print(user_query1)
|
||||
model_res1 = doubao_model(user_query1)
|
||||
print(model_res1)
|
||||
# business_req_deviation = clean_json_string(model_res1)
|
||||
# prompt_template2 = """以下文本是项目采购需求的商务要求部分,请你帮我从键值列表中各字符串中提取带星★或带三角▲的要求项,你的返回格式同输入文本格式,外键名为'商务要求带星',键值为字符串列表,其中每个字符串为带星★或带三角▲的要求项。
|
||||
# 要求与指南:
|
||||
# 1. 每个星★或三角▲要求占据一个字符串。
|
||||
# 2. 若没有带星★或带三角▲的要求项,键值为空列表,即[]
|
||||
#
|
||||
# 特殊情况处理:
|
||||
# 对于输入类似于'技术要求中带★条款项不满足的视为无效投标'这种描述带星★或带三角▲的响应情况的,它本身不是带星或带三角的要求,因此不需要添加进字符串列表中;仅需把本身是带★或带三角▲的要求添加进来。
|
||||
#
|
||||
# ### 示例输入如下:
|
||||
# {{
|
||||
# "商务要求": [
|
||||
# "考虑设备兼容性、项目实施、交付及售后服务",
|
||||
# "★交货期(工期):合同签订之日起 15个日历天内完成,并通过项目验收。",
|
||||
# "▲本项目报价须为固定总价,包含但不限于:采购、实施、调试、试运行、验收、运维等所有完成本项目相关的一切费用。"
|
||||
# ]
|
||||
# }}
|
||||
# ### 对应的输出如下:
|
||||
# {{
|
||||
# "商务要求带星": [
|
||||
# "★交货期(工期):合同签订之日起 15个日历天内完成,并通过项目验收。",
|
||||
# "▲本项目报价须为固定总价,包含但不限于:采购、实施、调试、试运行、验收、运维等所有完成本项目相关的一切费用。"
|
||||
# ]
|
||||
# }}
|
||||
#
|
||||
# 文本内容:{full_text}
|
||||
# """
|
||||
# user_query2 = prompt_template2.format(full_text=model_res1)
|
||||
# model_res2 = doubao_model(user_query2)
|
||||
# business_star_req_deviation = clean_json_string(model_res2)
|
||||
#
|
||||
# return business_req_deviation, business_star_req_deviation
|
||||
|
||||
extract_business_deviation(data)
|
||||
res=compute_total_score(data)
|
||||
print(res)
|
@ -14,7 +14,6 @@ def extract_pages_tobidders_notice(pdf_path, output_folder, begin_pattern, begin
|
||||
pdf_document = PdfReader(pdf_path)
|
||||
exclusion_pattern = regex.compile(
|
||||
r'文件的构成|文件的组成|须对应|需对应|须按照|需按照|须根据|需根据|文件组成|文件构成|文件的编制|文件编制')
|
||||
|
||||
def run_extraction():
|
||||
start_page = None
|
||||
mid_page = None
|
||||
@ -22,14 +21,15 @@ def extract_pages_tobidders_notice(pdf_path, output_folder, begin_pattern, begin
|
||||
chapter_type = None # 用于存储“章”或“部分”
|
||||
combined_mid_pattern = None
|
||||
end_pattern = None
|
||||
|
||||
catalog_pattern = regex.compile(r'\s*目\s*录\s*$', regex.MULTILINE)
|
||||
for i, page in enumerate(pdf_document.pages):
|
||||
text = page.extract_text() or ""
|
||||
cleaned_text = clean_page_content(text, common_header)
|
||||
|
||||
if mid_page is not None and exclusion_pattern and regex.search(exclusion_pattern, cleaned_text):
|
||||
continue
|
||||
|
||||
if begin_page==0 and catalog_pattern.search(cleaned_text):
|
||||
continue # 如果存在目录,跳过当前页面
|
||||
if start_page is None:
|
||||
match = regex.search(begin_pattern, cleaned_text)
|
||||
if match and i > begin_page:
|
||||
@ -362,7 +362,7 @@ def truncate_pdf_main_engineering(input_path, output_folder, selection, logger,
|
||||
1: 0, # 公告
|
||||
2: 5, # 评标
|
||||
3: 5, # 资格
|
||||
4: 1, # 前附表
|
||||
4: 0, # 前附表
|
||||
5: 0 # 无效标
|
||||
}.get(selection, 0)
|
||||
|
||||
@ -443,7 +443,7 @@ if __name__ == "__main__":
|
||||
logger = get_global_logger("123")
|
||||
start_time = time.time()
|
||||
# input_path = r"C:\Users\Administrator\Desktop\new招标文件\工程标"
|
||||
pdf_path=r"D:\flask_project\flask_app\static\output\output1\f91db70d-8d96-44a5-b840-27d2f1ecbe95\ztbfile.pdf"
|
||||
pdf_path=r"C:\Users\Administrator\Desktop\货物标\zbfiles\唐山市公安交通警察支队机动车查验机构视频存储回放系统竞争性谈判-招标文件正文(1).pdf"
|
||||
|
||||
# pdf_path = r"C:\Users\Administrator\Desktop\招标文件\招标02.pdf"
|
||||
# input_path=r"C:\Users\Administrator\Desktop\招标文件\招标test文件夹\zbtest8.pdf"
|
||||
|
@ -390,7 +390,6 @@ def get_business_requirements(procurement_path, processed_filepath, model_type):
|
||||
|
||||
return final_res
|
||||
|
||||
# TODO:改为先判断,再摘取
|
||||
if __name__ == "__main__":
|
||||
# truncate_file = "C:\\Users\\Administrator\\Desktop\\fsdownload\\e4be098d-b378-4126-9c32-a742b237b3b1\\ztbfile_procurement.docx"
|
||||
# truncate_file = r"C:\Users\Administrator\Desktop\货物标\output1\2-招标文件(广水市教育局封闭管理)_procurement.pdf"
|
||||
|
@ -64,7 +64,6 @@ def combine_basic_info(merged_baseinfo_path, procurement_path,clause_path,invali
|
||||
|
||||
return {"基础信息": aggregated_baseinfo}
|
||||
|
||||
#TODO:招标控制价50000怎么来的
|
||||
if __name__ == "__main__":
|
||||
start_time=time.time()
|
||||
# baseinfo_file_path = "C:\\Users\\Administrator\\Desktop\\货物标\\truncate_all\\ztbfile_merged_baseinfo\\ztbfile_merged_baseinfo_3-31.pdf"
|
||||
|
@ -16,9 +16,12 @@ def extract_pages_generic(pdf_document, begin_pattern, end_pattern, begin_page,
|
||||
text = page.extract_text() or ""
|
||||
cleaned_text = clean_page_content(text, common_header)
|
||||
if output_suffix == "tobidders_notice":
|
||||
catalog_pattern = regex.compile(r'\s*目\s*录\s*$', regex.MULTILINE)
|
||||
if exclusion_pattern and flag and (start_page is not None) and regex.search(exclusion_pattern, cleaned_text):
|
||||
flag=False
|
||||
continue
|
||||
if begin_page==0 and catalog_pattern.search(cleaned_text):
|
||||
continue # 如果存在目录,跳过当前页面
|
||||
else:
|
||||
#一般投标文件的编制、组成在'投标人须知前附表/正文'中,需要防止begin_pattern匹配到这部分内容,所以在start_page is None的时候使用该exclusion_pattern
|
||||
if exclusion_pattern and flag and (start_page is None) and regex.search(exclusion_pattern, cleaned_text):
|
||||
@ -168,6 +171,7 @@ def extract_pages_tobidders_notice(pdf_path, begin_pattern, begin_page, common_h
|
||||
end_page = None
|
||||
combined_mid_pattern = None # 中间页的组合模式
|
||||
pdf_document = PdfReader(pdf_path)
|
||||
catalog_pattern = regex.compile(r'\s*目\s*录\s*$', regex.MULTILINE)
|
||||
for i, page in enumerate(pdf_document.pages):
|
||||
text = page.extract_text() or ""
|
||||
cleaned_text = clean_page_content(text, common_header)
|
||||
@ -175,6 +179,8 @@ def extract_pages_tobidders_notice(pdf_path, begin_pattern, begin_page, common_h
|
||||
# 如果已经找到中间页,且当前页匹配排除模式,则跳过
|
||||
if exclusion_pattern and regex.search(exclusion_pattern, cleaned_text) and mid_page is not None:
|
||||
continue
|
||||
if begin_page==0 and catalog_pattern.search(cleaned_text):
|
||||
continue # 如果存在目录,跳过当前页面
|
||||
|
||||
# 识别起始页
|
||||
if start_page is None:
|
||||
@ -304,6 +310,7 @@ def extract_pages_twice_tobidders_notice(pdf_document, common_header, begin_page
|
||||
|
||||
exclusion_pattern = regex.compile(r'文件的构成|文件的组成|文件构成|文件组成|文件的编制|文件编制')
|
||||
|
||||
|
||||
# 提取第一部分
|
||||
start_page1, end_page1 = extract_pages_generic(pdf_document, begin_pattern, end_pattern, begin_page, common_header,exclusion_pattern,output_suffix)
|
||||
if start_page1 is None or end_page1 is None:
|
||||
@ -476,7 +483,7 @@ def truncate_pdf_main_goods(input_path, output_folder, selection,logger, output_
|
||||
pdf_path = convert_to_pdf(input_path)
|
||||
common_header, last_begin_index = get_start_and_common_header(input_path, 10)
|
||||
begin_page = last_begin_index if last_begin_index != 0 else {
|
||||
4: 1,
|
||||
4: 0,
|
||||
2: 5,
|
||||
3: 5,
|
||||
1: 0,
|
||||
@ -612,11 +619,11 @@ if __name__ == "__main__":
|
||||
logger = get_global_logger("123")
|
||||
# input_path = r"C:\Users\Administrator\Desktop\new招标文件\货物标"
|
||||
# pdf_path = r"C:\Users\Administrator\Desktop\招标文件-采购类\2024-贵州-贵州医科大学附属医院导视系统零星制作安装项目.pdf"
|
||||
pdf_path=r"D:\flask_project\flask_app\static\output\output1\f91db70d-8d96-44a5-b840-27d2f1ecbe95\ztbfile.pdf"
|
||||
pdf_path=r"D:\flask_project\flask_app\static\output\output1\test\招标文件-第二章-第六章-172404【电能表标准设备172404-1305001-0002】.pdf"
|
||||
# input_path = r"C:\Users\Administrator\Desktop\货物标\zbfiles\2-招标文件(广水市教育局封闭管理).pdf"
|
||||
# pdf_path=r"C:\Users\Administrator\Desktop\文件解析问题\文件解析问题\1414cb9c-7bf4-401c-8761-2acde151b9c2\ztbfile.pdf"
|
||||
output_folder = r"D:\flask_project\flask_app\static\output\output1\f91db70d-8d96-44a5-b840-27d2f1ecbe95\tmp"
|
||||
output_folder = r"D:\flask_project\flask_app\static\output\output1\test"
|
||||
# output_folder = r"C:\Users\Administrator\Desktop\new招标文件\output2"
|
||||
selection = 4 # 例如:1 - 公告, 2 - 评标办法, 3 - 资格审查后缀有qualification1或qualification2(与评标办法一致) 4.投标人须知前附表part1 投标人须知正文part2 5-采购需求
|
||||
selection = 6 # 例如:1 - 公告, 2 - 评标办法, 3 - 资格审查后缀有qualification1或qualification2(与评标办法一致) 4.投标人须知前附表part1 投标人须知正文part2 5-采购需求 6-invalid_path
|
||||
generated_files = truncate_pdf_main_goods(pdf_path, output_folder, selection,logger)
|
||||
# print(generated_files)
|
||||
print(generated_files)
|
||||
|
@ -11,8 +11,6 @@ from flask_app.general.通义千问long import upload_file
|
||||
from flask_app.货物标.商务服务其他要求提取 import get_business_requirements
|
||||
|
||||
|
||||
|
||||
#TODO:目前若截取不到采购需求,默认上传整份procurement_path=invalid_path,再转md格式,后续可以判断,这种可以就转docx,不再转md了
|
||||
def fetch_procurement_reqs(procurement_path, invalid_path):
|
||||
#procurement_path可能是pdf\docx
|
||||
# 定义默认的 procurement_reqs 字典
|
||||
@ -31,7 +29,7 @@ def fetch_procurement_reqs(procurement_path, invalid_path):
|
||||
try:
|
||||
proc_path = os.path.abspath(procurement_path)
|
||||
invalid_path = os.path.abspath(invalid_path)
|
||||
# 判断路径是否一致
|
||||
# 判断路径是否一致,一致表示一开始procurement_path截取为空
|
||||
if proc_path == invalid_path:
|
||||
# 读取 PDF 页码数
|
||||
page_count = get_pdf_page_count(procurement_path)
|
||||
@ -43,11 +41,11 @@ def fetch_procurement_reqs(procurement_path, invalid_path):
|
||||
else:
|
||||
tech_model_type= 1 #doubao
|
||||
busi_model_type =4 #qianwen-plus
|
||||
processed_filepath = convert_file_to_markdown(procurement_path) # 转markdown格式
|
||||
processed_filepath = convert_file_to_markdown(procurement_path,"extract3.txt") # invalid_path->markdown格式
|
||||
else:
|
||||
tech_model_type = 1 #doubao
|
||||
busi_model_type = 4
|
||||
processed_filepath = convert_file_to_markdown(procurement_path) # 转markdown格式
|
||||
processed_filepath = convert_file_to_markdown(procurement_path) # 正常情况:procurement_path->markdown格式
|
||||
# processed_filepath = pdf2txt(procurement_path) # 纯文本提取
|
||||
# 使用 ThreadPoolExecutor 并行处理 get_technical_requirements 和 get_business_requirements
|
||||
with concurrent.futures.ThreadPoolExecutor() as executor:
|
||||
@ -76,9 +74,6 @@ def fetch_procurement_reqs(procurement_path, invalid_path):
|
||||
# 在出错时返回默认的包含空字符串的字典
|
||||
return DEFAULT_PROCUREMENT_REQS.copy()
|
||||
|
||||
|
||||
# TODO:技术要求可以在技术参数之后执行,把完整的技术参数输入,问大模型,除了上述内容还有哪些,这样的话把技术标和其他的区分开。
|
||||
|
||||
if __name__ == "__main__":
|
||||
start_time = time.time()
|
||||
output_folder = "C:\\Users\\Administrator\\Desktop\\货物标\\货物标output"
|
||||
|
Loading…
x
Reference in New Issue
Block a user