diff --git a/README.md b/README.md index ec983c6..22f4e10 100644 --- a/README.md +++ b/README.md @@ -59,7 +59,7 @@ python main.py --id 26B742 --mode fine --enable-other - **fine**:在同一个 `types` 字段里直接给出"大类:细分类目",例如 "配件:针型阀""资料:说明书" -两种模式对应的提示词都定义在 `src/prompts.py` 中,修改分类边界或细分类目 +两种模式对应的提示词都定义在 `prompts.py` 中,修改分类边界或细分类目 枚举,只需要改这一个文件。 ### 分类体系(已与业务方确认边界) @@ -186,15 +186,15 @@ JSON 的括号、引号、转义更容易被模型写错。约定 LLM 只输出" ## 项目结构 ``` -├── config.yaml # 配置文件 -├── main.py # 命令行入口 +├── config.yaml # 配置文件 +├── main.py # 命令行入口(直接 import 同目录各模块) ├── requirements.txt -└── src/ - ├── config_loader.py # YAML 配置读取与校验 - ├── db.py # SQL Server 查询 (pyodbc) - ├── prompts.py # 提示词与细分类目枚举(唯一需要改分类边界时编辑的文件) - ├── llm_client.py # LLM 调用 (OpenAI 兼容接口) - ├── parser.py # LLM 输出格式校验与清洗 → 结构化数据 - ├── order_logger.py # 每个总排号一份的完整对话日志 - └── classifier.py # 编排:查库 -> 调LLM -> 校验解析 -> 记日志 -> 组装结果 +├── config_loader.py # YAML 配置读取与校验 +├── db.py # SQL Server 查询 (pyodbc) +├── prompts.py # 提示词与细分类目枚举(唯一需要改分类边界时编辑的文件) +├── llm_client.py # LLM 调用 (OpenAI 兼容接口) +├── parser.py # LLM 输出格式校验与清洗 → 结构化数据 +├── order_logger.py # 每个总排号一份的完整对话日志 +├── classifier.py # 编排:查库 -> 调LLM -> 校验解析 -> 记日志 -> 组装结果 +└── attachment_classifier.py # 历史版本(旧 Excel 版,已弃用,保留仅供参考) ``` diff --git a/docs/附件分类说明.md b/docs/附件分类说明.md new file mode 100644 index 0000000..a919a61 --- /dev/null +++ b/docs/附件分类说明.md @@ -0,0 +1,129 @@ +# 附件分类说明 + +> 布莱迪压力表订单附件识别工具 —— 分类体系参考文档。 +> 本文档只讲"能分成哪些类";怎么部署、怎么跑程序见 README.md。 + +## 总览 + +分类分两级:**粗分(大类)** 定位到"是资料/配件/耗材/其他里的哪一种";**精分(细分类目)** 在粗分基础上进一步给出具体是哪一项。 + +| 大类 | 细分类目数 | 是否默认启用 | +|---|---|---| +| 资料 | 12 | 是(固定,不可关闭) | +| 配件 | 25 | 是(固定,不可关闭) | +| 耗材 | 1 | 是(固定,不可关闭) | +| 其他 | 1(固定值"其他") | 否,需手动开启 | + +三大类任何时候都生效;"其他"是可选兜底类目,默认关闭,开启方式见文末第五节。 + +--- + +## 一、先排除:这些都不算附件 + +**产品本体**(压力表自身规格,永远不算附件、不参与判断): +表壳直径/材质、精度等级、防护等级(IP)、过压保护(这里指内置功能规格,注意和下文"过压保护器"这个实物配件区分开)、弹性元件材质、接头材质/螺纹、安装方式、表盘材质/刻度/颜色、量程、充油、玻璃、指针、调零装置、结构代号(如513/531)、卡盘尺寸、打标/示值/红线标识要求。 + +**工艺处理**(不算配件):缓冲钉、阻尼钉、阻尼帽。 + +**标识件**(不算配件):位号牌、铭牌、标牌、号牌。 + +**物流包装指令**(不算资料):装箱单、送货单、贴箱单、发货章、包装/箱体标注。 + +**合格证**(单独强调,整体排除):既不算资料,也不算任何附件类型。无论参数文本里出没出现"合格证"这个说法,一律忽略——不影响"是否携带附件"的判断,也不会出现在精分结果里。 + +> 补充:资料类精分里有一项叫"检验合格证书综合"(见下文第9项),这和上面被整体排除的"合格证"是两个不同的类目标签,互不冲突——文本里出现"合格证"三个字本身,按上面的规则忽略;"检验合格证书综合"作为独立的资料类细分类目正常参与判断,不受这条排除规则影响。 + +--- + +## 二、粗分:三大类 + 一个可选类 + +### 1. 资料类 —— 交付给客户的技术文件 +检测报告、检验报告、出厂报告、材质证明/材质单/材质报告、说明书(使用/安装/维护)、标定证书/校验证书、制造记录/检验记录、图纸、营业执照、原产地证明、型式检验报告等。 + +### 2. 配件类 —— 随货交付的独立实物零件(不含垫片) +阀类(针型阀/球阀/截止阀/旋塞阀/角阀/阀组)、冷凝类(冷凝管/冷凝圈/冷凝弯)、表弯管/缓冲弯、虹吸管、过压保护器、散热器/散热片、焊接接头/短节/短管、法兰隔膜、隔离器、铅封、转换接头、卡箍/抱箍、紧固件(螺栓/螺母)、活接头、接线盒、电缆/插头、变送器等。凡随表一起出货的独立零件都算。 + +### 3. 耗材/密封件类 —— 垫片 +垫片(四氟垫片、紫铜垫片、缠绕垫、密封圈、O型圈等各种材质),单独成类,不算在配件里——一张订单只要一片垫片,和要一整套阀组,不该算同等权重的"携带配件"。 + +### 4. 其他类 —— 兜底选项,默认关闭 +确认订单确实随货交付了某个附件,但资料/配件/耗材下所有具体细分类目(包括各大类里已有的"其他XX"兜底项,如"其他交工文件""检验合格证书综合")都覆盖不了时,才归入这里。是最后手段:能归到前三类具体细分的必须归到那里,不能图省事往"其他"里塞。 + +--- + +## 三、精分:完整细分类目清单 + +### 资料类(12项) +1. 出厂检测检验报告 +2. 材质证明类 +3. 说明书 +4. 检验记录过程性 +5. 图纸类 +6. 标定校验证书 +7. 质量证明书 +8. 原产地证明 +9. 检验合格证书综合 +10. 其他交工文件 +11. 营业执照 +12. 型式检验报告 + +### 配件类(25项) +1. 针型阀 +2. 球阀 +3. 截止阀 +4. 旋塞阀 +5. 角阀 +6. 阀组 +7. 冷凝圈 +8. 冷凝管 +9. 冷凝弯 +10. 虹吸管 +11. 表弯管 +12. 缓冲管缓冲弯 +13. 法兰隔膜 +14. 隔离器 +15. 过压保护器 +16. 散热器散热片 +17. 铅封 +18. 转换接头 +19. 焊接接头短节短管 +20. 卡箍抱箍 +21. 紧固件 +22. 活接头 +23. 接线盒 +24. 电缆插头 +25. 变送器 + +### 耗材类(1项) +1. 垫片 + +### 其他类(1项,仅开启后生效) +1. 其他(固定值,模型不允许编造具体名称) + +--- + +## 四、和实际输出的对应关系 + +分类结果集中在 `types` 字段(完整输出记录还包含 `zong_pai_hao` / `status` / `has_attachment`,详见 README 的「输出格式」一节);以下示例只截取 `types` 字段,用来展示两种模式下的格式差异: + +**coarse 模式**——只到大类这一级: +```json +{"types": ["资料", "配件"]} +``` + +**fine 模式**——精确到细分类目,格式固定为"大类:细分": +```json +{"types": ["资料:出厂检测检验报告", "配件:针型阀", "耗材:垫片"]} +``` + +开启"其他"后,会以 `"其他"`(coarse 模式)或 `"其他:其他"`(fine 模式)的形式,混在同一个 `types` 列表里输出,不单独开字段、不需要额外解析逻辑。 + +--- + +## 五、"其他"类目怎么开 + +默认关闭,二选一即可开启: +- `config.yaml` 里设置 `business.enable_other_category: true` +- 运行时加命令行参数 `--enable-other` + +两者是"或"的关系:只要有一处开了就生效;命令行参数只能把关闭状态调成开启,不能把配置文件里已经开启的状态强制关掉。