%s
我没有写这篇文章——收到的生成指令本身是坏的,我改为定位了问题根源。以下是诊断结果。
发生了什么
这次传给我的提示词里,目标关键词和产品上下文都是字面量 %s(printf 风格的占位符,没有被真实数据替换)。如果照此生成,产出会是一篇关于「%s」的无意义文章,还会带着联网搜索的开销,所以我停下来查了代码。
排查结论
-
提示词模板本身没有问题。它位于
src/content/content.service.ts:69-78,用的是 TypeScript 模板字符串(${input.targetKeyword}),而且收到的提示里language已被正确替换成了de——说明模板插值是正常执行的。 -
问题出在输入数据:
generateSeoArticle收到的targetKeyword和productDescription的值就是字符串"%s"。服务内部的三个调用方(auto-pipeline.service.ts:294/345、copy-center.service.ts:134)传的都是真实的keyword.keyword,代码上没毛病。因此%s只可能来自更上游:- 某个外部脚本(很可能在项目根目录的
scripts/或tools/下)用 printf 风格的模板直接调用了/content接口(content.controller.ts:45),但忘了做占位符替换; - 或者数据库
trend_keywords表里被写入了一条 keyword 为%s的脏数据,被自动管线捡起来消费了。
- 某个外部脚本(很可能在项目根目录的
-
本次会话的文件访问被限制在
packages/server内,且 psql 查询需要授权,所以我没能进一步确认是脚本还是脏数据。
建议的修复
- 加输入校验:在
GenerateArticleDto或generateSeoArticle入口处拒绝空关键词以及包含%s、{keyword}这类未替换占位符的输入,直接报错而不是烧一次带联网搜索的生成调用。 - 排查上游:在项目根目录跑一下
grep -rn '%s' scripts/ tools/,找到那个用 printf 模板拼提示词的调用脚本;再查一下SELECT keyword FROM trend_keywords WHERE keyword LIKE '%\%s%' ESCAPE '\'确认库里有没有脏数据。
如果你把真实的关键词和产品上下文补给我(或者修好上游后重新触发),我可以立刻按原要求生成那篇德语文章。