Tiana随笔

多模态落地的三个真实场景

· AI 与大模型

标签:#AI #大模型

多模态落地的三个真实场景

图文理解能力降到几厘钱一次之后,多模态从“演示项目”变成了可以写进排期的功能。挑三个投入产出比最高的场景说说。

我们公司从去年开始把多模态能力推进到三条业务线里,不是为了追潮流,而是因为那几条线的问题本质上就是"图+文+语音"的。纯文本大模型再强,也解不开一张发票里的金额,看不了直播截图里有没有违规画面,听不懂客户带着情绪的语音。这一年的实打实落地,让我对"多模态"有了比 demo 阶段清醒得多的认识:它很贵,很挑场景,而且大多数时候你不该上来就用通用多模态大模型。

这篇文章不堆概念,就讲三个我们真跑过、真付过钱、真踩过坑的场景,以及我沉淀下来的选型与验收思路。写这些不是要劝你别用多模态,恰恰相反,我想帮你把钱花在刀刃上,少交一点我们交过的学费。如果你正打算在业务里上视觉或语音,前面这几个坑我们替你踩过了,看完能省至少一两个季度的试错。

先讲一个总账:多模态贵在哪

在进具体场景前,先把成本这件事说透,因为它贯穿后面每一个决策。多模态,尤其带图像和音频输入的调用,单次计费口径和纯文本完全不同:图像要先切 patch、编码成视觉 token,音频要先做声学特征、按时间窗切片,这些都会换算成比文字多得多的"计费单元"。同样一段业务,纯文本可能几分钱,带图可能几毛,带音频更长,而且还要叠加更高的延迟,延迟本身也是钱,因为你要为此设计异步、队列和超时。

我的结论很直接:能用文本解决,就别上多模态;必须上多模态时,先做"降级路径":能先 OCR/ASR 转成文本就转,转完能解就解,只有文本确实解不了时才调用昂贵的视觉/语音模型。成本差异不是百分之几十,是数量级。这一条在我们后面三个场景里反复出现,请记住它,它是整套选型的总纲。

场景一:票据与文档的结构化抽取

业务痛点

财务共享中心每天要处理上千张发票、合同、银行回单。过去靠人工录入或传统 OCR,准确率到九成左右就上不去了,剩下的一成靠人工兜底,月底尤其崩溃。传统 OCR 的死穴在于"版面理解":它能认字,但不懂"这张表右下角那个数字是含税总价还是不含税"。我们试过规则模板,但版式一变就崩,维护成本比录入还高,遇到异形发票直接歇菜。

方案架构

我们没有把整张图直接丢给通用多模态大模型。架构是这样的:先用轻量 OCR 把文字和坐标抽出来,再喂给一个视觉理解模型做版面与字段归位,最后由一个小模型/规则层做字段校验。关键决策是"OCR 负责取字,视觉模型负责理解结构"。这样既控制了旗舰模型的调用量,又让结构理解有据可依,还能在视觉模型出错时回退到规则。

# 票据抽取的简化流水线
from typing import Dict, Any

def extract_invoice(image_bytes: bytes) -> Dict[str, Any]:
    # 1) 传统 OCR:拿文字 + 坐标(便宜、快、可本地)
    ocr = call_ocr_service(image_bytes)
    # 2) 视觉模型:结合原图做版面理解,定位字段
    #    注意:把 OCR 坐标也喂进去,让模型"回指"原文,减少幻觉
    vision_prompt = (
        "以下是发票的 OCR 文本与坐标。请识别:"
        "发票代码、发票号码、开票日期、销售方名称、"
        "价税合计(含税总价)、税额。只输出 JSON,"
        "不要解释。字段缺失则值为 null。"
    )
    result = call_vision_model(image_bytes, ocr, vision_prompt)
    # 3) 规则校验层:金额逻辑、必填校验
    if not validate_amount(result):
        result = fallback_manual_review(result)
    return result

成本结构

这里有个现实:如果每单都调一次昂贵的旗舰多模态模型,成本会高到业务方拒绝采用。我们的做法是分层,标准版式走便宜的专用模型,疑难样本(模糊、异形、手写)才升级到旗舰视觉模型,占比控制在 5% 以内。这样单票平均成本降到了可接受区间,而那 5% 疑难样本的人工兜底也几乎被省掉。算过一笔账:全量旗舰方案的单票成本是分层方案的八倍左右,准确率提升却不到两个点,不划算。

踩坑与效果量级

