当前位置: 首页 > article >正文

五、AIGC大模型_10多模态大语言模型基础知识与示例

1、基础知识

1.1 定义

多模态大语言模型(Multimodal Large Language Model)是一种在传统大语言模型(LLM)基础上,融合了多种数据模态的先进人工智能模型,它的核心在于能够处理和理解多种类型的数据,并将这些数据转化为统一的语义表示,进而进行推理和生成

模态指的是数据的不同形式或类型,常见的模态包括:

  • 文本(Text):自然语言文本,如句子、段落等
  • 图像(Image):静态图片,如照片、绘画等
  • 音频(Audio):声音信号,如语音、音乐等
  • 视频(Video):包含图像和音频的时间序列数据
  • 其他模态:如传感器数据、生物信号等

1.2 核心组成

多模态大语言模型的核心组成包括 大语言模型多模态编码器 这两部分:

  • 大语言模型(LLM,Large Language Model) 这是多模态大模型的基础,本质上是一个强大的文本生成和理解模型,它通过大规模的文本数据训练,能够生成自然语言文本,并对文本进行推理和理解

  • 多模态的编码器(Multimodal Encoders) 编码器的作用是将不同模态的数据(如图像、音频等)转化为与文本语义一致的向量表示,比如:

    • 图像编码器:将图像数据转化为语义向量,使其能够与文本数据进行交互
    • 音频编码器:将音频信号转化为语义向量,用于处理语音或音乐等数据
    • 视频编码器:将视频中的帧信息和时间序列信息转化为语义向量

1.3 工作原理

多模态大模型的核心在于将不同模态的数据通过编码器转化为统一的语义表示,然后输入到大语言模型中进行推理和生成,例如:

  • 将图像数据通过图像编码器转化为语义向量

  • 将音频数据通过音频编码器转化为语义向量

将这些语义向量与文本输入一起输入到大语言模型中,模型会综合这些信息进行推理和生成

1.4 优势和挑战

1.4.1 优势

  • 更全面的理解能力:能够结合多种模态的信息,更全面地理解复杂的场景和问题
  • 更广泛的应用场景:适用于图像、音频、视频等多种数据类型的处理,应用范围更广
  • 更强大的交互能力:能够支持更自然的人机交互,例如通过语音和图像与用户进行交互

1.4.2 挑战

  • 模态融合的复杂性:不同模态的数据具有不同的特征和结构,如何有效地将它们融合是一个技术难题
  • 计算资源的需求:多模态模型通常需要处理大量的数据和复杂的计算任务,对硬件资源的要求较高
  • 数据标注的困难:多模态数据的标注比单一模态数据更加复杂和耗时

2、典型代表(Qwen2系列)

阿里的Qwen2系列是多模态大模型的一个典型代表,它包括多种针对不同模态的模型架构

2.1 VL模型

  • 定义:VL(Vision Language Model)模型是一种结合视觉(Vision)和语言(Language)的多模态模型,主要用于处理图像和文本的交互任务
  • 应用场景
    • 图像描述(Image Captioning):根据输入的图像生成描述性的文本
    • 视觉问答(Visual Question Answering,VQA):根据图像和自然语言问题生成答案
    • 图文检索(Image-Text Retrieval):根据文本查询检索相关图像,或根据图像检索相关文本
  • 工作原理
    • 图像通过图像编码器转化为语义向量
    • 文本通过语言模型的编码器转化为语义向量
    • 两者结合后输入到大语言模型中进行推理和生成

2.2 Audio模型(Audio Language Model)

  • 定义:Audio(Audio Language Model)模型是一种结合音频和语言的多模态模型,用于处理音频和文本的交互任务
  • 应用场景
    • 语音识别(Speech Recognition):将语音信号转化为文本
    • 音频描述(Audio Captioning):根据音频生成描述性的文本
    • 音频问答(Audio Question Answering):根据音频和自然语言问题生成答案
  • 工作原理
    • 音频通过音频编码器转化为语义向量
    • 文本通过语言模型的编码器转化为语义向量
    • 两者结合后输入到大语言模型中进行推理和生成

3、简单示例

以Qwen2-VL-2B-Instruct为例,介绍多模态大模型的调用方法

模型下载地址:魔搭社区

下载模型之后,在模型同级目录存放ViT.png和代码文件

代码:

# 导入所需的库
from transformers import Qwen2VLForConditionalGeneration
from transformers import AutoTokenizer
from transformers import AutoProcessor
from qwen_vl_utils import process_vision_info
import os

