消息格式会显著影响模型的reasoning行为

阿里云千问模型Reasoning功能行为差异反馈

基本信息

  • 反馈类型: 模型行为差异问题
  • 模型版本: qwen-plus-2025-04-28
  • API接口: DashScope Compatible Mode (OpenAI格式)
  • 功能模块: Reasoning思考过程 (enable_thinking=True)
  • 发现时间: 2025年5月
  • 影响程度: 功能完全失效/正常工作 (取决于消息格式)

问题描述

核心问题

在使用qwen-plus-2025-04-28模型的thinking功能时,发现消息格式会显著影响模型的reasoning行为

  • 字符串格式消息: 模型正常产生reasoning内容
  • 列表格式消息: 模型完全跳过reasoning阶段,直接给出答案

这种行为差异在官方文档中未有说明,给开发者造成困扰。

具体表现

字符串格式 (正常工作)

{
    "role": "user",
    "content": "解释什么是深度学习?"
}

结果: ✅ 产生reasoning内容,可以获取到delta.reasoning_content

列表格式 (reasoning失效)

{
    "role": "user", 
    "content": [
        {"type": "text", "text": "解释什么是深度学习?"}
    ]
}

结果: ❌ 不产生reasoning内容,delta.reasoning_content始终为空

🔍 重要发现:格式检测优先于内容检测

我们进一步测试了给qwen-plus-2025-04-28(不支持多模态)发送图片的情况:

测试3: 文本+图片列表格式

{
    "role": "user",
    "content": [
        {"type": "text", "text": "请描述图片并解释AI"},
        {"type": "image_url", "image_url": {"url": "data:image/jpeg;base64,..."}}
    ]
}

结果:

  • ❌ 不产生reasoning内容 (0 chunks)
  • ✅ 正常响应文本内容 (78 chunks)
  • ✅ 智能忽略图片,不报错
  • 💭 关键:即使图片被忽略,reasoning仍然被禁用

测试4: 纯图片列表格式

{
    "role": "user",
    "content": [
        {"type": "image_url", "image_url": {"url": "data:image/jpeg;base64,..."}}
    ]
}

结果:

  • ❌ 不产生reasoning内容 (0 chunks)
  • ✅ 礼貌回复"无法处理图片" (10 chunks)
  • ✅ 不报错,优雅处理

数据对比

我们进行了严格的A/B测试,使用完全相同的问题和模型配置:

消息格式思考过程chunks回答chunks思考内容长度reasoning状态
字符串格式8177563字符✅ 正常
列表格式(纯文本)0490字符❌ 失效
列表格式(文本+图片)0780字符❌ 失效
列表格式(纯图片)0100字符❌ 失效

核心结论: 模型根据消息格式(不是内容)来决定是否启用reasoning功能。

可复现的测试代码

测试环境

  • Python 3.8+
  • openai库 (兼容DashScope)
  • 相同的API Key和配置

测试代码1: 字符串格式 (有reasoning)

from openai import OpenAI

client = OpenAI(
    api_key="your_api_key",
    base_url="https://dashscope.aliyuncs.com/compatible-mode/v1"
)

# 字符串格式
messages = [
    {"role": "user", "content": "解释什么是深度学习?"}
]

completion = client.chat.completions.create(
    model="qwen-plus-2025-04-28",
    messages=messages,
    extra_body={"enable_thinking": True},
    stream=True,
)

reasoning_chunks = 0
for chunk in completion:
    if chunk.choices and hasattr(chunk.choices[0].delta, 'reasoning_content'):
        if chunk.choices[0].delta.reasoning_content is not None:
            reasoning_chunks += 1
            print(f"思考过程: {chunk.choices[0].delta.reasoning_content}")

print(f"总思考chunks: {reasoning_chunks}")  # 输出: 80+ chunks

测试代码2: 列表格式 (无reasoning)

# 列表格式 - 相同的模型和配置
messages = [
    {
        "role": "user", 
        "content": [{"type": "text", "text": "解释什么是深度学习?"}]
    }
]

completion = client.chat.completions.create(
    model="qwen-plus-2025-04-28",
    messages=messages,
    extra_body={"enable_thinking": True},  # 相同的配置
    stream=True,
)

reasoning_chunks = 0
for chunk in completion:
    if chunk.choices and hasattr(chunk.choices[0].delta, 'reasoning_content'):
        if chunk.choices[0].delta.reasoning_content is not None:
            reasoning_chunks += 1

print(f"总思考chunks: {reasoning_chunks}")  # 输出: 0 chunks

业务影响

实际场景

在开发多模态AI聊天系统时,为了统一处理文本和图片消息,开发者通常会使用列表格式:

# 统一的消息格式处理
def build_message(text_content, image_files=None):
    content = []

    # 添加文本
    if text_content:
        content.append({"type": "text", "text": text_content})

    # 添加图片
    if image_files:
        for img in image_files:
            content.append({"type": "image", "image": img})

    return {"role": "user", "content": content}

问题影响

  1. 功能缺失: 用户无法看到AI的思考过程
  2. 用户体验下降: 缺少透明度,用户不理解AI如何得出答案
  3. 开发困惑: 相同配置下不同表现,难以调试
  4. 架构复杂化: 需要针对不同场景使用不同的消息格式

期望的解决方案

选项1: 统一行为

希望模型在两种格式下都能产生reasoning内容,保持一致性。

选项2: 明确文档说明

如果这是设计行为,希望在官方文档中明确说明:

  • 何时使用字符串格式
  • 何时使用列表格式
  • 不同格式的功能差异
  • reasoning功能的使用限制

选项3: 新增配置参数

提供明确的参数控制reasoning行为,而不依赖于消息格式推断。

技术分析

推测的原因

根据测试结果,我们推测模型内部可能有如下逻辑:

def process_message(message):
    # 第一步:格式检测(优先级最高)
    if isinstance(message.content, list):
        # 进入多模态快速响应模式
        enable_reasoning = False
        mode = "multimodal_fast_response"

        # 第二步:内容处理
        for item in message.content:
            if item.type == "image_url":
                if model_supports_images:
                    process_image(item)
                else:
                    # 忽略图片,不报错
                    ignore_image(item)
            elif item.type == "text":
                process_text(item)

    elif isinstance(message.content, str):
        # 进入深度文本对话模式
        enable_reasoning = True
        mode = "deep_text_conversation"
        process_text(message.content)

关键洞察

  1. 格式检测优先于内容检测 - 模型首先判断消息结构,再处理具体内容
  2. 多模态模式禁用reasoning - 为了快速响应,牺牲深度思考能力
  3. 优雅的向后兼容 - 不支持的功能会被忽略,不会报错

感谢阿里云团队的支持,期待您的回复和解决方案!

展开
收起
游客52gcpe2ne3roo 2025-05-24 22:57:50 132 分享 版权
0 条回答
写回答
取消 提交回答

基于通义系列大模型和开源大模型的一站式大模型服务平台,提供「生成式大模型的全流程应用工具」和「企业大模型的全链路训练工具」。为大模型,也为小应用。 阿里云百炼官网网址:https://www.aliyun.com/product/bailian

还有其他疑问?
咨询AI助理