最大的坑是"幻觉金额"。早期我们让模型自由输出,它偶尔会把"¥1,234.00"读成"¥12,340.00",差一个数量级。解决办法是强制它基于 OCR 坐标回指原文,并加数值范围校验(价税合计应大于等于税额等)。改造后,人工复核量从约一成降到百分之二左右,财务同事的月底加班显著减少。另一个坑是"跨页合同":模型只看单页会漏掉总额在最后一页,我们后来加了对多页的拼接与跨页字段关联,才算真正稳住。第三个坑是"印章遮挡":红章盖住关键数字时 OCR 全糊,这类只能转人工,我们把它做成显式兜底分支,而不是让模型硬猜。

场景二:内容审核(图文合规)

业务痛点

我们的社区业务每天产生海量带图内容,合规要求覆盖涉政敏感、低俗、侵权水印、误导医疗等多个维度。纯文本审核抓不到图里的违规,纯图像模型又看不懂配文里的暗示。必须图文联合判断,而且要在用户发布前或发布后极短时间内给出结论,延迟和吞吐都是硬指标。审核错了两边都不好交代:漏放要担责,错杀伤创作者。

方案架构

这里我强烈建议用"专用视觉模型 + 文本分类器"双通道,再做一个融合决策,而不是把所有压力压在一个通用多模态模型上。专用审核模型在违规样本上训练过,召回更稳、单价更低;文本分类器管得了配文里的擦边暗示。两者独立跑,最后融合,谁爆高危谁说了算。

# 图文联合审核的融合决策(简化)
def moderate(post: dict) -> str:
    img_risk = vision_moderation_model(post["image"])   # 专用审核视觉模型
    text_risk = text_moderation_model(post["caption"])  # 文本分类器
    scores = {"img": img_risk, "text": text_risk}
    # 任一高危即拦截,避免图文互遮
    if scores["img"] >= 0.9 or scores["text"] >= 0.9:
        return "block"
    if scores["img"] > 0.5 or scores["text"] > 0.5:
        return "review"   # 人工复核
    return "pass"

成本结构

审核是高频、实时、量大的场景,对延迟和单价都敏感。专用视觉审核模型单价远低于通用多模态旗舰,而且可以批量、可以异步队列削峰。我们的经验是:把"一眼明显违规"用便宜模型拦掉八成,剩下两成疑难再考虑是否升级。这套"宽进严出"的分层,把总成本压到了纯用旗舰的几分之一,同时把人工复核量也压到可控范围。

踩坑与效果量级

一个隐蔽坑是"图文互补误导":图正常、文正常,但图上的小字水印里有违规信息,文本模型看不见,通用模型注意力又没放在水印上。我们最后给专用视觉模型加了"高分辨率裁剪+文字区检测"的前置,把水印、角落文字单独放大再判。误杀率下降明显,但代价是管线变长、延迟上升,需要按业务容忍度取舍。另一坑是"对抗样本":用户故意用谐音、变体字绕文本审核,这部分必须靠视觉模型补位,双通道缺一不可。我们做过对抗测试:只开文本通道,变体违规漏放率很高;双通道合起来,漏放率降到可接受线以下。第三坑是"误杀创作者":艺术类内容常被模型误判低俗,我们给这类加了白名单和二次人工,把误杀投诉压了下来。

场景三:客服语音交互

业务痛点

电话与语音渠道的客服,用户说话有口音、有打断、有情绪。只做语音转文字再接文本大模型,会丢掉"语气里的愤怒"。而愤怒的客户和开心的客户,该给的应答策略完全不同。更麻烦的是实时性:用户不会等你五秒才听到第一句回应,延迟一长体验就崩。

方案架构

我们做的是 ASR(语音识别)+ 情绪识别 + 文本大模型的三段式,而不是端到端语音大模型。原因后面讲选型时细说。情绪模型直接吃音频波形,和转写结果并行产出,再作为上下文信号注入文本大模型。注意情绪不是独立决策,而是"上下文信号":它改变的是大模型的应答语气,而不是替大模型做业务判断。

# 客服语音交互的简化链路
def handle_call(audio_chunk: bytes) -> str:
    text, confident = asr(audio_chunk)          # 语音转写
    emotion = emotion_model(audio_chunk)         # 直接吃音频做情绪
    # 情绪作为上下文信号注入,而非独立决策
    system = f"用户当前情绪倾向:{emotion}。若偏负面,先共情再解决;若中性,直接给方案。"
    reply = llm(system=system, user=text)
    return reply

