多模态模型中文本生成器的过程和原理

在多模态模型里,文本生成器通常指负责输出自然语言结果的模块。它接收图像、视频、音频、文本、OCR、检测框等多模态信息,最终生成:

图像描述
视觉问答答案
商品属性说明
OCR 解释
视频摘要
机器人动作说明
结构化 JSON
诊断报告
库存差异说明

本质上,文本生成器通常就是一个 LLM Decoder,例如 LLaMA、Qwen、Vicuna、Mistral、Phi、Gemma 等。


1. 总体流程

多模态文本生成的基本流程如下:

图像 / 视频 / 音频 / OCR / bbox / mask
        ↓
各自模态编码器
        ↓
模态特征 token / embedding
        ↓
跨模态对齐模块
        ↓
转换成 LLM 能理解的 token 表示
        ↓
文本生成器 LLM Decoder
        ↓
逐 token 自回归生成文本

可以抽象成:

视觉输入 I
文本问题 Q

v = VisionEncoder(I)

z = Projector(v)

h = LLM([z, Q])

answer = TextDecoder(h)

其中:

模块 作用
VisionEncoder 把图像变成视觉特征
Projector 把视觉特征映射到 LLM 词向量空间
LLM Decoder 根据视觉 token 和文本 prompt 生成答案
Tokenizer 文本与 token ID 之间转换
Sampler 控制生成策略,例如 greedy、top-k、top-p、beam search

2. 文本生成器在多模态模型中的位置

以典型 VLM 为例:

             图像
              ↓
        Vision Encoder
              ↓
        Visual Tokens
              ↓
          Projector
              ↓
    Visual Tokens in LLM Space
              ↓
问题文本 → Tokenizer → Text Tokens
              ↓
     [Visual Tokens + Text Tokens]
              ↓
          LLM Decoder
              ↓
        Generated Text

在 LLaVA、MiniGPT-4、MiniCPM-V、Qwen-VL、SmolVLM 这类模型中,文本生成器通常就是 decoder-only LLM


3. 为什么多模态模型可以生成文本?

核心原因是:
视觉、音频、视频等模态被转换成了类似“软文本 token”的向量,然后喂给语言模型。

LLM 本来只能处理文本 token:

"图片里有什么?" → [token_1, token_2, token_3, ...]

多模态模型会把图像也转换成 token:

image → [visual_token_1, visual_token_2, visual_token_3, ...]

然后拼接成:

[visual_token_1, visual_token_2, ..., text_token_1, text_token_2, ...]

LLM 会把这些视觉 token 当成上下文信息,然后继续生成文本。


4. 关键原理一:模态编码

不同模态首先要编码成向量。

4.1 图像编码

常见视觉编码器:

CLIP ViT
SigLIP
EVA-CLIP
DINOv2
ConvNeXt
SAM Encoder
EfficientViT

输入图像:

I ∈ R^(H×W×3)

经过视觉编码器:

V = VisionEncoder(I)

输出视觉 token:

V = [v1, v2, v3, ..., vn]

每个 vi 是一个图像 patch 的语义表示。

例如一张图像被切成 14×14 个 patch,就可能得到 196 个视觉 token。


4.2 音频编码

音频模型中,常见编码器包括:

Whisper Encoder
Wav2Vec2
HuBERT
EnCodec
BEATs

音频输入:

A = waveform / mel spectrogram

编码后:

A_tokens = AudioEncoder(A)

这些 token 可以表示语音内容、说话人、音色、情绪、环境声等。


4.3 视频编码

视频一般是图像序列:

Video = [frame_1, frame_2, ..., frame_t]

可以通过:

ViT + temporal adapter
VideoMAE
TimeSformer
3D CNN
Frame sampling + CLIP

生成视频 token:

V_video = VideoEncoder(Video)

视频文本生成器可以基于这些 token 生成:

视频摘要
动作描述
事件检测结果
时序问答答案

5. 关键原理二:跨模态对齐

LLM 原本不理解视觉特征,所以需要一个 跨模态对齐层

常见做法有四种。


5.1 Linear Projector / MLP Projector

这是 LLaVA 类模型最常用的方式。

视觉特征维度:1024
LLM hidden size:4096

需要一个投影层:

z = MLP(v)

把视觉 token 映射到 LLM 的 hidden space。

结构类似:

Vision Token 1024
      ↓
Linear / MLP
      ↓
LLM Token 4096

优点:

简单
速度快
容易训练
适合 sVLM

缺点:

视觉 token 数多时推理成本高
细粒度对齐能力有限

5.2 Q-Former

BLIP-2、MiniGPT-4 早期路线常用 Q-Former。

它使用一组 learnable query 从视觉特征中提取关键信息。

Image Features
      ↓
Q-Former
      ↓
少量 Query Tokens
      ↓
LLM

例如:

视觉 patch token:576 个
Q-Former query token:32 个

这样可以大幅减少送入 LLM 的 token 数量。

