文章摘要

招标文件通常同时包含资格条件、技术参数、评分办法、商务条款、合同模板和附件表格。如果简单按固定字数切分,容易把评分条件拆散、把表格表头与数据分离,并导致模型找到了条款却无法判断完整约束。本文给出一套适用于招投标知识库的层级分块方案,包括文档结构识别、章节父子块、评分项原子块、参数表重建、元数据设计和混合检索流程。

一、为什么普通固定分块不适合招标文件

最常见的RAG分块方式是:

每800个字符切一块
重叠100个字符

这种方法适合普通文章,却很容易破坏招标文件结构。

例如评分规则:

3.2 技术方案评分,共20分
(1)整体架构完整,得5分;
(2)实施计划合理,得5分;
(3)安全设计完善,得5分;
(4)售后服务清晰,得5分。
注:缺少任意一项,该项不得分。

如果被切成两个Chunk,模型可能只召回前半部分,漏掉“缺少任意一项不得分”。

招标文件的核心问题不是文本长度,而是:

一个可以独立理解、独立引用、独立响应的业务语义单元有多大。

二、先识别招标文件的六类内容

建议先进行文档分类:

资格与合规条件
采购需求和项目背景
技术参数与功能要求
评分办法
商务与报价条款
合同、附件和响应表格

不同内容应采用不同分块策略。

内容类型 分块重点
资格条件 每个条件独立成块,保留否决属性
技术要求 按功能或参数项拆分
评分办法 按评分项和得分规则拆分
商务条款 保留付款、交付、保证金等完整约束
合同条款 按条款号拆分,并保留父章节
参数表 表头、行号、参数值和备注必须绑定

三、第一步:保留文档层级结构

解析后不要只保存纯文本,应保留:

文档
→ 章
→ 节
→ 条款
→ 子条款
→ 表格行

推荐结构:

{
  "document_id": "BID-2026-018",
  "chapter": "第三章 采购需求",
  "section": "3.2 技术要求",
  "clause_no": "3.2.6",
  "title": "批次效期管理",
  "content": "系统应支持批次、生产日期和有效期管理……",
  "page_start": 42,
  "page_end": 42
}

层级信息既用于检索,也用于回答时显示来源。

四、使用父子分块,而不是只保留小块

子块

用于精准检索,例如一个评分点或一个参数项。

父块

用于向模型提供完整上下文,例如整个评分章节。

检索流程:

用户问题
→ 检索子块
→ 找到对应父块
→ 将子块和必要父块一起送入模型

示例:

{
  "child_id": "CHILD-102",
  "parent_id": "PARENT-18",
  "content": "实施计划完整、进度合理,得5分。"
}

父块:

项目实施方案评分共15分,包括项目组织、实施计划和风险控制。

这样既提高召回精度,也避免失去评分项的整体背景。

五、资格条件必须标记“否决项”

招标文件中常见:

未提供营业执照复印件,投标无效。

这不是普通说明,而是硬性否决条件。

元数据应包含:

{
  "content_type": "QUALIFICATION",
  "mandatory": true,
  "veto": true,
  "required_material": "营业执照复印件",
  "response_action": "上传证明文件"
}

检索时,否决项应该获得更高优先级。

响应生成时,系统不能只生成文字,还要检查附件是否已经存在。

六、评分项应拆成“评分原子块”

评分原子块至少包含:

评分项名称
分值
评分条件
分档规则
扣分条件
需要的证据
来源页码

示例:

{
  "score_item_id": "SCORE-TECH-03",
  "name": "项目实施方案",
  "max_score": 5,
  "rules": [
    {
      "condition": "方案完整、进度合理、职责清晰",
      "score": 5
    },
    {
      "condition": "内容基本完整,但职责不够清晰",
      "score": 3
    },
    {
      "condition": "未提供",
      "score": 0
    }
  ],
  "required_evidence": [
    "实施计划",
    "项目组织图",
    "里程碑"
  ]
}

后续Agent可以按每个评分原子块生成响应,而不是一次生成整本投标文件。

七、技术参数表不能直接转成无结构文本

参数表如果被解析成:

支持 是 支持 不支持 备注

几乎无法使用。

应转换成每行独立对象:

{
  "table_id": "T-3-2",
  "row_no": "18",
  "category": "仓储管理",
  "parameter": "批次效期管理",
  "requirement": "支持批次、生产日期、有效期及预警",
  "mandatory": true,
  "deviation_allowed": false,
  "remark": "需提供系统截图"
}

