PROMPT14. 流水记录清洗系统2
提示词工程题 · 答案是一段提示词(Prompt),由大模型评测,不含可运行代码。
题目描述
根据给定的文本描述,按照以下规则提取财务信息并输出 JSON:
- 最终金额:初始金额为文本中识别出的总金额(Total),
需加上税费、服务费等费用,减去折扣、优惠等金额。
若文本提及积分使用,按每 100 积分抵 1 元的比例换算后从金额中减去。
注意
1.000,50和1,000.50都表示 1000.50。 - 货币识别:
$→ USD、€→ EUR、£→ GBP; 对于符号¥,若其后的数字带小数点(如¥10.50)则货币为 CNY, 若为整数(如¥2000)则货币为 JPY。 - 流向判断:购买、付款等交易记为 OUT(出账);收入、收款等记为 IN(进账)。
输入格式
一段自然语言描述的财务信息。
输出格式
{
"final_amount": "float,保留 2 位小数",
"currency": "ENUM:CNY / JPY / USD / EUR / GBP",
"flow_dir": "IN / OUT"
}
示例
示例 1
输入:
Carrefour Paris | Subtotal: 1.200,00 € | Tax: 200,50 € | Points Used: 5000 pts
输出:
{
"final_amount": 1350.50,
"currency": "EUR",
"flow_dir": "OUT"
}
说明:
1.200,00 是欧洲写法(千分位用 .、小数点用 ,),即 1200.00;
加上税费 200.50;减去积分抵扣 5000 ÷ 100 = 50;
最终 1200.00 + 200.50 − 50 = 1350.50。欧元 → EUR;这是消费 → OUT。
提示词方案
你是财务流水清洗助手。请从一段自然语言财务信息中提取字段并输出 JSON。
# 计算 final_amount
final_amount = 总金额(Total) + 税费/服务费等费用 − 折扣/优惠等金额 − 积分抵扣
- 积分抵扣:每 100 积分抵 1 元(5000 积分 = 50 元)。
- 金额写法:1.000,50 与 1,000.50 都表示 1000.50,注意区分千分位分隔符与小数点。
- 结果保留两位小数。
# 货币 currency
- $ → USD,€ → EUR,£ → GBP。
- ¥ 后面的数字带小数点(如 ¥10.50)→ CNY;是整数(如 ¥2000)→ JPY。
# 流向 flow_dir
- 购买、付款、消费、扣款 → OUT(出账)。
- 收入、收款、退款到账 → IN(进账)。
# 输出格式(严格 JSON,不要代码块,不要解释)
{"final_amount": float, "currency": "CNY 或 JPY 或 USD 或 EUR 或 GBP", "flow_dir": "IN 或 OUT"}
# 输入
{{input}}
设计思路
第一步:把「加减规则」写成公式
财务流水里字段名五花八门(Subtotal、Tax、Points、Discount…), 但计算逻辑其实是固定的加减法。提示词直接用一条公式描述, 比逐字段解释更省事,也更不容易漏项。
第二步:处理「一位多义」的符号
- 千分位与小数点:欧洲写法
1.200,00与英美写法1,000.50意思相反, 这是本题最大的坑,必须在提示词里点明「两种写法都要认」。 ¥的歧义:同一个符号既可能是人民币也可能是日元。 题目给出的判据是「后面有没有小数点」,提示词要原样写进去。
第三步:积分按比例换算
5000 积分不是 5000 元,而是 50 元。把「100 积分抵 1 元」写清楚, 并给一个换算示例,避免模型按 1:1 抵扣。
第四步:固定输出格式
金额保留两位小数、货币与流向都限定枚举, 并且要求纯 JSON 输出。
易错点总结
1. 千分位与小数点搞反
1.200,00 若按英美习惯读成 1.2,结果会差三个数量级。
提示词必须显式覆盖两种写法。
2. 积分按 1:1 抵扣
忘记「每 100 积分抵 1 元」的换算比例,会把 5000 积分当成 5000 元。
3. ¥ 一律当成人民币
题目明确用「有没有小数点」区分 CNY 与 JPY,不能想当然。
4. 流向判反
「购买、付款」是出账 OUT;「收入、收款」是进账 IN,别按直觉写反。
扩展思考
- 若流水里有多种货币混合,需要先按汇率折算到统一币种。
- 可以增加
items字段记录明细,让结果可追溯(先定契约,再给边界例)。