小红书笔记自动审核工具
导入 Excel 或 Word 文件中的小红书笔记数据,先提取内容并与用户确认,再确认审核规则,最后执行审核,生成带标注的 HTML 审核结果页面。
核心流程:第〇步提取确认 → 第一步确认文件 → 第二步确认规则 → 第三步执行审核 → 第四步生成 HTML
适用输入格式
支持两种文件格式:
| 格式 | 扩展名 | 说明 |
|---|---|---|
| Excel | .xlsx |
首行为表头,后续行为数据行,标签以 ; 分隔 |
| Word | .docx |
支持表格型(同 Excel 结构)和段落型(按标题/正文/标签分组) |
跨平台编码说明
本工具自动处理以下编码差异:
- 换行符:Windows \r\n、旧 Mac \r → 统一为 \n
- BOM:\ufeff(UTF-8 BOM)自动移除
- 零宽字符:\u200b(零宽空格)、\u200c(零宽非连接符)等 iOS 常见字符自动清理
- 全角空格:\u3000(日文/中文全角空格)→ 半角空格
⚠️ 核心铁律
绝对禁止使用任何默认审核规则。 所有审核规则必须由用户逐条明确确认后才能生效。
- ❌ 禁止:未经用户确认就使用示例配置中的标签、产品名、错别字规则
- ❌ 禁止:自作主张添加用户未提及的审核项
- ❌ 禁止:跳过引导流程直接执行审核
- ✅ 正确做法:每一条规则都经过用户口头确认后,才写入配置并执行审核
- ✅ 收集完所有规则后,必须将完整的审核规则汇总展示给用户,等待用户明确确认(「确认」「可以」「没问题」),未确认前不得执行审核
- ✅
assets/review_config_example.json仅作为 JSON 格式参考,不得将其内容当作默认规则使用
触发条件
当用户要求审核小红书笔记、批量检查笔记内容质量、或提到"审稿"、"审核笔记"等需求时触发此技能。
典型触发语句:
- "帮我审核这批小红书笔记"
- "检查这些笔记的标签和内容"
- "审一下这批笔记"
- "自动审核这个 Excel 里的笔记"
工作流程
⚠️ 第〇步:提取内容并与用户确认(强制前置步骤)
在进入任何审核规则配置之前,必须先完成内容提取并向用户确认。
无论输入文件是 Excel(分散式:标题/正文/标签分列)还是 Word(合并式:内容在同一个字段),都必须:
-
从原始文件中提取以下字段:
-标题— 笔记标题(去除「标题:」等前缀标记)
-正文内容— 笔记正文(去除「内容:」「正文文案:」等前缀标记)
-标签— 以;(分号)分隔的标签字符串,如#标签1;#标签2
-昵称— 博主名称
-类型— 博主类型(如有)
-序号— 原始序号(如有) -
生成标准提取文件并以文件形式展示给用户:
- 将提取结果保存为 JSON 文件(outputs/<项目名>_records.json)
- 在终端打印每条记录的关键信息摘要(序号、昵称、类型、标题、正文前120字、标签)
- 明确告知用户:有效记录数、跳过空记录数
- 必须等用户确认提取内容无误后,才能进入下一步 -
确认话术示例:
> "共提取了 X 条有内容的记录(跳过了 Y 条空记录)。提取结果已保存到outputs/<项目名>_records.json。请确认标题、正文、标签的提取是否正确?" -
标准提取文件格式(
outputs/<项目名>_records.json):
[
{
"序号": 2,
"昵称": "叶南枝",
"类型": "volg博主",
"标题": "存点和Disney 人物的合照姿势吧",
"正文内容": "深圳好久没有大晴天啦...",
"标签": "#玩皮当夏畅爽充乐;#可口可乐;#玩具总动员5",
"原始文案": "标题:存点和Disney...\n内容:深圳好久没有大晴天..."
}
]
原始文案字段保留完整原文,供标签匹配等场景使用- 提取确认通过后,后续所有审核都将基于此标准文件进行
第一步:确认输入文件
向用户确认要审核的文件路径(支持 .xlsx 或 .docx)。必须由用户明确指定或确认文件路径,不得自行假定。
Excel 文件应包含以下列(列名不限,内容匹配即可):
- 标题 — 笔记标题
- 正文内容 — 笔记正文
- 标签 — 标签列,固定以 ;(分号)分隔,如 #标签1;#标签2;#标签3
- 笔记ID(可选)— 用于标识笔记
- 原始链接(可选)— 笔记链接
Word 文件通常一个文件对应一篇笔记,结构较为自由。对于 Word 文件,使用 --raw 模式输出原始文本,然后由 LLM 根据内容自动识别:
python3 scripts/review.py --input <文件路径> --raw
LLM 读取原始文本后,按以下规则提取:
- 标题:Word 文档第一行的第一句作为标题(去掉"标题:"等前缀标签)
- 正文:标题之后、标签之前的所有内容段落
- 标签:以 # 开头的行,或以空格/分号分隔的 #话题词
- 博主名称:从 Word 文件名中提取。文件名通常包含博主名,如 华为手环-Thy西瓜.docx → 博主为「Thy西瓜」
博主信息
每条笔记必须关联对应的博主。博主信息来源:
- Word 文件:从文件名提取(如 产品-博主名.docx)
- Excel 文件:从"博主"/"昵称"/"作者"列读取(如有)
- 审核结果 HTML 中,每条笔记卡片需展示博主名称
解析命令(自动识别文件类型):
python3 scripts/review.py --input <文件路径>
第二步:引导式审核规则配置
审核优先级(从高到低):
| 优先级 | 审核项 | 要求 |
|---|---|---|
| 🔴 P1 | 品牌名 | 纯品牌词必须完全正确,不包含产品名,不允许错别字(如「华为」不能写成「华华为」) |
| 🟠 P2 | 产品名 | 品牌名+产品名的完整名称,包括缩写、变体、代际/版本号、空格格式 |
| 🟡 P3 | 话题标签 | 必需标签必须全部携带,标签文字完全正确 |
| 🔵 P4 | 语法或错别字 | LLM 自动检测,仅作修改建议,不影响判定 |
重要原则:当用户没有给出具体审核要求时,主动引导用户从以上维度按优先级逐步设定规则。每次只问一个问题,逐项确认后再进行下一项。不要一次性抛出所有问题。
审核覆盖范围:标题、正文内容、标签三部分必须全部审核,任何一部分不通过则该条笔记整体不通过。
2.1 🔴 P1:品牌名
品牌名仅指品牌词本身,不包含任何产品名。例如「华为」就是品牌名,「华为手环 11 Pro」中的「华为」部分。
规则:品牌名必须完全正确,不允许任何错别字或变体。 如「华为」不能写成「华华为」「华力」「HuaWei」等。
向用户确认品牌名的正确写法:
> "笔记中涉及的品牌名称是什么?请给出最标准的写法。"
将理解反馈给用户确认:
> "我理解的品牌名:华为
>
> 品牌名在笔记中出现时必须与此完全一致,不允许任何错别字或变体写法。这样理解对吗?"
确认后强调:"品牌名是最高优先级审核项,笔记中的品牌词必须完全正确,否则直接判定不通过。"
2.2 🟠 P2:产品名 — 完整名称与变体
产品名 = 品牌名 + 产品名称的完整组合。 例如「华为手环 11 Pro」中,「华为」是品牌名(P1 审核),「华为手环 11 Pro」是产品名(P2 审核)。
确认产品名的细节,覆盖以下场景:
空格与格式:
> "关于「[产品名]」,请具体说明:哪些位置必须有空格?哪些不能有空格?大小写有要求吗?"
缩写与变体:
> "文章是否允许使用品牌名的缩写或简称?如果允许,正确的缩写形式是什么?"
反馈确认:
> "我理解的缩写规则:
> - 允许缩写:超新星手表(省略「华为」)
> - 允许缩写:超新星 X1 Pro(省略「华为」「手表」)
>
> 这些缩写的文字是否正确?有没有错别字或漏字?"
部分出现:
> "如果笔记中只出现了品牌名的部分片段(比如只写了「超新星手表」而未写完整名称),空格规则需要同样严格要求吗?"
2.3 🟡 P3:话题标签审核
禁止使用任何默认标签。 必须从用户处获取。
步骤一:获取标签列表
> "笔记中必须包含哪些话题标签?请逐一列出(带 # 号)。"
步骤二:反馈理解并确认
用户列出后,必须将你理解的标签数量和内容反馈给用户:
> "根据你的输入,我理解的必需标签如下(共 X 个):
> 1. #标签1
> 2. #标签2
> ...
>
> 请确认:标签数量是否正确?标签文字(包括 # 号后的每个字)是否完全正确?"
步骤三:修正循环
如果用户表示不正确,必须让用户重新输入完整标签列表,然后再次反馈确认,直到用户确认无误。
2.4 🔵 P4:语法或错别字检测(无需用户确认)
语法和错别字检测完全不需要和用户确认。LLM 在审核过程中自动判断,发现以下问题时在 HTML 中以蓝色标注给出修改建议,但不算审核错误、不影响通过/不通过判定:
- 错别字、重复字词
- 语法不通顺、搭配不当
- 标点符号使用不规范
2.5 最终确认(⚠️ 强制步骤,不可跳过)
在收集完所有规则后,将你的理解整理成结构化汇总,并要求用户点击确认"是否开始"。
> "即将进入审核流程。以下是按优先级排列的审核要求,请最后确认一遍:
>
> 🔴 P1 品牌名(最高优先级)
> - 品牌词:[品牌词正确写法],必须完全一致,不允许错别字或变体
>
> 🟠 P2 产品名(品牌名 + 产品名)
> - 完整名称与格式:[完整写法 + 空格/大小写说明]
> - 允许缩写:[缩写列表,如无则写「不允许」]
> - 代际/版本号要求:[说明]
>
> 🟡 P3 必需话题标签(共 X 个,必须全部包含)
> - #标签1
> - #标签2
> - ...
>
> 🔵 P4 语法或错别字:LLM 自动检测并以蓝色标注建议(不影响通过判定)
>
> 确认无误请回复「开始」,我将逐条审核每篇笔记。"
只有当用户明确回复「开始」「可以」「确认」「没问题」等肯定词后,才进入第三步执行审核。如果用户提出修改,则调整后重新汇总,直到用户确认。
第三步:LLM 逐条审核
⚠️ 审核必须由大语言模型执行,禁止使用脚本程序进行规则匹配审核。
用户确认规则后,执行以下流程:
-
解析文件(仅数据提取):
bash python3 scripts/review.py --input <文件路径>
此命令仅解析并打印笔记列表,不执行任何审核。 -
LLM 逐条阅读并审核:
对每条笔记,LLM 逐条阅读标题、正文内容、标签,对照用户确认的规则备忘录进行审核:
- 品牌名审核(P1):扫描标题和正文中品牌词的出现,与正确品牌词逐一比对。品牌名仅指品牌词本身(如「华为」),不包含产品名部分。品牌词必须完全一致,不得有任何错别字或变体(如「华华为」),否则直接判定不通过。
- 产品名审核(P2):扫描标题和正文中完整产品名引用(品牌名+产品名,含缩写、变体、部分截取),检查空格、大小写、代际/版本号的准确性。
- 标签审核(P3):将标签字段按
;(分号)分割得到标签列表,逐一检查是否包含所有必需标签。标签仅做「有/无」判定,不给任何文案修改建议。标签要么携带正确(通过),要么缺失(错误),不存在中间态。 - 语法或错别字建议(P4):逐句阅读标题和正文,发现错别字、语法问题、标点不规范时记录为建议(非错误),不影响通过判定
- 记录审核结果:
审核结果分为两类:错误(影响通过判定)和建议(不影响判定)。
对每条笔记,将发现的错误和建议按以下格式记录:
json
{
"note_index": 0,
"errors": [
{
"type": "product_name",
"category": "产品名错误",
"product": "华为超新星手表 X1 系列",
"wrong": "华为超新手表 X1 系列",
"correct": "华为超新星手表 X1 系列",
"start": 60,
"end": 70,
"section": "正文",
"description": "缺少「星」字,完整产品名应为「华为超新星手表 X1 系列」"
},
{
"type": "product_generation",
"category": "产品代际缺失",
"product": "大疆 Pocket 3",
"wrong": "大疆 Pocket",
"correct": "大疆 Pocket 3",
"start": 120,
"end": 131,
"section": "正文",
"description": "未标注具体代际,应为「大疆 Pocket 3」而非笼统的「大疆 Pocket」"
}
],
"suggestions": [
{
"type": "typo_suggestion",
"category": "错别字建议",
"wrong": "在在",
"correct": "在",
"start": 120,
"end": 122,
"section": "正文",
"description": "「在在」疑似重复,建议改为「在」"
}
]
}
errors:标签缺失、产品名错误等影响通过判定的问题suggestions:错别字建议等不影响通过判定的改进建议note_index为笔记在列表中的序号(从0开始),start/end为文本在标题 + '\n' + 正文中的字符位置
- ⚠️
start/end位置计算注意事项(关键,易出 bug):
由于 generate_annotated_text 使用 full_text[start:end] 截取高亮文本,位置必须精确指向违规文本在 标题 + '\n' + 正文 中的位置。
常见陷阱:wrong 值过短导致 find() 匹配到错误位置。
例如:违规为「包装可乐」中的独立「可乐」,但 find("可乐") 会首先匹配到「可口可乐」中合法的「可乐」——因为 find() 总是返回第一个匹配。
强制规则:
- 所有搜索必须从正文起始位置开始(
body_offset = len(title) + 1),禁止从全文开头搜索,避免匹配到标题中的合法文本。 - 当
wrong是更长子串的一部分时(如「可乐」是「可口可乐」的子串),必须跳过合法的出现:- 品牌名违规:搜索「可乐」时,跳过前面紧邻「口」的匹配(即跳过「可口可乐」中的「可乐」),只标注独立的「可乐」
- 验证步骤:写入 JSON 后,必须对每条错误的
start/end做验证:确保full_text[start:end]截取到的文本确实是违规的文字、且位于正确的上下文中。
示例修复代码:
python
body_offset = len(title) + 1
if wrong == "可乐":
pos = 0
while True:
pos = full_text.find("可乐", pos)
if pos == -1:
break
if pos > 0 and full_text[pos - 1] == "口":
pos += 1 # 跳过「可口可乐」中的「可乐」
continue
err["start"] = pos
err["end"] = pos + 2
break
else:
pos = full_text.find(wrong, body_offset)
if pos != -1:
err["start"] = pos
err["end"] = pos + len(wrong)
- 将审核结果写入 JSON 文件:保存所有笔记的审核结果到临时 JSON 文件。
第四步:生成 HTML 审核页面
使用脚本根据审核结果生成 HTML:
python3 scripts/review.py --input <文件路径> --results <审核结果.json路径> --output <输出html路径>
脚本会:
1. 解析 Excel 中的所有笔记
2. 读取 LLM 审核结果
3. 生成带标注的 HTML 审核结果页面
第五步:展示结果
审核完成后,使用 present_files 向用户展示生成的 HTML 页面。
同时向用户汇报审核统计:
- 总共审核了多少条笔记
- 多少条通过、多少条存在问题
- 各类问题的数量(标签缺失、产品名错误、错别字)
审核结果页面说明
生成的 HTML 页面包含:
- 顶部摘要栏:笔记总数、通过数、问题数、问题总数
- 审核规则展示:按优先级分卡片展示,含正确✅和错误❌示例对比
- 笔记卡片列表:
- ✅ 审核通过:绿色左边框,无额外标注
- ❌ 审核未通过:红色左边框,错误文字标红加 ❌,紧跟黄底修改建议 - 右侧问题侧边栏:汇总所有错误点,含错误类别和具体说明
- 滚动联动:滚动笔记时侧边栏自动高亮对应错误
脚本参考
核心脚本位于 scripts/review.py,支持两种模式:
| 模式 | 命令 | 说明 |
|---|---|---|
| 数据预览 | --input <文件> |
解析 .xlsx 或 .docx,打印笔记列表 |
| 原始文本 | --input <文件> --raw |
输出 .docx 原文,供 LLM 提取标题/正文/标签 |
| HTML 生成 | --input <文件> --results <结果.json> --output <输出.html> |
根据 LLM 审核结果生成 HTML |
--input 自动识别 .xlsx(Excel)和 .docx(Word)格式。已废弃的 --excel 参数仍可用,但推荐使用 --input。
注意:不存在 --config 模式。审核必须由 LLM 执行,脚本不包含任何审核逻辑。
引导式配置流程(可复用)
以下审核规则配置流程设计为通用框架,可复用于其他审核类 Skill:
- P1 品牌名 → P2 产品名 → P3 标签 → P4 语法/错别字
- 每一步都必须反馈理解、等待用户确认
- 最终汇总所有规则,要求用户回复「开始」后才进入审核
- 核心原则:禁止默认规则、禁止跳过确认、禁止程序审核
结构化规则展示(rules_config)
审核结果 JSON 可包含 rules_config 字段,用于生成带示例对比的规则展示:
{
"results": [...],
"rules_config": {
"levels": [
{
"priority": "P1",
"label": "品牌名",
"color": "#e74c3c",
"rule": "完整品牌名必须完全一致...",
"correct": ["华为手环 11 Pro"],
"incorrect": [
{"text": "华为手环11Pro", "reason": "缺少空格"}
]
}
]
}
}
若不提供 rules_config,则回退为纯文本 rules_memo 展示。
资源文件
scripts/review.py— 文件解析(Excel/Word)和 HTML 生成脚本(不含审核逻辑)assets/review_config_example.json— 规则记录格式参考(仅供 LLM 参考)