
大家好,我是人月聊IT。今天分享一个对业务系统进行逆向工程和蒸馏的规范参考手册。即把已有业务系统蒸馏为"AI 可理解、可调用的领域能力中心"
本手册是一份可分享的标准与参考。任何人按本手册的流程、目录结构、文件模板与验收方法,都能对一个业务系统产出一套规范一致的蒸馏文档。文末附有完整的参考案例(合同管理系统)与使用方法。
把一个面向人使用的业务系统,逆向蒸馏为一个面向 AI 的"领域能力提供中心":
业务系统已有的部分或全部资料:
不要求四类资料齐全。多数项目只有其中两三类,手册流程对"资料不全"是兼容的。
一套结构化 Markdown 文档(即 distilled/ 目录),分三层:
这六条是蒸馏成败的关键,贯穿全流程。模板和流程都是为落实这六条服务的。
产出物不是"一份大文档",而是分层的:
反例:把需求、Schema、API 全塞进一个上万行文件 → 塞不进上下文,AI 反而更糊涂。
insertOrderItem、updateStatus…… AI 要自己编排多步、极易违反业务时序。蒸馏时从"原始需求里的业务动作"出发定义这层 API,源代码是实现参考,不是 API 设计标准。
【服务端强制】:违反会被接口拒绝。AI 只需知道,用于预判并向用户解释。【调用方需预判】:服务端不拦截,AI 调用前需自行判断或与用户确认。不区分 → AI 要么过度兜底(多此一举),要么以为服务端会拦却没拦。
资料常互相矛盾(文档过期、代码才是真相):
model-code-conflicts.md),不要悄悄选一个——这往往是宝贵的业务债清单。蒸馏完成后必须验证:准备一组真实业务问答/操作测试集,让 AI 仅凭蒸馏文档去回答/操作,核对是否正确。把它当作蒸馏质量的回归测试。
开始前,先填一张"资料盘点表",明确手上有什么、以谁为准。
资料类型 | 是否具备 | 位置/路径 | 可信度 | 用途 |
|---|---|---|---|---|
原始需求文档 | 是/否 | 中 | 业务意图、术语、功能范围 | |
数据库 Schema | 是/否 | 高 | 数据结构、约束、枚举 | |
数据库实例数据 | 是/否 | 高 | 主数据、真实取值、种子数据 | |
本体 / 领域模型 | 是/否 | 中 | 对象关系、约束声明、状态机 | |
源代码(服务层) | 是/否 | 最高 | 实际业务规则、API 行为 | |
源代码(接口层/路由) | 是/否 | 最高 | API 清单、入参出参、鉴权 |
实际行为 / 规则细节: 源代码 > 数据库约束 > 本体 > 需求文档
业务意图 / 概念含义: 需求文档 > 本体 > 源代码注释
任何"本体/需求说 A,代码做 B"的差异,都记入
reference/model-code-conflicts.md,并在相关对象/接口文档中以 ⚠️ 标注。