成本结构

语音场景对实时性要求极高,每一次交互都要算延迟账。端到端语音大模型虽然"酷",但首字延迟和单分钟成本都偏高。三段式里 ASR 和情绪识别都是轻量本地或低价服务,只有文本大模型是主要开销,整体成本可控。我们按"每分钟通话成本"做核算,三段式只有端到端方案的一个零头,而用户体感差异很小,大多数人分不出答话的是端到端还是三段式拼的。

踩坑与效果量级

最痛的坑是 ASR 错误传染。口音重时转写出错,情绪模型吃的是正确音频所以判断对,但下游大模型拿到的是错误文本,于是"用户很生气但答非所问"。我们加了一层"低置信度转写触发澄清反问"的逻辑,把"没听清请重复"做成主动动作,体验反而比硬答更好。上线后,语音渠道的投诉率有可见下降,具体幅度因业务而异,但方向稳定正向。另一个坑是"打断":用户说到一半改口,我们得靠 VAD(语音活动检测)及时截断并重启理解,否则模型会把半句当完整句答,闹出"答非所问"的尴尬。还有个坑是"背景噪音"被情绪模型误判为"激烈情绪",我们在情绪模型前加了降噪和静音段剔除,误判率才下来。

什么时候该用专门视觉模型而不是通用多模态

这是选型里最容易被忽略的判断。我的取舍清单:

  • 任务高度标准化、量大、要稳定低价:选专用视觉模型(如审核、票据、特定检测),它们在这个窄 domain 上更准更便宜。
  • 任务开放、需要常识推理、需要结合文字理解图:选通用多模态旗舰,但要控制调用比例。
  • 需要可解释、要回指原文坐标:专用模型 + 规则层往往比旗舰更可控。
  • 延迟敏感、要实时:优先轻量专用模型,旗舰做疑难兜底。
  • 样本稀少、难以标注:通用旗舰的零样本能力更适合冷启动,等数据积累够了再训专用模型。

一句话总结:专用模型吃"规模与稳定",通用旗舰吃"灵活与零样本"。你的问题落在哪一侧,就选哪一侧,别被旗舰的 demo 晃花了眼。我们踩过的反面教材是:一开始全用旗舰做审核,demo 惊艳,一上量账单爆掉,退回去重做专用模型分层,多花了一个季度。早想清楚能省这事。

多模态的数据安全与隐私

三个场景都碰得到敏感数据,这块翻车比效果差更致命。我们踩过的坑和定的规矩:

  • 票据场景的图片含发票代码、税号,必须脱敏存储,评测样本一律打码,绝不落原始图到评测集。
  • 语音场景的音频是用户原声,按合规要求加密留存且设最短保留期,情绪模型训练样本要去标识化。
  • 审核场景的违规图绝不能外发到第三方模型做调试,我们搭了完全本地化的专用模型来处理这类高敏内容。
多模态数据比文本更难脱敏,因为图里、声里藏着你没注意的敏感信息。把"能不能出内网"当成选型的硬门槛,而不是事后补丁。

一个具体教训:早期我们把一批疑似违规图直接传第三方旗舰模型做能力验证,被安全团队叫停。那之后再定规矩,凡涉敏内容,模型必须私有化部署,验证只能在隔离环境用合成数据。这条规矩让选型范围收窄,但避开了真正的合规雷区。

落地中的组织与流程成本

技术之外,多模态落地还有一笔容易被低估的账:人和流程。专用模型要标数据、要训练、要有人维护;评测集要人建、要人抽验;降级开关要人设计、要人值守。我们第一个场景上线前,低估了标注的人力,结果前两周工程师自己当标注员,效率低且标准摇摆。

我的建议是把"人力模型"也写进方案:谁建标注集、谁每周抽验、谁值守降级开关、模型效果归谁背。责任不清,多模态项目很容易在效果波动时互相甩锅,最后不了了之。我们现在的做法是指定一个"多模态负责人",对三个场景的效果和成本总负责,反而跑得最稳。

三个场景的共同方法论

把上面三个场景抽出来,其实是一套可复用的套路,我总结成四步,任何多模态立项都先过一遍:

  • 先问"纯文本能不能解":能解就别上多模态,这是成本总闸。
  • 再定"专用还是通用":标准化量大用专用,开放灵活用通用旗舰,疑难才升级。
  • 必做"分层与降级":便宜模型拦大头,贵模型兜底疑难,降级开关保可用。
  • 早建"标注集与回放":没有量化验收,你永远不知道模型到底行不行。

