| name | data-contract-skill |
| version | 1.1.0 |
| description | 多轮对话交互式填写国家数据局合同模板(支持4种合同类型),自动路由识别合同类型,生成清洁版 .docx 合同 |
国家数据局合同自动填写 Skill
概述
本 Skill 用于通过多轮自然语言对话,逐步收集用户提供的合同信息,填写国家数据局发布的4种示范合同模板,最终生成排版完整的 .docx 成品文件。
支持的合同类型
| 编号 | 合同名称 | 编码 | 占位符数量 | 分组数 |
|---|
| 1 | 数据提供合同 | GF-2025-2615 | 189 | 14 |
| 2 | 数据委托处理服务合同 | GF-2025-2616 | 137 | 13 |
| 3 | 数据融合开发合同 | GF-2025-2617 | 224 | 16 |
| 4 | 数据中介服务合同 | GF-2025-2618 | 156 | 12 |
核心流程
用户发起请求
│
▼
┌─────────────────────────────────────┐
│ 1. 合同类型识别(自动路由) │
│ 规则匹配(关键词 / 合同编号) │
│ 歧义或无匹配时: │
│ → 由你(Skill 模型)语义判别 │
│ → 仍不确定则追问用户 │
└─────────────────────────────────────┘
│
▼
┌─────────────────────────────────────┐
│ 2. 初始化:加载模板配置 │
│ python scripts/init_contract.py │
└─────────────────────────────────────┘
│
▼
┌─────────────────────────────────────┐
│ 3. 多轮对话收集信息 │
│ 按分组优先级逐轮提问 │
│ 智能推断、别名联动 │
│ python scripts/update_state.py │
└─────────────────────────────────────┘
│
▼
┌─────────────────────────────────────┐
│ 4. 生成最终合同 │
│ python scripts/fill_contract.py │
└─────────────────────────────────────┘
第一步:识别合同类型
当用户发起请求时,首先识别合同类型。
规则识别
init_contract.py --intent 会先用关键词 / 合同编号 / 合同全名做规则匹配。
| 合同类型 | 典型关键词示例 |
|---|
| 数据提供合同 | "数据提供"、"卖数据"、"数据交易" |
| 数据委托处理服务合同 | "委托处理"、"数据加工"、"数据清洗"、"数据标注" |
| 数据融合开发合同 | "融合开发"、"多方合作"、"联合开发" |
| 数据中介服务合同 | "中介服务"、"撮合交易"、"交易平台" |
用户也可直接说合同编号(如 GF-2025-2616)或英文编码(weituo)。
语义路由(由你完成)
当规则匹配结果 歧义 或 无匹配 时,init_contract.py 会输出一段 【给 Skill 模型的语义路由提示】。你需要:
- 阅读该提示中的候选类型和用户原始意图
- 基于语义理解,选择最匹配的合同类型编码(
tigong / weituo / ronghe / zhongjie)
- 用
--type 参数重新调用 init_contract.py
- 如果你也无法确定,追问用户具体场景后再决定
追问模板(无法识别时)
我无法确定您需要哪种合同类型。请告诉我您的具体场景:
📋 支持的合同类型:
1. 数据提供合同(GF-2025-2615)— 一方向另一方提供数据
2. 数据委托处理服务合同(GF-2025-2616)— 委托方交给受托方处理数据
3. 数据融合开发合同(GF-2025-2617)— 多方共同参与数据融合开发
4. 数据中介服务合同(GF-2025-2618)— 中介方提供数据交易撮合服务
请描述您的数据交易场景,或直接告诉我需要哪种合同。
第二步:初始化
python <skill_dir>/scripts/init_contract.py --intent "帮我填数据提供合同" --state "./contract_state.json"
python <skill_dir>/scripts/init_contract.py --type tigong --state "./contract_state.json"
类型参数值:tigong / weituo / ronghe / zhongjie
初始化成功后会输出分组概览和占位符总数。请记住这个总数,后续用于进度播报。
第三步:多轮对话收集信息
核心规则(必须严格遵守)
-
所有字段必填
- 每个字段都必须填写,不能留空
- 只有当用户明确说 "暂时不填"、"跳过"、"不需要" 时,才能跳过该字段
- 如果用户没有提供某字段的值,必须追问直到获得答案
- 一个分组内所有字段填完后才进入下一分组
-
复选框字段(以 ☐ 开头的占位符)
- 必须明确填写选中或不选,不能留空
- 选中 → 值设为
"☑" 或 "是"
- 不选 → 值设为
"☐" 或 "否"
- 示例:
{"☐甲方_统一社会信用代码": "☑", "☐甲方_居民身份证": "☐"}
- 禁止写入布尔值
true/false,必须用字符串
-
字段名必须精确匹配模板中的名称
- 字段名含下划线的(如
甲方_证件号码)不能写成 甲方证件号码
- 如果不确定字段名,运行
--show 查看标准字段名
update_state.py 有模糊匹配提示:写错时会给出建议
-
别名联动
- 填写
甲方名称 会自动联动填充 封面_甲方名称、签署_甲方 等
- 填写
签订年 会自动联动 签署_甲方年、签署_乙方年
-
智能推断
- 用户说 "合同总价50万" → 自动填金额 + 大写 "伍拾万元整"
- 用户给公司名 → 自动推断封面和签署栏
更新状态
python <skill_dir>/scripts/update_state.py --state "./contract_state.json" --field "甲方名称" --value "北京数据科技有限公司"
python <skill_dir>/scripts/update_state.py --state "./contract_state.json" --json '{"甲方名称": "北京数据科技有限公司", "乙方名称": "上海智能技术有限公司"}'
python <skill_dir>/scripts/update_state.py --state "./contract_state.json" --show
对话模板
每轮开始(当前分组有未填字段时):
📋 {合同名称} 填写进度:已填 {filled}/{total} 项({percentage}%)
接下来需要了解 **{当前分组名称}** 的信息:
{分组的ask提示}
请直接用自然语言描述,我会自动提取信息。
每轮结束(分组完成):
✅ 已提取以下信息:
- 甲方名称:北京数据科技有限公司
- 甲方证件类型:统一社会信用代码 ☑
...
📋 当前分组已全部填写完成!还有 {remaining} 项未填写,继续下一部分。
每轮结束(分组未完成,需追问):
✅ 已提取以下信息:
- 甲方名称:北京数据科技有限公司
...
⚠️ 当前分组还有以下字段未填写:
- 甲方_证件号码
- 甲方_注册地址
请继续提供以上信息。
第四步:生成最终合同
python <skill_dir>/scripts/fill_contract.py --state "./contract_state.json" --output "out.docx" --check
python <skill_dir>/scripts/fill_contract.py --state "./contract_state.json" --output "./数据提供合同_成品.docx"
python <skill_dir>/scripts/fill_contract.py --state "./contract_state.json" --output "out.docx" --force
错误处理
| 场景 | 处理方式 |
|---|
update_state 报 "无法识别的字段名" | 根据提示的建议字段名修正后重试 |
init_contract 报 "模板占位符与配置字段不一致" | 说明模板或配置损坏,提示用户重新安装 Skill |
fill_contract 报 "仍有 N 个字段必须填写" | 继续多轮对话收集,不要用 --force 除非用户明确要求 |
用户给了布尔值 true/false 到文本字段 | 追问用户提供实际文本值 |
| 复选框字段为空 | 追问用户选择 "选中" 还是 "不选" |
文件结构
data-contract-skill/
├── SKILL.md # 本文件(AI Agent 使用说明)
├── README.md # 人类用户使用说明
├── contracts/ # 合同配置和模板
│ ├── __init__.py
│ ├── router.py # 合同类型路由器
│ ├── base_config.py # 共享工具(进度/校验/金额转换)
│ ├── tigong/ # 数据提供合同
│ │ ├── config.py # 占位符分组、别名配置
│ │ └── template.docx # DOCX 模板文件
│ ├── weituo/ # 数据委托处理服务合同
│ ├── ronghe/ # 数据融合开发合同
│ └── zhongjie/ # 数据中介服务合同
├── scripts/
│ ├── init_contract.py # 初始化合同状态
│ ├── update_state.py # 更新字段值
│ └── fill_contract.py # 生成最终合同
└── examples/
└── sample_state.json # 示例状态文件
依赖
- Python 3.10+
python-docx:pip install python-docx
示例对话
用户:帮我填一个数据提供合同
AI:
🔍 识别到合同类型:数据提供合同(GF-2025-2615)
✅ 合同初始化完成!
📋 数据提供合同 填写进度:已填 0/189 项(0%)
接下来需要了解 **合同基本信息** :
请提供合同编号、签订日期(年月日)和签署地点(城市、区县)。
用户:合同编号是2025-DATA-001,2025年3月15日在北京市海淀区签
AI:
✅ 已提取以下信息:
- 合同编号:2025-DATA-001
- 签订日期:2025年3月15日
- 签署地点:北京市海淀区
📋 填写进度:已填 6/189 项(3.2%)
接下来需要了解 **甲方信息**:
请提供甲方(接收方)的信息:公司名称、证件类型及号码、注册地址、法定代表人、联系人等。