背景与问题
在工程项目前期,投资估算决定了项目能否获批以及后续预算控制。传统审核方式依赖审核人员逐项阅读估算书、核对工程量清单、对比历史指标,往往面临以下问题:
- 信息分散:投资估算文档动辄上百页,包含总估算表、综合概算表、其他费用表等,人工检索关键参数耗时巨大。
- 标准依赖经验:指标合理性(如单位建筑面积造价、设备费占比)需要对照地方定额和历史数据,新手审核员难以把握。
- 异常难以发现:人工易忽略某些分项费用异常偏高或偏低,或是与相似项目对比时的显着偏离。
随着 AI 技术发展,我们可以利用自然语言处理(NLP)自动抽取估算关键要素,利用机器学习算法对历史项目数据进行建模,自动标记异常,从而辅助审核人员快速聚焦重点。
方案设计
本文设计的辅助审核系统分为四个模块:
- 数据接入层:支持上传 PDF/Excel 估算文件,存储到阿里云 OSS。
- AI 分析层:
- 使用 NLP 模型抽取估算书中的关键字段,如工程费用、设备购置费、安装费、基本预备费、建设期贷款利息等。
- 使用机器学习模型(如孤立森林、回归预测)对提取的指标进行异常检测。
- 规则引擎层:应用国家和行业强制性规则,如费用组成是否完整、比例是否在允许范围,结合 AI 结果生成审核意见。
- 应用展示层:供审核人员查看风险轨迹、异常高亮、对比图表,并支持人工最终判定。
整体架构可运行在阿里云容器服务或函数计算上,数据库采用云数据库 RDS,对象存储使用 OSS。AI 模型可依托 PAI 平台进行训练和离线推理,也可通过 API 方式调用。
实现步骤
1. 数据预处理
原始估算文件多为非结构化文本或表格。第一步是将 PDF/Excel 解析为结构化 DataFrame。对于中文文档,可以使用 pdfplumber 或 openpyxl 提取表格;对于扫描件,需先 OCR 再解析。这里为了聚焦核心流程,我们假设已经提取出关键字段。
2. 关键字段抽取
可以用正则表达式或基于词典的命名实体识别来抽取“工程项目名称”、“总造价”、“建筑面积”等。更优做法是调用阿里云自然语言处理模型,但考虑到代码可运行性,我们演示一个基于规则的抽取函数。
3. 异常检测
基于历史项目数据构建特征空间,例如:建筑面积、层数、结构类型、总造价、单位面积造价、安装费占比。使用孤立森林模型识别异常样本。孤立森林适合高维且异常样本较少的场景,在投资估算审核中非常合适。
4. 规则校验
将AI检测结果与硬性规则(如预备费比例不得低于5%)结合,生成最终审核结论。
代码示例
下面是一个简化的可运行示例,演示如何基于历史项目数据训练异常检测模型,并对新项目进行风险评分。
import pandas as pd
import numpy as np
from sklearn.ensemble import IsolationForest
# 构造历史项目数据:area(建筑面积), total_cost(总造价), unit_cost(单位面积造价)
history_data = {
"area": [12000, 25000, 8000, 46000, 31000, 15000, 22000, 40000, 18000, 28000],
"total_cost": [3600, 9000, 2800, 21000, 13000, 5000, 7600, 16800, 5400, 11900],
"unit_cost": [0.3, 0.36, 0.35, 0.46, 0.42, 0.33, 0.35, 0.42, 0.3, 0.43],
}
df = pd.DataFrame(history_data)
# 训练孤立森林模型,contamination 指定异常比例
def train_model(df):
model = IsolationForest(
contamination=0.1,
random_state=42,
n_estimators=100
)
model.fit(df[["area", "total_cost", "unit_cost"]])
return model
model = train_model(df)
# 新项目估算数据
new_project = pd.DataFrame({
"area": [20000],
"total_cost": [5000],
"unit_cost": [0.25] # 明显低于历史平均,可能异常
})
# 预测:-1 表示异常,1 表示正常
pred = model.predict(new_project)
# 获取异常分数(越小越异常)
score = model.score_samples(new_project)
print("预测结果(1正常,-1异常):", pred[0])
print("异常分数:", round(score[0], 4))
# 简单规则校验:预备费比例应在 5%-15%,若缺失则标记审核
new_project["preparation_rate"] = 0.03 # 模拟提取值
if not (0.05 <= new_project["preparation_rate"][0] <= 0.15):
print("规则警告:基本预备费比例不满足要求")
if pred[0] == -1:
print("AI 提示:该项目投资估算疑似异常,建议人工复核")
else:
print("AI 提示:该项目投资估算无明显异常")
代码说明:
- 首先构造一个包含三个特征的历史数据样本,实际项目中特征可以扩充到几十个。
IsolationForest是无监督模型,不需要标注数据,适合在建库初期没有“是否异常”历史标签的场景。score_samples返回样本的异常分数,分数越低表示越有可能异常。审核人员可以设置一个阈值,并将异常样本推送到前台。- 规则引擎部分用
preparation_rate演示硬校验,实际可以写在配置表中,避免硬编码。
将上述代码封装为一个函数,部署在阿里云函数计算中,便可以利用 API 网关将审核系统前端与模型服务打通。模型文件可存储在 OSS,每次调用时加载最新版本。
注意事项
- 数据质量:历史项目数据是训练模型的基础,需要经过清洗去除异常记录,否则模型会学到错误模式。
- 模型可解释性:投资审核需要明确的依据。孤立森林只能告诉“异常”,不能告诉“为什么”。因此系统必须配合规则引擎,输出可追溯的理由,如“单位面积造价低于历史25分位数”。
- 人机协同:AI 只能做“辅助”,最终审核意见必须由具有执业资格的工程师确认。系统应设计为“建议+预警”,而不是自动放行或否决。
- 安全合规:投资估算属于敏感数据,在云上需要启用 VPC 隔离、加密存储和访问审计。推荐使用阿里云 KMS 管理密钥,并限制模型服务的白名单访问。
- 持续迭代:定期用新审核完成的项目更新训练集,重新训练模型,使系统适应政策变化和市场价格波动。
总结
投资估算 AI 辅助审核系统能够显著减少基础性、重复性工作,使审核人员专注于复杂判断。本文提供了一种结合机器学习异常检测和规则引擎的实现路径,并给出了可运行的代码样例。通过阿里云平台将模型服务化,可以快速构建一个稳定的辅助审核应用。未来可以引入更细粒度的 NLP 模型,直接阅读估算正文并抽取逻辑关系,进一步提升自动化水平。