在这里插入图片描述


先说结论:本文提供一个基于Claude API的Python实现,输入年薪、婚姻状况、子女数量等基本信息,自动调用Claude API按香港薪俸税规则估算应缴税额。实测与IRD官方eTAX计算器差异在50港币以内,可作为报税前快速估算工具。


一、背景

报税季到了。香港薪俸税的计算涉及累进税率、标准税率取低、多重免税额组合和14项可扣税项目,手动计算容易出错且耗时。

我在香港工作三年,每到报税季都要花大量时间算税。最近尝试用Claude API做一个自动化计算方案——把计算逻辑交给AI,我只需要维护个人信息参数。

环境信息:

  • Python 3.10+
  • Claude API (anthropic-sdk-python >= 0.8.0)
  • 测试时间:2026-05-15
  • OS: macOS 14.4

二、核心方案设计

方案的核心是一个精心构造的Prompt,让Claude扮演香港税务助理。相比纯代码计算(规则复杂、需维护税率表),Prompt方案的优点是灵活——改一下Prompt就能适配2026/27免税额变化。

但缺点也很明显:输出不是100%确定性的。所以设计时加入了严格的步骤约束和验证逻辑。

方案架构

用户输入(个人信息 + 财务数据)
        ↓
  Prompt组装器(注入个人参数 + 税务年度指令)
        ↓
  Claude API调用(按6步计算流程执行)
        ↓
  结果解析器(提取税项明细 + 应缴金额)
        ↓
  交叉验证(可选:与IRD eTAX对比)

三、完整代码实现

3.1 安装依赖

pip install anthropic python-dotenv

3.2 环境配置

# .env
ANTHROPIC_API_KEY=sk-ant-your-api-key-here

3.3 核心代码

import os
from anthropic import Anthropic
from dataclasses import dataclass, asdict
from typing import Optional

# ---------- 数据结构 ----------

@dataclass
class TaxPayerInfo:
    """纳税人信息"""
    marital_status: str          # "单身" or "已婚"
    children_count: int          # 子女数量
    annual_salary: float         # 年薪(HKD)
    mpf_employee_contribution: float  # MPF雇员供款(年度总额)
    vhis_premium: float = 0      # 自愿医保保费
    annuity_premium: float = 0   # 合资格年金保费
    other_deductible: float = 0  # 其他可扣税项目合计
    other_income: float = 0      # 其他收入

# ---------- Prompt模板 ----------

TAX_PROMPT_TEMPLATE = """
你是一位熟悉香港薪俸税计算的税务助理。
请根据以下信息,帮我计算【2025/26课税年度】的应缴薪俸税。

【基本信息】
- 婚姻状况:{marital_status}
- 子女数量:{children_count}
- 年薪总额:{annual_salary} HKD
- MPF雇员供款:已缴纳(年度共{mpf} HKD)
- 其他可扣税项目:
  · 自愿医保(VHIS):{vhis} HKD
  · 合资格年金保费:{annuity} HKD
  · 其他:{other_deductible} HKD
- 其他收入:{other_income} HKD

【2025/26课税年度免税额标准(必须使用以下数字)】
- 基本免税额:132,000 HKD
- 已婚人士免税额:264,000 HKD
- 子女免税额(第1名):130,000 HKD
- 子女免税额(第2名):130,000 HKD
- 单亲免税额:132,000 HKD
- 供养父母免税额(每名):25,000 HKD

【请严格按以下6步计算】
1. 计算应评税入息:总收入 - MPF雇员供款 - 其他可扣税项目 + 其他收入
2. 计算适用的免税额合计(根据婚姻状况和子女数量)
3. 计算应课税入息 = 应评税入息 - 免税额合计
4. 按累进税率计算:
   首50,000 × 2%50,000 × 6%50,000 × 10%50,000 × 14%
   剩余 × 17%
5. 按标准税率15%计算:应课税入息 × 15%
6. 取第4步和第5步的较低者作为最终应缴税款

【输出格式】

应评税入息计算:[步骤明细]
免税额合计:[步骤明细]
应课税入息:[数字]
累进税率计算:[各阶梯明细,含具体数字]
标准税率计算:[数字]
最终应缴税款:[数字]


【重要提醒】
- 每一步都要写出具体数字
- 四舍五入到个位数
- 如果应课税入息为负数或零,最终应缴税款为0
"""

# ---------- Claude客户端 ----------

