养老金测算 Skill
帮用户按政策口径估算退休金,并生成一份可自己调整参数的 Excel 测算表。本技能完全本地运行,不含任何预置的个人数据;每次使用都从本次对话的用户输入重新采集信息。
⚠️ 隐私与采集铁律(务必遵守)
- 每次运行都必须从用户处重新采集全部必要信息,严禁使用历史对话、记忆、上下文,或任何之前会话里提供的个人信息(出生年月、退休年龄、退休计划、缴费记录、权益单内容等)。即使用户之前用过本技能,也不要假定任何值。
- 必填信息一项都不能省:退休地、出生年月(或退休年龄+退休年份)、各段缴纳历史、未来规划,都必须明确询问或经用户确认,绝不能臆造或沿用默认。
- 上传文件须先提示脱敏:用户上传权益单/缴费证明前,先提醒其自行屏蔽姓名、身份证号、手机号、银行卡号等敏感信息;本工具本地处理、不会外传,但不做自动脱敏,只提示。
- 发布/分发本技能时:技能目录内只能含
SKILL.md、README.md、LICENSE、scripts/、data/、inputs.example.json(虚构示例)。绝不能把含真实数据的inputs.json或个人权益单打进包。
核心计算口径(务必遵守)
- 指数分母统一用「待遇领取地(归集退休地)社平」,不是参保地社平。依据:人社部《关于城镇企业职工基本养老保险关系转移接续若干问题的意见》(2009)第二条——跨省归集退休时,缴费工资指数 = 本人各参保地缴费工资 ÷ 待遇领取地对应年度社平。所以高基数城市(如一线城市)的缴费若在较低社平城市退休会被放大。
- 平均指数 = Σ(每年月缴费指数×月数) ÷ 总月数;指数化工资 = 退休时社平 × 平均指数。
- 基础养老金 = (退休时社平 + 指数化工资) ÷ 2 × 缴费年限(年) × 1%。
- 个人账户养老金 = 个账累计 ÷ 计发月数(55→170、60→139、50→195、65→101)。
- 灵活就业 缴 20%,其中 8% 进个人账户(与单位职工个人部分一致)。
- 指数封顶 3.0 默认 不封顶(FALSE),仅当跨省到较低社平城市退休且用户要求时改为 TRUE。
- 终身领取:退休后月养老金按「养老增幅」逐年复利,累计逐年累加。
工作流
第 1 步:采集必要信息(用提问,逐项确认,不要一次性甩长串,也不要假设任何值)
按以下清单向用户询问(可合并但必须全部拿到,缺失任一项就继续问):
- 退休地(待遇领取地)城市:决定指数分母。问清是归集到某城市(如户口所在地)退休,还是在最后工作地退休。
- 出生年月(或「哪年开始领退休金」)+ 计划退休年龄:退休年龄决定计发月数,退休年份决定推演起点。若用户只给其中一项,主动追问另一项。
- 缴纳历史(多段):每段需要——起止年月、城市、类型(单位职工/灵活就业)、月缴费基数或个人账户年入账/累计额。告诉用户「有多段就提供多段,包括跨省转移」。
- 未来规划(预估段):是否继续在职/转灵活就业、缴费档位(60%–300%)、缴到哪一年退休。这一步必须显式确认,不要擅自假设「之后一直按某方式缴」。
- 假设参数:先给默认(社平增幅 2%、养老增幅 2%、记账利率 2.5%、灵活档位 60%),并明确告知用户这些值可在生成的表里修改。
> 若用户直接上传了权益单,第 1 步的多数字段可从文件解析(见第 2 步),但退休地、退休年龄、退休年份仍须口头确认(文件里通常没有这些信息)。
第 2 步:文件上传与隐私(权益单解析)
- 上传前先一句话提醒:「上传前请自行屏蔽姓名、身份证号、手机号、银行卡号等敏感信息;本工具本地处理,不会外传。」
- 解析方式:用 Read 工具直接看 Excel/Word;但养老权益记录单常为带电子签章的图片型 PDF,Read 工具会读成二进制无法提取文字——此时改用 Python(PyMuPDF /
fitz)抽取文本:
python import fitz doc = fitz.open(文件路径) for p in doc: print(p.get_text())
提取后全自动解析出每段/每年的:年份、城市、类型、月数、月缴费基数(或年缴费工资÷12、或个人账户年入账÷8%÷月数),填入 inputs。 - 跨省月份边界校验(重要):把各段按「年」归并,某一年所有段的月数之和应 ≤ 12。若发现某年 > 12(如上海段和成都段在同一年重叠),不要擅自取舍,向用户确认哪段算几个月,并在表里备注。
- 解析不确定的字段,向用户确认,不要臆造。
第 3 步:查社平工资
- 优先用 skill 内置缓存
data/社平工资表.xlsx(共 13 城、1989–2033 逐年补全)。关键口径:本表“社平”=养老金公式里的「养老金计发基数」(人社公布),不是“全口径城镇单位就业人员平均工资”(那个只用于核定缴费基数上下限)。 具体取法:2020 年及以后用各地人社公布的「养老金计发基数」(北京 2020–2024 已用真实值 9910/10534/11082/11525/11883);2020 年以前(计发基数概念未单独公布)用「城镇非私营单位在岗职工平均工资」(统计年鉴,年值÷12)。2024 年以后在生成测算表时一律按「社平增幅」参数活公式推算。⚠ 除北京外,其余城市目前仍暂为“全口径”旧口径,待逐个查真实计发基数校正。 - 若待遇领取地或某段城市不在缓存(或需校正):联网搜索「{城市} 养老金计发基数 {最近年}」(或「{省} 社保缴费基数 上限」÷3 倒推省全口径、再注意计发基数通常略高/略低于全口径),把结果填进
manual_sheping:{"城市": {"2023": 数值}},并提醒用户以社保局公布值为准。 - 缓存值可能与用户实际有出入,务必提示用户核实、可在生成的表里直接改对应年份社平。
第 4 步:写 inputs.json 并生成
- 在当前工作目录写
inputs.json(结构见下方「输入契约」,可用inputs.example.json作模板)。把用户每段/每年数据归一化为years列表最稳妥;也可用segments让脚本展开。 - 运行脚本(用受管 Python):
/Users/hbw/.workbuddy/binaries/python/versions/3.13.12/bin/python3 \ ~/.workbuddy/skills/养老金测算/scripts/build_pension.py \ inputs.json 养老金测算_{退休地}.xlsx - 脚本会在当前目录生成
养老金测算_{退休地}.xlsx。(默认输出已算好的数值,任何查看器打开即见正确数字,不会出现活公式未计算而显示 0、或公式描述显示 #NAME? 的问题。)
第 5 步:校验与交付
- 打开生成的 xlsx,快速核对:公式无
==/结构错误;缴纳明细参数区与数据行合理;退休金预估首年与「计算结果(月基本养老金)」一致。 - 用
present_files呈现给用户,并口头说明: - 三张表分别是什么;
- 哪些参数可改、改了哪里会变;
- 历史社平/缴费基数是估算还是用户实际提供,绝对数值仅供参考,以社保局数据为准;
- 预估待缴纳段已用橙色标记。
输入契约(inputs.json)
> 以下为示例(虚构数据),请替换为用户的真实信息。inputs.example.json 是同结构的完整样例。
{
"retire_city": "北京",
"retire_age": 60,
"retire_year": 2040,
"manual_sheping": {},
"params": {
"sheping_growth": 0.02,
"pension_growth": 0.02,
"interest_rate": 0.025,
"flex_ratio": 0.60,
"cap_index": false
},
"years": [
{"year":2010,"city":"上海","type":"单位职工","months":12,"base_monthly":9000,"rate":0.03,"is_estimated":false},
{"year":2040,"city":"北京灵活","type":"灵活就业","months":12,"is_estimated":true}
]
}
retire_city/retire_age/retire_year为必填,缺任一项脚本会报错提示。years与segments二选一。推荐用years(agent 归一化后最灵活)。- 单位职工/灵活就业均可;灵活就业 20% 中 8% 进个账,脚本统一按
月基数×8%×月数入个账。 - 某年只知道个人账户年入账
account_entry而不知月基数:在 yearly 记录给account_entry,脚本反推月基数 = account_entry/(0.08×月数)。 - 预估段
is_estimated:true:不填base_monthly,脚本用当年待遇领取地社平 × 灵活档位算月基数;若用户指定了预估段的具体基数,填base_monthly优先。 manual_sheping:缓存缺城市时,按{"城市":{"年份":月社平}}补充。
输出工作簿结构
- Sheet1 测算说明:计算规则、政策依据、参数含义、数据来源与免责(公式描述以单引号前缀存储为纯文本,不会显示 #NAME?)。
- Sheet2 缴纳明细:顶部黄色参数区(可改)+ 逐年记录(含橙色「预估待缴」行)+ 底部「计算结果(退休首年)」。
- Sheet3 退休金预估:从退休年起逐年(到 99 岁)月/年养老金与累计领取,全部为已算好的数值(改参数需重跑脚本;若需 Excel 内即时重算,设
"output_mode":"formula"走活公式)。
已知实现要点(来自实测打磨,无需用户关心)
- 默认
output_mode="values":所有计算列写数值,避免轻量预览器不计算活公式而显示 0。 - 公式描述以
=开头的单元格加前导单引号,强制按文本显示,避免#NAME?。 - 参数写入起始行与公式引用常量已对齐,计发月数/增幅/档位/退休年引用不会错位。
- 预估段
base_monthly优先于「社平×灵活档位」自动估算,避免用户指定基数被覆盖。