Picset/文章中心/AI玩法
AI玩法

详情文案有几个版本:逐字段变更报告器

详情文案有几个版本要处理的不是商品效果,而是一类可以由程序明确判断的输入问题。旧版和新版使用JSON对象,先按键集合区分新增和删除,再比较共同键的字符串值。没有变化的字段不进入报告,代码不评价新文案是否更有效。

Picset 内容研究组 · 发布/核验于 2026年10月10日 · 约 4 分钟阅读
详情文案有几个版本:逐字段变更报告器
简要回答

详情文案有几个版本要处理的不是商品效果,而是一类可以由程序明确判断的输入问题。旧版和新版使用JSON对象,先按键集合区分新增和删除,再比较共同键的字符串值。没有变化的字段不进入报告,代码不评价新文案是否更有效。

  详情文案有几个版本要处理的不是商品效果,而是一类可以由程序明确判断的输入问题。旧版和新版使用JSON对象,先按键集合区分新增和删除,再比较共同键的字符串值。没有变化的字段不进入报告,代码不评价新文案是否更有效。

输入契约与实现

  旧版和新版使用JSON对象,先按键集合区分新增和删除,再比较共同键的字符串值。没有变化的字段不进入报告,代码不评价新文案是否更有效。

文案差异工具的分区流程图,箭头连接整理与核对步骤
文案差异工具:旧新JSON增删改,不判断营销有效性

  代码把文案逐字段差异限定成小范围任务,刻意不增加网络请求、文件覆盖和发布动作。

运行结果与排错

  相同对象返回三个空组;新版返回package新增、note删除、size改动;非字符串值抛出string_fields_required。

  差异器不检查事实与语义,标点调整也会作为改动。嵌套对象不在本例输入契约中;需要嵌套比较时应另定义字段路径。如果要扩大范围,先添加对应失败夹具,再修改实现。

  成功分支同样要验证结果含义。

放在图片制作链路的哪里

  这个工具适合放在文案差异工具相关的本地资料整理环节,和图像制作保持解耦。

  实际交接至少保留输入版本、代码版本和完整报告。

  本例的覆盖范围是:相同对象返回三个空组;新版返回package新增、note删除、size改动;非字符串值抛出string_fields_required。未覆盖的边界是:差异器不检查事实与语义,标点调整也会作为改动。嵌套对象不在本例输入契约中;需要嵌套比较时应另定义字段路径。

import json
def diff(old, new):
    for data in (old, new):
        if not isinstance(data, dict) or any(not isinstance(v, str) for v in data.values()):
            raise ValueError('string_fields_required')
    old_keys, new_keys = set(old), set(new)
    return {'added': {k: new[k] for k in sorted(new_keys - old_keys)},
            'removed': {k: old[k] for k in sorted(old_keys - new_keys)},
            'changed': {k: [old[k], new[k]] for k in sorted(old_keys & new_keys) if old[k] != new[k]}}
old = {'name': '杯子', 'size': '旧资料', 'note': '旧说明'}
new = {'name': '杯子', 'size': '新资料', 'package': '包装清单'}
assert diff(old, old) == {'added': {}, 'removed': {}, 'changed': {}}
report = diff(old, new)
assert list(report['added']) == ['package']
assert list(report['removed']) == ['note']
assert report['changed']['size'] == ['旧资料', '新资料']
try:
    diff(old, {'size': 1})
except ValueError as exc:
    assert str(exc) == 'string_fields_required'
else:
    raise AssertionError('expected rejection')
print(json.dumps(report, ensure_ascii=False))

编辑复核与下一组测试

  逐字段变更报告应先按新增、删除、改动划分审核动作,再看各字段与详情页模块的对应关系。本文新版出现package新增、note删除、size改动,意味着package只存在于新版,note只存在于旧版,size同时存在但字符串不同;它们不应被合并成文案更新一项,因为新增可能要求排版增加模块,删除可能要求撤掉旧提示,改动则需要查看旧值与新值差在哪里。审核size时,应把两版字符串并列核对,确认是尺寸内容变化、单位写法变化还是标点调整;算法会把这些都视为改动,并不会自动判定哪一种影响商品事实。对package新增,也不能因为报告标注新增就认为包装资料已经核实;对note删除,则要确认删的是过时说明还是仍需展示的信息,差异器不替编辑作出取舍。相同对象返回三个空组,只说明这两份输入没有形成所定义的字段差异,不能证明拿来比较的就是上一轮已批准版本。交接前应明确旧版来自哪里、新版属于哪次修改,避免将两个相同的副本比较后错认本次无需审阅。非字符串值抛出string_fields_required时,优先检查数据结构是否从纯文案对象变成了数值或嵌套对象,不要先把尺寸数字强制转为字符串来让流程继续,因为这可能掩盖了单位与字段组织方式的变化。下一组测试可分别只新增package、只删除note、只修改size,让三类输出都有独立样例;再加入完全不变的共同字段,核对它不会进入变更报告。另可将字段删除与将值改为空字符串做成对照,前者改变键集合,后者仍是共同键的值变化,编辑处理时也分别对应模块移除与内容待补。还可仅改变标点或空格,明确当前比较是否保留这些表面差异,不要在审阅时自行将提示视为噪声而遗漏有意义的字符修改。嵌套比较若成为需求,应先规定字段路径和增删含义,本例不能解释深层对象的差异。最适合使用报告的节点是详情文案交给排版或复审时,接收者按字段变化确认哪些模块需要更新,再回到商品资料核验内容;不应把差异组数量当成文案质量分数,也不应把无差异当成营销效果已经获证实。

参考资料