#### 技术背景:为什么需要分离评分?
在公共资源交易系统中,技术方案评分(主观分)与资质认证评分(客观分)的混合评审一直是行业痛点。传统模式下,评审专家容易产生**晕轮效应**——用一个亮眼的方案印象去抬高或压低本应客观量化的资质得分。
财政部87号令与《政府采购需求管理办法》明确要求:**评审因素应当细化和量化,商务标与技术标需分模块独立设置分值**。但政策落地时,缺乏技术手段支撑。
本文分享一个在opencheck基于Python的技术实现方案。
#### 核心技术架构
**方案一:评分项自动识别引擎**
```python
import re
def extract_scores(text):
"""从招标文件文本中自动识别主观分与客观分项"""
result = {"客观分": 0, "主观分": 0}
# 匹配标准格式
obj_pattern = r'客观分[::]\s*(\d+(?:\.\d+)?)'
subj_pattern = r'主观分[::]\s*(\d+(?:\.\d+)?)'
obj_match = re.search(obj_pattern, text)
subj_match = re.search(subj_pattern, text)
if obj_match:
result["客观分"] = float(obj_match.group(1))
if subj_match:
result["主观分"] = float(subj_match.group(1))
return result
# 使用示例
text = "技术方案评审:客观分:85分,主观分:90分"
scores = extract_scores(text)
print(scores) # {'客观分': 85.0, '主观分': 90.0}
```
**方案二:五维溯源(5D JSON)数据结构**
招标文件解析后,系统生成结构化JSON:
```json
{
"项目基本信息": "杭州文化两中心展馆",
"客观分清单": [
{
"评分项": "资质证书",
"分值": 10,
"核验规则": "ISO9001认证,自动比对证书编号"
},
{
"评分项": "同类业绩",
"分值": 12,
"核验规则": "近3年展馆项目,自动比对合同金额"
},
{
"评分项": "设备授权",
"分值": 20,
"核验规则": "投影设备厂商授权书,自动核验有效期"
}
],
"主观分清单": [
{
"评分项": "项目整体理解",
"分值": 5,
"评审维度": "对展馆主题的理解深度"
},
{
"评分项": "视频创意方案",
"分值": 15,
"评审维度": "叙事脚本、光影设计、创新性"
}
],
"约束条件": {
"杭州非遗综述片": "时长≤60秒",
"整体演示视频": "时长≤15分钟"
}
}
```
#### 实战案例:杭州展馆项目的58分主观分拆解
该项目的技术方案评分包含**11个评审维度**,传统人工核验极易遗漏约束条件:
| 评审维度 | 分值 | 关键约束 | AI自动检测点 |
|---------|-----|---------|-------------|
| 项目整体理解 | 5分 | 无硬性约束 | 主题匹配度分析 |
| 径山茶宴展项分析 | 5分 | 需符合文化内涵 | 历史文献交叉验证 |
| 杭州非遗综述分镜 | 5分 | 视频时长≤60秒 | FFprobe提取时长 |
| 展陈样片整体表现力 | 5分 | 视频清晰度≥1080P | MediaInfo自动核验 |
| 推广传播方案 | 3分 | 需包含渠道策略 | 关键词检索 |
**技术难点:视频约束条件的自动化核验**
```python
import subprocess
import json
def check_video_constraints(video_path):
"""使用ffprobe自动核验视频技术参数"""
cmd = [
'ffprobe', '-v', 'quiet',
'-print_format', 'json',
'-show_format', '-show_streams',
video_path
]
result = subprocess.run(cmd, capture_output=True, text=True)
video_info = json.loads(result.stdout)
duration = float(video_info['format']['duration'])
width = video_info['streams'][0]['width']
height = video_info['streams'][0]['height']
alerts = []
if duration > 60:
alerts.append(f"杭州非遗综述片时长{duration:.1f}秒,超标{duration-60:.1f}秒")
if height < 1080:
alerts.append(f"视频分辨率{width}x{height},低于1080P要求")
return alerts
# 集成到清单引擎
if check_video_constraints("demo_video.mp4"):
print("检测到约束违规,需优化方案")
```
#### 双清单引擎的实现逻辑
```python
class ScoringEngine:
def __init__(self, tender_doc):
self.tender_doc = tender_doc
self.objective_scores = {} # 客观分存储
self.subjective_scores = {} # 主观分存储
def process_objective_items(self, company_data):
"""客观分:自动比对,无人工干预"""
for item in self.tender_doc['客观分清单']:
if item['评分项'] == '资质证书':
score = self.auto_check_certificates(
company_data['certificates'],
item['核验规则']
)
elif item['评分项'] == '同类业绩':
score = self.auto_check_projects(
company_data['past_projects'],
item['核验规则']
)
self.objective_scores[item['评分项']] = score
return sum(self.objective_scores.values())
def process_subjective_items(self, proposal_doc):
"""主观分:AI辅助风险识别"""
for item in self.tender_doc['主观分清单']:
risk_score = self.ai_analyze_risk(
proposal_doc[item['评分项']],
item['评审维度']
)
self.subjective_scores[item['评分项']] = {
'内容': proposal_doc[item['评分项']],
'风险提示': risk_score
}
return self.subjective_scores
```
#### 技术方案对比:人工vs AI引擎
| 维度 | 传统人工评审 | AI清单引擎 |
|-----|------------|-----------|
| 客观分准确率 | 85%(漏项率15%) | 99%+ |
| 主观分风险识别 | 依赖专家经验 | 对标历史废标案例库 |
| 评审时间 | 5-7个工作日 | 分钟级 |
| 合规性 | 易混评,难追溯 | 物理隔离,5D溯源 |
#### 开源方案建议
对于中小型项目,可采用以下技术栈快速搭建:
1. **PDF解析**: PyPDF2 + pdfplumber
2. **规则引擎**: 自定义正则表达式或Drools(Java)
3. **视频核验**: FFmpeg/FFprobe
4. **数据存储**: SQLite(单机) / PostgreSQL(团队协作)
大型项目建议集成NLP模型(CLS分类器)实现评分项的智能分类。
---
http://www.opencheck.com.cn