你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn。
重要
本文中标记了“(预览版)”的项目目前为公共预览版。 此预览版未提供服务级别协议,不建议将其用于生产工作负载。 某些功能可能不受支持或者受限。 有关详细信息,请参阅 Microsoft Azure 预览版补充使用条款。
多模式大型语言模型 (LLM) 可以处理和解释各种形式的数据输入,提供了一个可以将仅限语言系统的功能提升到新高度的强大工具。 在各种数据类型中,图像对于许多实际应用程序都很重要。 将图像数据合并到 AI 系统中提供了一个实现视觉理解的基本层。
本文内容:
- 如何在提示流中使用图像数据
- 如何使用内置的 GPT-4V 工具分析图像输入。
- 如何构建可以处理图像和文本输入的聊天机器人。
- 如何使用图像数据创建批处理运行。
- 如何使用具有图像数据的联机终结点。
提示流中的图像类型
提示流输入和输出支持将图像作为新的数据类型。
若要在提示流创作页中使用图像数据,请执行以下操作:
添加流输入,选择“图像”作为数据类型。 你可以在流文件夹中上传或拖放图像文件、粘贴剪贴板中的图像,或者指定图像 URL 或相对图像路径。
在将图像馈送给 LLM 之前,可能需要使用 Python 工具对其进行预处理。 例如,可以将图像的大小调整或裁剪为较小的尺寸。
from promptflow import tool from promptflow.contracts.multimedia import Image as PFImage from PIL import Image as Image import io @tool def process_image(input_image: PFImage) -> PFImage: # convert the input image data to a BytesIO object data_byteIO = io.BytesIO(input_image) # Open the image data as a PIL Image object image = Image.open(data_byteIO) # crop image cropped_image = image.crop((100, 100, 900, 900)) # Convert the cropped image back to BytesIO byte_arr = io.BytesIO() cropped_image.save(byte_arr, format = 'JPEG') # Create a new prompt flow Image object with the cropped image data # This image is now ready to be returned cropped_PF_image = PFImage(byte_arr.getvalue(), mime_type = "image/jpeg") return cropped_PF_image ``` > [!IMPORTANT] > To process images using a Python function, you need to use the `Image` class that you import from the `promptflow.contracts.multimedia` package. The `Image` class is used to represent an `Image` type within prompt flow. It is designed to work with image data in byte format, which is convenient when you need to handle or manipulate the image data directly. > > To return the processed image data, you need to use the `Image` class to wrap the image data. Create an `Image` object by providing the image data in bytes and the [MIME type](https://developer.mozilla.org/docs/Web/HTTP/Basics_of_HTTP/MIME_types/Common_types) `mime_type`. The MIME type lets the system understand the format of the image data, or it can be `*` for unknown type.
运行 Python 节点并检查输出。 在此示例中,Python 函数将返回已处理的图像对象。 选择相应图像输出以预览图像。
如果 Python 节点中的图像对象设置为流输出,则也可以在流输出页面中预览图像。
使用 GPT-4V 工具
Azure OpenAI GPT-4 Turbo with Vision 工具和 OpenAI GPT-4V 是提示流中的内置工具,可以使用 OpenAI GPT-4V 模型根据输入图像回答问题。 可以通过在流创作页中选择“+ 更多工具”来找到该工具。
将 Azure OpenAI GPT-4 Turbo with Vision 工具添加到流中。 确保已建立 Azure OpenAI 连接,且可使用 GPT-4 vision-preview 模型。
用于在 GPT-4V 工具中撰写提示的 Jinja 模板遵循与 LLM 工具中的聊天 API 类似的结构。 若要在提示中表示图像输入,可以使用语法 
。 图像输入可以在 user
、system
和 assistant
消息中传递。
撰写提示后,选择“验证并分析输入”按钮以分析输入占位符。 由 
表示的图像输入将解析为图像类型,输入名称为“INPUT NAME”。
你可以通过以下方法为图像输入分配值:
- 来自图像类型流输入的引用。
- 来自其他节点的图像类型输出的引用。
- 上传、拖动、粘贴图像,或者指定图像 URL 或相对图像路径。
生成聊天机器人以处理图像
在本部分中,你将了解如何构建可以处理图像和文本输入的聊天机器人。
假设你想要构建一个聊天机器人,该机器人需要可以同时回答有关图像和文本的任何问题。 为此,可以按照此部分的步骤操作。
创建聊天流。
在“输入”中,选择“列表”作为数据类型。 在聊天框中,用户可以输入混合的文本和图像序列,提示流服务会将该序列转换为列表。
将 GPT-4V 工具添加到流中。 可以从默认 LLM 工具聊天复制提示并将其粘贴到 GPT 4V 工具中。 然后,从流中删除默认 LLM 工具聊天。
在此示例中,
{{question}}
引用聊天输入,这是一个由文本和图像组成的列表。(可选)你可以将任何自定义逻辑添加到流以处理 GPT-4V 输出。 例如,可以添加 Guardrails 和控件工具,以检测答案是否包含任何不适当的内容,并向用户返回最终答案。
现在,可以测试聊天机器人。 打开聊天窗口,并输入包含图像的任何问题。 聊天机器人将根据图像和文本输入回答问题。 聊天输入值是自动从聊天窗口中的输入回填的。 你可以在聊天框中找到包含图像的文本,这些内容将转换为由文本和图像组成的列表。
使用图像数据创建批处理运行
通过批处理运行,可以使用广泛的数据集测试流。 表示图像数据的方法有三种:通过图像文件、公共图像 URL 或 Base64 字符串。
- 图像文件:若要在批处理运行中使用图像文件进行测试,你需要准备一个数据文件夹。 此文件夹应包含一个
jsonl
格式的批处理运行条目文件(该文件位于根目录中),以及存储在同一文件夹或子文件夹中的所有图像文件。在该条目文件中,应使用格式
{"data:<mime type>;path": "<image relative path>"}
来引用每个图像文件。 例如,{"data:image/png;path": "./images/1.png"}
。 - 公共图像 URL:也可以使用以下格式在条目文件中引用图像 URL:
{"data:<mime type>;url": "<image URL>"}
。 例如,{"data:image/png;url": "https://www.example.com/images/1.png"}
。 - Base64 字符串:可以使用以下格式在条目文件中引用 Base64 字符串:
{"data:<mime type>;base64": "<base64 string>"}
。 例如,{"data:image/png;base64": "iVBORw0KGgoAAAANSUhEUgAAAGQAAABLAQMAAAC81rD0AAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAABlBMVEUAAP7////DYP5JAAAAAWJLR0QB/wIt3gAAAAlwSFlzAAALEgAACxIB0t1+/AAAAAd0SU1FB+QIGBcKN7/nP/UAAAASSURBVDjLY2AYBaNgFIwCdAAABBoAAaNglfsAAAAZdEVYdGNvbW1lbnQAQ3JlYXRlZCB3aXRoIEdJTVDnr0DLAAAAJXRFWHRkYXRlOmNyZWF0ZQAyMDIwLTA4LTI0VDIzOjEwOjU1KzAzOjAwkHdeuQAAACV0RVh0ZGF0ZTptb2RpZnkAMjAyMC0wOC0yNFQyMzoxMDo1NSswMzowMOEq5gUAAAAASUVORK5CYII="}
。
总之,提示流使用唯一的字典格式来表示图像,即 {"data:<mime type>;<representation>": "<value>"}
。 此处,<mime type>
表示 HTML 标准 MIME 图像类型,<representation>
表示支持的图像表示形式:path
、url
和 base64
。
创建批处理运行
在流创作页中,选择“评估”->“自定义评估”按钮来启动批处理运行。 在“批处理运行”设置中,选择一个数据集,该数据集可以是一个文件夹(包含条目文件和图像文件),也可以是一个文件(仅包含条目文件)。 你可以预览条目文件并执行输入映射,以将条目文件中的列与流输入对齐。
查看批处理运行结果
你可以在运行详细信息页面中检查批处理运行输出。 选择输出表中的图像对象以轻松预览图像。
如果批处理运行输出中包含图像,可以检查包含输出 jsonl 文件和输出图像的 flow_outputs 数据集。
使用具有图像数据的联机终结点
目前,部署详细信息页中的“测试”选项卡不支持图像输入或输出。
目前,你可以通过发送包含图像输入的请求来测试终结点。
若要使用具有图像输入的联机终结点,应使用 {"data:<mime type>;<representation>": "<value>"}
格式来表示图像。 在这种情况下,<representation>
可以是 url
或 base64
。
如果流生成了图像输出,则输出会以 base64
格式返回,例如 {"data:<mime type>;base64": "<base64 string>"}
。