优点:

压缩视觉信息
降低 LLM 上下文长度
适合轻量化

缺点:

结构更复杂
训练难度高于 MLP projector

5.3 Perceiver Resampler / Token Compressor

Flamingo、部分 VLM 和 sVLM 会用 resampler 压缩视觉 token。

大量视觉 token
      ↓
Resampler
      ↓
固定数量视觉 token
      ↓
LLM

这对边缘端很重要,因为视觉 token 越多,LLM 推理越慢。


5.4 Cross-Attention

有些模型不会直接把视觉 token 拼到文本 token 前面,而是在 LLM 中加入 cross-attention。

文本 token 作为 Query
视觉 token 作为 Key / Value

即:

Attention(Q_text, K_visual, V_visual)

优点是模态融合更灵活;缺点是改动 LLM 结构,工程部署复杂。


6. 关键原理三:文本生成器的自回归生成

文本生成器一般采用 自回归语言建模

也就是每次预测下一个 token:

P(y_t | y_1, y_2, ..., y_{t-1}, image, prompt)

完整生成概率为:

P(Y | X) = ∏ P(y_t | y_<t, X)

其中:

X = 图像 token + 文本 prompt
Y = 生成的答案 token

例如输入:

图像:一瓶可乐
问题:这是什么商品?

模型生成过程:

Step 1: 预测 “这”
Step 2: 预测 “是”
Step 3: 预测 “一”
Step 4: 预测 “瓶”
Step 5: 预测 “可”
Step 6: 预测 “乐”
Step 7: 预测 “。”

最终输出:

这是一瓶可乐。

7. 文本生成的详细推理过程

假设输入是一张自动售货柜图片和一个问题:

图片:柜体图像
问题:请判断第二层左侧商品是什么?

推理流程:

1. 图像预处理
   resize / normalize / patchify

2. 视觉编码
   image → visual tokens

3. 视觉 token 压缩或投影
   visual tokens → LLM-compatible tokens

4. 文本 prompt tokenize
   问题 → text token ids

5. 拼接多模态上下文
   [BOS] [IMG_TOKENS] [USER_PROMPT]

6. LLM 前向推理
   计算 hidden states

7. 预测下一个 token 概率
   logits = LMHead(hidden)

8. 采样或选择 token
   greedy / top-p / top-k / beam search

9. 把生成 token 追加到上下文

10. 重复直到生成 EOS 或达到最大长度

伪代码:

visual_feats = vision_encoder(image)
visual_tokens = projector(visual_feats)

text_tokens = tokenizer(prompt)

context = concat(visual_tokens, text_tokens)

generated = []

for step in range(max_new_tokens):
    hidden = llm(context)
    logits = lm_head(hidden[-1])
    next_token = sample(logits)

    generated.append(next_token)
    context.append(next_token)

    if next_token == EOS:
        break

answer = tokenizer.decode(generated)

8. 训练过程

多模态文本生成器通常分阶段训练。


8.1 第一阶段:视觉-语言对齐预训练

目标是让视觉 token 能被 LLM 理解。

输入:

图像 + caption

训练目标:

根据图像生成 caption

例如:

输入图像:一只狗在草地上
目标文本:A dog is running on the grass.

训练时常常冻结:

Vision Encoder
LLM

只训练:

Projector / Q-Former / Adapter

这样成本较低。


8.2 第二阶段:视觉指令微调

让模型学会按照用户指令回答。

数据形式:

{
  "image": "xxx.jpg",
  "conversations": [
    {
      "from": "user",
      "value": "<image>\n这张图中有什么商品?"
    },
    {
      "from": "assistant",
      "value": "图中有一瓶可乐和一包薯片。"
    }
  ]
}

训练目标:

输入:图像 + 用户问题
输出:人工或大模型生成的答案

此阶段让模型具备:

视觉问答
描述生成
细粒度识别
OCR 解释
复杂推理
结构化输出

8.3 第三阶段:领域微调

针对具体业务场景,例如:

自动售货柜
医学影像
工业质检
机器人操作
交通监控
文档理解

可以继续微调:

LoRA
Adapter
Projector
视觉塔最后几层
LLM 部分层

例如自动售货柜场景:

输入:柜体图片 + SKU 库 + 任务指令
输出:商品列表 / 库存差异 / 异常说明

训练样本:

{
  "image": "cabinet_001.jpg",
  "instruction": "识别第二层所有商品,并输出 JSON。",
  "output": {
    "shelf": 2,
    "items": [
      {
        "sku": "coca_cola_500ml",
        "count": 3
      },
      {
        "sku": "sprite_500ml",
        "count": 2
      }
    ]
  }
}

9. 损失函数原理

文本生成器最核心的训练目标是 next token prediction

给定目标文本:

Y = [y1, y2, y3, ..., yn]

模型预测:

P(y_t | y_<t, image, prompt)

损失函数:

L = - Σ log P(y_t | y_<t, image, prompt)

也就是交叉熵损失:

L_ce = CrossEntropy(logits, target_token_ids)

如果模型生成目标是:

这是一瓶可乐

训练时:

输入:这
预测:是

输入:这是
预测:一

输入:这是一
预测:瓶

输入:这是一瓶
预测:可

不断让模型学会预测下一个 token。


10. 文本生成器的几种结构路线

10.1 Decoder-only 路线

代表:

LLaVA
MiniGPT-4
Qwen-VL
MiniCPM-V
InternVL
SmolVLM
MobileVLM

结构:

[Visual Tokens] + [Text Tokens] → LLM Decoder → Text

优点:

简单
复用现有 LLM
工程部署方便
适合 llama.cpp / vLLM / TensorRT-LLM

缺点:

视觉 token 会占用上下文长度
长图、多图、视频成本较高

10.2 Encoder-Decoder 路线

代表:

BLIP
BLIP-2
T5-based VLM
Unified-IO

结构:

Encoder: 多模态输入编码
Decoder: 文本生成

优点:

输入输出结构清晰
适合 caption、VQA、OCR、文档理解

缺点:

不如 decoder-only LLM 生态成熟
接入通用 LLM 工具链略复杂

10.3 Cross-Attention 路线

代表:

Flamingo
Kosmos 部分架构
部分 Video-Language 模型

结构:

LLM 内部通过 cross-attention 读取视觉特征

优点:

多模态融合能力强
适合多图、多帧、视频场景

缺点:

需要改 LLM 结构
部署复杂度高

11. 生成策略

文本生成不是直接选一个固定结果,而是根据概率分布逐 token 生成。

常见策略如下。


11.1 Greedy Search

每次选择概率最大的 token。

next_token = argmax(logits)

优点:

速度快
结果稳定
适合结构化输出

缺点:

容易死板
多样性差

适合:

JSON 输出
商品识别
库存差异
分类判断

11.2 Beam Search

保留多个候选序列。

beam_size = 3 / 5 / 10

优点:

结果更稳
适合翻译、caption

缺点:

速度慢
对开放式对话不一定好

11.3 Top-k Sampling

只从概率最高的 k 个 token 中采样。

k = 40

优点:

有一定随机性

缺点:

结构化任务不够稳定

11.4 Top-p Sampling

从累计概率达到 p 的 token 集合中采样。

p = 0.9

适合开放式描述和创意生成。


11.5 Temperature

控制分布平滑程度。

temperature < 1:更保守
temperature > 1:更多样

对于工业识别类任务,建议:

temperature = 0 或 0.1
top_p = 1
greedy decoding

对于描述生成,可以使用:

temperature = 0.7
top_p = 0.9

12. 多模态文本生成器为什么会幻觉?

多模态模型生成文本时,可能会出现幻觉:

图中没有可乐,但模型说有可乐
看不到文字,但模型编了 OCR 内容
商品数量错误
把相似包装误认为另一个 SKU

原因主要有:

原因 解释
视觉 token 信息不足 图像分辨率低、token 被压缩过度
语言先验太强 LLM 根据常识补全,而不是严格看图
对齐不足 视觉特征没有准确映射到语言空间
训练数据偏差 常见共现关系导致伪推理
解码策略过开放 temperature 过高导致编造
缺少检测约束 纯 VLM 不擅长精确计数和定位

所以在工程中,不建议完全依赖 VLM 文本生成结果做最终判断。


13. 文本生成器在 sVLM 中的轻量化

sVLM 的文本生成器通常会做以下优化:

13.1 小型 LLM

例如:

0.5B
1B
1.5B
2B
3B

相比 7B、13B,更适合边缘端。


13.2 量化

常见量化:

FP16
INT8
INT4
GPTQ
AWQ
GGUF Q4_K_M

用于降低:

显存
内存
带宽
功耗
推理延迟

13.3 视觉 token 压缩

这是 sVLM 特别关键的点。

576 visual tokens → 64 tokens
1024 visual tokens → 128 tokens
多帧视频 token → memory tokens

视觉 token 越少,LLM 解码越快。


13.4 KV Cache

自回归生成时,每生成一个 token 都要复用历史上下文。

KV Cache 存储:

Key Cache
Value Cache

避免每次都重复计算前面的 token。

没有 KV Cache:

每步重新计算全部上下文

有 KV Cache:

只计算新 token

这是实时文本生成的关键优化。


16. 总结

多模态模型中的文本生成器,本质上是:

把图像、音频、视频等非文本模态编码成 token,
通过 projector / Q-Former / cross-attention 对齐到 LLM 空间,
再由 LLM decoder 按自回归方式逐 token 生成文本。

对 sVLM 和边缘部署来说,关键不是单纯让模型“会说话”,而是让文本生成器成为:

结构化事实解释器
低置信度复核器
多模态证据融合器
业务决策说明器
Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