🤖 第二章 应用实战:小红书运营增效助手
📄 一句话概括

上一节拿到了 Agent 的原始返回,本节把它拆成表里的四列:解析走三层(直接解析 → 正则截取花括号片段 → 整段存备注并标异常),解析完再走五项校验(字段齐、标题长度、正文字数、标签个数、违禁词),任何一层失败都要留下痕迹,绝不静默丢弃。

📝 本节和前面几节的关系

2.4.1 只做到【能拿到返回的原始文本】,本节把它变成可用的数据(流程图上的 N5)。这又是 2.3.1 那一课的重演:Agent 那边保证输出格式稳,RPA 这边保证解析失败也坏得住——两头都设防,这条链才敢天天跑。本节还是本章唯一真正动手写代码的地方(一段 Python)。

一、先看清【要解析的东西】长什么样

新手最容易犯的错:以为 Agent 返回的就是那个干净的 JSON。 实际拿回来的东西,外面经常包着几层:

层 可能出现的形态
第一层:平台包装 返回体里除了结果,还有用量、日志、会话 id 等字段
第二层:模型的客气话 【好的,这是您的小红书笔记:】+ json ... +【希望对您有帮助!】
第三层:真正的 JSON 才是你要的四个字段

所以要写的是【能找到 JSON 并解析它】的代码,而不是【假设它一定是纯 JSON】的代码。

三条测试数据(本节 Demo 就用这三条):

编号 形态 能不能直接解析
测试 1 纯 JSON 能
测试 2 外面包着解释文字与代码块标记 不能,要先截取
测试 3 用了中文引号 不能,任何兜底都救不回来(要标异常)

二、四条取结果路径(优先级从高到低)

第一章 1.6.2 给过四条路,这里落到具体场景:

路径 本案例用法 稳定性
① 接口返回 影刀【HTTP 请求】指令拿到返回体,直接在流程里解析 最高(本案例用这条)
② 文件交换 让 Agent 把结果写进表格/文档,RPA 去读 高(多一个中转)
③ 界面读取 打开 Agent 的对话页,从页面上把文字抓下来 低(界面一改就坏)
④ 剪贴板 人手动复制,RPA 从剪贴板读 最低(要人参与,但做原型时最快)
📝 原型阶段可以先走 ④

如果你还没打通接口,先用【人复制 + RPA 读剪贴板】把后半段流程跑通——目的是先验证解析逻辑对不对,而不是卡在接口上。能跑通的一条烂链,胜过三条完美的断路。

三、解析三层:直接 → 截取 → 兜底

思路:一层失败就用下一层,最后一层不是【想办法成功】,而是【把失败记下来】。

import json, re

def parse_note(raw):
    """把 Agent 的原始返回解析成四个字段。失败抛 ValueError。"""
    data = None
    # 第一层:直接解析
    try:
        data = json.loads(raw)
    except Exception:
        # 第二层:截取第一个 { 到最后一个 } 之间的片段
        m = re.search(r"\{.*\}", raw, re.S)
        if m:
            try:
                data = json.loads(m.group(0))
            except Exception as e:
                raise ValueError("正则兜底仍失败:%s" % e)
        else:
            raise ValueError("返回里找不到花括号")

    # 缺字段就补默认值,不让后面崩
    for k in ("title", "body", "tags", "image_prompt"):
        if k not in data:
            data.setdefault(k, "" if k != "tags" else [])
    return data

三层的分工:

层 做什么 什么时候生效
第一层 直接解析 json.loads 模型乖乖只输出 JSON 时
第二层 正则截取 用 \{.*\} 把花括号之间的内容抠出来再解析 模型加了客气话、或包了代码块标记时
第三层 兜底 不解析了:整段原文存进备注列,状态标【异常】 中文引号这类硬伤
⚠️ 第二层的正则有个前提

它假设返回里只有一段花括号内容。如果正文里出现了花括号(比如示例代码),\{.*\} 会贪婪匹配到最后一个 },可能截多。更稳的写法:先去掉代码块标记(```json 与 ```),再去掉首尾的说明文字,最后解析。本节的写法够用,但要知道它的边界在哪。

四、真跑一次:三条测试数据的实际输出

把上面那段 parse_note 加上一段校验代码,跑三条数据,实际输出如下:

==============================================
测试1 纯 JSON
  解析成功(直接解析)
  标题 = 小户型玄关太乱?三件收纳好物让门口清爽一倍
  正文字数 = 345 | 标签 4 个 = ['玄关收纳', '小户型', '收纳好物', '入户玄关']
  校验结果 = 全部通过
==============================================
测试2 夹着解释文字
  解析成功(正则兜底(截取花括号片段))
  标题 = 小户型玄关太乱?三件收纳好物让门口清爽一倍
  正文字数 = 345 | 标签 4 个 = ['玄关收纳', '小户型', '收纳好物', '入户玄关']
  校验结果 = 全部通过
==============================================
测试3 中文引号
  解析失败 → Expecting value: line 1 column 11 (char 10)
  兜底动作:整段存进备注列,状态改【异常】,继续下一行