class HKTaxCalculator:
    """香港薪俸税Claude计算器"""

    def __init__(self, api_key: str):
        self.client = Anthropic(api_key=api_key)

    def calculate(self, info: TaxPayerInfo) -> str:
        """调用Claude计算薪俸税"""

        # 组装Prompt
        prompt = TAX_PROMPT_TEMPLATE.format(
            marital_status=info.marital_status,
            children_count=info.children_count,
            annual_salary=f"{info.annual_salary:,.0f}",
            mpf=f"{info.mpf_employee_contribution:,.0f}",
            vhis=f"{info.vhis_premium:,.0f}",
            annuity=f"{info.annuity_premium:,.0f}",
            other_deductible=f"{info.other_deductible:,.0f}",
            other_income=f"{info.other_income:,.0f}",
        )

        # 调用API
        response = self.client.messages.create(
            model="claude-sonnet-4-20250514",
            max_tokens=2048,
            messages=[{
                "role": "user",
                "content": prompt
            }]
        )

        return response.content[0].text

# ---------- 使用示例 ----------

if __name__ == "__main__":
    # 从环境变量读取API Key
    api_key = os.getenv("ANTHROPIC_API_KEY")
    if not api_key:
        raise ValueError("请设置 ANTHROPIC_API_KEY 环境变量")

    # 示例1:已婚有1孩,年薪48万
    info1 = TaxPayerInfo(
        marital_status="已婚",
        children_count=1,
        annual_salary=480_000,
        mpf_employee_contribution=18_000,  # 1,500/月 x 12
        vhis_premium=8_000,
        annuity_premium=12_000,
    )

    calculator = HKTaxCalculator(api_key)
    result1 = calculator.calculate(info1)
    print("=== 场景1:已婚有1孩,年薪48万 ===")
    print(result1)

    # 示例2:单身无孩,年薪60万
    info2 = TaxPayerInfo(
        marital_status="单身",
        children_count=0,
        annual_salary=600_000,
        mpf_employee_contribution=18_000,
    )

    result2 = calculator.calculate(info2)
    print("\n=== 场景2:单身无孩,年薪60万 ===")
    print(result2)

3.4 运行效果

=== 场景1:已婚有1孩,年薪48万 ===
应评税入息计算:
  480,000 - 18,000(MPF) - 8,000(VHIS) - 12,000(年金) = 442,000
免税额合计:
  264,000(已婚) + 130,000(子女1名) = 394,000
应课税入息:
  442,000 - 394,000 = 48,000
累进税率计算:
  首50,000 × 2% = 1,000
  剩余0 × 6% = 0
  累进税款 = 1,000
标准税率计算:
  48,000 × 15% = 7,200
最终应缴税款:
  min(1,000, 7,200) = 1,000 HKD

=== 场景2:单身无孩,年薪60万 ===
应评税入息计算:
  600,000 - 18,000(MPF) = 582,000
免税额合计:
  132,000(基本) = 132,000
应课税入息:
  582,000 - 132,000 = 450,000
累进税率计算:
  首50,000 × 2% = 1,000
  次50,000 × 6% = 3,000
  次50,000 × 10% = 5,000
  次50,000 × 14% = 7,000
  剩余250,000 × 17% = 42,500
  累进税款 = 58,500
标准税率计算:
  450,000 × 15% = 67,500
最终应缴税款:
  min(58,500, 67,500) = 58,500 HKD

四、踩坑记录

踩坑1:免税额版本混淆

第一次调用时Prompt没写清楚「2025/26课税年度」,Claude直接用了2026/27的新版免税额(基本145,000)。输出结果和IRD eTAX对比差了约2,000港币。

解决方案: 在Prompt中明确指定课税年度,并把当年的免税额数字写死。

踩坑2:MPF上限未正确处理

年薪超过30万的情况下MPF雇员供款已封顶(1,500/月),但Claude有时会按年薪×5%计算。

解决方案: 在输入端预先计算好MPF金额,不作为变量交给Claude计算。

踩坑3:输出格式不稳定

Claude有时不按指定格式输出,导致解析困难。目前方案中不对输出做自动化解析,以人工阅读为主。后续可以加few-shot示例来约束输出格式。


在这里插入图片描述

五、局限与改进方向

  1. 非确定性输出:同样的输入每次结果可能有微小差异(±50港币以内),不适合作为报税依据
  2. 不支持复杂场景:多份收入、股票期权、境外收入等场景未覆盖
  3. 改进方向:可以增加few-shot示例稳定输出格式,或改用纯代码实现计算逻辑(不依赖AI)

最终强调:本工具仅用于快速估算,最终报税请以IRD eTAX计算器或专业会计师核算为准。

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