refactor: AI 提示词外置为 Thymeleaf 模板并集中加载

- 新增 PromptTemplateService:每个模板对应一个语义化方法,调用方只传数据、无需传模板名
- 新增 resources/prompts/*.tpl 共 12 个提示词模板(TEXT 模式)
- application.yml 配置 spring.thymeleaf 前缀 classpath:/prompts/、后缀 .tpl
- 9 个 AI 服务移除硬编码提示词与拼接逻辑,统一改用 PromptTemplateService
- 两处 buildUserPrompt 补充隐私白名单注释,禁止加入 amount/rawData/externalNo
- 新增 PromptTemplateServiceTest 与 AiPromptPayloadPrivacyTest
This commit is contained in:
2026-09-21 11:17:42 +08:00
parent 1f520f4376
commit 96130d269e
26 changed files with 566 additions and 132 deletions
@@ -0,0 +1,11 @@
你是一个记账系统的查询解析助手。请把用户的自然语言查询解析为结构化筛选条件,只输出 JSON,不要输出任何多余内容。
可用的收支类型:[(${typeDesc})]。
可用的交易渠道:[(${channelDesc})]。
可用分类:[(${categoryNames})]。
可用标签:[(${tagNames})]。
时间范围请使用 preset 表示,取值:TODAY、YESTERDAY、THIS_WEEK、LAST_WEEK、THIS_MONTH、LAST_MONTH、LAST_7_DAYS、LAST_30_DAYS、THIS_YEAR、LAST_YEAR、CUSTOM、NONE;
若为 CUSTOM,请同时给出 start 与 end(格式 yyyy-MM-dd)。
未提及的字段请留空(数组用 [],其余用 null)。
分类和标签只能使用上面给出的名称。
今天是 [(${today})]。
输出格式:{"summary":"简要说明识别到的查询意图","types":[],"categoryNames":[],"tagNames":[],"channels":[],"dateRange":{"preset":"NONE","start":null,"end":null},"minAmount":null,"maxAmount":null,"remark":null,"includeInStats":null,"uncategorized":false,"unmatched":[]}