三条输出说明三件事:

  1. 测试 1 和测试 2 的结论完全一样——说明正则兜底确实有效,模型多说两句不会毁掉整行数据;
  2. 测试 2 的被自动降级到第二层而你没有察觉——这正是写日志的意义:流程里应该把【用了哪一层】记进日志,因为【经常需要兜底】说明上游的格式约束在松动,那是要回去改提示词的信号;
  3. 测试 3 失败后没有崩——它按第三层兜底:记备注、标异常、继续下一行。如果这里直接抛出异常中断流程,后面 27 行就全不跑了。

五、五项校验:解析成功不等于内容能用

解析成功只说明【格式对】,不说明【内容能发】。 加一层校验:

校验项 判据 不合格怎么办
字段齐 四个字段都在 缺的补默认值,备注里标【缺 xxx】
标题长度 8~25 字 标【待人工改】,不要自动截断(截断会毁掉语义)
正文字数 300~500 字 标【待人工改】
标签个数 3~5 个 少于 3 个补上默认标签,多于 5 个只留前 5 个
违禁词 不含绝对化用语与引流话术 标【待人工处理】,不要自动替换(见 2.3.1 的【误伤】警告)
⚠️ 校验不合格时,为什么【标注】比【自动修】更安全

因为自动修会掩盖问题:标题被截断、违禁词被机械替换之后,看上去一切正常,但句子可能已经不通、意思已经变了。而人审这一关(N6)本来就在流程里——把问题标出来交给人,比机器自作聪明地改掉更省时间。

六、写回表:三个字段怎么落

Agent 输出 写到表的哪一列 注意
title 标题 直接写
body 正文 保留换行(段落结构是小红书正文的一部分)
tags 标签 用逗号连成一个字符串(表里存文本,发布时再拆开)
image_prompt 配图提示词 直接写,下一节图像生成用
— 状态 改成【待审】
— 备注 有问题就写问题;没问题留空

同时做两件收尾:保存表格;写一条日志(第几行、成功还是异常、用了哪一层解析)。

七、⚙️ 2026 现状:影刀里怎么写这段代码

八、动手 Demo:解析三条数据(含一条坏的)

准备:影刀一段【Python 代码】指令(或者本机任意 Python 环境,先离线验证逻辑)。

第一步——贴数据:准备三条测试数据(第四节那三条即可,第三条故意用中文引号)。

第二步——贴函数:把第三节的 parse_note 贴进去。

第三步——加校验:按第五节五项判据写一小段检查,把问题收集成一个列表(不要一发现问题就退出)。

第四步——跑,看三条各自的输出。

第五步——观察:

看到什么算成功:

  1. 测试 1 与测试 2 都解析出四个字段,且内容一致;
  2. 测试 3 没有让整个脚本崩掉,而是给出【解析失败 + 兜底动作】;
  3. 每条数据你都说得清它走了哪一层——这决定了你后面是【继续跑】还是【回去改提示词】。

读结果:这一段解析代码,就是 2.4.1 的循环里【⑦ 收到结果】那一步的内部实现。把它调稳,再放进循环里跑整批——顺序仍然是从小到大:单条能解析 → 三条能跑通 → 整批不出事。

30 秒实验

把测试 1 的 JSON 去掉最后一个花括号,再跑一次。

结论:JSON 的错误信息是有用的,它给出行列号。养成【先看报错位置、再改数据】的习惯,比盯着字符串找半天快得多。

常见误区

  1. 【Agent 会乖乖只输出 JSON,不用写兜底】——错。 模型的输出有随机性,它随时可能加一句【好的,以下是……】。兜底不是不信任模型,是承认它的特性。
  2. 【解析失败就中断整批,回头再跑一遍】——错。 中断会让后面所有行都不处理;重跑一遍又会让已成功的行重复处理。正确做法是标异常 + 继续下一行。
  3. 【校验不合格就自动修】——错。 自动截断标题、机械替换违禁词,会把问题藏起来(改完看着挺正常,其实句子已经不通)。标注比乱改安全,反正后面有人审这一关。
  4. 【拿到的链接直接存表里,以后要用再打开】——错。 图片链接有效期约 1 年,必须下载到本地(2.3.2 已经强调过一遍,因为这一步最容易忘)。
  5. 【备注列空着最干净】——错。 备注列是异常的唯一落点。它空着说明一切正常,它写着东西说明那一行需要你看一眼——这一列的价值远高于它占的那点宽度。
自测三问(点开对答案) 1. **解析的三层分别是什么?第三层为什么不是【想办法成功】?** ① 直接 `json.loads`;② 正则截取第一个 `{` 到最后一个 `}` 之间再解析;③ 不解析了——**整段原文存备注、状态标异常、继续下一行**。第三层之所以不是【想办法成功】,是因为**有些格式错误(如中文引号)无法可靠修复**,硬修不如把问题交给人工,**让错误可见比让错误消失重要**。 2. **解析成功为什么还要做内容校验?五项校验是哪五项?** 因为**解析成功只说明格式对,不说明内容能发**。五项:字段齐、标题长度 8~25 字、正文字数 300~500 字、标签 3~5 个、无违禁词。 3. **校验不合格时,为什么【标注】优于【自动修】?** 因为自动修会**掩盖问题**:标题被截断、违禁词被机械替换后,表面上看一切正常,但语义可能已经坏了(2.3.1 还讲过【第一件】被误判成排名承诺的误伤)。**流程里本来就有人审这一关,把问题标出来交给人,比机器自作聪明更省时间。**

相关笔记