在生产线上盯过屏幕的人都知道,工业缺陷检测从来不是一个"模型精度"问题,而是一个"系统能不能用"的问题。我做了三年工业视觉项目,从传统图像处理算法一路做到现在的"多模态大模型+RAG"方案,最大的感受是:真正的难点不在模型本身,而在怎么让模型理解工厂里的实际上下文——这个批次是什么材料、这条缺陷以前见过没有、客户对这个位置的划痕到底什么态度。今天就把这套系统的完整思路、落地细节,以及那些文档里不会写的坑,一次性拆透。
这篇文章适合正在做工业质检、机器视觉落地,或者想搞明白多模态大模型和RAG在实际业务里怎么配合的朋友。我不讲概念,只讲这套系统从零到上线过程中真正干活的东西。
1. 项目设计与方案选型:为什么是"多模态+RAG"的组合拳
1.1 需求拆解:产线真正缺的不只是"看得见"
先交代项目背景。这是一家做金属零部件的制造企业,产线需要检测多种表面缺陷——划痕、凹坑、氧化色斑、毛刺、焊接气孔。传统机器视觉方案在固定光源、固定角度下能跑,但换产品型号、换材料批次、换光照环境,缺陷形态就变了,写死的规则马上失灵,误报率能逼疯产线工人。
我把需求拆成了三层来看:
第一层是看得见。缺陷区域要在图像里被准确圈出来,这是传统视觉模型擅长的。问题是缺陷类别多、形态差异大,单一模型很难覆盖全面。
第二层是认得准。圈出来之后要判断"这是什么缺陷类型、严重程度如何"。这一步非常依赖老师傅的经验——同样一条划痕,在A零件的承重面是报废级缺陷,在B零件的非功能面可能只是轻微瑕疵,标准藏在企业规程里,而且随时跟着客户要求变。
第三层是说得出。不只给结论,还要能输出一份可追溯的质检报告,说明缺陷位置、类型、疑似成因、处置建议,并且能参考历史批次出现过类似问题后的处理方式。这一步传统算法完全做不了,但对工厂的价值恰恰最大——很多工厂缺的不是检测能力,而是把检测结果转化为可执行决策的能力。
这三层需求决定了方案方向:用视觉模型做快速筛查,用多模态大模型做深度研判,用RAG挂载企业历史质检知识做"经验参考",再靠大模型的生成能力输出结构化报告。这个组合不是炫技,是需求逼出来的。
1.2 技术选型:和纯视觉方案对比后的取舍
有人会问:直接用YOLO系目标检测模型不就行了,为什么要上多模态大模型和RAG?
纯视觉方案我一开始就在用,能解决一部分问题,但有几个绕不过去的痛点:
缺陷类别是动态增长的。产线上时不时出现新缺陷类型,比如新供应商的材料带来一种以前没见过的纹路。传统检测模型遇到新类别,得重新标注、重新训练,一轮至少两三周,生产线根本等不起。
判断需要理由。纯视觉模型只能输出类别和置信度,给不了"为什么这么判"。产线工人看到一个"划伤,置信度0.87",还是得靠自己的经验决定放行还是报废。而多模态大模型可以结合知识库内容给出完整的因果链条:"该缺陷位于零件密封面,对比历史案例编号X,此位置的划伤在客户标准中属于不可接受缺陷。"
文字和图像是割裂的。工厂质检记录里有大量文字经验——"某批次出现类似纹路,推测模具磨损导致""这个客户对色差接受度较高"。这些知识存在Excel、邮件、甚至老师傅脑子里,传统视觉系统完全用不上。RAG的价值就在这里:把散落的历史记录、工艺文档、客户标准组织起来,在判断时动态检索相关先例。
最终架构定为三层:边缘侧轻量视觉模型做第一道筛查,快速圈出疑似区域;多模态大模型接收局部裁切图做深度研判;RAG提供知识支撑。三层配合下来,既有产线节拍所需的速度,又有可追溯的判断依据。
1.3 整体架构:让大模型只"看"该看的地方
这套系统的数据流是这样的:
- 产线摄像头采集图像,边缘侧视觉筛查模型实时推理,圈出疑似缺陷区域坐标。
- 对每个疑似区域做裁切,保留原图缩略图作为上下文,连同批次信息一起组装成多模态模型的输入。
- 根据缺陷信息构造检索query,从RAG知识库召回历史案例和判定标准。
- 多模态大模型在"当前图像+参考知识+质量规范"的共同约束下,生成结构化判定结果。
- 结果写入质检数据库和MES系统,低置信度结果自动转人工复核队列。
架构里最核心的设计决策是:让大模型处理局部裁切图,而不是整张大图。原因有二。第一是推理成本,高分辨率大图直接喂给多模态模型,单张延迟能到四五秒,产线节拍完全扛不住;第二是有效信息密度,缺陷判定的关键信息集中在局部区域,给整张大图反而引入大量与判定无关的干扰,模型注意力被分散,精度反而下降。
2. 数据集构建、知识库组织与检索链路设计
2.1 缺陷样本集:边缘样本比典型样本更值钱
多模态大模型本身具备一定视觉理解能力,但工业缺陷非常领域化,通用数据里几乎没有,所以第一件事就是构建专属样本集。样本来源我用了三条线:
产线实拍。满足现场合规要求的前提下,在产线上加装采集相机,连续采集两周的正常件和异常件。这里有个特别重要的操作要点:不要只拍典型缺陷,要刻意收集边缘样本——光线不均匀条件下的正常件、疑似缺陷但实际是油污的件、不同角度拍摄的同一种缺陷。这些边缘样本决定了系统上线后的误报率。
历史图片归档。工厂过去几年的质检记录里有大量缺陷图片,但很多没标注、存在硬盘角落里。我把它们整理出来,用半自动方式(目标检测模型预标注+人工修正)统一补了类别标签。
人工模拟。针对一些罕见但危险的缺陷,比如特定形式的开裂,在实验室用人工手法制造少量样本,弥补数据空缺。
标注策略上我做了个关键决策:只做"类别+粗糙区域框",不搞像素级分割。多模态大模型对像素级精度不敏感,它需要的只是"这里大概有个疑似缺陷区域"的上下文。把标注预算花在标签准确率上,比花在像素精度上划算得多。
数量方面,每个缺陷类别至少60到100个样本,总样本800多张。这个量级从头训视觉模型远远不够,但对做微调和知识库来说是够用的——系统真正的"经验"在知识库里,不在模型权重里。
2.2 知识库搭建:把老师傅的经验结构化
RAG系统能不能干活,七成看知识库建得好不好。我把知识来源分成四类,每类都做格式统一和字段规范化:
- 缺陷知识条目:缺陷名称、典型形态描述、常见成因、判定标准、处置建议,附参考图示意。
- 历史质检案例:过去处理过的典型场景,包含图像特征描述、客户反馈、最终处置结果。这类知识价值最高,模型从先例中学"遇到类似情况该怎么办"。
- 工艺与材料文档:各工序参数范围、材料批次特性差异、工艺变更记录,帮模型理解"为什么会出现这种缺陷"。
- 客户标准与行业规范:不同客户验收标准差异,最终判定依据。
大量原始文档不能直接丢进知识库。我实践下来最有效的方式是做知识蒸馏:把长文档里和检测判定相关的信息提炼出来,重写成统一格式的条目,每条标注来源、版本号和生效日期。这步工作量大,但直接决定检索效果的上限。见过太多项目栽在这——知识库里堆了一堆格式混乱的PDF,检索出来的内容既难读也难引用。
2.3 检索链路:命中率就是RAG的命
知识库建好只是第一步,关键是检索要准。我用了混合检索策略:向量检索处理语义相似的召回,关键词检索用ES解决缺陷代码、规格参数这类精确匹配。一路各取TopK结果,再做融合排序。
每个步骤的具体选择:
向量检索选了一款中文和工业术语支持较好的开源Embedding模型。选型时我不只看公开榜单,而是拿自己的知识条目实测,因为不同模型对工业术语的编码差异很大,有些模型在通用数据集上分数很高,遇到"毛刺""飞边"这类词却会"抓瞎"。
关键词检索用倒排索引方案做精确匹配,尤其是质检单上的编码类查询,比如"D001-划伤",这种带编号的查询向量检索效果并不理想,关键词一查一个准。
融合排序后加了精排模型,用cross-encoder对召回的候选条目二次打分。这一层强烈建议保留,不加它你会发现前排经常混着"看起来相关但实际没用"的条目,后面问题排查部分会详细说。
最后是chunk切分。我是按语义段落切,不按固定字符数硬切。每个知识点保持语义完整,300到500字左右,段间保留一定重叠。固定长度硬切是RAG项目的隐性坑,切出来的chunk上下文断裂,模型拿到手根本没法用。
3. 实操落地:从环境准备到流水线跑通
3.1 硬件配置与推理框架选型
这套系统对算力要求不小。我的参考配置是两张推理卡,单卡24GB显存,多模态大模型推理和向量检索分开部署,避免互相争抢资源。
视觉筛查环节选了YOLO系最新版本,这个系列在中等分辨率工业图像上成熟稳定,部署边缘设备也方便,训练用开源工具链,导出到推理框架大概半天时间。
多模态模型环节,我测过多个开源视觉语言模型,最终选了一个尺寸、中文理解、文档理解都相对均衡的。量化后部署到推理服务上,配置了请求排队机制。推理缓存建议一定要开——同一个缺陷图在调试阶段会被反复查询,缓存能把调试效率提升一大截。
3.2 向量库与检索模块实现
向量库选社区活跃、运维简单的开源方案,这批数据量在几万条级别,索引配置上直接用了暴力检索。数据量不大的时候暴力检索性能完全够,准确率还最高,没必要一开始就上复杂的索引结构。
Embedding模型的选型再强调一次:别只看公开榜单分数。我对比测试了七八个模型,拿自己的知识条目去跑检索,最后选的不是分数最高的,而是工业领域文本上实测效果最好的。通用分数高不代表领域效果好,这个必须自己测。
索引构建管道的完整流程是:
- 读入结构化知识条目,清洗格式。
- 按语义切分chunk,保留段落结构。
- 逐条生成向量,连同原文、来源、元数据写入向量库。
- 同时写入关键词索引,建立编码字段的精确匹配。
3.3 多模态模型与RAG的配合流程
系统运行时的完整推理流程,每一步都有讲究:
第一步:视觉筛查模型处理整图,输出疑似区域列表。没有疑似区域直接判正常件,不进入后续环节——这能省下大量推理成本。有一次我们统计过,正常件占比超过85%,这一步过滤掉的大模型调用量非常可观。
第二步:对每个疑似区域裁切,保留原图缩略图。把裁切图、原图缩略图、检测框坐标、产品型号、批次信息组装成多模态输入。这里有个细节:输入图像尺寸统一缩放,但要保持长宽比,这个处理让模型对目标形状的判断更稳定。
第三步:构造检索query。这是决定RAG效果的关键步骤,下一节单独讲。
第四步:组装Prompt,调大模型生成结构化JSON输出。JSON Schema提前定义好,包含缺陷类型、置信度、严重程度、判断理由、相关历史案例编号、处置建议。
第五步:输出校验。规则引擎检查缺陷类型是否在知识库枚举范围内,置信度低于阈值自动转人工复核。不在枚举范围内的类别,绝不直接放行,一律转人工——这是工业场景的兜底纪律。
3.4 Prompt模板的迭代过程
Prompt设计是投入产出比最高的环节,我前后迭代了二十多版。最终模板的核心结构包含五块:角色设定、任务描述、图像上下文、RAG参考知识、输出约束。
角色设定要写具体——"你是一名资深的工业质检工程师,负责对金属零部件的表面缺陷进行检测与判定"。别小看这句话,实测下来带角色设定和不带的判定风格差异非常大,前者更倾向于给出严谨、有出处的判断。
任务描述要含格式示例。给完整JSON输出示例的准确率,比只描述字段含义的要高不少。大模型对"照着示例输出"的理解力远强于"请按以下Schema输出"。
图像上下文的引导很重要。多模态接口传图和Prompt文本描述要配合:文本里写"图中已用红色框标注疑似缺陷区域,请重点分析框内区域",模型能更快定位关键区域。不加这行引导,模型注意力分散,判断准确率明显下降。
RAG知识引用要带编号。在Prompt里按"1. 来源:历史案例库,内容摘要""2. 来源:客户标准Q-2024-03,内容摘要"的格式组织,生成时模型会自动引用编号,这让质检报告的可追溯性大增——每条判断理由都能回溯到知识库的具体来源。
输出约束里的关键一条是:"如果无法从参考知识中得出明确结论,请如实说明信息不足,不要强行推断。"这一行字能显著降低幻觉概率。
query构造也是核心细节。早期我直接把图像描述文本拿来检索,效果很差,因为"图中有一条长约2厘米的浅划痕,位于工件右上角"这种句子里冗余信息太多,向量化之后语义被稀释。改成结构化提取——"划痕+铝合金表面+密封面+长度2厘米",再拿这个精简query去检索,召回准确率从不到五成直接到八成以上。检索query不是上下文照搬,而是要提炼核心实体和属性。
4. 常见问题与排查实录:现场踩过的坑
4.1 检索命中率低的排查:问题出在query构造
系统第一版做小规模测试时,模型经常判断得对不上号。查日志发现是RAG捞上来的知识条目和当前缺陷完全不搭,模型等于拿着错误资料作答,结果自然跑偏。
排查思路是这样的:先看检索日志,确认召回候选的相关性,发现query本身就有问题。当时是把整个图像描述文本直接拿来做向量检索,语义太散。改成结构化query方案后,只保留"缺陷类型+材料+部位+尺寸"四个槽位,准确率立刻上去。
实话说这个坑踩得最值——它让我明白了RAG这条链路里,query质量的影响比知识库大小还大。知识库一万条、query构造得烂,不如知识库三千条、query构造得好。
4.2 大模型幻觉:编造缺陷类型和处置建议
某个测试批次里,模型把一张无缺陷的正常件硬说成"轻微磨痕",理由编得很详尽,处置建议也很笃定。人工复核后发现那个件根本没问题。
两条根治思路:
Prompt约束强化——"所有判断必须基于提供的参考知识;如果参考知识中没有足够信息支撑,请明确指出'信息不足以判定',禁止自行编造缺陷类型或处置措施"。
加规则校验层——把模型输出的缺陷类型和知识库枚举的缺陷清单做精确比对,输出清单外的类别直接标记为低置信度,进人工复核队列。两套兜底机制叠加之后,幻觉案例大幅减少。
4.3 推理延迟太高:产线节拍压不住
工业现场对延迟的要求远比一般应用严格。我们定的指标是从图像采集到报告生成控制在3秒内,初版系统单次推理要6到8秒,直接被产线负责人否掉了。
处理思路分三步走:
第一步,输入图前置压缩。缺陷裁切图统一缩放到一个较小的分辨率,比如256x256。实测在常见缺陷(划痕、色斑、毛刺)上精度几乎无损,但图像Token量直接减小,推理时间明显缩短。第二步,开推理框架的连续批处理特性和KV Cache复用,整体吞吐提升一倍以上。第三步,加结果缓存——同一个批次、同一个位置的相似缺陷,短时间内重复查询直接返回缓存结果,不再重复跑模型。
优化完单次耗时降到2.5秒左右,总算过了及格线。如果后续单量再涨,视觉筛查环节还可以做TensorRT加速。
4.4 边缘样本误报:最容易被忽视的坑
系统上线一段时间后,发现正常件误报率其实控制得不错,但总有一类情况让人头疼——工件表面有水渍、油污或者光照反光造成的亮斑,视觉筛查框出"疑似区域",大模型分析一通,最后给出"建议返工"或"需人工复核"。
核心原因:训练样本和知识库里缺"伪缺陷"负样本。模型只看过目标缺陷长什么样,没见过"看起来像缺陷但实际不是"的情况。解决办法是在样本库里专门建了"非缺陷外观"类别——油污、水渍、指纹、反光斑、轻微色差,全部归入这一类别,并配套知识条目说明"这些属于外观干扰而非真实缺陷,判断时应结合工艺上下文排除"。
补完这批数据,误报率直接下降了一半以上。所以我的结论很明确:构建数据集的时候,负样本和边缘样本的优先级要高于正样本。很多人一门心思收集缺陷图,忽略了正常外观的变体,上线后才被环境干扰打个措手不及。
4.5 常见问题速查表
| 现象 | 根因 | 排查方向 | 解决方案 |
|---|---|---|---|
| 模型判定明显错误 | RAG检索不到相关内容 | 查看检索日志,确认召回条目相关性 | 优化query结构化程度,检查知识库条目格式 |
| 模型经常"编"缺陷类型 | Prompt约束不足 | 检查输出是否超出枚举范围 | 加强Prompt约束,加规则校验层,超范围转人工 |
| 单次推理耗时过高 | 输入图像token太多 | 分析推理耗时成分 | 压缩输入分辨率,开启批处理和KV Cache复用 |
| 正常件被误报为缺陷 | 缺少伪缺陷负样本 | 统计误报集中在哪些图 | 补充"非缺陷外观"类别样本和知识条目 |
| 检索结果"看起来相关但没用" | 缺少精排过滤 | 检查融合排序后的TopK结果 | 加cross-encoder精排模型,过滤低相关条目 |
5. 写在最后:一些个人体会
这套系统从立项到稳定运行,前前后后花了四个多月。技术选型倒不是最难的,多模态大模型和RAG都是成熟组件,真正难的是把工业现场的领域知识和这套技术框架咬合起来——知识库怎么组织、query怎么构造、Prompt怎么约束、负样本怎么收集,每一个细节都是和产线实际反复磨出来的。
回头看,这个系统最值钱的部分不是模型,而是知识库。模型会换代,框架会升级,但组织良好的知识库是长期积累的资产。每处理一次误判案例,就把案例沉淀回知识库——这等于让系统像老质检员一样,在每一个错误中积累经验。坚持这个动作,系统准确率会呈现很明显的爬升曲线,这是我在实操中反复验证的。
最后分享一个实用技巧:把"非缺陷外观"当作一种正式的缺陷类别来管理。很多团队在规划缺陷检测系统时压根不会考虑"看不出问题但会造成困扰"的情况,但产线环境的光照变化、油污、水渍是无处不在的。给这些干扰建立一个类别、配上知识条目、持续积累样本,整个系统在真实环境里的鲁棒性会完全不一样。
工业质检这个领域,技术本身没有太多花巧,拼的是"能不能贴合现场"。希望这些实战经验能帮到正在做类似项目的朋友,少走几个弯路。