这套方法论我们内部叫"多模态四问",新场景立项答辩时先答这四问,答不清就不开工。它帮我们挡掉过两个其实用文本就能解、硬要上视觉的"伪需求",也提前暴露过两个成本会爆的坑。

多模态的延迟账与部署形态

前面讲成本多讲单价,这里补一句延迟。多模态模型的推理比文本重得多,单张图的首字延迟可能是文本的数倍,音频更甚。如果你的场景要实时(客服、审核拦截),部署形态就得认真选:

  • 轻量专用模型走本地或就近部署,控制延迟在百毫秒级。
  • 旗舰视觉/语音模型若走云端,要设计异步、批量与超时降级,别让用户干等。
  • 端到端语音大模型延迟高,除非体验允许,否则不放在实时主链路。

我们审核场景最初把专用模型也放云端,高峰期延迟飙到秒级,创作者体验崩了。后来把专用模型下沉到本地 GPU 节点,延迟回到两百毫秒内,才真正可用。部署形态不是运维的事,是体验的一部分,立项时就要算进去。

我们把延迟预算和部署形态绑死成了一个查表函数,立项时先过这一关:

LATENCY = {"专用模型本地": 180, "专用模型云端": 900,
           "旗舰视觉云端": 2600, "端到端语音": 4200}


def deploy_for(budget_ms):
    ok = [k for k, v in LATENCY.items() if v <= budget_ms]
    return ok or ["没有能进实时链路的形态,改异步"]


print(deploy_for(300))
print(deploy_for(3000))

多模态能力的边界:什么时候别用

说了那么多落地,也得划清"不该上多模态"的线,免得你被 demo 冲昏头:

  • 信息本来就是文本的(比如一段日志、一份已结构化的 JSON),就别绕去截图再识别,纯文本直接处理又快又准又便宜。
  • 任务对"可解释、可审计"要求极高(如金融风控决策),多模态的黑箱归因更难,优先规则+文本。
  • 数据量极小且稳定,专门模型训练不起,通用旗舰零样本也未必靠谱时,先评估 ROI,别为了"上多模态"而上。
  • 合规不允许数据出域,而你又没私有化能力时,宁可不做,也别违规传数据。

这几条本质还是回到总纲:多模态是奢侈品,按场景与成本匹配来用,别把它当万能钥匙。

给不同规模团队的落地建议

团队大小不同,打法也不同,别盲目照搬大厂:

  • 小团队/个人:先用通用旗舰做最小验证,跑通业务再说;成本扛不住时再针对性换专用模型,别一上来就搭复杂分层。
  • 中型团队:必须建标注集和回放,分层与降级写入架构评审,不然一上量就失控。
  • 大团队:私有化专用模型 + 统一的多模态平台 + 强制评测门禁,把重复能力建设成基础设施。

我们是从小团队一路过来的,最深的体会是:复杂分层是"规模逼出来的",不是"一开始就该有的"。过早优化架构,反而会拖慢你验证业务价值的速度。先跑通,再分层,这个顺序别反。

选型与验收要点

落到执行层,我给团队定的验收清单,分享给同样要落地的人:

  • 先定义"什么算对":每个场景要有明确的判定标准和抽样人工标注集,不能只靠感觉。
  • 分层与降级必须设计在架构早期,而不是成本爆了再补。
  • 验收看"错在哪类样本",而不是只看总准确率。模糊样本、异形样本、口音样本要单独统计。
  • 留好回放能力:把真实输入和模型输出落盘,出事能复现、能归责、能改进。
  • 成本要按"单业务单"核算,写进验收报告,让业务方和财务一起签字。
  • 设降级开关:当昂贵模型不可用或超预算时,能自动回落到便宜路径,保住可用性。

我的一点反思

这一年我最大的收获,是把"要不要上多模态"这个问题,从技术炫技变成了纯粹的成本收益与场景匹配计算。最早我们也冲动过,想用一个万能多模态旗舰吃下所有场景,结果账单先爆、效果其次。后来老老实实做分层、做专用模型、做降级,反而每个场景都跑通了、也赚到了。

给同样在落地的人一句忠告:多模态的能力上限很高,但商业落地的胜负手几乎都在"成本结构"和"降级路径"这两件事上。把这两件事想清楚,再谈模型,顺序别反了。还有一个容易忽视的点:多模态的验收比文本难,因为"图对不对"很多时候要人来看,所以一定要早建人工标注集,别等到上线被投诉了才想起来什么叫"准确"。我们第一个场景就是吃了这个亏,前两周全靠工程师肉眼验,效率低且不一致,建了标注集才真正量化起来。