每个阶段有明确产出与检查点。建议顺序执行,但 S3–S5 可迭代往返。
00-overview.md 初稿、domain/_index.md、各 domain/<对象>.md 初稿。【服务端强制】 / 【调用方需预判】 标签。reference/model-code-conflicts.md。api/_index.md、各 api/<域>/<用例>.md。reference/schema/*.md、reference/enums.md、reference/error-codes.md。[[slug]] 把对象↔接口↔Schema 串起来。api/_index.md 写"自然语言意图 → 接口序列"的典型编排。api/_index.md、README.md、requirements/_index.md。distilled/ 推导调用,再真打到接口验证。S0 盘点 → S1 对象 → S2 规则 → S3 API → S4 明细 → S5 编排 → S6 验证
▲__________________________________|
(发现缺口则迭代)
distilled/
├── README.md 入口:阅读顺序、加载策略、目录导航、写权限提醒
├── 00-overview.md 系统全景 + 给 AI 的关键约定
├── 01-glossary.md 业务术语表(全局共享语义)
│
├── domain/ 【语义层】领域对象——建议给 AI 常驻加载
│ ├── _index.md 对象关系总览(文字版关系图)
│ ├── <对象A>.md 一个核心业务对象一个文件
│ └── <对象B>.md
│
├── api/ 【能力层】业务用例级接口
│ ├── _index.md 能力清单 + 典型编排
│ ├── <域1>/ 按业务域分子目录
│ │ ├── <用例1>.md 一个用例级接口一个文件
│ │ └── <用例2>.md
│ └── <域2>/
│
├── reference/ 【明细层】按需检索,不常驻上下文
│ ├── schema/ 字段级数据库 Schema
│ │ └── <表>.md
│ ├── enums.md 全部枚举/字典值
│ ├── error-codes.md 错误码与统一响应
│ └── model-code-conflicts.md ⚠️ 本体/需求 与 代码 的差异清单
│
└── requirements/
└── _index.md 原始业务需求(蒸馏来源,保留可追溯)
命名约定
create-contract.md)。contract.md)。create-contract.md、query-contracts.md)。以下每个模板都可直接复制填写。
<尖括号>为占位符。模板后附"填写说明"。
README.md(入口)# <系统名> · 蒸馏文档(AI 能力说明书)
本目录把<系统名>蒸馏为一套 AI 可理解、可调用的领域能力说明。
AI 仅通过 API 操作业务,**不直接访问数据库**。
## 阅读顺序 / 加载策略
**语义层(建议常驻加载给 AI):**
1. 00-overview.md — 系统全景与给 AI 的约定
2. 01-glossary.md — 业务术语
3. domain/ — 领域对象
4. api/_index.md — API 能力清单与典型编排
**明细层(按需检索):**
- api/ — 各业务用例接口详情
- reference/schema/ — 字段级 Schema
- reference/enums.md / error-codes.md
- reference/model-code-conflicts.md — ⚠️ 重要:模型与代码差异
**来源:** requirements/_index.md
## 目录结构
<贴出本系统的目录树>
## 关键提醒(写操作权限)
<前期只读/写需确认/不可逆操作说明>
00-overview.md(系统全景)# <系统名> · 能力总览
> 本目录是对<系统名>的蒸馏产物:把系统下沉为可被 AI 调用的领域能力中心。
> AI 通过本文档理解业务语义,并**只能通过 API**操作业务。
## 这是什么系统
<2~4 句:系统定位、服务谁、核心价值>
## 业务边界
- 管理什么:<...>
- 不管理什么:<...>(划清边界,避免 AI 越界假设)
## 核心业务链路(一句话)
<用一句话串起主流程,如:录入 → 开票 → 收款>
## 核心业务对象
| 对象 | 说明 | 详见 |
|------|------|------|
| <对象A> | <一句话> | [[对象A-slug]] |
## 能力清单(API 概览)
| 能力 | 类型(读/写) | 详见 |
|------|------------|------|
| <能力> | 写 | [[用例-slug]] |
## 给 AI 的关键约定
1. 永远通过 API 操作,不直接读写数据库。
2. 引用类字段是 ID 不是名称——先调<主数据接口>解析。
3. 金额/状态等由服务端计算或裁决。
4. 写操作权限分级:<前期策略>。
5. 规则标注 【服务端强制】/【调用方需预判】 的含义。
## 技术事实(便于排错,非业务语义)
- 技术栈、数据库、统一响应信封、鉴权方式、错误码入口。
填写说明:这是 AI 最先读的文件,必须短而全。"给 AI 的关键约定"是行为护栏,务必写清 ID 解析、服务端权威、写权限。
01-glossary.md(术语表)# 业务术语表(Glossary)
> 全局共享语义。出现歧义时以本表为准。
| 术语 | 英文/别名 | 含义 |
|------|-----------|------|
| <中文术语> | <Alias> | <含义;指明它在业务中的角色与关键约束> |
填写说明:把需求里反复出现的名词、代码里的对象别名、用户口语的叫法对齐到一起。一个术语一行,含义要点到关键约束(如"比例合计必须=1")。
domain/_index.md(对象关系总览)# 领域模型总览
> 语义层。描述业务对象、关系、生命周期。字段级细节见 reference/schema/。
## 对象关系(文字版)
```
<用 ASCII 画出对象间引用/组合关系>
```
## 关键关系说明
- <对象A> 1:N <对象B>:<组合还是引用,级联行为>
- <对象A> N:N <对象C>(通过<中间对象>)
## 对象清单
| 对象 | 角色(聚合根/明细/主数据) | 文档 |
|------|--------------------------|------|
| <对象A> | 聚合根 | [[对象A-slug]] |
domain/<对象>.md(业务对象)— 核心模板# 业务对象:<中文名> (<Alias>)
## 一句话定义
<它是什么、在业务中扮演什么角色>
## 业务语义
<2~4 句:它代表什么、在流程中的位置、谁创建谁消费>
## 生命周期 / 状态
<状态机:状态A → 状态B → ...;每个状态含义与触发动作>
> ⚠️ 已知差异:<模型定义但代码未实现的状态>,见 [[model-code-conflicts]]
## 关键属性(语义级,非字段级)
| 属性 | 含义 | 约束/来源 |
|------|------|-----------|
| <attr> | <含义> | <必填/唯一/服务端维护/引用 [[xx]]> |
## 组合 / 关系
- 包含 <明细对象>(基数,组合/引用,级联行为)
- 引用 [[主数据]]
- 被 [[其它对象]] 引用
## 核心业务规则
1. 【服务端强制】<规则>,违反报"<错误消息>"。
2. 【服务端维护】<由系统自动计算/更新的字段>。
3. 【调用方需预判】<服务端不拦但业务要求的约束>。
4. 【副作用】<该对象变更触发的连锁动作>。
## 相关能力
- 录入:[[create-xx]] 查询:[[query-xx]] 详情:[[get-xx-detail]]
## 明细索引
- 字段级 Schema → reference/schema/<表>.md
- 枚举值 → [[enums]]
填写说明:属性表是语义级(合并/省略技术字段),字段级放 Schema。规则段是本对象的灵魂,每条必带执行方标签。
api/_index.md(能力清单 + 编排)# API 能力清单
> 业务用例级接口。统一响应信封:<贴出信封结构>。"输出"均指 data 部分。
> 鉴权:<说明>。
## 业务能力(AI 主要使用)
| 能力 | 方法 + 路径 | 读/写 | 文档 |
|------|------------|-------|------|
| <能力> | POST /api/... | 写 | [[slug]] |
## 平台/辅助接口(一般不直接暴露给业务对话)
| 接口 | 方法 + 路径 | 用途 |
|------|------------|------|
## 典型编排(自然语言 → 接口序列)
- **"<用户说的话>"** → [[接口1]] 解析… → [[接口2]] 执行。
填写说明:把"业务能力"和"平台/辅助接口"分开列——AI 主要用前者。"典型编排"是把单接口拼成业务流的关键,直接降低 AI 出错率。
api/<域>/<用例>.md(用例级接口)— 最重要模板# 接口:<中文动作名> (<接口标识>)
`<HTTP方法> <路径>`
## 业务场景
<什么情况下用;给一句用户自然语言示例;强调它是完整业务动作而非底层 CRUD>
## 能力边界
- 做什么:<...>
- 不做什么:<...>(划清边界,避免 AI 误用)
## 输入(<Body/Query>)
| 参数 | 类型 | 必填 | 说明 | 约束 |
|------|------|------|------|------|
| <param> | <type> | 是/否 | <含义> | <取值/引用 [[xx]]> |
> <不需传入、由服务端生成的字段说明>
## 输出(data)
| 字段 | 说明 |
|------|------|
| <field> | <含义;服务端计算的标注出来> |
## 关键规则
1. 【服务端强制】<规则> → "<错误消息>"。
2. 【调用方需预判】<AI 调用前要保证的事>。
3. 【服务端维护/副作用】<自动更新/触发的连锁>。
## 涉及的数据对象
- 主对象:[[对象]] 关联:[[对象]]
## 可能的错误
| message / errorCode | 含义 | AI 应如何向用户解释 |
|---------------------|------|---------------------|
## 调用示例
```json
<一个真实可用的请求 body>
```
## 写权限分级
- 当前阶段:<只读/受控写/禁用>;<是否需 dry-run+确认;是否不可逆>
填写说明:这是整套文档里 AI 用得最多的文件。"业务场景 + 能力边界 + 关键规则 + 可能的错误"四段决定 AI 用得对不对。示例必须是能直接跑通的真实数据。
reference/schema/<表>.md(字段级 Schema)# 表:<表名>(<中文说明>)
> 对应领域对象 [[对象]]。AI 不直接访问,仅供理解语义与排错。
| 字段 | 类型 | 含义 | 约束 | 对应领域属性/API字段 |
|------|------|------|------|----------------------|
| <col> | <type> | <含义> | <PK/FK/UNIQUE/NOT NULL/DEFAULT> | <camelCase 字段> |
## 索引与约束体现的业务规则
- <唯一键/外键 → 对应哪条业务规则>
填写说明:关键价值在最后一列"对应领域属性/API字段"——它把数据库命名(snake_case)和 API 命名(camelCase)对齐,是 AI 排错的桥梁。
reference/enums.md(枚举)# 枚举 / 字典值
> ✅ = 代码实际使用;⚠️ = 仅模型定义、代码未实现(见 [[model-code-conflicts]])。
## <对象>.<字段>
| 值 | 状态/含义 | 标记 |
|----|-----------|------|
| <值> | <含义> | ✅ |
| <值> | <含义> | ⚠️ |
## 主数据示例值(以实时<主数据接口>结果为准)
- <类型>:<示例取值>
reference/error-codes.md(错误码)# 错误码与错误处理
> 统一信封:<结构>。失败时 <字段约定>。
## errorCode 总览
| errorCode | HTTP | 含义 | 典型来源 |
|-----------|------|------|----------|
## 给 AI 的处理建议
1. <每类错误 AI 该怎么处理/解释/是否重试>
reference/model-code-conflicts.md(差异清单)# 本体模型 ↔ 代码实现 差异记录
> 蒸馏时发现的"本体/需求"与"实际代码"不一致之处。
> **实际行为以代码为准**;本表帮助 AI 不做错误假设,也是后续治理清单。
## N. <差异标题>
- 本体/需求:<声明>
- 代码:<实际>
- AI 影响:<AI 应注意什么>
---
维护建议:<如何收敛这些差异>
requirements/_index.md(原始需求)# 原始业务需求
> 蒸馏来源之一,保留可追溯。原文见 <路径>。
> 注意:与实际代码的差异见 [[model-code-conflicts]]。
## 业务范围
<原文摘录/整理>
## 关键业务对象(原文)
<原文摘录>
## 需实现的业务功能(原文)
1. <功能> → [[对应接口]]
## 蒸馏时补充识别出的能力(需求未明确,但代码已实现)
- <能力> → [[接口]]
【服务端强制】:违反被接口拒绝。【服务端维护】:由系统自动计算/更新,调用方不可设置。【调用方需预判】:服务端不拦,AI 需自行保证或与用户确认。【副作用】:该动作触发的连锁(事件、重算等)。[[slug]],slug = 目标文件名(不含 .md)。准备一组真实场景测试集,让 AI 仅凭 distilled/ 推导出应调用的接口序列,再真打到运行中的系统,核对结果。建议覆盖四类:
类型 | 示例 | 验证什么 |
|---|---|---|
读/查询 | "查 X 部门今年的合同" | 名称→ID 解析、查询参数 |
写/录入 | "给客户 A 录个合同……" | ID 解析、必填、用例编排、服务端维护字段 |
统计 | "未来三个月各部门预计收多少" | 统计接口口径理解 |
规则反例 | 故意违反规则(如比例≠1、重复操作) | "关键规则/可能的错误"是否准确预测 |
判定标准:AI 能正确解析名称、推导前置条件、按正确顺序编排接口、预判并解释规则错误,且字段/枚举/错误消息与真实系统一致 → 文档可用性通过。
参考案例 §9 给出了合同管理系统实跑验证的真实过程与结论。
本案例是按本手册产出并已实跑验证通过的真实样例,可作为新蒸馏的对照基准。

一个销售合同管理系统,只管理"已签字盖章生效后"的合同:合同信息维护 → 按付款条款分阶段开票 → 客户付款后确认收款;每次变动自动重算"未来 3 个月分部门收款预算"。
合同管理原始需求.txtcode/backend(Flask + SQLite)——API 与规则的真相来源models/contract/m1-object-model.yamldistilled/
├── 00-overview.md, 01-glossary.md, README.md
├── domain/ : _index, contract, invoice, master-data
├── api/
│ ├── _index.md
│ ├── contract/ : create-contract, query-contracts, get-contract-detail
│ ├── invoice/ : create-invoice, query-open-invoices
│ ├── payment/ : receive-payment
│ ├── reference/: get-reference-data
│ └── analytics/: receipt-budget
├── reference/ : schema/(contracts,invoices,payment-terms-and-mappings,master-data), enums, error-codes, model-code-conflicts
└── requirements/_index.md
生效 → 作废(⚠️ "作废"本体定义但代码未实现)。POST /api/behaviors/Contract_Create/execute仅凭 distilled/ 文档,AI 成功完成端到端链路:
GET /meta/reference-data 把"星河制造/集成交付服务/销售二部/李强"解析为 ID → POST Contract_Create,返回字段与文档逐字段吻合。GET Contract_GetDetail 推导出"可开票、剩余可开票额、合法阶段" → 开票 → 确认收款;复查详情显示状态自动流转为"部分开票/部分收款"。POST open-invoices,已收款的发票正确地不在列表中。GET /events/runs 返回分部门收款预算,口径与文档一致。结论:文档可用性通过。 字段名、枚举、错误消息、服务端维护逻辑与真实系统完全对得上。
distilled/ 目录。可借助 AI 加速:把单个源码服务文件 + 对应模板喂给 AI,让它产出初稿,再人工核对"实际为准"。
00、01、domain/、api/_index.md)注入系统提示或检索的高优先级片段。reference/、各 api/<用例>.md)做成可被 AI 检索的知识库(RAG / 工具),AI 需要时再取。api/ 文档把真实 API 注册为 AI 可调用的工具(function calling)。00-overview.md 的"给 AI 的关键约定"写进系统提示。基于这套蒸馏规范模板,我们对合同管理系统进行蒸馏。输出完整的Skills技能包,具体如下:

基于这套技能包,我们再做一个AI自然语言对话客户端。该客户端可以动态的价值我们刚才输出的完整技能。

基于该技能包,我们就可以愉快的和合同管理系统进行自然语言对话了,大家可以看下具体参考的对话输出结果。

今天的分享就到这里,希望对大家有所启发。