573 lines
14 KiB
Markdown
573 lines
14 KiB
Markdown
# 规则配置正确设置规范
|
|
|
|
> 适用范围:规则配置详情页、规则 YAML、规则版本保存/发布、历史规则迁移。
|
|
> 核心原则:页面配置必须最终落成可被 DSL 校验和执行引擎直接消费的正式 YAML,不能只维护前端临时字段。
|
|
|
|
## 1. 总体对象关系
|
|
|
|
规则配置只有三类核心对象:
|
|
|
|
| 对象 | 作用 | 由谁引用 | 正确落点 |
|
|
|------|------|----------|----------|
|
|
| 抽取字段 | 从文本中抽取业务值,例如 `合同金额`、`甲方`、`技术指标` | 规则 stage / AI prompt | `extract` |
|
|
| 视觉要素 | 从 OCR/版面视觉中识别签章、签名、骑缝章 | 视觉规则 stage | `visual_elements` |
|
|
| 评查规则 | 判断合同/案卷是否合规 | 执行引擎 | `rules[].rules[].stages` |
|
|
|
|
禁止把视觉要素当普通抽取字段使用。也就是说,不能生成:
|
|
|
|
```yaml
|
|
dependencies:
|
|
- visual.骑缝章
|
|
```
|
|
|
|
也不能生成:
|
|
|
|
```yaml
|
|
stages:
|
|
- id: '1'
|
|
check: required
|
|
field: visual.骑缝章
|
|
```
|
|
|
|
正确做法是先定义视觉要素,再在视觉 stage 中引用。
|
|
|
|
## 2. 抽取字段正确设置
|
|
|
|
抽取字段用于文本抽取,配置在 `extract` 下。
|
|
|
|
```yaml
|
|
extract:
|
|
- group: 基础信息
|
|
fields:
|
|
- name: 合同名称
|
|
type: verbatim
|
|
required_from: draft
|
|
desc: 合同标题或合同名称
|
|
- name: 合同金额
|
|
type: money
|
|
required_from: draft
|
|
desc: 合同总金额
|
|
- name: 质量等级
|
|
type: enum
|
|
required_from: draft
|
|
allowed:
|
|
- 合格
|
|
- 优良
|
|
desc: 工程质量等级
|
|
```
|
|
|
|
字段设置规则:
|
|
|
|
| 字段 | 正确口径 |
|
|
|------|----------|
|
|
| `name` | 业务字段名,必须稳定,AI prompt 和规则 stage 都会引用它 |
|
|
| `type` | 字段类型,常见为 `verbatim`、`string`、`money`、`date`、`integer`、`enum` |
|
|
| `required_from` | 只允许 `draft` 或 `executed`,不能写 `-` |
|
|
| `allowed` | 仅 `enum` 必填,用于枚举候选项 |
|
|
| `desc` | 抽取说明,要写清楚正向/负向边界 |
|
|
|
|
抽取字段可以被确定性规则引用:
|
|
|
|
```yaml
|
|
stages:
|
|
- id: '1'
|
|
check: required
|
|
field: 合同名称
|
|
- id: '2'
|
|
check: required
|
|
field: 合同金额
|
|
logic: 1 AND 2
|
|
```
|
|
|
|
抽取字段也可以被 AI 规则引用:
|
|
|
|
```yaml
|
|
stages:
|
|
- id: '1'
|
|
check: ai
|
|
prompt: '请检查合同金额是否明确。
|
|
|
|
合同金额:{{合同金额}}
|
|
|
|
请以 JSON 格式回答:{"passed": true/false, "reason": "简要说明"}
|
|
'
|
|
```
|
|
|
|
## 3. 视觉要素正确设置
|
|
|
|
视觉要素用于签章、签名、骑缝章,不属于文本抽取字段。
|
|
|
|
```yaml
|
|
visual_elements:
|
|
seals:
|
|
- id: 发包人公章
|
|
name: 发包人公章或合同专用章
|
|
required: true
|
|
required_from: executed
|
|
allowed_types:
|
|
- 公章
|
|
- 合同专用章
|
|
expected_text_match:
|
|
field: 发包人名称
|
|
signatures:
|
|
- id: 法定代表人签名
|
|
name: 法定代表人手写签名
|
|
required: true
|
|
required_from: executed
|
|
cross_page_seals:
|
|
- id: 骑缝章
|
|
name: 合同骑缝章
|
|
required: true
|
|
required_from: executed
|
|
```
|
|
|
|
视觉要素字段含义:
|
|
|
|
| 字段 | 正确口径 |
|
|
|------|----------|
|
|
| `id` | 视觉要素稳定编码,建议直接用业务名,例如 `骑缝章`、`发包人公章` |
|
|
| `name` | 页面展示名,可比 `id` 更详细 |
|
|
| `required` | 是否必需,布尔值 |
|
|
| `required_from` | 生效阶段,通常签章/签名/骑缝章为 `executed` |
|
|
| `allowed_types` | 可接受的章类型,例如 `公章`、`合同专用章` |
|
|
| `expected_text_match.field` | 印章文字需要匹配的抽取字段,例如 `发包人名称` |
|
|
|
|
页面交互要求:
|
|
|
|
| 页面字段 | 正确行为 |
|
|
|----------|----------|
|
|
| 视觉要素编码 | 可选;不填时用视觉要素名称作为 `id` |
|
|
| 视觉要素名称 | 必填;业务人员可理解的名称 |
|
|
| 要素类型 | 三选一:`签章`、`签名`、`骑缝章` |
|
|
| 签章类型 | 写入 `allowed_types`,不是 `signature_types` |
|
|
| 签署角色 | 当前兼容写入 `expected_text_match.field` 的第一个值 |
|
|
|
|
禁止默认生成 `visual-时间戳` 作为业务配置。如果历史数据已经存在,可以保留兼容,但新增配置不应再制造这类不可读编码。
|
|
|
|
## 4. 视觉规则正确设置
|
|
|
|
视觉规则必须使用视觉 stage,不使用 `dependencies`。
|
|
|
|
签章存在:
|
|
|
|
```yaml
|
|
stages:
|
|
- id: '1'
|
|
type: seal.present
|
|
seal_id: 发包人公章
|
|
logic: '1'
|
|
```
|
|
|
|
签章文字匹配:
|
|
|
|
```yaml
|
|
stages:
|
|
- id: '1'
|
|
type: seal.text_match
|
|
seal_id: 发包人公章
|
|
logic: '1'
|
|
```
|
|
|
|
签章类型命中:
|
|
|
|
```yaml
|
|
stages:
|
|
- id: '1'
|
|
type: seal.type_in
|
|
seal_id: 发包人公章
|
|
logic: '1'
|
|
```
|
|
|
|
签名存在:
|
|
|
|
```yaml
|
|
stages:
|
|
- id: '1'
|
|
type: signature.present
|
|
signature_id: 法定代表人签名
|
|
logic: '1'
|
|
```
|
|
|
|
骑缝章完整:
|
|
|
|
```yaml
|
|
stages:
|
|
- id: '1'
|
|
type: cross_page_seal.complete
|
|
seal_id: 骑缝章
|
|
logic: '1'
|
|
```
|
|
|
|
## 5. 确定性规则正确设置
|
|
|
|
确定性规则用于非 AI 的固定判断,例如必填、格式、金额一致、数量检查。
|
|
|
|
```yaml
|
|
- rule_id: GC-000
|
|
name: 基础信息完整性
|
|
risk: high
|
|
score: 10
|
|
type: deterministic
|
|
stages:
|
|
- id: '1'
|
|
check: required
|
|
fields:
|
|
- 发包人名称
|
|
- 承包人名称
|
|
- 工程名称
|
|
- 合同金额
|
|
logic: and
|
|
logic: '1'
|
|
messages:
|
|
pass: 基础信息完整
|
|
fail: 缺少发包人/承包人/工程名称/合同金额
|
|
```
|
|
|
|
设置规则:
|
|
|
|
| 项 | 正确口径 |
|
|
|----|----------|
|
|
| `rule_id` | 稳定规则编码,不随版本变化 |
|
|
| `name` | 业务名称 |
|
|
| `risk` | `high`、`medium`、`low` |
|
|
| `score` | 分值,必须有值 |
|
|
| `stages` | 至少一条 |
|
|
| `logic` | 多 stage 时必须表达 stage 组合关系 |
|
|
| `messages` | 建议保留,用于结果展示 |
|
|
|
|
## 6. AI 规则正确设置
|
|
|
|
AI 规则必须配置 `check: ai` 和 prompt。Prompt 中引用的 `{{字段名}}` 必须来自 `extract` 或可解析的子文档字段。
|
|
|
|
```yaml
|
|
- rule_id: JS-TECH-008
|
|
name: 技术标准与质量条款
|
|
risk: medium
|
|
score: 3
|
|
type: ai_rule
|
|
stages:
|
|
- id: '1'
|
|
check: ai
|
|
prompt: '请检查技术合同中技术标准与质量条款的完整性和明确性。
|
|
|
|
技术规范:{{技术标准规范}}
|
|
质量要求:{{质量要求}}
|
|
|
|
请以 JSON 格式回答:{"passed": true/false, "reason": "简要说明"}
|
|
'
|
|
schema:
|
|
type: object
|
|
required:
|
|
- passed
|
|
- reason
|
|
properties:
|
|
passed:
|
|
type: boolean
|
|
reason:
|
|
type: string
|
|
pass_when: passed == True
|
|
logic: '1'
|
|
```
|
|
|
|
AI 规则设置要求:
|
|
|
|
| 项 | 正确口径 |
|
|
|----|----------|
|
|
| `prompt` | 必须包含评查目标、输入字段、判断标准、输出格式 |
|
|
| `{{字段名}}` | 必须能在抽取字段中找到 |
|
|
| `schema` | 建议配置,保证输出可解析 |
|
|
| `pass_when` | 建议配置,避免返回结构无法判定 |
|
|
|
|
## 7. 规则组合正确设置
|
|
|
|
规则组合不直接检查字段,而是组合已有规则结果。
|
|
|
|
```yaml
|
|
- rule_id: GC-GROUP-QUALITY
|
|
name: 质量条款综合评查
|
|
type: rule_group
|
|
risk: high
|
|
score: 20
|
|
rules:
|
|
- GC-QUALITY-001
|
|
- GC-QUALITY-002
|
|
logic: GC-QUALITY-001 AND GC-QUALITY-002
|
|
```
|
|
|
|
规则组合要求:
|
|
|
|
| 项 | 正确口径 |
|
|
|----|----------|
|
|
| `type` | 必须为 `rule_group` |
|
|
| `rules` | 子规则 ID 列表,必须存在 |
|
|
| `logic` | 组合表达式,引用子规则 ID |
|
|
| `stages` | 不应配置 |
|
|
|
|
## 8. 子文档/案卷字段正确设置
|
|
|
|
案卷类规则可能有子文档配置。
|
|
|
|
```yaml
|
|
sub_documents:
|
|
- id: 处罚决定书
|
|
name: 行政处罚决定书
|
|
required: true
|
|
extract:
|
|
- group: 当事人信息
|
|
fields:
|
|
- name: 当事人名称
|
|
type: verbatim
|
|
desc: 被处罚对象名称
|
|
```
|
|
|
|
引用方式:
|
|
|
|
```yaml
|
|
stages:
|
|
- id: '1'
|
|
check: required
|
|
field: 处罚决定书.当事人名称
|
|
```
|
|
|
|
子文档设置要求:
|
|
|
|
| 项 | 正确口径 |
|
|
|----|----------|
|
|
| `id` | 稳定文书编码 |
|
|
| `name` | 文书展示名 |
|
|
| `required` | 是否必需 |
|
|
| `extract.fields` | 子文档内部字段 |
|
|
|
|
## 9. 版本保存与发布正确流程
|
|
|
|
规则编辑必须区分“保存草稿”和“发布生效”。
|
|
|
|
1. 编辑页面内容。
|
|
2. 前端序列化为正式 YAML。
|
|
3. 后端执行 DSL schema 校验。
|
|
4. 点击“保存规则配置”只生成草稿版本。
|
|
5. 点击“发布版本”后才成为当前租户生效版本。
|
|
6. 其他租户不应看到该租户未发布或已发布的私有版本。
|
|
|
|
版本状态口径:
|
|
|
|
| 状态 | 含义 | 是否生效 | 是否可回滚 |
|
|
|------|------|----------|------------|
|
|
| `draft` | 草稿 | 否 | 否 |
|
|
| `validated` | 校验通过但未发布 | 否 | 否 |
|
|
| `published` | 当前生效版本 | 是 | 否,当前版本不能回滚到自己 |
|
|
| `rollback` | 历史回滚版本 | 作为历史候选 | 是 |
|
|
| `deprecated` | 废弃版本 | 否 | 通常否 |
|
|
|
|
## 10. 租户下规则配置正确口径
|
|
|
|
当前采用方案 A:业务树共享,规则版本按租户隔离。
|
|
|
|
| 层级 | 是否共享 | 说明 |
|
|
|------|----------|------|
|
|
| 业务树/规则包分类 | 共享 | 例如合同、案卷、技术合同分类 |
|
|
| 规则 YAML 版本 | 租户隔离 | 梅州、揭阳可以有不同发布版本 |
|
|
| 公共规则模板 | 共享来源 | 新租户可从公共模板复制初始版本 |
|
|
| 角色权限 | 控制谁能看/编辑/发布 | 不决定规则数据归属 |
|
|
|
|
正确行为:
|
|
|
|
- 揭阳编辑并发布 `JS-TECH-032` 的 V10,梅州仍应看到梅州自己的当前版本。
|
|
- 新建租户时,应从公共模板或指定来源物化一份租户规则版本。
|
|
- 规则编辑接口必须带当前用户租户上下文,不能只按 `rule_type` 查全局版本。
|
|
|
|
## 11. 历史旧写法迁移规则
|
|
|
|
### 11.1 `check: visual + element`
|
|
|
|
旧写法:
|
|
|
|
```yaml
|
|
stages:
|
|
- id: '1'
|
|
check: visual
|
|
element: 骑缝章
|
|
```
|
|
|
|
如果 `element` 是 `骑缝章` 或 `cross_page_seal`,迁移为:
|
|
|
|
```yaml
|
|
visual_elements:
|
|
cross_page_seals:
|
|
- id: 骑缝章
|
|
name: 合同骑缝章
|
|
required: true
|
|
required_from: executed
|
|
|
|
stages:
|
|
- id: '1'
|
|
type: cross_page_seal.complete
|
|
seal_id: 骑缝章
|
|
```
|
|
|
|
如果 `element` 是 `seal` 或具体公章名,迁移为:
|
|
|
|
```yaml
|
|
visual_elements:
|
|
seals:
|
|
- id: 发包人公章
|
|
name: 发包人公章
|
|
required: true
|
|
required_from: executed
|
|
|
|
stages:
|
|
- id: '1'
|
|
type: seal.present
|
|
seal_id: 发包人公章
|
|
```
|
|
|
|
如果 `element` 是 `signature` 或具体签名名,迁移为:
|
|
|
|
```yaml
|
|
visual_elements:
|
|
signatures:
|
|
- id: 法定代表人签名
|
|
name: 法定代表人签名
|
|
required: true
|
|
required_from: executed
|
|
|
|
stages:
|
|
- id: '1'
|
|
type: signature.present
|
|
signature_id: 法定代表人签名
|
|
```
|
|
|
|
### 11.2 `dependencies: visual.xxx`
|
|
|
|
旧写法:
|
|
|
|
```yaml
|
|
dependencies:
|
|
- visual.骑缝章
|
|
```
|
|
|
|
迁移原则:
|
|
|
|
- 不再输出 `dependencies`。
|
|
- 根据视觉要素类型生成正式视觉 stage。
|
|
- 如果找不到对应 `visual_elements`,页面应提示先补视觉要素,不能静默保存。
|
|
|
|
### 11.3 `field: visual.xxx`
|
|
|
|
旧写法:
|
|
|
|
```yaml
|
|
stages:
|
|
- id: '1'
|
|
check: required
|
|
field: visual.骑缝章
|
|
```
|
|
|
|
迁移原则:
|
|
|
|
- 删除这个错误 stage。
|
|
- 改成 `cross_page_seal.complete + seal_id`、`seal.present + seal_id` 或 `signature.present + signature_id`。
|
|
|
|
## 12. 页面正确交互设计
|
|
|
|
规则详情页应按当前规则实际引用展示:
|
|
|
|
| 区块 | 展示内容 | 新增行为 |
|
|
|------|----------|----------|
|
|
| 抽取字段 | 当前规则引用的文本字段 | 新增后自动挂到当前规则普通字段依赖 |
|
|
| 子文档 | 当前规则引用的子文档或子文档字段 | 新增后按子文档字段引用 |
|
|
| 视觉要素 | 当前规则引用的签章/签名/骑缝章 | 新增后生成视觉 stage |
|
|
| 当前 YAML 片段 | 正式序列化后的当前规则 YAML | 不显示前端临时 `dependencies` |
|
|
| 版本管理 | 草稿、发布、回滚 | 回滚必须选择非当前、非草稿版本 |
|
|
|
|
新增视觉要素的页面逻辑:
|
|
|
|
1. 用户填写“视觉要素名称”,例如 `骑缝章`。
|
|
2. “视觉要素编码”可不填。
|
|
3. 不填编码时,系统用名称作为 `id`。
|
|
4. 类型选择 `骑缝章` 后,保存当前规则时生成 `cross_page_seal.complete`。
|
|
5. YAML 片段显示正式 stage。
|
|
|
|
## 13. `JS-TECH-032` 正确配置
|
|
|
|
当前旧配置:
|
|
|
|
```yaml
|
|
- rule_id: JS-TECH-032
|
|
name: 骑缝章检查
|
|
risk: medium
|
|
score: 2
|
|
applies_in:
|
|
- executed
|
|
stages:
|
|
- id: '1'
|
|
check: visual
|
|
element: 骑缝章
|
|
logic: '1'
|
|
```
|
|
|
|
正确配置:
|
|
|
|
```yaml
|
|
visual_elements:
|
|
cross_page_seals:
|
|
- id: 骑缝章
|
|
name: 合同骑缝章
|
|
required: true
|
|
required_from: executed
|
|
|
|
rules:
|
|
- group: 默认规则组
|
|
rules:
|
|
- rule_id: JS-TECH-032
|
|
name: 骑缝章检查
|
|
risk: medium
|
|
score: 2
|
|
type: deterministic
|
|
applies_in:
|
|
- executed
|
|
stages:
|
|
- id: '1'
|
|
type: cross_page_seal.complete
|
|
seal_id: 骑缝章
|
|
logic: '1'
|
|
messages:
|
|
pass: 已加盖骑缝章
|
|
fail: 未检测到骑缝章
|
|
```
|
|
|
|
页面上应表现为:
|
|
|
|
- 视觉要素区显示 `骑缝章 / 骑缝章 / executed 必需`。
|
|
- 检查方法显示 `cross_page_seal.complete` 或中文 `骑缝章完整性检查`。
|
|
- YAML 片段显示 `type: cross_page_seal.complete` 和 `seal_id: 骑缝章`。
|
|
- 不再显示 `dependencies: visual.骑缝章`。
|
|
|
|
## 14. 保存前验收清单
|
|
|
|
每次保存规则配置前必须满足:
|
|
|
|
| 检查项 | 验收标准 |
|
|
|--------|----------|
|
|
| YAML schema | `RulesFile.model_validate` 通过 |
|
|
| DSL validator | `validate(rules_file)` 通过 |
|
|
| 字段引用 | 所有 `field / fields / prompt {{}}` 都能找到抽取字段 |
|
|
| 视觉引用 | 所有 `seal_id / signature_id` 都能找到视觉要素 |
|
|
| 规则组合 | 子规则 ID 存在 |
|
|
| 租户边界 | 保存和发布只影响当前租户 |
|
|
| 预览一致 | 页面 YAML 片段与实际保存 YAML 一致 |
|
|
|
|
## 15. 禁止项
|
|
|
|
禁止以下配置继续进入新版本:
|
|
|
|
- `visual-时间戳` 作为新增视觉要素默认编码。
|
|
- `dependencies: visual.xxx`。
|
|
- `check: required + field: visual.xxx`。
|
|
- `required_from: -`。
|
|
- `enum` 字段没有 `allowed`。
|
|
- AI prompt 引用不存在的字段。
|
|
- 规则发布不带租户上下文。
|
|
- 当前版本可以回滚到自己。
|
|
|