一个被我们砍掉的需求:反例更有说服力

光讲跑通的场景容易让人觉得"多模态处处能上",我反而想讲一个被我们否掉的需求,因为它最能说明"总纲"怎么用。很多时候,真正帮你省钱的不是"用上了什么",而是"拦住了什么"。

那是运营提的一个需求:把每篇社区帖子的封面图,用视觉模型自动生成一句"配图风格描述",写进搜索索引,方便用户按"清新风""复古风"搜图。听起来挺合理,demo 也做得出来,评审时一度差点立项。但我们在架构评审里按"多模态四问"过一遍,第一问就卡住了:纯文本能不能解?

答案是能。运营后来承认,他们真正想搜的其实是"有没有文字水印""是不是真人出镜"这类结构化标签,这些靠已有的图像分类模型就能打标,根本不需要通用多模态去"生成描述"。而"风格"这种主观维度,即使用视觉模型生成了,搜索召回率也低得可怜,用户不会真的用"复古风"去搜,他们搜的是"婚礼""美食"这种实体词。需求的根,其实是结构化标签,不是自然语言描述。

我们算了一笔账:全量帖子每天新增几万张图,全走旗舰视觉模型生成描述,单日成本是一个可观的五位数,而带来的搜索点击提升几乎测不出来。最后这个需求被砍,改成用已有的轻量分类模型打十个结构化标签,成本忽略不计,业务方要的"可搜性"反而更准。这个反例的价值在于:它证明"多模态四问"的第一问不是摆设。很多需求是被"视觉模型能做"的炫技感带着走,而不是被"业务真的需要"推着走。先问纯文本,再问专用模型,最后才问通用旗舰,顺序对了,你会在立项阶段就拦掉一大批伪需求,省下的不只是钱,还有团队被无效项目消耗的心力。

验收到底怎么量化:我们的评测集实践

前面反复说"早建标注集",但怎么建、建多少、拿它干什么,值得单独讲。多模态的验收比文本难,因为"对不对"常常要人眼判断,不能只信模型自报的准确率,否则你会在上线后才发现"它其实一直没答对那类样本"。

第一步是抽而不是全量。我们每个场景建了一个几百到一两千条的黄金集(golden set),由两个以上人独立标注、交叉校验,分歧样本由负责人拍板。量不在大,在于"覆盖典型错误类型":模糊图、异形票、口音语音、变体违规文案,每类都要有代表。一个只含清晰样本的评测集,会给你虚假的安全感,因为它从没见过会出事的那种输入。

第二步是分桶统计,而不是看总准确率。下面这种分法我们一直在用:

  • 标准样本桶:占大头,要求准确率极高,因为量大,错一个比例就放大成海量误判。
  • 疑难样本桶:模糊、异形、口音,允许略低,但要能降级到人工或旗舰兜底。
  • 对抗样本桶:专门放变体、谐音、遮挡,用来压测降级和多通道是否真兜得住。

只看总准确率会掩盖问题,比如标准桶 99%、对抗桶 60%,平均下来 90% 看着还行,但对抗桶正是出事的地方,一旦被钻空子就是真实的合规或资损事故。我们每次模型更新,都要求三个桶分别出数,任何一桶明显掉,就不许上线,哪怕总准确率涨了也不行。

# 评测分桶的简化统计(思路示例,非生产代码)
def eval_by_bucket(samples, predict):
    buckets = {"standard": [], "hard": [], "adversarial": []}
    for s in samples:
        buckets[s.tag].append(predict(s) == s.label)
    return {k: sum(v) / len(v) for k, v in buckets.items()}

第三步是回放。我们把每次真实输入的图/音频和模型输出落盘(敏感数据脱敏后),出事后能复现。有次线上误杀暴涨,就是靠回放定位到一批新出现的变体水印,模型从没见过,连夜补进对抗桶重训。没有回放能力,这种问题你连"为什么错"都答不上来,更别提修。回放还顺带解决了"归责"问题,到底是模型烂、数据脏还是上游传错,一盘就能看明白。

没有量化验收的多模态项目,本质上是在赌。你以为它行了,只是因为还没遇到那类会出事的样本。评测集就是用来提前把那类样本摆到你面前,让"行不行"变成可以讨论的数字,而不是一句"感觉还行"。

相关文章