
上一篇写的是踩了什么坑。这一篇只写怎么做,能抄的直接抄。
先说明一句:下面的数字和字段都是俺这站的,抄的时候必须换成你自己的。 提示词可以抄,阈值不行。
node);第一步:先测你的检索到底会不会返零结果。
造 20 个词去搜:纯乱码、纯英文、生造的中文词、正常但冷门的需求。把每次的 total 记下来。
如果每个词都能返 20 条以上,说明你的检索也是模糊匹配,total === 0 这个条件基本用不上——这是俺踩的第一个坑。
第二步:定两级触发。
total === 0,一条都没有;total > 0,但前 3 条跟查询没有一个共同二元词。二元词的判断不长:
// 中文按两个字滑窗,英文按三个字母以上的单词
const cjk = (q.match(/[\u4e00-\u9fa5]/g) || []).length;
if (cjk >= 2) {
for (let i = 0; i + 1 < q.length; i++) {
if (hay.includes(q.slice(i, i + 2))) return true; // 命中任一就算相关
}
return false;
}
return q.split(/[^a-z0-9]+/).some(w => w.length >= 3 && hay.includes(w));B 级触发的时候,百度那块追加在站内结果下面,不替换。万一站内真有一两条对的,两块并存比误删安全。
第三步:接口别抓网页。
服务端去请求搜索结果页,会被跳到验证页(滑块),换 UA、加 Referer 都没用。用官方搜索接口,字段要五个就够:标题、链接、摘要、站点名、日期。
第四步:结果要过三刀。
三刀砍完一条不剩,就整块不渲染,回到「去百度搜」的文字出口。宁可没有,也别挂一排附件下载页。
第五步:给兜底自己加护栏。
超时 2.2 秒、负缓存 6 小时(查过没结果的词不再问)、正缓存 30 天、每进程每小时最多 200 次外呼、同词并发只发一次。
搜索页是公开入口,不加这几条,一晚上就能被人拿随机词刷出账单。
第一步:先重算页面数。 俺记的是 349,脚本算出来 401。差的 52 个页面此前只有规则句,没有结论段落。别用记忆里的数字开工。
第二步:提示词。 俺用的是这一版,可以直接抄:
给每对工具写一段 120-180 字的中文建议。硬约束:
1. 先场景后选择:先说"什么人什么情况下选 A",再说另一种情况选 B,
场景要具体(写周报 / 给客户出方案 / 手机上随手问 / 处理几十页 PDF);
2. 只能引用下面给出的字段,不许出现价格数字、版本号、公司背景、用户量;
3. 不评判谁更好,只说谁更适合什么;
4. 不要"综上所述 / 各有千秋 / 建议根据实际需求选择";
5. 两者确实不是同类工具,返回空字符串 ""。工具字段就给五样:一句话、主要用途、价格、适合谁、有没有免费层。给多了模型就开始编。
第三步:三道校验,缺一不可。
第四步:不合格就删。
单条重试五次还不行,直接删掉这一条,页面退回原来的规则句。
宁可这一页没有段落,也不能留半句话在页面上。
第一步:把旧稿的毛病列成黑名单。
「这一页」「这里收录」「这类产品」「本子类」「一是…二是…三是…」——这些词一个都不许出现在开头。
第二步:四类开头轮着用。
一批四条,四种各来一个。同一批里重样,一眼就看出来是批量生成的。
第三步:长度 110–165,只写三句。 第一句是什么、第二句有哪几类差别、第三句怎么挑。
第四步:查重看开头四个字。
俺这 40 条跑完,同一个分类里有 3 组开头撞了(两个都是「想把脑子」)。加一行判断就能捞出来,别靠眼睛。
第五步:跑题和堆品牌名的单条重写。
有两类必须重写:一是把「设计素材」写成了建站(跑题),二是一段里点了六个产品名。导语里不写品牌——站点会下线、会改名,写死了第二年就是错的。
第一步:给候选表,不让模型编 URL。
每条问题配一张小表:同分类问答 10 条、跨分类热门 6 条、相关页面 4 个,全部带编号。
第二步:一次四条问题,每条出三个追问 + 目标编号。
只返回 JSON:{"1":[{"q":"追问句","to":3}, ...]}
追问 10-30 字,像读者接着问的下一个问题,不要照抄目标标题。
三条方向不同:深挖细节 / 换场景或人群 / 回到入口。
至少一条指向"页面:"开头的目标,三条不能指向同一个。第三步:校验四件事。
三条都在、编号都合法、至少一条是页面(不是全在问答里打转)、不重复也不指向自己。
第四步:URL 归一。
子类页有两种写法,带不带前缀,两个都返回 200,但 canonical 只认一种。内链要是指到别名上,等于自己给自己造重复页面。
第五步:上线前逐页 curl。
110 条问答、330 条链接、111 个落点,跑一遍全部 200 才算完。别信「应该没问题」。
俺这次用到的脚本,按顺序:
干什么 | 脚本 |
|---|---|
对比页结论批量生成 | gen-vs-pick-v2.js |
对比页结论逐条修 | fix-vs-picks.js |
子类导语批量生成 | gen-subcat-desc-v2.js |
子类导语单条重写 | fix-subcat-desc.js |
问答追问生成 | gen-qa-followups.js |
上线前校验 | validate-vs.js、validate-qa.js、check-vs-pages.js |
四条纪律:
db.json 之前先停服务,否则进程退出时内存里的旧库会把你的修改整份盖回去;data/ 下,按 mtime 热加载,改完不用重启;build-release.sh,版本号、changelog、包、仓库一次做完;server.js、version.json、几个数据文件的 md5 要逐项对上。还有一条容易忘:清 nginx 的页面缓存。不然你改完了,自己刷新看到的是旧页面,会以为没生效。
第一,数字全换。120–180 字是俺站的节奏,你的页面可能适合 80–120。
第二,提示词里的字段换成你库里真有的。俺这边有「适合谁」「有免费层」,你没有就别写进提示词,模型会替你编。
第三,先跑 5 条再全量。俺第一批就是直接跑 400 条,结果提示词里一个「A/B」把 60 多条写坏了,返工两轮。
真正省时间的不是生成,是校验。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。