尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

ContentIQ实践:用规则引擎与LLM构建发布前内容质量检查工具

ContentIQ实践:用规则引擎与LLM构建发布前内容质量检查工具 如果你维护过技术博客、产品文档或面向用户的帮助中心大概率经历过下面这种场景文章写完了排版也做了点下发布按钮过了几个小时阅读量仍然是个位数。更麻烦的是有用户留言说看不懂或者搜索流量来了但跳出率极高再回去检查才发现内容结构、关键词密度、标题表达甚至事实准确性都存在问题。问题出在哪很多时候不是写作能力不行而是“发布”这个动作缺少一道质量闸门。代码有 CI/CD 流水线有 lint、单测、代码 review但内容发布往往是一个人写完直接上线。ContentIQ 想解决的正是这个问题在内容发布之前对质量做一次系统化评估找出薄弱环节并给出可执行的优化建议。这篇文章不打算只复述项目介绍。我会围绕 ContentIQ 的定位拆解这类“发布前内容质量评估工具”的核心设计思路、实现路径和工程落地方式。即使你不想直接用现成工具读完也能照着自己搭一套内容质量检查服务把它接入博客、CMS 或文档发布流程。文章会覆盖质量评估维度设计、规则引擎与 LLM 结合的实现思路、完整代码示例、流水线集成方式和常见坑点。1. 为什么要关注“发布前的内容质量”内容质量评估不是一个新概念。传统编辑流程里有校对、审稿、事实核查这些环节保证了出版物质量。但到了互联网时代内容生产节奏明显变快尤其是技术博客、产品更新说明、帮助文档这类内容往往由工程师或产品经理兼职撰写缺少专业编辑团队质量把关被压缩到极限。很多人以为内容质量主要靠“写得好不好”实际工程视角下它应该是一个可以被度量、被检查、被自动化的流程问题。发布前检查内容有没有覆盖用户搜索意图、标题是否清晰、代码块是否完整、关键结论是否前置、有没有明显的事实性错误这些都可以在发布前完成不需要等到线上反馈再补救。ContentIQ 类工具的价值在于把“质量”从主观感受变成可量化的检查项。它不做文学评论而是从内容完整性、可读性、SEO 表现、专业性、用户体验等维度打分并指出具体哪一段需要修改、为什么修改、改成什么样更好。哪些人最应该关注这类工具技术博客作者希望提升文章收录和阅读完成率。产品技术团队需要维护帮助文档和 API 文档质量。内容运营团队批量生产页面时希望控制质量下限。独立开发者一个人包揽写作和发布缺少第二双眼睛审校。对于这些场景内容质量工具不是锦上添花而是把编辑经验固化成可复用规则。它不能让烂文章变成爆款但可以避免明显低于水准的内容带着问题上线降低后续返工和用户流失成本。2. ContentIQ 的核心定位与内容质量评估维度从项目名称看ContentIQ 的关键词是 IQ 和 Content 的组合核心语义接近“内容智能评估”。从工程实现的角度理解这类工具通常做三件事解析内容、对照质量维度评分、生成可执行优化建议。要设计一套可用的质量评估体系先要把“质量”拆成机器可检查的维度。以下六个维度在高阅读量技术文章中出现的频率最高也适合做成自动化检查项评估维度检查什么典型检查项完整性用户想获取的信息是否都覆盖是否包含前提条件、操作步骤、结果验证可读性阅读门槛高不高、结构是否清晰段落长度、句子复杂度、小标题是否分段SEO 相关性搜索场景下能否命中用户意图标题是否含关键词、首段是否快速点题、H2/H3 是否覆盖长尾词专业准确性术语、代码、配置是否可信代码块是否完整、版本号是否明确、命令是否可执行用户体验扫读时能否快速获取结论是否前置结论、是否使用列表和表格、关键结论是否加粗合规性是否违反平台或法律要求敏感词、隐私信息、政策相关表述这套维度拆解的核心逻辑是不要试图用机器评价“文笔好坏”而是检查与读者完成路径强相关的可验证因素。可读性和 SEO 可以量化专业准确性可以设置代码块和命令校验规则完整性和用户体验可以基于章节结构分析得出。ContentIQ 这类工具的底层判断力就看维度设计是否贴近真实阅读场景。如果维度太玄比如“文章是否有灵魂”机器没法落地如果维度太浅只统计字数又无法真正优化内容。好的设计应该介于两者之间用可检查的规则逼近人的编辑判断。3. 内容质量评估引擎的架构设计思路从零实现一个 ContentIQ 式的质量评估服务架构上可以先拆成五个模块再按照模块边界逐步实现。整体流程是内容输入进入解析层把 Markdown、HTML 或纯文本转成结构化文档树分析层在文档树上执行检查规则优化建议层汇总问题并生成修改意见输出层把结果渲染成报告如果接入了发布流水线还会回调到 CI 或 CMS 系统。模块之间的关系可以用下面这段伪代码描述它会帮助你建立整体印象输入内容 - 解析器Parser将 Markdown/HTML 转为文档结构 - 检查器Checker按质量维度执行规则集合 - 报告生成器Reporter汇总分数与优化建议 - 发布适配器Publisher Adapter对接 CI/CMS/API这里面最关键的模块是检查器。它的工作方式分为三层第一层是规则引擎层。负责执行确定性检查比如标题是否存在、首段字数是否过短、是否有代码块、H2 数量是否合理、关键词是否出现在标题和首段。这一层不依赖外部模型速度快、成本低、结果确定。第二层是 LLM 评估层。负责语义层面的检查比如“结论是否前置”“表达是否清楚”“代码解释是否充分”“是否覆盖了用户的潜在疑问”。这一层需要调用大模型接口适合做开放性问题判断但要注意成本和延迟。第三层是融合打分层。把规则检查和 LLM 评估的结果按权重合并得到分维度分数和总分。常见做法是规则层作为硬性指标LLM 层作为软性指标任何一层发现严重问题都会触发“建议修改后再发布”的结论。这种分层设计的好处是可以只保留规则引擎做低成本检查也可以在内容质量要求高的场景叠加 LLM 评估兼顾成本和质量。4. ContentIQ 规则引擎实现基于 Python 的最小示例下面我们用 Python 实现一个最小但可运行的内容质量评估服务。它包含两个核心能力读取 Markdown 内容、执行一组内容质量检查规则并输出报告。先看代码结构contentiq/ ├── analyzer/ │ ├── __init__.py │ ├── parser.py │ ├── rules.py │ └── reporter.py ├── main.py └── requirements.txt首先是 Markdown 解析模块。这一步的目的是把 Markdown 文本解析成结构化数据方便后续规则逐项检查。# 文件路径analyzer/parser.py import re from dataclasses import dataclass from typing import List, Optional dataclass class ArticleNode: title: str headings: List[str] paragraphs: List[str] code_blocks: List[str] word_count: int character_count: int class MarkdownParser: CODE_BLOCK_PATTERN re.compile(r.*?, re.DOTALL) HEADING_PATTERN re.compile(r^(#{1,6})\s(.)$, re.MULTILINE) def parse(self, markdown_text: str) - ArticleNode: # 提取代码块避免后续可读性统计被代码干扰 code_blocks self.CODE_BLOCK_PATTERN.findall(markdown_text) text_without_code self.CODE_BLOCK_PATTERN.sub(, markdown_text) # 提取标题行 headings [ m.group(2).strip() for m in self.HEADING_PATTERN.finditer(text_without_code) ] # 清理标记符号统计正文 clean_text re.sub(r[#*_\-], , text_without_code) clean_text re.sub(r\[(.*?)\]\(.*?\), r\1, clean_text) paragraphs [ p.strip() for p in clean_text.split(\n) if p.strip() and not p.strip().startswith((#, ![, |)) ] # 标题优先取第一个一级或二级标题 title for h in headings: if h.strip(): title h.strip() break word_count len(clean_text.split()) character_count len(clean_text.replace( , )) return ArticleNode( titletitle, headingsheadings, paragraphsparagraphs, code_blockscode_blocks, word_countword_count, character_countcharacter_count, )解析逻辑里有几个容易踩坑的地方值得单独说明。第一代码块必须先提取再统计。如果不先把代码块剔除代码里的英文单词会自动进入正文字数统计可读性分数会被严重干扰。第二Markdown 链接需要把链接地址去掉只保留显示文本否则 URL 中的英文单词会污染词频统计。第三表格行|开头的内容剔除与否取决于你的统计口径。如果表格内容本身有助于表达保留也可以但如果做的是纯文本可读性分析建议剔除。接下来是规则引擎模块。这里实现一组可组合的检查规则每个规则独立成函数。# 文件路径analyzer/rules.py from dataclasses import dataclass from typing import Callable, List from .parser import ArticleNode dataclass class CheckResult: rule_name: str passed: bool score: int suggestion: str RuleFn Callable[[ArticleNode], CheckResult] MIN_WORDS 300 MIN_PARAGRAPHS 5 MIN_HEADINGS 3 def check_word_count(node: ArticleNode) - CheckResult: passed node.word_count MIN_WORDS suggestion if passed else f正文偏短建议不少于 {MIN_WORDS} 字当前为 {node.word_count} 字。 return CheckResult(正文长度, passed, 20 if passed else 10, suggestion) def check_paragraph_count(node: ArticleNode) - CheckResult: passed node.paragraphs and len(node.paragraphs) MIN_PARAGRAPHS suggestion if passed else f段落数量过少建议至少 {MIN_PARAGRAPHS} 段便于分层阅读。 return CheckResult(段落结构, passed, 15 if passed else 5, suggestion) def check_heading_structure(node: ArticleNode) - CheckResult: has_h2 any(h.startswith(## ) for h in []) for heading in node.headings: # 简单判断是否包含二级标题 pass passed len(node.headings) MIN_HEADINGS suggestion if passed else f小标题数量不足建议至少 {MIN_HEADINGS} 个提升扫读体验。 return CheckResult(标题结构, passed, 15 if passed else 5, suggestion) def check_introduction(node: ArticleNode) - CheckResult: first_para node.paragraphs[0] if node.paragraphs else has_keyword_hint len(first_para) 80 passed bool(first_para) and has_keyword_hint suggestion if passed else 首段内容偏短或缺失建议首段交代问题背景并引出核心主题。 return CheckResult(引导段落, passed, 20 if passed else 10, suggestion) def check_code_blocks(node: ArticleNode) - CheckResult: passed len(node.code_blocks) 0 suggestion if passed else 技术内容建议包含代码或配置示例提升可操作性。 return CheckResult(代码示例, passed, 15 if passed else 5, suggestion) def build_default_rules() - List[RuleFn]: return [ check_word_count, check_paragraph_count, check_heading_structure, check_introduction, check_code_blocks, ]这里有一个细节值得注意规则函数返回的是结构化的CheckResult而不是简单布尔值。这样设计的好处是后续报告模块可以同时拿到“是否通过”“得分”“修改建议”三份信息不必重复执行规则。规则拆成独立函数的另一个好处是方便组合。你可以给技术文档类内容使用默认规则集给产品介绍页换成另一组偏向 SEO 的规则集规则越多组合的灵活性越明显。然后是报告模块。它负责把多个规则结果汇总成最终报告。# 文件路径analyzer/reporter.py from dataclasses import dataclass from typing import List from .rules import CheckResult dataclass class QualityReport: total_score: int passed_count: int total_count: int suggestions: List[str] passed: bool def generate_report(results: List[CheckResult], pass_threshold: int 70) - QualityReport: total_score sum(r.score for r in results) passed_count sum(1 for r in results if r.passed) total_count len(results) suggestions [r.suggestion for r in results if not r.passed and r.suggestion] passed total_score pass_threshold return QualityReport( total_scoretotal_score, passed_countpassed_count, total_counttotal_count, suggestionssuggestions, passedpassed, )最后把模块串起来通过命令行入口运行检查。# 文件路径main.py import sys from analyzer.parser import MarkdownParser from analyzer.rules import build_default_rules from analyzer.reporter import generate_report def check_file(file_path: str): with open(file_path, r, encodingutf-8) as f: content f.read() parser MarkdownParser() node parser.parse(content) rules build_default_rules() results [rule(node) for rule in rules] report generate_report(results) print(f评估文件: {file_path}) print(f总字数: {node.word_count}) print(f段落数: {len(node.paragraphs)}) print(f小标题数: {len(node.headings)}) print(f代码块数: {len(node.code_blocks)}) print(f质量总分: {report.total_score}) print(f通过项: {report.passed_count}/{report.total_count}) print( * 40) if report.suggestions: print(优化建议:) for suggestion in report.suggestions: print(f- {suggestion}) else: print(未发现明显的结构化问题可进入发布流程。) if not report.passed: print(\n结论: 建议优化后再发布) sys.exit(1) else: print(\n结论: 质量检查通过) if __name__ __main__: if len(sys.argv) ! 2: print(用法: python main.py markdown_file) sys.exit(1) check_file(sys.argv[1])运行方式python main.py sample-article.md这里的sys.exit(1)是为后续接入 CI 流水线准备的。当质量分不达标时直接以非零状态退出Jenkins、GitHub Actions、GitLab CI 都会把这条任务标记为失败从而形成发布前门禁效果。5. 引入 LLM 评估层让检查从规则走向语义规则引擎适合检查“确定性问题”比如字数、标题数量、代码块是否存在。但内容质量的高阶问题例如“结论是否足够前置”“代码解释是否充分”“表达是否适合目标读者”规则引擎很难准确判断这时就需要引入 LLM 评估层。LLM 层的做法不是直接让模型“给文章打个分”而是设计结构化的评估提示词让模型按维度输出 JSON 格式的结果便于程序解析和合并。下面是一个可复制的评估提示词模板# 文件路径analyzer/llm_evaluator.py import json import os from typing import Dict from openai import OpenAI EVALUATION_PROMPT 你是一名资深技术内容编辑。请从以下几个维度评估用户提供的技术文章片段 1. 结论是否前置10分读者能否在开篇快速理解文章要解决的问题。 2. 表达是否清楚10分段落逻辑是否连贯是否存在歧义或信息跳跃。 3. 代码解释是否充分10分代码块是否完整关键逻辑是否有说明。 4. 读者适配度10分内容难度与目标读者是否匹配。 请严格按照以下 JSON 格式输出不要输出任何其他文字 { conclusion_position: 0, clarity: 0, code_explanation: 0, audience_fit: 0, overall_feedback: 用一句话给出总体优化方向 } def evaluate_with_llm(content: str, api_key: str None) - Dict: client OpenAI(api_keyapi_key or os.getenv(OPENAI_API_KEY)) response client.chat.completions.create( modelos.getenv(CONTENTIQ_LLM_MODEL, gpt-4o-mini), messages[ {role: system, content: EVALUATION_PROMPT}, {role: user, content: content[:6000]}, ], temperature0.2, ) raw response.choices[0].message.content # 防止模型输出额外的 Markdown 代码块标记 raw raw.strip().removeprefix(json).removesuffix().strip() return json.loads(raw)使用这个评估器时要注意三个工程问题。第一上下文长度限制。大段文章直接塞给模型既浪费 token又容易超出上下文窗口。实际工程中应该先截取关键部分比如开头、每个小标题下的首段、代码块附近的内容拼成一个精简版再评估。这里的示例使用了content[:6000]真实场景下建议实现一个 extract_key_sections 函数。第二输出格式稳定性。LLM 可能输出多余说明文字或 Markdown 代码块标记解析前必须清理。建议在提示词中严格约束 JSON 格式并在代码里做removeprefix和removesuffix清理。第三成本和延迟控制。LLM 评估比规则引擎慢得多、贵得多。不要把 LLM 应用在每一篇低风险内容上。推荐策略是先用规则引擎过滤得分高于 80 的直接放行低于 60 的走人工修改只有 60 到 80 之间的边界内容才调用 LLM 做二次评估。6. 接入发布流水线CI 检查与 CMS Webhook 两种方式内容质量工具只有接入发布流程才能真正发挥作用。否则它只是一个孤立的检查脚本靠人自觉运行慢慢就会被遗忘。最常见的接入方式是 CI/CD 流水线。如果你用 GitHub Actions可以在.github/workflows/content-check.yml里增加一个 jobname: Content Quality Check on: pull_request: paths: - content/** - docs/** jobs: content-quality: runs-on: ubuntu-latest steps: - name: Checkout uses: actions/checkoutv4 - name: Setup Python uses: actions/setup-pythonv5 with: python-version: 3.11 - name: Install Dependencies run: pip install -r requirements.txt - name: Run Quality Check run: | for file in $(git diff --name-only origin/main...HEAD -- content/*.md docs/*.md); do python main.py $file done这个配置只对变更的内容文件做检查避免全量扫描拖慢 CI。检查不通过时python main.py会以非零状态退出PR 会被标记为失败从而在合并代码之前拦截低质量内容。接入方式有两种按你的团队结构选择方式触发时机适用团队优点缺点CI 检查提交 PR 时内容存放在 Git 仓库的团队强制门禁难以绕过需要维护 CI 配置CMS Webhook点击发布时使用 WordPress、Strapi 等 CMS 的团队贴近编辑习惯灵活依赖后端服务稳定性如果你使用的是 CMS 系统更实际的做法是提供一个 Webhook 服务。编辑在 CMS 后台点“发布”按钮前先调用内容质量评估服务拿到报告后可选择继续或取消发布。这个模式对非技术编辑更友好但需要你额外维护一个轻量 HTTP 服务。7. 评估结果的可视化与解释策略质量评估工具做出来之后下一步面临的问题是分数出来了要怎么展示才不让人反感内容创作者对“你的文章质量只有 65 分”这类结论天然有防御心理。好的报告不应该是冷冰冰的分数而应该解释“为什么扣分、哪些地方改掉能加多少分”。建议报告采用三层结构第一层是总分但要给出评分标准说明。比如“总分 100 分70 分以上建议发布70 分以下建议优化”。同时强调这是结构化和语义化检查不是文学水平评判。第二层是分维度得分每条分数旁边标注不通过的原因。除了文字说明还可以给出一个可执行的修改清单例如“正文偏短建议补充使用前提”“首段缺少背景交代建议增加场景描述”“代码块数量为 0建议补一个最小示例”。第三层是具体参考修改建议。这里可以由规则引擎给出确定性建议也可以由 LLM 层生成参考样例。展示时不能只说“表达不清”而要给出“这里可以这样改写……”的示例。对于分数不高的内容报告应该避免降级式表达。更合适的表达是“当前内容适合内部预览考虑到发布后搜索流量和用户留存建议先完成以下优化”。把问题定位成“发布前准备不足”而不是“你写得很差”用户体验会完全不同。8. 常见问题与排查方法实现 ContentIQ 类工具时以下问题出现频率最高问题现象可能原因排查方式解决方案中文文本词数统计不准确默认按空格分词中文没有空格检查分词逻辑统计中文字符数使用 jieba 分词或单独统计字符数代码块统计一直为 0Markdown 代码块没被正确提取打印正则匹配结果确认反引号格式检查代码块是否使用三个反引号包裹LLM 评估输出 JSON 解析失败模型输出多余文字或 Markdown 标记打印原始返回内容清理字符串首尾标记增加重试逻辑CI 里运行很慢每篇文章都调用 LLM查看执行日志统计耗时先用规则引擎过滤只对边界样本调用 LLM检查命令不退出sys.exit(1)没有按预期执行检查规则是否全部通过确认if not report.passed分支逻辑正确规则评估和人工判断差距大规则阈值设置不合理抽样对比人工评分和机器评分用历史文章校准阈值中文分词问题尤其值得注意。上面示例中的word_count len(clean_text.split())对英文文章有效但中文以字为基本单位没有空格分词。处理中文内容时建议统计“字符数 包含中文的词数”两个指标或者引入 jieba 等中文分词库。规则引擎中的字数阈值也要区分中英文英文 300 词的文章和中文 300 字的篇幅差异很大。LLM 评估的稳定性也是一个常见坑。同一个内容调用多次分数可能不同因为大模型本身有随机性。工程上建议把 temperature 设低一些示例中为 0.2并在提示词里要求“严格按照 JSON 输出”同时保留原始返回内容用于排错。9. 最佳实践与工程化建议把内容质量检查纳入团队流程后有几条工程建议值得提前考虑。先建立基准集再定阈值。不要拍脑袋定“80 分及格”。把团队过去半年的文章收集起来按阅读量、用户反馈、留存时间分成“好内容”和“待改进内容”两组用工具跑一遍分数看看实际分布再根据分布设置阈值。这样阈值有依据团队成员也更认可评分结果。规则要做成可配置、可扩展的。不同团队对内容质量的要求不同有的重视 SEO有的重视代码可操作性有的重视合规。规则引擎应该支持按文档类型加载不同规则配置文件。一个简单的规则配置示例{ rules: { word_count: { enabled: true, min_words: 300, score: 20 }, heading_structure: { enabled: true, min_headings: 3, score: 15 }, llm_evaluation: { enabled: true, model: gpt-4o-mini, only_for_score_between: [60, 80] } } }这样配置的好处是规则调整不需要改代码运营或编辑负责人也可以参与阈值调优。不要把 LLM 评估作为默认路径。规则引擎的执行成本几乎为零LLM 评估每次都要消耗时间和费用。默认只跑规则引擎只有当内容处于“要不要改”的灰色地带时再调用 LLM是成本和质量之间最务实的平衡点。人工复核永远保留。机器可以拦截明显的结构问题但对“这个结论是不是准确”“这个例子是不是贴切”这类事实性判断机器只能辅助。建议工具输出报告后保留人工抽查环节尤其是对要发布到主站对外渠道的内容人工确认事实和观点机器确认结构和表达分工明确。最后是告警和回滚机制。内容质量检查工具接入生产流水线后你可能会遇到误报问题一篇历史遗留的短文档被检查拦截却阻碍了紧急发布。这时需要设置跳过或豁免机制但要保留审计日志记录谁在什么时间因为什么原因跳过了检查。如果工具出现故障应该能快速停用并恢复原流程避免内容发布被工具卡死。10. 总结与后续学习方向ContentIQ 这类工具的价值不在于它能给文章打多少分而在于它把内容发布流程从“个人经验驱动”推进到了“可检查、可度量、可回溯”的工程化阶段。对一个内容团队来说统一质量标准比偶尔写出一篇高质量文章重要得多。规则引擎 LLM 评估 发布流水线三者的组合可以覆盖技术博客、产品文档、帮助中心等多种内容场景而且每一层都可以根据你的成本要求做取舍。如果看完这篇文章想动手实践建议从最小闭环开始先实现规则引擎把正文字数、段落结构、小标题数量、代码块数量这些确定性检查项跑通再接入 CI 或 CMS 钩子让检查成为发布流程的必经环节等团队适应了这个节奏再考虑加入 LLM 语义评估用来处理“边界地带”的内容判断。内容质量是一个持续迭代的过程不是一次打分就能结束。后续值得研究的方向还包括基于历史发布数据反哺规则阈值、针对不同内容类型定制评估模板、把用户阅读行为数据回流到质量评分模型里。工具做得再好最终服务的还是读者能否更快、更准确地获得他需要的信息这一点值得一直记住。
返回列表