中文合同起草 & 公文撰写
先检索法律和模板,再起草合同/公文。不审查法律风险。
⚠️ 免责声明:本 skill 输出仅作参考,不构成法律建议。签署前必须经执业律师审查。
⚡ 30秒速查(用户原话→skill 行为)
| 用户原话(任一触发) | skill 行为 |
|----------------------|------------|
| "起草合同"/"写合同"/"帮我拟个合同"/"拟合同"/"草拟协议"/"弄个租房合同"/"出个租房合同" | 启动 Step 0-5 合同工作流 |
| "写通知"/"出个通知"/"写公文"/"发个函"/"写报告"/"写请示" | 启动 gov-doc 编写阶段(Step 2b) |
| "编辑公文"/"修改通知"/"改一下报告" | 启动 gov-doc 编辑阶段(Step 2b) |
| "审核公文"/"送审稿"/"出送审版本" | 启动 gov-doc 审核阶段(Step 2b) |
| "审合同风险"/"审查采购合同" | ⚠️ 不支持:告知"本 skill 不提供自动化审查",仅返回格式规范文档供人工比对 |
| "更新数据"/"更新数据集"/"刷新数据"/"同步数据" | 执行 bash scripts/download_data.sh 删除旧数据、下载并解压新数据 |
| "合同格式对吗"/"字号字体规范吗"/"格式审查" | 查 references/文件合同格式规范.md 返回格式要点 |
🔴 关键关卡(LLM 必扫,5 条关卡集中化)
| 触发条件 | 关卡类型 | 强制动作 |
|----------|----------|----------|
| 用户需求模糊(无金额/期限/标的/身份信息等) | 🔴 CHECKPOINT | 逐项追问,禁止自行假设 |
| 模板缺少法律强制项 | 🔴 CHECKPOINT | 必须追问到位才能进入 Step 4 |
| 文档类型为 gov-doc | 🔴 CHECKPOINT | 确认工作阶段(编写/编辑/审核,Step 2b)再继续 |
| 涉及未在 31 部法律库覆盖的领域 | 🔴 CHECKPOINT | 提示用户并按行业惯例起草 |
| 合同生成完成 | 🛑 STOP | 提醒用户建议律师审查后才能签署 |
LLM 解析规则:遇到 🔴 CHECKPOINT 必须停下来等待用户输入,禁止跳过;遇到 🛑 STOP 必须最后输出提醒。
📄 格式规范(强制)
🔴 规则:生成任何合同/公文前,必须先用 Read 工具读取 references/文件合同格式规范.md,将其全部内容纳入上下文。所有输出的字体、字号、行距、版面、结构必须严格遵循该文件中的规范。docx_utils.py 已内置这些格式参数,禁止绕过。
🔴 封面页强制规则:合同必须包含封面页,封面页必须单独占一页(封面后插入分页符)。必须使用 docx_utils.py 中的 add_cover_page() 函数生成封面页,禁止手动拼封面。
from scripts.docx_utils import add_cover_page
add_cover_page(
doc,
title_cn='合同中文名称',
title_en='Contract English Name',
contract_no='HT-2026-001',
party_a_label='甲 方(出卖方):',
party_b_label='乙 方(买受方):'
)
📦 安装(自动)
# 1. 确保 cy_data/ 和 cy_templates/ 已放在本目录(预构建的文档/模板向量库)
# 2. 确保 references/文件合同格式规范.md 已存在
# 3. 首次运行任意 Python 脚本时会自动安装依赖(pip install -r requirements.txt)
# 也可以手动运行:
pip install -r requirements.txt
# 4. 首次执行 search.py 时,sentence-transformers 会自动从 HuggingFace 下载
# BAAI/bge-small-zh-v1.5 模型(~200MB)用于把用户查询编码成向量。
# 索引本身已预构建无需重新向量化。模型缓存在 ~/.cache/huggingface/ 后续运行不再下载。
# 5. 如需完整初始化测试,运行:
bash scripts/setup.sh
# 6. 如需更新向量数据(删除旧数据 + 下载新数据 + 解压到根目录),运行:
bash scripts/download_data.sh
🔄 数据更新工作流
当用户说"更新数据"/"更新数据集"/"刷新数据"/"同步数据"时,执行以下步骤:
Step 1: 检查配置
# 确认 scripts/config.json 存在且 token 已配置
cat scripts/config.json
Step 2: 执行更新
bash scripts/download_data.sh
该脚本会:
- 删除旧的
cy_data/和cy_templates/目录 - 从远程下载最新数据压缩包
- 解压到 skill 根目录
- 清理临时文件
Step 3: 验证更新结果
# 检查新数据文件数量
ls cy_data/ | wc -l
ls cy_templates/ | wc -l
🔴 规则:更新完成后,告知用户数据已更新,建议重新测试搜索功能。
📋 工作流
Step 0: 从向量知识库检索
法律检索 — 获取相关法条作为合同依据:
python scripts/search.py law --contract-type {type} --query "押金 违约金 必备条款" --topk 5
模板匹配 — 找到最合适的模板:
python scripts/search.py template --query "用户需求描述" --topk 3
🔴 规则:Step 0 的搜索结果必须纳入上下文。法律条文原文必须逐条审查,选取相关的作为合同条款约束依据。
Step 1: 确定文档类型
合同类型: 租房→rental / 劳务→labor / 采购→procurement / 合作→cooperation / 股权→equity
公文类型: 通知/报告/请示/函 → gov-doc
类型识别决策树(防误判):
| 用户原话关键词 | 判定类型 | 关键依据 | |----------------|----------|----------| | "租房/出租/承租/房东/租客/月租/押金" | rental | 有"租金"或"押金" | | "雇人干活/打零工/个人提供劳务/劳务报酬" | labor | 个人对单位,非劳动关系(无社保/工伤) | | "招聘/劳动合同/入职/试用期/五险一金" | labor 升级 → 用 labor 模板 + 劳动法条款 | 劳动关系:必须含社保/工伤/解除条件 | | "买东西/采购/订购/供货/买卖" | procurement | 有"标的物"或"交货" | | "合伙/合作/共同出资/利润分成" | cooperation | 多人共同出资/经营(无公司形式) | | "股权/股份/转让/代持/投资" | equity | 有"股权"或"转让价款" | | "通知/报告/请示/函/批复" | gov-doc | 公文,进入 Step 2b |
🔴 歧义时必须追问:用户说"雇人干活"时,区分是"个人劳务"(labor)还是"公司招聘"(labor + 劳动法)。禁止自行假设。
从 Step 0 的模板搜索结果中选用最匹配的模板。
Step 2: 检索法律约束
python scripts/search.py law --contract-type {type} --query "必备条款 强制要求" --topk 5
将法条原文纳入上下文,作为合同条款的约束依据。
Step 3: 逐项追问缺失信息
对比模板已有条款和法律强制要求,找出缺失项。每次只问一个问题,法律强制项优先。
提问顺序:
- 法律强制要求但在模板中缺失的条款(押金条款、违约金上限、社保缴纳、租赁物登记)
- 行业常见但用户未提供的条款(保密、争议解决、不可抗力)
- 双方身份信息确认(出租人/承租人/统一社会信用代码/法定代表人/联系方式)
🔴 CHECKPOINT — 未完成法律强制项询问前,禁止进入 Step 4。
Step 4: 依据格式规范生成合同
🔴 前置动作:必须已读取 references/文件合同格式规范.md,所有格式参数以其为准。
from scripts.docx_utils import (
create_formatted_doc, set_page_layout, add_cover_page, add_title, add_body_text,
add_heading_level1, add_heading_level2, add_clause, add_signature_block, save_as
)
doc = create_formatted_doc()
set_page_layout(doc)
# 封面页(必须单独一页)
add_cover_page(
doc,
title_cn='房屋租赁合同',
title_en='House Lease Contract',
contract_no='HT-2026-001',
party_a_label='甲 方(出租方):',
party_b_label='乙 方(承租方):'
)
# 正文标题
add_title(doc, "房屋租赁合同")
# 当事人信息
add_body_text(doc, "甲方(出租方):xxx")
add_body_text(doc, "乙方(承租方):xxx")
# 正文主体 — 格式由 docx_utils 函数自动保证
add_heading_level1(doc, "第一条 租赁物")
add_body_text(doc, "出租人将下列房屋出租给承租人……")
# 文尾区域
add_signature_block(doc, party_a_name="出租人:李四", party_b_name="承租人:张三")
save_as(doc, "输出/房屋租赁合同.docx")
🔴 规则:docx_utils.py 中的函数已内置格式规范参数。禁止绕过这些函数自行设置格式。
Step 5: 输出
- 格式:.docx(必须符合
references/文件合同格式规范.md全部要求) - 文件名使用中文含义名称,禁止拼音或英文
- 输出末尾附上检索到的法律依据列表
- 🛑 强制追加:"⚠️ 建议聘请执业律师审查本合同后再签署"
Step 2b: 公文三阶段工作流(如文档类型为 gov-doc)
编写阶段(起草新版):
- 严格按
references/文件合同格式规范.md的公文规范(GB/T 9704-2012)生成 - 确认:发文机关、发文字号、标题、主送机关
- 正文 3 号仿宋体首行缩进 2 字;版头(红色发文机关标志)+ 主体 + 版记完整
- 结构层次:一、(黑体)→(一)(楷体)→ 1.(仿宋)→(1)(仿宋)
- 在版记下方添加起草说明
编辑阶段(修改已有草稿):
- 加载已有公文草稿,使用 Word 修订模式
- 新增内容:红色字体 + 下划线;删除内容:红色字体 + 删除线
- 存疑处加批注:
[编辑注:] - 每处修改标注修改人缩写 + 日期
审核阶段(生成送审稿):
- 在正文前插入审核签批表(起草/审核/会签/审批四栏)
- 正文采用标准公文版式 + 正文前标注审核提示
- 输出为送审稿 .docx
📋 完整示例:起草北京租房合同
用户: "帮我起草一份北京朝阳区的租房合同,租客张三,房东李四,月租 5000 元,押一付三,租期 1 年"
Step 0 — 法律检索:
python scripts/search.py law --contract-type rental --query "押金 违约金 维修 转租" --topk 3
返回:《民法典》第 703-728 条(合同编房屋租赁章)、第 711-721 条等
Step 1 — 类型:rental → 选 Step 0 返回的最相关租赁模板
Step 2 — 法律再检:
python scripts/search.py law --contract-type rental --query "必备条款 强制要求" --topk 5
Step 3 — 按优先级追问(每次只问一个):
- 🔴 "房产证编号是多少?"(法律强制)
- 🔴 "出租用途是住宅还是商用?"(影响条款)
- "押一付三之外还有物业/取暖/网费吗?"
- "张三身份证号?" / "李四身份证号?"
Step 4 — 依据格式规范填充:
from scripts.docx_utils import (
create_formatted_doc, set_page_layout, add_cover_page, add_title, add_contract_info,
add_body_text, add_heading_level1, add_clause, add_signature_block, save_as
)
doc = create_formatted_doc()
set_page_layout(doc)
# 封面页(必须单独一页)
add_cover_page(
doc,
title_cn='房屋租赁合同',
title_en='House Lease Contract',
contract_no='HT-2026-001',
party_a_label='甲 方(出租方):',
party_b_label='乙 方(承租方):'
)
add_title(doc, "房屋租赁合同")
add_contract_info(doc, contract_no="HT-2026-001", date="2026-07-01", party_a="出租人:李四", party_b="承租人:张三")
add_heading_level1(doc, "第一条 租赁物")
add_body_text(doc, "出租人李四将位于北京朝阳区XX路XX号的房屋出租给承租人张三。")
add_clause(doc, "押金条款:押一付三,押金 5000 元,合同终止无违约 7 日内退还。")
add_clause(doc, "法律依据:《中华人民共和国民法典》第七百零三条至第七百二十八条。")
add_signature_block(doc, party_a_name="出租人:李四", party_b_name="承租人:张三")
save_as(doc, "输出/租房合同_北京朝阳_张三李四.docx")
Step 5 — 输出:
✅ 已生成 租房合同_北京朝阳_张三李四.docx
🔴 关键条款:押金 5000 元 / 押一付三 / 提前 30 日通知解约
📚 法律依据:《民法典》第 703-728 条、第 711-721 条
🛑 建议聘请执业律师审查本合同后再签署
🛠 失败模式
HL-2 三段式:所有失败分支按"触发条件 / 一线修复 / 仍失败兜底"编码,禁止只在文末写"如有问题请联系管理员"。
| 场景 | 触发条件 | 一线修复 | 仍失败兜底 |
|------|----------|----------|------------|
| 向量库缺失 | search 报 FileNotFoundError: cy_data | 确认 cy_data/ 和 cy_templates/ 已放在本目录 | 列出 references/*.docx 法律清单让用户手动指定条款 |
| 搜索无结果 | search 返回 0 条 | 换关键词或去掉 --contract-type 过滤重试 | 列出 templates/98-商业合同/ 和 99-劳动合同/ 子目录让用户手动选模板 |
| 模型下载慢/超时 | 首次搜索超时 | 设置 HF_ENDPOINT=https://hf-mirror.com(默认已设) | 提示用户手动运行 bash scripts/setup.sh 重试 |
| 格式规范缺失 | references/文件合同格式规范.md 不存在 | 提示用户从 Gitee 仓库下载 | 用 docx_utils.py 内置默认格式参数(兜底) |
| 公文类型识别歧义 | 同时匹配"通知"/"请示" | 列出候选让用户选 | 默认按"请示"处理(更正式)+ 标注"⚠️ 类型识别不确定" |
| add_body_text 抛异常 | 段落超长或特殊字符 | 拆分为多次调用 | 用 add_clause 替代 + 标注"[转 add_clause]" |
| 模板路径不存在 | FileNotFoundError: templates/... | 运行 bash scripts/setup.sh 重新拉取模板 | 列出 templates/ 实际存在的子目录让用户手动指定 |
| 用户中途退出 | Step 3 追问阶段用户停止回复 | 保留已问/已答进度到临时文件 tmp/progress.json | 下次启动时读取 tmp/progress.json 恢复(如果 24h 内) |
| 生成的 .docx 损坏/打不开 | Word 提示"文件已损坏" | 检查 docx_utils.py 版本(git log scripts/docx_utils.py)+ 重装 | 用 LibreOffice 验证转 PDF 看错误码,列出 5 个常见 docx 损坏原因让用户自查 |
| 封面页生成失败 | add_cover_page() 抛 AttributeError 或 KeyError | 确认 docx_utils.py 版本 >= R12(含 add_cover_page 函数) | 跳过封面页直接生成正文,在文末追加 ⚠️ 封面页生成异常,请手动添加 |
| 当事人信息不完整 | Step 3 追问后用户只提供了姓名未提供身份证号/统一信用代码 | 追问时明确说明"请提供身份证号(个人)或统一社会信用代码(单位)" | 在生成的 .docx 末尾追加 [待补:当事人身份信息(身份证号/统一社会信用代码)] 黄色高亮占位符 |
| 依赖未安装 | 运行报 ModuleNotFoundError | 自动安装已内置在脚本顶部,重试即可 | 手动运行 pip install -r requirements.txt |
| 数据下载失败 | download_data.sh 报 curl 错误或 token 无效 | 检查 scripts/config.json 中 token 是否正确;检查网络连接 | 提示用户手动从 Gitee 仓库下载数据并解压到根目录 |
🚫 禁止事项
| # | 禁止行为 | 替代做法 |
|---|----------|----------|
| 1 | 修改模板样式/布局 | 只用 replace_text / append_clause |
| 2 | 拼音或英文命名 .docx | 劳动合同_张三.docx |
| 3 | 主动审查合同风险 | 识别"审查"意图时告知不支持 |
| 4 | 跳过 Step 0 检索直接生成 | 必须先搜索法律和模板 |
| 5 | 未追问自行假设法律强制项 | 逐项追问 |
| 6 | 覆盖用户同名文件 | 先提示确认或换名 |
| 7 | 合同正文插 emoji | 禁止 |
| 8 | 口语写入合同正文 | 转换为规范法律用语 |
| 9 | 数字中英文混排 | 阿拉伯数字,金额大写另起 |
| 10 | 绕过 docx_utils.py 格式函数自行设置格式 | 必须使用格式化函数 |
| 11 | 不读 references/文件合同格式规范.md 就生成 | Step 4 前必须读取 |
| 12 | 手动拼封面页 | 必须使用 add_cover_page() 函数 |
| 13 | 封面页与正文混在同一页 | 封面后必须插入分页符 |
✅ 验证清单
- [ ] Step 0:已检索法律条款并纳入上下文
- [ ] Step 0:已匹配模板
- [ ] 已逐项追问所有法律强制缺失项
- [ ] 已读取
references/文件合同格式规范.md并纳入上下文 - [ ] 封面页已使用
add_cover_page()生成,且单独占一页 - [ ] 合同已生成并保存为 .docx,格式符合规范
- [ ] 已附法律依据来源
- [ ] 🛑 已追加"建议律师审查"提醒
Scan to join WeChat group