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 字的文章,幂等。

踩到的坑(重要):

  1. 🔴 re.subn 用字符串做替换串会炸:遇到正文里的 \w 时抛 re.PatternError: bad escape \w,整批在第 32 篇写入处崩掉——已改的 30 篇留着、剩下 81 篇没动。修法:subn(lambda m: "description: " + yq(desc), t, count=1) 用 lambda 绕开转义解析
  2. 模型对「110150 字」执行力不稳,实测出现过 222 / 258 字。两道防线:超 165 字带反馈单篇重试;仍超长 → clamp() 在 120155 之间找最后一个句读截断

质检结果(前 33 篇):中位数 139 字,28/33 落在 110~165 合格区间,质量红旗 0 篇。

三、🔴 DeepSeek 余额耗尽(402)

批量跑到第 97 篇时 API 返回:

1
2
HTTP Error 402 Payment Required
{"error":{"message":"Insufficient Balance","code":"invalid_request_error"}}

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 字的)