# 设置环境变量,指定使用的GPU设备
# 这里设置为使用第0和第1号GPU设备
os.environ["CUDA_VISIBLE_DEVICES"] = "0, 1"

# 模型目录路径
model_dir = "Qwen2-VL-2B-Instruct"

# 加载预训练的Qwen2-VL模型
# 参数说明:
# - model_dir:模型文件所在的目录路径
# - torch_dtype="auto":自动选择张量的数据类型
# - device_map="auto":自动将模型分配到可用的设备(如GPU)
model = Qwen2VLForConditionalGeneration.from_pretrained(
    model_dir, 
    torch_dtype="auto", 
    device_map="auto"
)

# 加载与模型对应的处理器
# 处理器用于对输入数据进行预处理和编码
processor = AutoProcessor.from_pretrained(model_dir)

# 定义对话消息
# 消息包含系统角色和用户角色的对话内容
# 系统角色用于定义模型的行为和性格
# 用户角色用于输入问题和图像等信息
messages = [
    {
        "role": "system",
        "content": "你是一个有用的助手!"
    },
    {
        "role": "user",
        "content": [
            {"type": "text", 
             "text": "请描述一下这张图像"},
            {
                "type": "image",
                "image": "ViT.png",
            }
        ],
    }
]

# 使用处理器将对话消息转换为模型输入的文本模板
# 参数说明:
# - messages:对话消息
# - tokenize=False:不进行分词操作
# - add_generation_prompt=True:添加生成提示
text = processor.apply_chat_template(
    messages, tokenize=False, add_generation_prompt=True
)

# 使用process_vision_info函数处理消息中的视觉信息(图像和视频)
# 返回处理后的图像输入和视频输入
image_inputs, video_inputs = process_vision_info(messages)

# 使用处理器对输入数据进行编码
# 参数说明:
# - text:文本输入
# - images:图像输入
# - videos:视频输入
# - padding=True:对输入数据进行填充
# - return_tensors="pt":返回PyTorch张量
inputs = processor(
    text=[text],
    images=image_inputs,
    videos=video_inputs,
    padding=True,
    return_tensors="pt",
)

# 将输入数据移动到GPU设备
inputs = inputs.to("cuda")

# 使用模型生成输出
# 参数说明:
# - inputs:输入数据
# - max_new_tokens=512:生成的最大新token数量
generated_ids = model.generate(**inputs, max_new_tokens=512)

# 对生成的输出进行处理,去除输入部分的token
generated_ids_trimmed = [
    out_ids[len(in_ids) :] for in_ids, out_ids in zip(inputs.input_ids, generated_ids)
]

# 将生成的token解码为文本
# 参数说明:
# - generated_ids_trimmed:生成的token
# - skip_special_tokens=True:跳过特殊token
# - clean_up_tokenization_spaces=False:不清理多余的空格
output_text = processor.batch_decode(
    generated_ids_trimmed, skip_special_tokens=True, clean_up_tokenization_spaces=False
)

# 打印生成的文本
print(output_text)

运行结果:


http://www.kler.cn/a/594431.html

相关文章:

  • vue3之写一个aichat---已聊天组件部分功能
  • 文献检索与下指南
  • 神来之笔!Profinet转DeviceNet网关书写OTC焊机机器人连接传奇
  • PHP与Python无缝融合,开启跨语言开发新纪元
  • Web开发-JS应用原生代码前端数据加密CryptoJS库jsencrypt库代码混淆
  • 25.单例模式实现线程池
  • HW华为流程管理体系精髓提炼华为流程运营体系(124页PPT)(文末有下载方式)
  • 【QA】策略模式在QT有哪些应用
  • LabVIEW运动控制(二):EtherCAT运动控制器的多轴示教加工应用(下)
  • Unity音频混合器如何暴露参数
  • 用python制作一个俄罗斯方块小游戏
  • js 力扣100题 非负整数加一
  • 大白话详细解读React框架的diffing算法
  • 《剑指数据库:MySQL玄阶查术秘典·下卷》
  • 【c++】【STL】unordered_set 底层实现(简略版)
  • 从O(n²)到O(n):基于累计求和模型的线性递归模式优化与多场景实战
  • 基于Matlab的风力发电系统仿真研究
  • vue3 setup中访问全局变量还用加this吗。原来在组合式API中,需要用this.$loading。在setup中怎么用
  • Docker 容器基础技术:namespace
  • wsl2配置xv6全解(包括22.04Jammy)