虽然许多应用处理并生成文本,但现代大型语言模型(LLMs)正变得越来越支持多模态,能够理解语言之外的输入,比如图像。结合视觉功能可以构建能够“看”和解析视觉情境的应用,由此带来一类具有高效能的新应用场景。本部分介绍如何使用视觉语言模型(VLMs)处理和分析图像。您将学习如何准备图像以进行API调用,通过统一的接口将它们发送到不同模型,并通过有针对性的提示来指导模型分析,从而完成物体识别、文本提取和结构化数据生成等任务。从像素到提示视觉语言模型不直接处理图像文件。相反,它们需要将图像数据编码成一种可以通过API传输的格式,通常是Base64。这个过程将图像的二进制数据转换为字符串表示。该工具包会自动处理这种编码,但了解其过程很有帮助。image_to_base64 函数提供了一种直接的方法来执行此转换。from kerb.multimodal import image_to_base64 # 假设您有一个名为 'product-diagram.jpg' 的图像文件 image_path = "product-diagram.jpg" # 将图像编码为 Base64 字符串 encoded_image = image_to_base64(image_path) print(f"Base64 编码字符串(前60个字符):{encoded_image[:60]}...")这个编码后的字符串,连同您的文本提示,构成了发送到视觉模型的多模态输入。统一的图像分析不同的提供商,如OpenAI、Anthropic和Google,都有各自处理多模态输入的API格式。该工具包通过一个单一函数 analyze_image_with_vision_model 简化了这一点,它将提供商特定的细节抽象化。这使得您可以编写一次代码,并通过很小的改动就能在不同的视觉模型之间切换。下图展示了图像分析的典型工作流程。digraph G { rankdir=TB; splines=ortho; node [shape=box, style="rounded,filled", fillcolor="#e9ecef", fontname="Arial"]; edge [fontname="Arial"]; Image [label="图像文件\n(例如:product.jpg)", fillcolor="#a5d8ff"]; Prompt [label="文本提示\n(例如:'描述这张图片。')", fillcolor="#b2f2bb"]; subgraph cluster_toolkit { label="工具包函数"; style="dotted"; Analyze [label="analyze_image_with_vision_model", fillcolor="#ffec99"]; } VLM [label="视觉语言模型\n(GPT-4o, Claude 3.5, Gemini 1.5)", fillcolor="#eebefa"]; Analysis [label="文本分析\n(描述、JSON等)", fillcolor="#96f2d7"]; Image -> Analyze; Prompt -> Analyze; Analyze -> VLM [label="发送格式化的API请求"]; VLM -> Analysis [label="返回响应"]; }该函数自动处理 Base64 编码,并根据所选模型的要求格式化请求。让我们从一个基本任务开始:让模型描述一张图片。我们提供图像路径和引导分析的文本提示。from kerb.multimodal import analyze_image_with_vision_model, VisionModel # 假设 'product-diagram.jpg' 是产品示意图的图像 image_path = "product-diagram.jpg" prompt_text = "描述这张图片中显示的对象。" # 使用 OpenAI 的 GPT-4o 模型分析图像 analysis_result = analyze_image_with_vision_model( image_path=image_path, prompt=prompt_text, model=VisionModel.GPT4O ) print(analysis_result.description)使用 VisionModel 枚举的 model 参数,决定要使用哪个提供商和模型。通过简单地将 model=VisionModel.CLAUDE_3_5_SONNET 更改,您可以切换到 Anthropic 的 Claude 3.5 Sonnet。通过提示指导分析分析的质量在很大程度上取决于您提供的文本提示。通过具体化,您可以引导模型执行多种高级任务。使用 OCR 提取文本视觉模型在光学字符识别(OCR)方面表现良好,可以从扫描文档、截图或照片等图像中提取文本。# 假设 'product-specs.jpg' 包含带有产品规格的文本 ocr_prompt = "提取此图片中的所有文本。按其显示的样子精确转录。" ocr_result = analyze_image_with_vision_model( image_path="product-specs.jpg", prompt=ocr_prompt, model=VisionModel.GPT4O ) print("提取的文本:\n") print(ocr_result.description)这对于构建需要从数字和扫描文档组合中索引文本的RAG系统特别有帮助。结构化数据提取视觉语言模型最效能高的应用之一是从图像中提取结构化数据。通过指示模型以JSON等特定格式返回其结果,您可以创建可靠的数据处理流程。想象您有一张名片的图像。您可以要求模型将联系信息提取到一个JSON对象中。# 假设 'business-card.jpg' 是一张名片的图像 structured_prompt = """ 分析图片中的名片并提取以下信息。 以有效的JSON对象形式返回输出,包含以下键: - 姓名 - 职位 - 公司 - 电话 - 电子邮件 - 网站 """ structured_result = analyze_image_with_vision_model( image_path="business-card.jpg", prompt=structured_prompt, model=VisionModel.GPT4O ) # 现在可以轻松解析和使用结果 import json contact_info = json.loads(structured_result.description) print(json.dumps(contact_info, indent=2))此技术可用于发票、收据、表格或任何包含结构化信息的图像。分析多张图像您也可以在一次调用中提供多张图像进行比较分析。该函数接受 image_path 参数的图像路径列表。这对于比较产品版本、识别两张图表之间的变化或在一组图像中找出异类等任务很有帮助。# 假设您有两张来自不同季度的图表图像 image_paths = ["sales-q1.jpg", "sales-q2.jpg"] comparison_prompt = "这两张图片显示了第一季度和第二季度的销售图表。 " \ "比较它们并描述您观察到的主要趋势。" comparison_result = analyze_image_with_vision_model( image_path=image_paths, prompt=comparison_prompt, model=VisionModel.GPT4O ) print(comparison_result.description)通过在同一上下文中提供两张图像,模型可以直接引用并比较它们,从而提供比单独处理更具说明性的分析。