一个电商运营的朋友上周找我吐槽,说他们团队上新品前要人工核对一堆商品资料,标题、卖点、详情页、参数表、资质文件,眼睛都快看瞎了,结果还是漏了好几个低级错误,比如详情页参数和规格表对不上、卖点文案里写的材质和参数表里不一致。这场景我太熟了。商品资料包里的信息孤岛问题,几乎是每个电商团队的隐形成本。我当时正好在折腾 Qwen3.8-Max 的 API,就想试试能不能做个自动化体检助手,把这些散落的资料一次性交叉核对,找出所有矛盾点和缺失项。实测下来,6 份资料加 1 张商品图,一次跑完查出 27 个问题,其中十几条是人工很难一眼发现的跨文件矛盾。这篇文章就把整个搭建思路、技术细节和实测过程完整拆给你。
1. 为什么需要一个“资料包体检助手”
很多团队对商品资料审核的理解还停留在“找个人从头到尾读一遍”。但实际业务里,一套完整的商品资料包通常包含多个来源、多个格式的文件,信息被拆得七零八落,人工审核的效率和质量都很难保证。
1.1 电商商品资料包的典型构成与痛点
先还原一下真实场景。一个成熟品类的商品资料包,至少包含这些内容:
- 商品标题(用于前台展示和搜索)
- 核心卖点文案(通常 3-5 条,用于主图文案和详情页首屏)
- 详情页文案(长图文案,包含功能描述、使用场景、品牌故事等)
- 规格参数表(SKU 维度,包含材质、尺寸、重量、颜色、型号等)
- 尺码表或容量表(服装、箱包、容器类目必备)
- 资质文件(质检报告、授权书、3C 认证等)
- 商品主图和细节图(通常 5-8 张)
问题就出在这里。这些资料往往不是同一个人、同一个时间、用同一个模板产出的。标题可能是运营写的,参数表是产品经理从工厂拿来的,详情页是设计照着旧款改的。于是矛盾就产生了:
- 标题写了“纯棉”,参数表里材质却是“涤纶 65% + 棉 35%”
- 详情页说“容量 20L”,规格表写的却是“18L”
- 卖点里说“质保三年”,资质文件或售后政策里写的是“一年质保”
- SKU 颜色有五种,商品图上却只出现三种
- 尺码表的单位是厘米,详情页描述里用的是英寸
这些错误单看任何一份文件都发现不了,必须跨文件对比才能暴露。人工去做这件事,不仅慢,而且非常容易疲劳漏检。所以本质上,这个“体检助手”要解决的核心问题是:多源异构信息的一致性校验。
1.2 为什么选 Qwen3.8-Max 而不是传统规则方案
最开始我也想过用传统方案,比如写 Python 脚本做关键词匹配、用正则抽字段。但很快放弃了,原因很现实:
- 商品资料是自然语言,同一含义的表达方式极其多样,比如“材质”可以写成“面料”、“成分”、“材料”,正则规则根本写不完
- 跨文件对比需要理解语义,比如“20L”和“20升”是同一个意思,“涤纶”和“聚酯纤维”也是同一个东西,纯字符匹配会误报一大堆
- 图片里的文字、图片与文案的对应关系,传统 OCR 加脚本逻辑做起来非常笨重
大模型正好擅长这件事。Qwen3.8-Max 的上下文窗口够大,能把多份资料一次性塞进去做全局比对;指令跟随能力够强,能按我要求的 JSON 格式输出结构化结果。选它而不是其他模型,主要是看中两点:一个是对中文电商文案的理解明显更到位,很多口语化的卖点表达它能准确抓到关键信息;另一个是 API 调用简单稳定,部署起来不折腾。
2. 体检助手的整体架构设计
先别急着写代码。这个项目最忌讳一上来就堆 prompt。我第一版就吃过这个亏,把六份资料全塞进一个 prompt 里,让模型“帮我找找问题”,结果输出了一堆空泛的套话,什么“建议优化标题关键词”“详情页可以更生动”,完全没法用。
2.1 架构分层:从资料输入到报告输出
调整后的架构分成四层,每一层职责单一,层与层之间通过结构化的中间结果衔接。
第一层:资料预处理层。这一层负责把各种格式的资料转成模型友好的纯文本。PDF、Word、Excel、图片,格式五花八门,必须先统一。我的做法是:
- PDF 用
pdfplumber提取文本,扫描版走 OCR 方案 - Word 用
python-docx读取段落和表格 - Excel 用
pandas按 sheet 读取,把参数表转成“键:值”格式 - 商品图先用
paddleocr做文字提取,同时保留图片路径用于后续的“图面对应”分析
关键点是:尽量把表格结构在文本里保留下来。比如 Excel 转文本时,我会生成一个 markdown 格式的表格,而不是简单地拼接单元格。这样模型能清晰理解哪些字段是同一行的,避免语义错乱。
第二层:信息结构化层。这一层把预处理后的非结构化文本,转换成统一的“商品信息字段”。比如标题、卖点、详情页描述、参数表,都抽取成类似这样的结构:
{ "title": "2024新款轻便折叠双肩包 大容量旅行背包 男士女士通用", "selling_points": ["轻如无物,仅重380g", "20L大容量,轻松装下14寸笔记本"], "specs": {"材质": "900D涤纶", "重量": "380g", "容量": "20L", "尺寸": "30x20x45cm"}, "sku_colors": ["黑色", "灰色", "蓝色"] }这个步骤非常重要,相当于给模型做了一道“阅读理解题”,先把事实从文本里揪出来,后面做比对的时候就不容易漏。我实测下来,先结构化再比对,比直接拿原文做矛盾识别,准确率至少提升三成。
第三层:交叉比对与逻辑校验层。这是核心层。把第二层输出的结构化信息,连同原始文本的关键片段,一起作为上下文,让模型执行具体的校验任务。校验不能笼统地问“有没有问题”,而要拆成一个个明确的子任务,比如“标题中的材质信息与参数表是否一致”“卖点中的容量与规格表中的容量是否一致”“图片上的容量标注与参数表是否一致”。
第四层:报告生成层。把模型输出的结构化检测结果,聚合成一份分级报告。我的做法是让模型输出一个问题列表,每个问题包含:问题类型、涉及资料、具体描述、建议修改方案、严重级别。然后脚本再按严重级别汇总,生成最终的报告。
这套分层架构最大的好处是每一层都能单独调试。哪一层表现不好就优化哪一层,而不是一杆子捅到底,出了问题都不知道该调哪里。
2.2 用“任务矩阵”代替开放式提问
这是整个项目里最关键的认知转变。我发现让大模型做质检,跟让一个实习生做质检很像,你得给它一张清晰的检查表,它才知道该看哪、该查什么。开放式地说“你帮我看看这套资料有什么问题”,它只会泛泛而谈。
所以我把检测任务定义成一个矩阵,每个任务包含三个要素:检测维度、判断逻辑、输出格式。举个例子:
| 检测维度 | 判断逻辑 | 输出格式 |
|---|---|---|
| 标题一致性 | 标题中的核心属性(材质/容量/颜色/型号)是否与参数表冲突 | 列出冲突字段及两份资料中的原文 |
| 卖点真实性 | 卖点文案中的数据是否能在参数表中找到依据 | 列出无依据数据和依据出处 |
| 图片文案一致性 | 图片中识别出的文字与详情页对应描述是否一致 | 列出不一致文本及图片文件名 |
| 资质完整性 | 必需的资质文件是否齐全,文件中的关键信息是否与商品匹配 | 列出缺失项及文件与商品的矛盾点 |
| 参数表逻辑性 | 尺寸、重量、容量等数值是否存在内部矛盾 | 列出可疑数值组合及计算过程 |
有了这张矩阵,模型的输出质量立刻上了一个台阶。它会像拿着放大镜一样,逐项去比对,而不是天马行空地漫游。
3. 核心模块实现:预处理、结构化与比对逻辑
架构定完之后,就是一个个模块去实现。这部分的代码量不算大,但坑不少,我把关键逻辑和踩过的坑都说一下。
3.1 文件预处理:PDF、Word、Excel 和图片的统一处理
先贴一段 PDF 和 Excel 处理的简化代码,逻辑上可以直接复用:
import pdfplumber import pandas as pd from docx import Document def extract_pdf_text(file_path): """提取PDF文本,保留表格结构为markdown格式""" text_content = [] with pdfplumber.open(file_path) as pdf: for page in pdf.pages: # 先提取表格 tables = page.extract_tables() if tables: for table in tables: md_table = table_to_markdown(table) text_content.append(md_table) # 再提取普通文本 page_text = page.extract_text() if page_text: text_content.append(page_text) return "\n".join(text_content) def extract_excel_specs(file_path): """提取Excel参数表,转成键值对格式""" df = pd.read_excel(file_path, sheet_name=None) all_specs = {} for sheet_name, sheet_df in df.items(): # 假设参数表是两列:参数名、参数值 sheet_dict = {} for _, row in sheet_df.iterrows(): key = str(row.iloc[0]).strip() value = str(row.iloc[1]).strip() if key and value and value != "nan": sheet_dict[key] = value all_specs[sheet_name] = sheet_dict return all_specs有几个细节需要留意:
第一,表格转 markdown 时,表头要保留。很多参数表是横版的,参数名在第一行,值在下面,如果只提取纯文本,模型的语义理解会受影响。
第二,OCR 只处理扫描件。如果 PDF 能直接提取文本,就不要走 OCR,既省时间又减少识别错误。判断方法很简单:提取出的文本长度大于 0,就说明不是扫描件。
第三,图片处理除了 OCR 文字,还要记录图片的上下文。商品图通常有好几张,主图、细节图、场景图,每张图的关注点不一样。我的做法是给每张图做个编码,比如“主图_01”“细节_02”,然后让模型在发现图文矛盾时,能明确指出是哪张图出的问题。
3.2 信息结构化:让模型输出统一的商品字段
这个模块本质上是“从非结构化文本里提取关键信息”,我把它拆成了几个子任务:标题字段抽取、卖点字段抽取、规格参数抽取。每个子任务用独立的 prompt 处理。
规格参数抽取示例:
extract_spec_prompt = """ 你是电商商品信息结构化助手。请从以下规格参数表中提取信息,输出JSON格式。 只提取明确的字段,不要臆测。 输入: {spec_text} 输出格式: {{ "材质": "xx", "重量": "xx", "容量": "xx", "尺寸": "xx", "颜色": ["xx"], "型号": "xx", "其他": {{ "字段名": "字段值" }} }} """严格来说,这个 prompt 还能再优化。比如加一句“数值保留原始单位,不要换算”,因为模型有时候会自作聪明把“380g”换算成“0.38kg”,反而影响后续比对的准确性。我在实测中就遇到过好几次这种问题,后来干脆在 prompt 里强制要求保留原始表述。
卖点字段抽取要稍微复杂一点,因为卖点文案经常是营销语言,比如“轻如无物”“装下整个世界”,模型需要先判断哪些是客观可验证的信息,哪些是纯修辞。我的做法是让模型抽取时带上“证据类型”标签,比如“数值类卖点”“材质类卖点”“功能性卖点”“纯修辞卖点”,前三种进入后续比对流程,第四种直接忽略。
3.3 交叉比对的 Prompt 设计:把“找矛盾”变成“填表格”
交叉比对是整套流程的重头戏。为了让输出稳定可用,我设计了一套“填空式”的 prompt,让模型聚焦在具体问题上,而不是泛泛而谈。
compare_prompt = """ 你是电商商品资料质检专家。请检查以下商品信息中的【{check_dimension}】是否存在矛盾或不一致。 商品标题:{title} 核心卖点:{selling_points} 规格参数:{specs} 详情页摘要:{detail_excerpt} 图片OCR结果:{image_ocr} 检查规则: 1. 只检查【{check_dimension}】相关的信息,其他方面忽略 2. 判断标准:两份资料中描述同一属性的信息互相冲突,即视为问题 3. 注意单位换算(如 20L 与 20升 视为一致),注意同一材质的不同叫法(如 涤纶 与 聚酯纤维 视为一致) 4. 数值不一致必须明确指出两份资料中的原文 输出JSON格式: {{ "issues": [ {{ "issue_type": "矛盾类型", "field_name": "涉及字段", "source_a": "资料A中的原文", "source_a_file": "资料A文件名", "source_b": "资料B中的原文", "source_b_file": "资料B文件名", "description": "问题描述", "suggestion": "修改建议", "severity": "high/medium/low" }} ] }} """这个 prompt 用起来有几个心得:
第一,每次只查一个维度,不要把所有维度都塞进一次调用。虽然 Qwen3.8-Max 的上下文窗口很大,但让模型同时关注五六个维度,很容易顾此失彼,这个维度的矛盾找出来了,下一个维度的矛盾就漏了。分开调用,让模型每次专注一件事,准确率明显高很多。
第二,规则 3 特别关键。如果不加这句话,模型会把“20L”和“20升”报成矛盾,把“涤纶”和“聚酯纤维”报成不一致,误报率居高不下。加了这句话之后,模型才会调用它的语义理解能力去判断“是不是同一个意思”。
第三,输出格式要求 JSON,且明确字段名,这样后处理脚本处理起来非常方便。实际调用时我会把 temperature 调低到 0.1,避免模型“自由发挥”输出不稳定的格式。
4. 实测拆解:6 份资料加 1 张商品图,查出 27 个问题的完整过程
理论说了一堆,上点真实的。我这次测试用的是一套模拟的“户外折叠背包”商品资料包,包含 6 份资料和 1 张商品图:
- 商品标题及卖点文档(Word)
- 详情页文案(Word)
- 规格参数表(Excel)
- 尺码容量表(Excel,注意和规格参数表分开)
- 质检报告扫描件(PDF,带 OCR)
- 商品主图(PNG,含文字标识)
- 品牌授权书(PDF)
4.1 检测任务拆解与执行顺序
整个检测流程不是一次性跑完,而是分成多个子任务依次执行。我实际跑的顺序是:
第一轮:字段抽取。先从全部资料中抽取出结构化字段,包括标题、卖点、规格参数、尺码容量、资质文件关键信息、图片 OCR 文字。
第二轮:字段内部一致性检查。检查规格参数表内部的逻辑,比如长宽高算出来的体积是否和标称容量匹配。
第三轮:跨文件一致性检查。这里又拆成多个小任务,卖点对参数表、标题对参数表、详情页对参数表、图片对详情页、资质对商品信息。
每一轮调用 API 的结果都存成 JSON 文件,方便回溯。整个跑下来,大概调用了十几次 API,耗时大约 3 分钟。这个速度虽然比纯人工快了很多,但对比传统脚本还是慢的,属于“用时间换准确率”的取舍。
4.2 27 个问题的分类明细与典型案例
这 27 个问题,按严重级别和类型分布如下:
| 严重级别 | 数量 | 典型问题示例 |
|---|---|---|
| High(强制修改) | 8 | 参数表容量 20L 与详情页“18L 大容量”冲突;标题含“纯棉”但参数表材质为“涤纶 65%+棉 35%” |
| Medium(建议修改) | 11 | 卖点写“质保三年”但售后政策和资质文件只体现一年;SKU 颜色五种但主图只出现三种 |
| Low(提示优化) | 8 | 质检报告编号在授权书中缺失前缀;详情页“超轻”未标明具体重量;容量表单位不统一 |
挑几个典型问题具体说说。
典型问题一:跨文件单位与语义冲突。参数表里容量写的是“20L”,详情页写的是“18L 大容量”,标题写的是“20L 大容量”。这是最典型的跨文件矛盾,人工审核时如果只看详情页,根本发现不了标题和参数表已经对不上。模型能抓到这个,靠的就是全局上下文的比对能力。
典型问题二:图片与文案的不一致。商品主图上用大字写着“轻至 350g”,但参数表里的重量是“380g”。这两个数字不放在一起对照,几乎没人注意到。图片 OCR 加交叉比对,就专门抓这种隐蔽问题。
典型问题三:资质文件与商品信息的弱关联矛盾。质检报告上的产品型号是“BK-2024”,但授权书和规格表上的型号是“BK-2048”。这种错误人工检查极难发现,因为资质文件通常是被当作“有就行”的资料存档,很少有人会逐字核对型号。
4.3 检测耗时与成本统计
顺带算了一笔账。本次测试共调用 API 17 次,输入 token 总量约 12 万,输出 token 约 8000,按 Qwen3.8-Max 的公开定价计算,总成本不到 1 块钱。对比一个运营专员人工核对这 6 份资料至少需要半天时间,这个成本几乎可以忽略不计。
当然,这个成本估算没有计算前期的 prompt 调试时间。实际上我调了两天 prompt 才算稳定,但一旦跑通,后面每套新商品资料的边际成本就是每次几毛钱电费加 API 费用。
5. 报告生成与自动化落地
问题检测出来只是第一步,如何让业务方愿意用、用得起来,是更关键的问题。如果模型输出一份 2000 字的问题描述,运营同学大概率是不会认真看的。必须把结果整理成一眼就能看懂、直接照着改的整改清单。
5.1 从 JSON 到整改清单:让运营愿意看的报告
我的做法是在报告生成层做几件事:
第一,把问题按严重级别分组,强制修改的排在最前面,用红色标注。这个不能靠模型做,我用脚本处理。模型只负责输出结构化的问题列表,排序、配色、生成 Excel 都是脚本的活。
第二,每个问题都带上“原文证据”。描述问题时不只说“容量不一致”,而是直接给出来源:参数表第 3 行写“20L”,详情页第二屏写“18L 大容量”。这样运营拿到报告,不用再去翻原始文件找位置,直接就能定位修改。
第三,输出格式可选。我的脚本默认输出 Markdown 报告,方便在内部文档里贴;也可以转成 Excel 表单,适合需要分发给多个对接人的场景。
整改清单的输出示例:
## 整改清单(按严重级别排序) ### 必修问题(8项) 1. [容量] 详情页写“18L”,参数表写“20L”,标题写“20L” - 证据:详情页第3屏、参数表第1行、标题第7个词 - 建议:统一为实际容量,如需保留“大容量”表述,调整为“20L大容量” 2. [材质] 标题写“纯棉”,参数表材质为“涤纶65%+棉35%” - 证据:标题第2个词、参数表“材质”行 - 建议:按参数表修正标题为“棉混纺”,或修改参数表 ...5.2 完整检测脚本的串联方式
整个流程最后我用一个 Python 脚本串起来,逻辑非常简单:读文件列表 -> 逐份预处理 -> 调用结构化接口 -> 调用比对接口 -> 汇总输出报告。核心就一个main()函数,调度顺序大概是:
def main(package_path): files = scan_files(package_path) texts = {} for f in files: texts[f.name] = preprocess(f) # 预处理 structured = {} for name, text in texts.items(): structured[name] = extract_fields(text) # 结构化 issues = [] for task in build_task_matrix(structured): issues.extend(run_compare(task)) # 交叉比对 report = generate_report(issues) # 生成整改清单 save_report(report) print("检测完成,共发现 {} 个问题".format(len(issues)))这里有个小细节,build_task_matrix会根据实际有哪些文件来动态生成检测任务。比如这套资料包里没有尺码表,就不会执行尺码相关的检测任务,避免模型硬找问题制造误报。
6. 常见问题与排查技巧实录
这套方案写出来看着顺利,实际做的时候踩了一堆坑。挑几个有代表性的记录一下,给想复刻的朋友省点时间。
6.1 Prompt 层的问题:输出不稳定、语气不统一
最典型的问题就是模型输出格式不稳定。明明 prompt 里写了“输出 JSON”,它偶尔还是会在 JSON 外面套一层解释文字,比如“以下是检查结果:{...}”。解决方案是后处理时写一个宽容的 JSON 解析函数,先尝试直接json.loads,失败就用正则提取最外层花括号内的内容再解析。
还有语气问题。不加约束时,模型会输出“建议优化标题,使其更具吸引力”这种正确的废话。我在 prompt 里明确加了一句话:“只报告客观矛盾,不提供通用优化建议。没有矛盾请不要杜撰。”这句话非常管用,空话率大幅下降。
6.2 误报与漏报的平衡
误报和漏报是质检系统的永恒矛盾。我的经验是:对于跨文件比对,宁可误报也不能漏报,因为漏掉的矛盾会带着错误信息上线,代价更大;误报顶多多花两分钟人工复核。
但这个策略要配合一个机制:报告里单独列出“疑似问题(需人工确认)”一栏。凡是模型觉得可能矛盾但置信度不高的,都放这里,由人来判断。这样既不漏掉潜在问题,又不会因为误报太多导致运营同学骂娘。
6.3 API 调用层面:token 超限与频率限制
多份资料一次性塞进 prompt,很容易触发 token 超限。我的应对方法是分段处理,超大文档先按章节切分,每段分别结构化,再合并结果。关于频率限制,实测 Qwen3.8-Max 的并发上限对个人项目来说绰绰有余,但稳妥起见,我在脚本里做了一层简单的重试机制:碰到限流错误就 sleep 3 秒重试,最多重试 5 次。
7. 扩展思考:这个方案还能怎么用
写到这里,体检助手的基本能力已经完整了。但我做完之后发现,这套“结构化 + 交叉比对”的思路,本质上是一种通用的信息体检框架,稍微改改就能应用到很多场景。
7.1 商品合规审查方向
同样的流程,把检测维度换一下,就能做合规审查。比如检查是否有广告法违禁词(“最”“第一”“顶级”),检查是否包含虚假宣传用语,检查资质文件是否过期或与生产日期矛盾。对于美妆、保健品、电器这些强监管类目,这类工具的价值比矛盾检测更高。
7.2 跨渠道信息同步检查
很多品牌有多个销售渠道,天猫、京东、抖音、独立站,每个渠道的商品详情都有细微差异。用这个框架,把不同渠道的商品页作为多份“资料”,就可以自动检测渠道间信息不一致的问题,比如价格体系冲突、卖点差异过大等。
7.3 数据清洗与知识库构建
从资料包中抽取出的结构化字段,沉淀下来就是一份高质量的商品知识库。后续可以做自动生成商品问答对、辅助客服系统自动应答、或作为训练垂直领域模型的种子数据。
我在实际使用中发现,这套框架最有价值的反而不是某一个具体检测功能,而是它逼着我把“模糊的商品资料审核”拆成了“明确的、可执行的检测任务”。这种拆解能力,比任何模型都值钱。按照这个思路,你拿去审合同、审简历、审需求文档,无非就是换一套检测矩阵的事。