You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何向DSPy传入图片以实现Qwen2.5VL模型的图像分析?

解决DSPy向Ollama多模态模型传入图片的问题

问题原因

  1. 直接传入dspy.Image对象时,DSPy的Ollama适配器无法将其序列化为JSON格式,触发序列化报错。
  2. 使用Signature传入base64 URI时,DSPy默认提示生成逻辑未按Ollama多模态API要求封装图片数据,模型实际未接收到图片,因此输出通用模板内容。

正确解决方案

Ollama多模态API要求图片以结构化消息内容传入,需将图片的base64 URI封装在content数组中,与文本指令并列。以下是两种可行实现方式:

方式1:直接构造符合Ollama格式的消息调用LM

import dspy
import base64

# 初始化Ollama LM
lm = dspy.LM(model="ollama_chat/qwen2.5vl:latest", api_base="http://localhost:11434")
dspy.configure(lm=lm)

# 将图片转为base64数据URI
with open("image.png", "rb") as img_file:
    base64_img = base64.b64encode(img_file.read()).decode("utf-8")
img_uri = f"data:image/png;base64,{base64_img}"

# 构造Ollama要求的多模态消息
messages = [
    {
        "role": "user",
        "content": [
            {"type": "text", "text": "详细描述这张图片的内容"},
            {"type": "image_url", "image_url": {"url": img_uri}}
        ]
    }
]

# 调用模型并获取结果
response = lm(messages=messages)
print(response)

方式2:结合DSPy Signature自定义消息构造

如果需要遵循DSPy的Signature规范,可以手动封装消息结构,确保图片正确传递:

import dspy
import base64

class SceneDescriptionSignature(dspy.Signature):
    """详细描述提供的图片内容,聚焦于实际存在的元素"""
    image: str = dspy.InputField(desc="图片的base64数据URI")
    scene_description = dspy.OutputField(desc="图片内容的详细描述")

# 初始化LM
lm = dspy.LM(model="ollama_chat/qwen2.5vl:latest", api_base="http://localhost:11434")
dspy.configure(lm=lm)

# 处理图片为base64 URI
with open("image.png", "rb") as img_file:
    base64_data = base64.b64encode(img_file.read()).decode("utf-8")
image_data_uri = f"data:image/png;base64,{base64_data}"

# 自定义预测逻辑,确保消息格式符合Ollama要求
predictor = dspy.Predict(SceneDescriptionSignature)
def get_image_description(img_uri):
    # 构造包含图片的多模态消息
    messages = [
        {
            "role": "user",
            "content": [
                {"type": "text", "text": predictor.signature.instructions},
                {"type": "image_url", "image_url": {"url": img_uri}}
            ]
        }
    ]
    # 调用模型
    raw_response = lm(messages=messages)
    return {"scene_description": raw_response}

# 获取结果
result = get_image_description(image_data_uri)
print(result["scene_description"])

注意事项

  • 确保Ollama服务已启动(执行ollama serve),且api_base指向正确地址(默认是http://localhost:11434)。
  • 确认已通过ollama pull qwen2.5vl:7b拉取目标模型。

内容的提问来源于stack exchange,提问作者1058u4

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 01:19:52