通义千问
简介
阿里大模型内部访谈
初期,通义
前身为通义千问
- “通义”取自《汉书》中的“天地之常经,古今之通义也”,有“普遍适用的道理与法则”之意;
- “千问”寓意千万次的问,千万的学问,能问出千问的一定是真爱,能回答千问的,也一定是真有学问,以及AI和阿里云一样,都有千万次交互的热情。
- 2024年5月,更名为
通义
,意为“通情,达义”,具备全副AI能力,致力于成为人们的工作、学习、生活助手
发展历程
- 2023年4月7日,通义千问开始邀请测试。
- 2023年4月11日,阿里巴巴所有产品未来将接入
通义千问
大模型,进行全面改造,包括天猫、钉钉、高德地图、淘宝、优酷、盒马等 ; - 2023年4月,钉钉首次发布基于阿里千问大模型的智能化能力,用户输入斜杠“/”即可唤起10余项AI能力。通义千问 AI 大模型接入天猫精灵,开启相关内测招募。阿里云工程师在实验将千问大模型接入工业机器人,在钉钉对话框输入一句汉字,可远程指挥机器人工作。
- 2023年9月,通义千问正式向公众开放;淘宝内测应用淘宝问问接入通义千问,基于通义千问的文本理解与文本生成能力实现全新的交互体验以及推荐;
- 2024年9月25日,阿里云宣布开源通义千问140亿参数模型
Qwen-14B
及其对话模型Qwen-14B-Chat
,免费可商用; - 2024年10月31日,2023云栖大会现场,阿里大模型家族全面升级发布,
通义千问2.0
正式升级发布。通义千问App也随之发布
体验
API
API 支持多种模式
- 文本输入
- 流式输出
- 图像输入
- 视频输入
- 工具调用
- 联网搜索
- 异步调用
- 文档理解
- 文字提取
代码
import os
from openai import OpenAI
client = OpenAI(
# 若没有配置环境变量,请用百炼API Key将下行替换为:api_key="sk-xxx",
api_key=os.getenv("DASHSCOPE_API_KEY"),
base_url="https://dashscope.aliyuncs.com/compatible-mode/v1",
)
completion = client.chat.completions.create(
# 模型列表:https://help.aliyun.com/zh/model-studio/getting-started/models
model="qwen-plus",
messages=[
{"role": "system", "content": "You are a helpful assistant."},
{"role": "user", "content": "你是谁?"},
],
# Qwen3模型通过enable_thinking参数控制思考过程(开源版默认True,商业版默认False)
# 使用Qwen3开源版模型时,若未启用流式输出,请将下行取消注释,否则会报错
# extra_body={"enable_thinking": False},
)
print(completion.model_dump_json())
流式输出
输出示例
{"id":"chatcmpl-e30f5ae7-3063-93c4-90fe-beb5f900bd57","choices":[{"delta":{"content":"","function_call":null,"refusal":null,"role":"assistant","tool_calls":null},"finish_reason":null,"index":0,"logprobs":null}],"created":1735113344,"model":"qwen-plus","object":"chat.completion.chunk","service_tier":null,"system_fingerprint":null,"usage":null}
{"id":"chatcmpl-e30f5ae7-3063-93c4-90fe-beb5f900bd57","choices":[{"delta":{"content":"我是","function_call":null,"refusal":null,"role":null,"tool_calls":null},"finish_reason":null,"index":0,"logprobs":null}],"created":1735113344,"model":"qwen-plus","object":"chat.completion.chunk","service_tier":null,"system_fingerprint":null,"usage":null}
...
非流式输出
非流失输出返回格式
{
"choices": [
{
"message": {
"role": "assistant",
"content": "我是阿里云开发的一款超大规模语言模型,我叫通义千问。"
},
"finish_reason": "stop",
"index": 0,
"logprobs": null
}
],
"object": "chat.completion",
"usage": {
"prompt_tokens": 3019,
"completion_tokens": 104,
"total_tokens": 3123,
"prompt_tokens_details": {
"cached_tokens": 2048
}
},
"created": 1735120033,
"system_fingerprint": null,
"model": "qwen-plus",
"id": "chatcmpl-6ada9ed2-7f33-9de2-8bb0-78bd4035025a"
}
模型
截至2024年5月,通义千问提供通义灵码
(编码助手)、通义智文
(阅读助手)、通义听悟
(工作学习)、通义星尘
(个性化角色创作平台)、通义点金
(投研助手)、通义晓蜜
(智能客服)、通义仁心
(健康助手)、通义法睿
(法律顾问)8大行业模型
QwQ-32b 登顶开源榜单
Qwen 成为全球开源第一
- 32B 挑落
DeepSeek R1 671B
, 成为全球最佳开源模型
Qwen 推出了 32B 推理模型,击败了除 o1 线推理模型之外的所有模型。
- LiveBench AI 上击败了所有人,包括 DeepSeek、Anthropic、Meta、Google 和 xAI
能分清 3.11 3.9 大小,逻辑清晰。
- Blog: qwq-32b
- HF: QwQ-32B
- ModelScope: modelscope.cn/models/Qwen/Qw…
- Demo: huggingface.co/spaces/Qwen/Qw…
- Qwen Chat
体验
阿里qwq 32b 大失所望
- 语义理解:5分。 远远不如DeepSeekR1,甚至不如之前的72B-VL版本。 大失所望,与RAG和Agent结果效果非常差。
- 代码能力:8分, 一般般正常水平,也比不过DeepSeekR1, 不过胜在回答简洁,直击要害。
主要优点:
- 速度快(32B的优势)
同样的显卡,远不如用清华Ktransformer版本的DeepSeek。
多模态
QWen-VL 系列
QWen-VL
模型结构:
- Vision Encoder:ViT-bigG/14
- VL Adapter:a single-layer cross-attention(Q-former的左侧部分)
- LLM:Qwen-7B
VL Adapter 创建一组可训练 queries向量 和 image features一起做cross-attention,将视觉特征压缩至256的固定长度,同时为了提升细粒度的视觉理解,在cross-attention中也加入图像的2D绝对位置编码。
- Image Input 使用特殊token(
<img>
and</img>
)分隔 - Bounding Box Input 使用特殊token(
<box>
and</box>
)分隔 - bounding box 的 content referred使用特殊token(
<ref>
and</ref>
)分隔。
训练过程:
- Stage 1:预训练,训练Cross-Attention和ViT,冻结QwenLM。
- Stage 2:多任务预训练(7 tasks同时),全参数训练。
- Stage 3:指令微调,训练Cross-Attention和QwenLM,冻结ViT。
训练数据:
- 第一个阶段使用image-text pairs数据,77.3%英文、22.7%中文,一共14亿数据训练,图片size=224*224.
- 第二个阶段使用质量更高的image-text pairs数据,包含7个任务,图像size=448*448. 在同一个任务下构造交错图像文本数据,序列长度为2048. 训练目标与Stage1一致。
- 第三个阶段使用Instruction数据,训练指令遵循和对话能力,通过LLM self-instruction构造,一共350k条。
QWen2-VL
【2024-09-18】QWen-VL 发布
- 论文 Qwen2-VL: Enhancing Vision-Language Model’s Perception of the World at Any Resolution
- github:Qwen2
Qwen2-VL 开源了 2B,7B及其量化版本
参考
- 【2024-10-21】多模态大模型Qwen2的深入了解 – Qwen2-VL 部署方法
进一步增强模型对视频中视觉信息的有效感知和理解能力,引入三个关键升级:
- 原始动态分辨率:该功能允许模型处理任意分辨率的图像,而不需要调整模型结构。
- 实现原理: ViT里, 删除原始绝对位置嵌入, 引入 2D-RoPE 捕获图像二维位置信息;推理阶段, 任意分辨率图像包装成单个序列, 长度依赖于GPU内存; ViT 后通过MLP层将 2*2 token 压缩成1个token, 以减少图像的视觉token数
- 多模态旋转位置嵌入 (M-RoPE):该功能通过时间、高度、宽度三个维度来对进行embedding,从而建模了多模态输入的位置信息。
- 传统 1D-RoPE 仅限于编码一维位置信息,M-RoPE 有效地建模了多模态输入的位置信息。
- 这通过将原始旋转嵌入分解为三个组件:时间、高度 和 宽度 来实现。
- 对于文本输入,这些组件使用相同的位移。多模态旋转位置嵌入ID,使 M-RoPE 功能上等同于1D-RoPE。
- 在处理图像时,每个视觉令牌的时间ID保持不变,而高度和宽度组件根据令牌在图像中的位置分配不同的ID。
- 对于视频,这些被当作帧序列来处理的视频,每帧的时间ID递增,而高度和宽度组件遵循与图像相同的ID分配模式。
- M-RoPE不仅增强了对位置信息的建模能力,而且降低了图像和视频中位置ID的价值,使得模型能够在推理期间扩展到更长的序列。
- 统一图像和视频的理解:通过混合训练方法,结合图像和视频数据,确保在图像理解和视频理解方面具有专业水平
- 每秒对每个视频进行两次采样。
- 集成深度为两层的三维卷积来处理视频输入,允许模型处理三维管状结构而不是二维块,从而使其能够处理更多视频帧而无需增加序列长度
- 为了保持一致,每张图片都被视为两张相同的帧。为了平衡长视频处理所需的计算需求与整体训练效率,我们动态调整每个视频帧的分辨率,限制每个视频中的总令牌数量不超过 16384。
- 这种训练方法在模型理解和训练效率之间取得了平衡。
能力更强
优化亮点:
- 在各种分辨率和比例的图像的理解SoTA:Qwen2-VL 在视觉理解基准上实现了最先进性能,包括 MathVista、DocVQA、RealWorldQA、MTVQA 等。
- 支持理解 20 分钟以上的视频:借助在线流媒体功能,Qwen2-VL 可以通过基于高质量视频的问答、对话、内容创作等方式理解 20 分钟以上的视频。
- 可集成在移动设备上:Qwen2-VL 具有复杂的推理和决策能力,可以与手机、机器人等设备集成,根据视觉环境和文本指令进行自动操作。
- 多语言支持:为了服务全球用户,除了英语和中文,Qwen2-VL 现在还支持理解图像中不同语言的文本,包括大多数欧洲语言、日语、韩语、阿拉伯语、越南语等。
模型结构:
- Vision Encoder:ViT/14
- VL Adapter:Cross-Modal Connector
- LLM:Qwen2-1.5B, Qwen2-7B, Qwen2-72B
Qwen2-VL 相较于 Qwen-VL 主要改进点(除了VQA等基础能力的提升):
- 1)支持视频理解,支持context上下文长度到128k token(20分钟左右视频)。
- 2)Visual Agent 能力,支持实时视频对话。
- 3)图像位置编码采用 2D-RoPE,一张 224*224 分辨率的图像经过ViT/patch_size=14等一系列转换之后会被压缩至66个token输入到LLM。
Qwen2-VL 模型主要由两个部分组成:视觉编码器
和 语言模型
。
- •
视觉编码器
(Qwen2VisionTransformerPretrainedModel):- • Patch Embedding:使用 Conv3d 进行图像embedding,切分为多个小块并提取特征。其中卷积核大小为 (2, 14, 14),步幅也为 (2, 14, 14)。
- • Rotary Positional Embedding:如论文所述,进行旋转位置嵌入以增强视觉模型的感知能力。
- • Transformer Blocks:包含 32 个 Qwen2VLVisionBlock,每个块都有两个 Layer Normalization 层和一个 注意力机制,注意力机制采用 Linear 层进行 QKV(查询、键、值)映射。
- • Patch Merger:对提取的特征进行合并,使用 LayerNorm 和 MLP(多层感知机) 处理。
- •
语言模型
(Qwen2VLModel):- • Token Embedding:使用 Embedding 层将输入的文本 token 转换为稠密向量,维度为 1536。
- • Decoder Layers:包含 28 个 Qwen2VLDecoderLayer,每层具有自注意力机制和 MLP;自注意力机制(Qwen2VLFlashAttention2)通过 Q、K、V 的线性映射进行注意力计算,采用旋转嵌入增强序列信息。
- • Norm Layer:使用 Qwen2RMSNorm 进行归一化,帮助模型在训练过程中保持稳定性。
- •
输出层
(lm_head):- • 最后通过一个线性层将模型的输出映射回词汇表大小(151936),用于生成文本。
训练过程:
- Stage 1:训练ViT,使用大量image-text对。
- Stage 2:全参数微调,使用更多的数据提升模型全面理解的能力。
- Stage 3:指令微调,训练LLM。
下载通义千问2-VL-2B-Instruct模型
# 确保 git lfs 已安装
git lfs install
# 下载模型
git clone https://www.modelscope.cn/Qwen/Qwen2-VL-2B-Instruct.git
安装flash_attention, 加速推理,以减少显存占用
pip install flash-attn
代码
from transformers import Qwen2VLForConditionalGeneration
from transformers import AutoTokenizer
from transformers import AutoProcessor
import torch
from qwen_vl_utils import process_vision_info
# 设置模型路径
model_dir = "Qwen2-VL-2B-Instruct"
# 使用flash-attension加载模型
model = Qwen2VLForConditionalGeneration.from_pretrained(
model_dir,
torch_dtype=torch.bfloat16,
attn_implementation="flash_attention_2",
device_map="auto",
)
Qwen2.5-Omni
【2025-3-27】阿里巴巴发布Qwen2.5-Omni,全球首个端到端全模态大模型,为多模态信息流实时交互提供了新的技术框架。
Qwen2.5-Omni 整合了文本、图像、音频和视频的跨模态理解能力,实现流式文本与自然语音的双向同步生成。
关键技术:
- 1)采用分块处理策略解耦长序列多模态数据,由多模态编码器负责感知、语言模型承担序列建模,通过共享注意力机制强化模态融合;
- 2)提出时间对齐的位置编码方法TMRoPE,通过音视频交错排列实现时间戳同步;
- 3)首创Thinker-Talker架构,分离文本生成(Thinker语言模型)与语音合成(基于隐藏表征的双轨自回归Talker模型),避免模态间干扰;
- 4)引入滑动窗口DiT解码器降低音频流初始延迟。
效果分析:
- Omni-Bench 等多模态基准上达到SOTA,语音指令跟随能力与纯文本输入(MMLU/GSM8K)表现相当,流式语音生成在鲁棒性和自然度上超越主流流式/非流式方案。
资料:
- Qwen2.5-Omni技术报告
- 代码 Code: Qwen2.5-Omni
- 中文介绍: Qwen2.5-Omni
- 视频介绍: Video
应用
目标检测
基于多模态大模型 Qwen2.5-VL
实现完整的安全检测系统,通过视觉模型检测图像中的火灾、烟雾和人员安全帽佩戴情况,并将结果可视化输出。
主要功能
- 图像检测:
- 使用OpenAI API调用视觉模型(Qwen2.5-VL)分析图像
- 检测火灾、烟雾和安全帽佩戴情况
- 返回检测目标的边界框坐标和分类标签
- 结果可视化:
- 在原始图像上绘制检测框和标签
- 红色框标记火灾,蓝色框标记烟雾,绿色框标记人员
- 标注人员是否佩戴安全帽
- 报告生成:
- 将检测结果保存为PDF文档
- 包含原始/标注图像和检测结果的文字描述
- 文件管理:
- 自动创建必要的目录结构(images, marked_images, fonts)
- 支持本地图像和网络URL图像两种输入方式
基于多模态大模型 Qwen2.5-VL-7B 实现安全检测系统
主要功能
- 通过视觉模型检测图像中的火灾、烟雾和人员安全帽佩戴情况
- 返回: bbox_2d, label(人员), sub_label(佩戴安全帽)
- 主要就是写写提示词。
基于 Qwen2.5-VL 实现的安全检测系统(火灾、烟雾和安全帽佩戴)
用 OpenAI API 与 Qwen2.5-VL 模型进行交互,检测图像中的火灾、烟雾和人员安全帽佩戴情况。支持本地图片和互联网图片的检测。
提示词
效果图
- 小红书笔记
NVIDIA T4 卡,部署在4张卡上,每秒30多个token。
要想快关键是推理速度和生成token数量。可以试试批量推理。
对准确率和推理速度有高要求 –> 深度学习模型(YOLO)。
代码
pip install openai
import os
import base64
from openai import OpenAI
# 配置API参数
OPENAI_API_KEY = "EMPTY"
OPENAI_API_BASE = "http://172.16.33.66:8000/v1"
MODEL_NAME = "Qwen2.5-VL"
PROMPT = """
请检测图像中的所有火灾、烟雾和人员安全帽佩戴情况,并以坐标形式返回每个目标的位置。输出格式如下:
- 火灾对象:{"bbox_2d": [x1, y1, x2, y2], "label": "火灾", "sub_label": "轻微" / "中等" / "严重" / "不确定"}
- 烟雾对象:{"bbox_2d": [x1, y1, x2, y2], "label": "烟雾", "sub_label": "轻微" / "中等" / "严重" / "不确定"}
- 人员对象:{"bbox_2d": [x1, y1, x2, y2], "label": "人员", "sub_label": "佩戴安全帽" / "未佩戴安全帽" / "不确定"}
请严格按照上述格式输出所有检测到的对象及其坐标和属性,三类对象分别输出。如无法确定,请将 "sub_label" 设置为 "不确定"。
检测规则:
- 火灾:图像中存在明显火焰或燃烧迹象。
- 烟雾:图像中存在明显的烟雾扩散现象。
- 人员:图像中有完整或部分可见的人体。
- 安全帽佩戴:安全帽必须正确佩戴在头部,且帽檐朝前;若无法判断,则标记为 "不确定"。
注意事项:
- 输出结果应尽量准确。
- 输出检测到的对象不要超过 10 个。
结果示例:
[
{"bbox_2d": [100, 200, 180, 300], "label": "火灾", "sub_label": "严重"},
{"bbox_2d": [220, 150, 350, 280], "label": "烟雾", "sub_label": "轻微"},
{"bbox_2d": [400, 320, 480, 420], "label": "人员", "sub_label": "佩戴安全帽"},
{"bbox_2d": [520, 330, 600, 430], "label": "人员", "sub_label": "未佩戴安全帽"}
]
"""
client = OpenAI(
api_key=OPENAI_API_KEY,
base_url=OPENAI_API_BASE,
)
def is_url(path: str) -> bool:
return path.startswith("http://") or path.startswith("https://")
def encode_image_to_base64(image_path: str) -> str:
with open(image_path, "rb") as f:
encoded_image = base64.b64encode(f.read())
encoded_image_text = encoded_image.decode("utf-8")
ext = os.path.splitext(image_path)[-1].lower().replace('.', '')
if ext == 'jpg':
ext = 'jpeg'
return f"data:image/{ext};base64,{encoded_image_text}"
def detect_image(image: str, prompt: str = PROMPT) -> str:
if is_url(image):
image_url = image
else:
image_url = encode_image_to_base64(image)
chat_response = client.chat.completions.create(
model=MODEL_NAME,
messages=[
{"role": "system", "content": "You are a helpful assistant."},
{
"role": "user",
"content": [
{"type": "image_url", "image_url": {"url": image_url}},
{"type": "text", "text": prompt},
],
},
],
)
return chat_response.choices[0].message.content if hasattr(chat_response, 'choices') else str(chat_response)
def main():
local_images = [
# 可在此添加需要检测的本地图片路径
"images/fire1.png",
]
url_images = [
# 可在此添加需要检测的互联网图片URL
"https://www.cdstm.cn/gallery/hycx/child/201703/W020170307572370556544.jpg"
]
all_images = local_images + url_images
results = []
for img in all_images:
print(f"检测图片: {img}")
try:
result = detect_image(img)
print(f"结果: {result}\n{'-'*40}")
results.append({"image": img, "result": result})
except Exception as e:
print(f"检测失败: {e}\n{'-'*40}")
results.append({"image": img, "result": f"检测失败: {e}"})
if __name__ == "__main__":
main()