用本地 Ollama 模型批量重写了 112 篇文章的 meta description(2026-10-23)
description 中位数只有 35 字,最短的原文就是 ForeverBlog——这不是"优化空间",是搜索展示文案根本不存在。
昨天已经做完 P0-P3 清单里的全部项,今天用户又问「如何提升曝光和流量」。同一个问题重复出现说明昨天的答案没落地。这次换了角度:不再列清单,先用数据定位真实瓶颈。
一、内容层体检(昨天没查的三项)
| 项目 | 实测 | 后果 |
|---|---|---|
description 长度 |
中位数 35 字,最短 6 字 | SERP 理想 120-155 字,太短时 Google 自己从正文随机截一段,展示文案不可控 |
| 站内链接 | 0 / 112 | 全站孤岛,权重不流动 |
| 配图 | 1 / 112 | 无图搜流量 |
| 正文长度 | 中位数 2897 字 | 够,不动 |
| 标题长度 | 中位数 43 字,100/112 超 30 字 | SERP 会截断,但不建议再改(昨天刚重写一轮) |
description 这一项最离谱——它本来是唯一能控制"搜索结果里显示哪段话"的地方,却被填成了标题的复制。
二、新工具 tools/articles/gen_desc.py
按痛点写 meta description,目标 110~150 字,禁止流水账复述代码步骤。参数:--dry-run / --limit N / --only <文件名子串> / --force。默认跳过已 ≥90 字的文章,幂等。
踩到的坑(重要):
- 🔴
re.subn用字符串做替换串会炸:遇到正文里的\w时抛re.PatternError: bad escape \w,整批在第 32 篇写入处崩掉——已改的 30 篇留着、剩下 81 篇没动。修法:subn(lambda m: "description: " + yq(desc), t, count=1)用 lambda 绕开转义解析 - 模型对「110
150 字」执行力不稳,实测出现过 222 / 258 字。两道防线:超 165 字带反馈单篇重试;仍超长 →155 之间找最后一个句读截断clamp()在 120
质检结果(前 33 篇):中位数 139 字,28/33 落在 110~165 合格区间,质量红旗 0 篇。
三、🔴 DeepSeek 余额耗尽(402)
批量跑到第 97 篇时 API 返回:
1 | HTTP Error 402 Payment Required |
key 是 ***,模型 deepseek-v4-pro。最终结果:65/112 篇已改(中位数 35 → 122 字),47 篇仍是旧短描述,0 篇超长。
连带影响:build_articles.py --auto 用的是同一个 key,所以 2026-10-24 08:30 的每日文章刷新会失败。今天 08:33 那次是欠费前跑完的(tmp/daily.last_success = 2026-10-23),不受影响。
四、✅ 改用本机 Ollama 跑完剩余 47 篇
用户问「能不能用本地模型,太费钱了」→ 本机早有 ollama 0.40.4(127.0.0.1:11434),装的是 qwen3.8-27b 的 3 个量化档 + nomic-embed-text,GPU 是 RTX 2080 Ti(11G)。
🔴 最关键的一个坑:这些模型 capabilities 含 thinking。不传 "think": false 时,num_predict 会被思考过程全部吃光——实测 2048 token 全烧在 reasoning、content 返回空串、耗时 170s 白跑。关掉后单篇只要 ~76 token / 5s。ollama 0.40 支持请求级 think 参数。
接入结果(gen_desc.py --engine local):
- 单篇 5~13s,47 篇 664s 跑完,0 失败
- 最终 112 篇:description 中位数 139 字,合格 109 篇,超长 0,<90 短描述 0
- 字数控制不稳定(实测 18~291 字),靠
clamp()+ 双向重试兜底才稳 - 本地模型还会把「序号|摘要:」格式前缀抄进正文 →
parse()必须按「竖线左边非数字」分支取右半段
文章生成也测了:qwen3.8-27b-iq2xxs 用真实素材(6753 字符)写出 1998 字 / 72s,validate() 一次通过。质量弱于 deepseek-v4-pro(会把「用户」写成第三人称、DESC 只有 27 字偏短),但作为免费兜底完全够用。
五、部署与线上验证
hexo g 增量只生成 163 files(只改了 front-matter,无需 clean),public/posts/ 112 个目录完整。deploy commit 89e026a,status --short 为 0、## master 无 ahead/behind。线上 blog.demohappy.top 抽查 description 已生效。
最终部署 commit 38f0a65,0 未提交、## master 同步。线上复检 ov0728/ov0910/ov1010 均为新描述。
六、给用户的判断(比工具本身重要)
112 篇是施工日志,搜索需求本来就接近零。 站内 SEO 天花板很低——description / 内链 / 配图只是「提升已经搜到的人」的转化率,不能制造流量。能从 0 到 1 的只有站外分发:从 112 篇里提炼「答案型」文章发到掘金/知乎。
已向用户提议下一步:①筛出 8-10 篇有外部搜索价值的 ②改写成 1500 字问题→排查→根因→解法结构。
遗留:
build_articles.py新增引擎开关:ARTICLE_ENGINE=local|deepseek(默认 deepseek),ARTICLE_FALLBACK_LOCAL=0可关降级。云端 HTTP 401/402/403 一律自动降级本地,并把降级原因打印到daily_refresh.log——修掉了「欠费 → 当天静默断更、且与素材断流长得一模一样」这个坑- 充值后重跑即可:
python tools/articles/gen_desc.py(幂等,只会处理那 47 篇 <90 字的)