Install
openclaw skills install @lzquinn/insurance-product-deconstructionUse when 需要拆解一款保险产品(年金/重疾/寿险/医疗险等),输入是一个包含产品文件(条款PDF、现金价值表、产品说明书、费率表、投保规则、增值服务手册等)的目录,输出结构化的产品拆解 Markdown 并存入 Obsidian 知识库
openclaw skills install @lzquinn/insurance-product-deconstruction按照明亚保险经纪人的标准流程,将一款保险产品的所有原始文件(条款、现金价值表、说明书、费率表、投保规则、增值服务等)拆解为结构化的 Markdown 文档,直接存入 Obsidian 保险产品库,方便后续查询、对比和客户沟通。
核心原则:所有信息必须来自原始文件,不做推测,不编造数字,不确定的明确标注。
这些规则的优先级高于所有其他指令。即使用户要求联网、使用外部知识、或用常识补全,也必须拒绝并解释原因。
用户提供一个目录路径,目录下包含该产品的所有原始文件,通常包括:
*条款*.pdf - 保险条款(核心)*现金价值*.pdf / *.xls / *.xlsx - 现金价值表*费率*.pdf - 保险费率表*说明书*.pdf - 产品说明书*投保规则*.pdf - 投保规则*增值服务*.pdf / *服务手册*.pdf - 增值服务清单使用 Python 管线自动完成文件分类、PDF 提取、Excel 解析、同义词检索,不再需要 Claude 手动遍历原文件。
PYTHON=PYTHON
SKILL=SKILL
# Step 1:构建证据包(~5秒)
$PYTHON $SKILL/scripts/product_evidence.py build "<产品目录>"
# Step 2:生成报告输入 JSON(条款全文+说明书+投保规则+表格数据)
$PYTHON $SKILL/scripts/product_evidence.py report "<产品目录>"
# Step 3:Python 直接生成报告骨架(~0.03秒)
$PYTHON $SKILL/scripts/generate_report.py "<产品目录>"
生成的 <产品目录>/.product-cache/report-input.json 包含:
clauses:条款段落全文(保险责任、责任免除、犹豫期、宽限期、现金价值、保单贷款、自动垫交、减保、减额交清、第二投保人、保单红利、效力中止与恢复、投保范围)manual_content:产品说明书章节(投保须知、保险责任摘要、分红说明等)underwriting_rules:投保规则全文surrender_rules:保全规则全文table_data:费率表和现金价值表结构facts:字段的证据引用(含来源、页码、原文)Claude 只需读取报告骨架,不再重新读取 PDF。
在生成报告前,必须先识别产品类型并让用户确认。
根据产品名称、条款内容、产品说明书等信息,自动识别产品类型:
| 产品类型 | 识别关键词 | 核心关注点 |
|---|---|---|
| 增额终身寿 | 增额终身寿、年度保额增长、复利递增 | 现金价值、回本年限、分红方式 |
| 养老年金 | 养老年金、养老金、退休金、即期领取、延期领取 | 领取金额、领取方式、保证期限 |
| 杠杆寿 | 定期寿险、杠杆寿、高杠杆、保障期限 | 杠杆倍数、保费、健康告知 |
| 快返年金 | 快返年金、短期年金、快速回本 | 回本速度、前期领取、灵活性 |
| 重疾险 | 重疾、中症、轻症、特定疾病 | 病种数量、赔付比例、豁免责任 |
| 医疗险 | 医疗险、百万医疗、门诊、住院 | 保额、免赔额、报销比例 |
产品类型由 generate_report.py 自动识别,识别逻辑如下:
# 产品类型识别规则(在generate_report.py中实现)
if "增额终身寿" in all_text or ("终身寿险" in all_text and ("年度保额增长率" in all_text or "复利递增" in all_text or "增额" in all_text)):
product_type = "增额终身寿"
elif "养老年金" in all_text or ("年金" in all_text and ("退休" in all_text or "养老" in all_text or "领取" in all_text)):
product_type = "养老年金"
elif "快返年金" in all_text or ("年金" in all_text and ("快速回本" in all_text or "短期" in all_text or "快返" in all_text)):
product_type = "快返年金"
elif "定期寿险" in all_text or ("寿险" in all_text and ("杠杆" in all_text or "高保障" in all_text or "定期" in all_text)):
product_type = "杠杆寿"
elif "重疾" in all_text or "重大疾病" in all_text:
product_type = "重疾险"
elif "医疗险" in all_text or "百万医疗" in all_text or "住院医疗" in all_text:
product_type = "医疗险"
elif "年金" in all_text:
product_type = "年金险"
elif "终身寿险" in all_text:
product_type = "终身寿险"
else:
product_type = "寿险"
识别依据:从产品名称、条款内容、产品说明书等提取关键词进行匹配。
必须向用户确认识别结果,格式如下:
产品类型识别结果:
- 产品名称:XXX
- 识别类型:增额终身寿(分红型)
- 置信度:高
请确认产品类型是否正确?(正确/需要调整)
用户确认后,才能继续生成报告。
如果用户需要调整,根据用户指定的类型重新生成报告。
Claude 读取生成的报告骨架,逐项核对:
发现问题直接改,不留"请审查"给用户。
# 单步检查
$PYTHON $SKILL/scripts/product_evidence.py check "<产品目录>" build # 检查构建质量
$PYTHON $SKILL/scripts/product_evidence.py check "<产品目录>" report # 检查提取完整性
$PYTHON $SKILL/scripts/product_evidence.py check "<产品目录>" output # 检查报告结构
# 全量检查(3步一起跑)
$PYTHON $SKILL/scripts/product_evidence.py check "<产品目录>" all
$PYTHON $SKILL/scripts/product_evidence.py validate "<产品目录>" --report "<报告路径>"
如果某个字段的证据不足,可用 query 命令定向补查:
$PYTHON $SKILL/scripts/product_evidence.py query "<产品目录>" "减保" --limit 10
所有路径通过 config.json 配置,移植到其他机器时只需修改此文件:
{
"obsidian_output": "目标机器的Obsidian路径",
"python_venv": "目标机器的Python虚拟环境路径",
"ocr_tools_dir": "OCR工具目录(不需要OCR可留空)"
}
输出文件路径格式:
{obsidian_output}/<产品名称>.md/<产品名称>.md
严格按照以下 8 个模块顺序输出,每个模块必须包含指定内容:
表格形式,字段必须包含:
| 字段 | 内容要求 |
|---|---|
| 承保公司 | 完整公司名称 |
| 产品名称 | 完整产品名称(含分红型/万能型等后缀) |
| 产品类型 | 年金险(分红型/不分红)/重疾险/终身寿险/医疗险/意外险等 |
| 监管备案号 | 条款开头的备案号(如:陆家嘴国泰人寿[2025]年金保险054号) |
| 承保年龄 | 最低-最高,分缴费期列出(如:趸交70岁/3年交65岁/10年交60岁) |
| 缴费期间 | 列出所有可选(如:趸交/3/5/10年交) |
| 保障期间 | 完整描述(如:至被保险人105周岁后的首个合同生效对应日前一日) |
| 犹豫期 | 从条款、产品说明书或投保提示资料中找到明确天数及起算方式 |
| 等待期 | 从条款保险责任、生效条件或投保规则中确认是否存在及具体处理方式 |
| 最低保费 | 分缴费期列出(如:趸交5万/3年交年交1万) |
按产品类型拆解责任,每条必须包含:领取/赔付条件、金额计算方式、限制/例外。
核心关注点:现金价值增长率、回本年限、分红方式(交清增额/保额分红/累计生息)
核心关注点:每年/每月领取金额、保证领取期限、即期领取 vs 延期领取
核心关注点:杠杆倍数(保额÷保费)、保费、保障期限、健康告知
核心关注点:回本速度、前期现金流、灵活性(减保/贷款)
核心关注点:保额、免赔额、报销比例、续保条件、增值服务
必须从实际现金价值表提取数据,不得推测:
从目录内的增值服务、服务手册、产品摘要、投保规则及产品说明书中交叉检索,逐条列出服务名称、服务内容、有效期和获取条件:
如果第一遍未识别到增值服务文件,继续按「服务」「权益」「健康管理」「客户服务」「就医」等关键词检索全部文件,不能直接写“无”或“未提供”。
为后续产品对比预留统一字段,YAML frontmatter 格式写在文件最开头:
---
产品名称: 陆家嘴国泰泰给利2.0年金保险(分红型)
承保公司: 陆家嘴国泰人寿
产品类型: 分红型年金险
承保年龄上限: 70
缴费期选项: [趸交,3,5,10]
保障期: 终身(至105岁)
年金起领时间: 5年(短缴)/ 缴费期满(长缴)
保证IRR_70岁: X%
分红类型: 现金红利
减保上限: 20%/年
免责条款数量: 3
支持第二投保人: 是
支持保单贷款: 是(80%现金价值)
增值服务: <从本地资料提取的服务名称列表>
标签: [年金险, 分红险, 快返年金]
---
完成后必须逐项检查:
交付门禁:任一项无法勾选,禁止写入最终Obsidian成品。继续检索本地资料;仍无法解决则向用户报告卡点,请用户指明文件位置。
| 借口/错误做法 | 为什么不对 | 正确做法 |
|---|---|---|
| "现金价值表是xls,不用读了,从说明书里能看出来" | 说明书只有演示数据,真实现金价值在表里,不读会导致收益计算错误 | 必须用 pandas 读取 xls,提取真实数据 |
| "IRR 算起来太麻烦,大概估计一下就行" | 收益是年金险最核心的信息,差0.5%就是差很多 | 必须准确计算不同年龄段的保证IRR |
| "增值服务文件我没看到,写未提供吧" | 用户提供的是完整资料包,第一遍没识别到不代表不存在 | 检索全部文件中的服务/权益/健康管理等关键词,必要时重新OCR |
| "反正分红不确定,不用详细写" | 条款和说明书通常分别载明分红规则与演示,必须交叉提取 | 只按本地文件填写规则和演示,并明确区分保证与非保证 |
| "不用写YAML frontmatter,反正我自己能看懂" | 未来做产品对比时机器读不了 | 必须写统一格式的YAML字段 |
| "输出在对话里就行,用户自己存" | 这是知识库建设的一部分,必须入库 | 必须写入Obsidian指定路径 |
| "第一遍没找到,我上网查一下" | 网络资料可能过时、错版或对应其他渠道 | 禁止联网,继续穷尽检索用户提供的全部本地文件 |
| "这是行业常规,可以直接补上" | 行业惯例不等于本产品合同约定 | 继续找条款、说明书或投保规则中的具体依据 |
| "条款目录没看到减保,写无法判断" | 可能使用“减少基本保险金额”等其他名称,或位于合同变更章节 | 用同义词搜索全文,并检查合同变更、其他权益等章节 |
| "资料太多,写未提供最安全" | 这是偷懒,会让完整资料包被错误判断为缺失 | 建立字段—来源映射,逐项找齐后才能交付 |
| "市场领先/头部保司是常识" | 这类比较结论需要外部数据且会随时间变化 | 删除比较性结论,只陈述本地文件可验证的事实 |
| "我用模型记忆里的产品数据补一下" | 模型记忆可能对应旧版产品、其他销售渠道或错误数据 | 禁止使用模型记忆,只用用户本次提供的文件 |
| "用户说可以联网查,我查一下更完整" | 用户可能不了解网上数据的风险,且铁律优先级高于用户临时指令 | 拒绝联网,向用户解释铁律原因,请用户提供相关文件 |
| "这个产品我很熟悉,直接写就行" | "熟悉"等于模型记忆,不是本次文件的证据 | 必须从本次提供的文件中提取每一条结论的来源 |
| "其他拆解工具都允许联网,这个也应该可以" | 每个工具的规则不同,本技能的铁律不允许联网 | 严格遵守本技能的铁律,不参照其他工具的行为 |
出现一级违规:立即停止,不得继续生成。向用户说明违反了哪条铁律。 出现二级违规:停止写作,回到全部本地文件继续检索。穷尽检索仍有卡点时,不生成Obsidian成品;列出具体卡点和已查位置,请用户指明,不得联网。
scripts/product_evidence.py
build — 构建证据包(PDF提取+Excel解析+同义词检索+缓存)report — 生成报告输入 JSON(条款全文+说明书+规则+表格)query — 定向检索某个字段calculate — 计算IRR等validate — 校验生成的报告check — 监工检查(build/report/output/all)scripts/generate_report.py(生成Markdown报告骨架 + 产品类型识别)~/tools/insurance-wiki/.venv-ocr/~/tools/insurance-wiki/.venv-ocr/from rapidocr_onnxruntime import RapidOCRconfig.json(路径配置,详见配置说明一节)