如何向DSPy传入图片以实现Qwen2.5VL模型的图像分析?
解决DSPy向Ollama多模态模型传入图片的问题
问题原因
- 直接传入
dspy.Image对象时,DSPy的Ollama适配器无法将其序列化为JSON格式,触发序列化报错。 - 使用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
相关产品推荐
相关产品推荐

