审计日期: 2026-07-10
审计范围: 文章质量、自动化生成流程、数据抓取、工程代码、系统架构
项目规模: 238 篇中文文章 + 238 篇英文翻译,11ty 静态站,Vercel 部署
问题总数: 30 个(🔴 严重 5 个 / 🟡 中等 15 个 / 🟢 轻微 10 个)
问题描述: 新闻类文章的抓取器只获取标题和 URL,不提供文章正文。LLM 在仅收到 ~50-200 字符素材的情况下,被要求生成 3000-5000 字的"深度分析"。
数据证据:
{title, url, source},无正文代码位置: scripts/fetch-tech-news.mjs 各源的数据提取逻辑
// HackerNews 示例 — 只有 title 和 url
.map((item, i) => ({
rank: i + 1,
title: item.title,
url: item.url || `https://news.ycombinator.com/item?id=${item.id}`,
source: "hackernews",
sourceName: "HackerNews",
id: `hn-${item.id}`,
score: item.score || 0,
category: "tech",
// ← 没有 content / body / summary
}));
代码位置: scripts/daily-update.mjs 传给 generate-article.mjs 的参数
// news: AI 前沿 — 只传了 title 和来源信息
const article = articles[0];
filePath = await generateArticle(
"news",
{
topic: article.title,
context: `来源:${article.sourceName},链接:${article.url}${article.summary ? ",摘要:" + article.summary : ""}`
},
"AI 前沿,学术研究,技术突破"
);
影响: 文章本质上是用热搜标题作为写作提示,让 AI 自由创作,而非对真实新闻的摘要或分析。
修复建议:
问题描述: prompt 同时要求"不许编数据"和"必须含 4-5 个含具体数字的数据点",在素材不足的情况下形成结构性矛盾,迫使模型虚构精确数值。
代码位置: scripts/generate-article.mjs — news 类目的 system prompt
// 反捏造规则(COMMON_RULES)
【数据要求】
- 所有数据必须标注来源(如:据IDC统计、根据官方文档、实测数据等)
- 如果无法确认真实数据,用"据公开资料"、"行业估算"等模糊表述
- 禁止凭空编造精确数字(如"响应延迟123ms"、"准确率99.7%")
- 宁可少写数据,也不要写假数据
// 但 system prompt 的结构性要求:
## 四、行业冲击与数据支撑
用数据和事实说话。列出 4-5 个关键数据或趋势,每个必须包含具体数字并标注来源。
矛盾点: 当 LLM 只收到一个标题(如"Apple 整合 Gemini"),无法从素材中找到任何数据,但又被强制要求"4-5 个具体数字"——唯一出路就是编造。
实际表现: 新闻类文章中反复出现无法验证的精确数值:
影响: 这是最危险的 AI 内容风险——内部连贯、结构完整、数据"精确",但本质是虚构的科技新闻。
修复建议:
据XX来源 修饰的数值供人工审核问题描述: 所有 6 个类目的文章都遵循同一套 10-H2 骨架,读者在阅读第 2 篇后就能预测全部结构。
各类目骨架对比:
| 章节 | news | tools | tutorials | tips | software | resources |
|---|---|---|---|---|---|---|
| 1 | 背景与意义 | 产品定位 | 学习目标 | 问题原因 | 背景需求 | 学习路线图 |
| 2 | 核心原理 | 核心功能 | 前置知识 | 快速解法 | 核心功能 | 入门资源 |
| 3 | 技术架构 | 使用体验 | 环境搭建 | 彻底解法 | 使用体验 | 进阶资源 |
| 4 | 数据支撑 | 竞品对比 | 核心概念 | 场景解法 | 竞品对比 | 工具平台 |
| 5 | 落地案例 | 实际案例 | 步骤详解1 | 实际案例 | 实际案例 | 社区推荐 |
| 6 | 对比表格 | 性能基准 | 步骤详解2 | 性能基准 | 性能基准 | 书籍推荐 |
| 7 | 挑战局限 | 定价策略 | 代码深入 | 常见误区 | 定价策略 | 阶段对比 |
| 8 | 适用人群 | 踩坑指南 | 验证测试 | 优化技巧 | 踩坑指南 | 阶段建议 |
| 9 | 未来预判 | 进阶技巧 | FAQ | 日常维护 | 进阶技巧 | 常见误区 |
| 10 | 总结 | 总结 | 下一步 | 总结 | 总结 | 总结 |
影响: 阅读体验机械、可预测,缺乏惊喜感和原创性。对 SEO 来说,Google 的 Helpful Content Update 对公式化内容的降权风险。
修复建议:
问题描述: 95/238 篇(40%)使用"我的真实经验/踩坑实录"标题模板。
常见模式:
我处理了N个X的真实经验:Y工具踩坑实录我用X踩过的N个坑:Y实战总结N天深度体验X:说几句大实话影响: 读者审美疲劳,品牌调性单一。
修复建议:
validate-article.mjs 中增加标题模板检测,对高频模板发出警告问题描述: 尽管 prompt 明确禁止 15+ 个 AI 惯用过渡词,仍有 36/238 篇(15%)包含被禁词汇。
被禁词列表(COMMON_RULES):
此外、另外、至关重要、值得注意的是、综上所述、总而言之、显著提升、不仅如此、毫无疑问、不言而喻、众所周知、不难看出、由此可见、总而言之、归根结底
代码位置: scripts/generate-article.mjs 第 77-130 行(COMMON_RULES 常量)
影响: 15% 的文章仍有明显 AI 写作痕迹,拉低整体质量。
修复建议:
validate-article.mjs 中增加被禁词检测,输出违规统计问题描述: 39/238 篇(16%)包含 emoji(💡⚠️📌等),但 prompt 明确禁止用 emoji 装饰。
影响: 轻微,但反映 prompt 约束力不足。
修复建议:
validate-article.mjs 中增加 emoji 检测[\u{1F600}-\u{1F64F}\u{1F300}-\u{1F5FF}...] 清除所有 emoji问题描述: 用户案例中反复出现"小王/老张/小林"等泛化角色,且背景高度雷同。
常见模式:
影响: 案例缺乏真实感,读者难以产生共鸣。
修复建议:
问题描述: 同一天批量产出 5 篇同主题系列文(如 5 篇 Vibe Coding),单篇内容稀薄但覆盖大量长尾关键词。
影响: 单篇质量低,可能被 Google 识别为 Thin Content 或 Doorway Page。
修复建议:
问题描述: 从 AI 生成到上线生产,全流程无人工介入。
当前流程:
LLM 生成 → 自动翻译 → 自动 commit → GitHub Actions → Vercel 部署 → 上线
缺失环节:
影响: 幻觉、坏链、低质内容、错误数据直达生产环境,且被 git 永久存档、被搜索引擎索引。
修复建议:
staging 分支,Vercel 自动部署预览,人工确认后 merge 到 main问题描述: 中文标题经过 slug 正则处理后变为空字符串,导致文件名回退为 {category}-article。
代码位置: scripts/generate-article.mjs 中的 slug 生成逻辑
// 当前逻辑(伪代码)
const slug = title
.toLowerCase()
.replace(/[^a-z0-9\s-]/g, "") // ← 清除所有非英文字符,中文全被清光!
.replace(/\s+/g, "-");
// 中文标题 "苹果整合Gemini" → slug = "" → 回退为 "news-article"
影响:
2026-07-10-tools-article.md、2026-07-10-news-article.md修复建议:
pinyin-pro 库)将中文标题转为拼音 slug2026-07-10-tools-01)问题描述: 中文 5000 字约消耗 7500 tokens,加上 markdown 格式标记,接近 8000 上限。
代码位置: scripts/generate-article.mjs
const response = await callAI(systemPrompt, userPrompt, {
temperature: 0.7,
max_tokens: 8000, // ← 上限
});
影响: 文章可能在任意位置被截断(通常在最后一个章节中段),产生不完整内容。
修复建议:
max_tokens 提升至 16384(NVIDIA/OpenRouter 均支持)问题描述: 每篇文章由 LLM 一次生成,无 outline→expand、无 self-critique、无迭代优化。
影响: 单次生成的质量天花板低,无法修正方向性错误。
修复建议:
filtered[0]问题描述: daily-update.mjs 中所有新闻选择逻辑都取过滤后第一篇文章。
const article = articles[0]; // ← 永远是第一个
影响: 每周同一天取同一来源同一话题,多样性退化。
修复建议:
articles[Math.floor(Math.random() * articles.length)]] 随机选取问题描述: 两个脚本使用不同的英文文件命名约定。
| 脚本 | 输出路径 |
|---|---|
generate-article.mjs |
content/articles/en/{slug}-en.md |
daily-update.mjs |
content/articles/en/{slug}.md |
影响: retry-translate.mjs 需要做归一化匹配来弥合差异,增加复杂度和出错概率。
修复建议: 统一为 content/articles/en/{slug}.md(无 -en 后缀),清理现有重复文件。
问题描述: 存在同一中文话题对应多个不同英文版的情况。
实际案例:
last30days-skill-ai-en.md(版本 A):关于 AI 技能聚合工具last30days-skill-ai.md(版本 B,无 -en 后缀):关于 AI 时代的信息聚合器两版英文内容完全不同,案例不同、对比表不同、甚至核心论点不同。
影响: SEO 自相残食(duplicate content),读者困惑。
修复建议:
generate-translation-pairs.js 检测并清理重复问题描述: prompt 要求"不编工具名",但无程序验证文章中 URL 是否真实可达。
影响: 文章中的链接可能指向 404 页面、已失效工具、或完全不存在的网站。
修复建议:
问题描述: AI 生成的文章未与源材料做查重,无法发现逐字复制。
影响: 如果 LLM 记忆了训练数据中的某篇文章并逐字复现,可能产生版权问题。
修复建议:
问题描述: 当前 QA 脚本只能检查表面特征。
当前检查项:
无法检测:
修复建议:
问题描述: 抓取器读取列表页/标题/摘要,从不抓取文章正文。
各源数据字段:
| 数据源 | title | url | summary | content |
|---|---|---|---|---|
| HackerNews | ✅ | ✅ | ❌ | ❌ |
| 36氪 | ✅ | ✅ | ❌ | ❌ |
| 虎嗅 | ✅ | ✅ | ❌ | ❌ |
| IT之家 | ✅ | ✅ | ❌ | ❌ |
| 少数派 | ✅ | ✅ | ❌ | ❌ |
| 爱范儿 | ✅ | ✅ | ❌ | ❌ |
| 量子位 | ✅ | ✅ | ❌ | ❌ |
| TechCrunch | ✅ | ✅ | ❌ | ❌ |
| VentureBeat | ✅ | ✅ | ❌ | ❌ |
| The Verge | ✅ | ✅ | ❌ | ❌ |
| arXiv | ✅ | ✅ | ✅ (150字) | ❌ |
| 机器之心 | ✅ | ✅ | ✅ (100字) | ❌ |
影响: 见问题 #1。这是整个内容质量问题的根源——无素材则无摘要,只有生成。
修复建议:
@postlight/mercury-parser 或 mozilla/readability 抓取全文问题描述: daily-update.yml(GitHub Actions)和 daily-update.mjs 都调用了 Awesome/PH/V2EX 抓取。
代码位置: .github/workflows/daily-update.yml
# workflow 中抓取
- run: node scripts/fetch-github-awesome.mjs
- run: node scripts/fetch-product-hunt.mjs
- run: node scripts/fetch-v2ex.mjs
# daily-update.mjs 内部又抓取一次
影响: 双倍的 API 调用、网络请求和构建时间。
修复建议: 删除 workflow 中的抓取步骤,只保留 daily-update.mjs 内部的抓取。
问题描述: 话题相关性仅靠关键词列表匹配。
代码位置: scripts/daily-update.mjs — TECH_KEYWORDS 常量
影响: 可能放过低质量话题(标题含"AI"但内容空洞),也可能误杀优质话题(标题不含关键词但内容相关)。
修复建议:
问题描述: ai-concepts.json、awesome-list、v2ex 数据在不同周期更新,可能枯竭或过时。
影响: 教程类文章可能重复讲解同一概念,或讲解已废弃的工具。
修复建议:
问题描述: Tencent 逐段翻译仅 200ms 延迟,3000 字文章(30-50 段)连续调用。
代码位置: scripts/generate-article.mjs — tencentTranslate 函数
// 每段之间仅 200ms 延迟
await new Promise(r => setTimeout(r, 200));
影响: 可能触发 Tencent Cloud 限流,导致翻译失败或降级为 [TODO: needs translation]。
修复建议: 将延迟提升至 500-1000ms,或实现批量翻译接口。
问题描述: generate-search-index.js 存在分词缺陷,238 篇文章只索引了 4 篇。
代码位置: scripts/generate-search-index.js
影响: 站点搜索功能基本失效,用户无法搜索到绝大多数文章。
修复建议:
nodejieba 或 @node-rs/jieba 做中文分词问题描述: 根目录和 scripts/ 散布 50+ 个调试残留文件。
典型文件:
check-*.js / check-*.mjs — 各种检查脚本fix-*.js / fix-*.mjs — 各种修复脚本_test-*.js — 测试文件_*.txt — 临时输出1.md — 不明文件影响: 项目混乱,新人上手困难,可能误将调试文件当作生产代码。
修复建议:
scripts/legacy/ 或 scripts/dev/.gitignore 中增加 check-*、fix-*、_test-* 模式问题描述: 所有 prompt 使用 flat text,未用 JSON mode、few-shot、结构化输出约束。
影响:
# 标题匹配)修复建议:
response_format: json_object 模式问题描述: 见问题 #18。
问题描述: 系统要求 AI "伪装人类",但同时又用工业化模板批量生产。
矛盾三角:
影响: 产出内容在"像人"和"是 AI"之间摇摆,形成恐怖谷效应。
修复建议:
问题描述: 未见 Vercel/nginx 配置中压缩 HTML/CSS/JS。
影响: 页面加载性能次优,Core Web Vitals 可能不达标。
修复建议: 在 vercel.json 中增加 headers 配置启用 gzip/brotli。
问题描述: 238 篇文章、~48 页分页,每次构建全量重建。
影响: 构建时间随文章增长线性增加。
修复建议: 11ty 本身有增量构建支持(--incremental),确保启用。
| 优先级 | 问题 | 预计工时 | 理由 |
|---|---|---|---|
| P0 | #10 Slug 生成 Bug | 1h | 文件静默覆盖,数据丢失 |
| P0 | #1 新闻无原始素材 | 4-8h | 内容质量问题的根源 |
| P0 | #2 结构性捏造数据 | 2-4h | 最危险的 AI 内容风险 |
| P0 | #9 零人工审核 | 2-4h | 错误直达生产 |
| 优先级 | 问题 | 预计工时 | 理由 |
|---|---|---|---|
| P1 | #19 抓取器增加正文抓取 | 4-6h | 解决 P0 #1 的具体实现 |
| P1 | #11 max_tokens 截断 | 0.5h | 一行代码修改 |
| P1 | #14 翻译文件命名分裂 | 1h | 消除双 convention 混乱 |
| P1 | #15 同一话题多版本 | 2h | SEO 自残风险 |
| P1 | #24 搜索索引 Bug | 2-4h | 搜索功能基本失效 |
| 优先级 | 问题 | 预计工时 | 理由 |
|---|---|---|---|
| P2 | #3 文章骨架公式化 | 4-8h | 需要设计多套模板 |
| P2 | #5 AI 腔词禁令 | 1-2h | 增加后处理替换 |
| P2 | #18/27 validate 增强 | 3-5h | 提升 QA 覆盖率 |
| P2 | #20 重复抓取 | 0.5h | 删除冗余步骤 |
| P2 | #26 Prompt 结构化 | 3-5h | 提升输出稳定性 |
| 优先级 | 问题 | 预计工时 | 理由 |
|---|---|---|---|
| P3 | #4 标题模板 | 2h | 增加模板多样性 |
| P3 | #7 案例同质化 | 1-2h | prompt 调整 |
| P3 | #8 SEO 内容簇 | 2-4h | 合并或差异化 |
| P3 | #12 迭代优化 | 8-16h | 两步法生成 |
| P3 | #13 固定取第一篇 | 0.5h | 随机化 |
| P3 | #16 链接验证 | 2-3h | 后处理脚本 |
| P3 | #17 抄袭检测 | 4-8h | 外部工具集成 |
| P3 | #21 关键词过滤 | 2-4h | 语义分类 |
| P3 | #22 概念库耗尽 | 2h | 标记+定期更新 |
| P3 | #23 翻译限流 | 0.5h | 增加延迟 |
| P3 | #25 脏文件清理 | 1h | 整理项目 |
| P3 | #28 反 AI 矛盾 | 持续 | 定位调整 |
| P3 | #29 静态压缩 | 0.5h | 配置修改 |
| P3 | #30 增量构建 | 0.5h | 启用 --incremental |
| 文件 | 作用 | 涉及问题 |
|---|---|---|
scripts/daily-update.mjs |
自动化编排器 | #1, #9, #13, #14, #20, #21 |
scripts/generate-article.mjs |
文章生成核心 | #2, #5, #6, #10, #11, #12, #23, #26 |
scripts/fetch-tech-news.mjs |
新闻抓取 | #1, #19 |
scripts/validate-article.mjs |
质量检查 | #5, #6, #18, #27 |
scripts/retry-translate.mjs |
翻译回填 | #14, #15 |
scripts/generate-search-index.js |
搜索索引 | #24 |
scripts/generate-translation-pairs.js |
翻译对生成 | #15 |
.github/workflows/daily-update.yml |
CI 工作流 | #9, #20 |
.eleventy.js |
11ty 配置 | #30 |
vercel.json |
部署配置 | #29 |
config/translation-pairs.json |
中英映射 | #15 |
本报告由自动化代码审计生成,基于对项目全部核心脚本、模板、配置文件和内容样本的逐行分析。所有问题均有代码级证据支撑。