同时保留表头和原始页码。

跨页表格

招标PDF中的表格经常跨页,第二页没有完整表头。

解析时需要:

识别同一表格
→ 继承上一页表头
→ 合并跨页行
→ 保留原页码范围

否则第二页数据会失去字段含义。

八、推荐的分块尺寸

不存在所有文件通用的固定数值,但可以使用以下起点:

块类型 建议大小
普通背景段落 500—1000中文字符
单个资格条件 完整条件,不强制长度
单个评分项 一个评分项及全部分档
单个技术参数 一行或一组强关联参数
合同条款 一个完整条款号
父章节 1500—4000字符,用于上下文扩展

重叠不应机械固定为100字符。

更推荐按结构重叠:

子块携带章节标题
子条款携带上级条款摘要
表格行携带表头
评分项携带评分章节总说明

九、元数据决定检索质量上限

建议至少存储:

document_id
document_version
tender_name
buyer
content_type
chapter
section
clause_no
page_start
page_end
mandatory
veto
score_value
industry
publish_date
deadline
confidentiality_level

查询“所有废标条件”时,不能只依赖向量相似度,应直接过滤:

veto = true

查询“技术评分20分中有哪些评分项”时,应过滤:

content_type = SCORE

十、混合检索比纯向量检索更适合招投标

招标文件中有大量精确术语:

3.2.6
ISO 27001
等保三级
API接口
履约保证金
5个工作日

纯向量检索可能忽略精确编号。

推荐组合:

BM25关键词检索
+向量语义检索
+元数据过滤
+Reranker

示例权重:

关键词分数 40%
向量分数 40%
结构和元数据分数 20%

实际权重应通过测试集调整。

十一、查询改写应该保留硬条件

用户问:

找出所有需要原厂授权并且属于废标项的条款。

改写后不能只剩:

原厂授权要求

应生成结构化查询:

{
  "keywords": ["原厂授权", "制造商授权"],
  "filters": {
    "veto": true,
    "mandatory": true
  },
  "content_types": ["QUALIFICATION", "TECHNICAL"]
}

十二、一个简单的分块数据模型

from pydantic import BaseModel, Field
from typing import Literal


class TenderChunk(BaseModel):
    chunk_id: str
    document_id: str
    parent_id: str | None = None
    content_type: Literal[
        "BACKGROUND",
        "QUALIFICATION",
        "TECHNICAL",
        "SCORE",
        "COMMERCIAL",
        "CONTRACT",
        "TABLE_ROW"
    ]
    chapter: str | None = None
    clause_no: str | None = None
    content: str = Field(min_length=1)
    page_start: int
    page_end: int
    mandatory: bool = False
    veto: bool = False
    score_value: float | None = None
    metadata: dict = Field(default_factory=dict)

十三、分块后必须做质量检查

自动检查:

空Chunk
过短Chunk
超长Chunk
缺少页码
缺少章节
表格行没有表头
评分项没有分值
否决项未标记
重复Chunk
跨页内容断裂

人工抽检重点:

  • 评分章节;
  • 参数表;
  • 废标条款;
  • 付款条款;
  • 交付和验收;
  • 合同违约责任。

十四、如何建立测试集

建议准备真实问题:

本项目最高限价是多少?
有哪些废标条件?
技术方案评分包含哪些小项?
哪些参数必须提供截图?
付款比例和付款节点是什么?
项目要求多久完成?
是否必须提供原厂授权?

每个问题记录:

正确条款
正确页码
正确答案
是否需要多块组合

评测指标:

Recall@K
评分项召回率
否决条款漏召回率
页码准确率
回答忠实度

其中否决条款漏召回率应作为高风险指标单独统计。

十五、推荐的完整处理链路

PDF或Word
→ 版面解析
→ 标题与条款识别
→ 表格重建
→ 内容类型分类
→ 层级父子分块
→ 元数据提取
→ 向量化与关键词索引
→ 质量检查
→ 人工抽检
→ 上线检索

总结

招投标RAG不能把整个文件当成普通文章处理。

正确分块的核心是:

按业务结构切分
而不是按字符数切分

评分项、否决条款、参数表和合同条款都应采用独立策略,并通过父子块、元数据过滤和混合检索保留完整语义。

延伸阅读

如果你正在关注企业级 AI 应用、Agent、RAG、MCP 与大模型工程化落地,欢迎访问 智元界

https://www.zyentor.com/

智元界将持续分享可运行的技术实战、架构设计、问题排查与企业应用案例。