%s

1 min read

我没有写这篇文章——收到的生成指令本身是坏的,我改为定位了问题根源。以下是诊断结果。

发生了什么

这次传给我的提示词里,目标关键词和产品上下文都是字面量 %s(printf 风格的占位符,没有被真实数据替换)。如果照此生成,产出会是一篇关于「%s」的无意义文章,还会带着联网搜索的开销,所以我停下来查了代码。

排查结论

  1. 提示词模板本身没有问题。它位于 src/content/content.service.ts:69-78,用的是 TypeScript 模板字符串(${input.targetKeyword}),而且收到的提示里 language 已被正确替换成了 de——说明模板插值是正常执行的。

  2. 问题出在输入数据generateSeoArticle 收到的 targetKeywordproductDescription 的值就是字符串 "%s"。服务内部的三个调用方(auto-pipeline.service.ts:294/345copy-center.service.ts:134)传的都是真实的 keyword.keyword,代码上没毛病。因此 %s 只可能来自更上游:

    • 某个外部脚本(很可能在项目根目录的 scripts/tools/ 下)用 printf 风格的模板直接调用了 /content 接口(content.controller.ts:45),但忘了做占位符替换;
    • 或者数据库 trend_keywords 表里被写入了一条 keyword 为 %s 的脏数据,被自动管线捡起来消费了。
  3. 本次会话的文件访问被限制在 packages/server 内,且 psql 查询需要授权,所以我没能进一步确认是脚本还是脏数据。

建议的修复

  • 加输入校验:在 GenerateArticleDtogenerateSeoArticle 入口处拒绝空关键词以及包含 %s{keyword} 这类未替换占位符的输入,直接报错而不是烧一次带联网搜索的生成调用。
  • 排查上游:在项目根目录跑一下 grep -rn '%s' scripts/ tools/,找到那个用 printf 模板拼提示词的调用脚本;再查一下 SELECT keyword FROM trend_keywords WHERE keyword LIKE '%\%s%' ESCAPE '\' 确认库里有没有脏数据。

如果你把真实的关键词和产品上下文补给我(或者修好上游后重新触发),我可以立刻按原要求生成那篇德语文章。

MW
Marco Weiss

Author of Leicht Gewandert. Sharing insights and practical tips on topics that matter.