在本文中,你将浏览多个示例来提取不同类型的实体。 这些示例演示如何创建对象架构并从 Azure OpenAI 模型获取响应。 它使用 Python 和 Azure OpenAI 结构化输出模式。
注释
本文使用一个或多个 AI 应用模板 进行示例和指南。 AI 应用模板提供维护良好的易于部署的参考实现,确保 AI 应用的高质量起点。
此示例提供所需的一切。 它包括用于设置 Azure OpenAI gpt-4o 模型部署的基础结构和 Python 文件。 然后,可以使用它通过 Azure OpenAI 结构化输出模式和 Python OpenAI SDK 执行实体提取。
获取代码
浏览本文基于的 Azure OpenAI 结构化输出 示例。
跳转到 代码演练部分 ,了解每个示例示例的工作原理。
按照本文中的说明操作,你将:
- 从结构化输出支持的模型列表中部署模型。
- 运行使用 OpenAI Python 包 和 Pydantic 模型 请求结构化输出的示例 Python 文件。
OpenAI 中的结构化输出确保 AI 模型的响应遵循预定义的 JSON 架构。 此功能提供以下几个主要优势:
- 确保响应与定义的架构匹配,减少错误和不一致。
- 帮助将非结构化数据转换为定义完善的结构化格式,从而更轻松地与其他系统集成。
- 通过减少对后期处理的需求、优化令牌使用和提高效率。
结构化输出可用于函数调用、提取结构化数据以及生成复杂的多步骤工作流。
使用相同的常规方法跨许多文件类型进行实体提取,只要可以在文本或图像窗体中表示它们。
注释
目前不支持结构化输出:
- 自带数据 情境。
- 助手 或 Azure AI 代理服务。
-
gpt-4o-audio-preview和gpt-4o-mini-audio-preview版本:2024-12-17.
体系结构图
成本
为了在此示例中尽可能降低定价,大多数资源采用“基本”或“消耗”定价层级。 根据预期使用情况随时调整等级。 若要停止产生费用,在完成本文后删除资源。
先决条件
开发容器 环境中包含完成本文所需的所有依赖项。 可以在 GitHub Codespaces(在浏览器中)或本地使用 Visual Studio Code 运行开发容器。
若要使用本文,需要满足以下先决条件:
打开开发环境
按照这些说明设置预配置的开发环境,其中包含完成本文所需的所有依赖项。
GitHub Codespaces 运行由 GitHub 托管的开发容器,将 Visual Studio Code 网页版作为用户界面。 将 GitHub Codespaces 用于最简单的开发环境。 系统附带了已预安装的开发人员工具和依赖项,以确保能够完成本文。
重要
所有 GitHub 帐户每月最多可使用 Codespaces 60 小时,其中包含两个核心实例。 有关详细信息,请参阅 GitHub Codespaces 每月所含的存储和计算核心小时数。
使用以下步骤在 GitHub 存储库的main分支上Azure-Samples/azure-openai-entity-extraction创建新的 GitHub 代码空间。
右键单击以下按钮,然后在 新窗口中选择“打开”链接。 此操作让开发环境和文档可供查看。
在 “创建代码空间 ”页上,查看信息,然后选择“ 创建新代码空间”。
等待 Codespace 启动。 此启动过程会花费几分钟时间。
在屏幕底部的终端中,使用 Azure 开发人员 CLI 登录到 Azure:
azd auth login --use-device-code在终端中打开 URL。
从终端复制代码并将其粘贴到刚刚打开的 URL 中。
按照说明登录到 Azure 帐户。
本文中的剩余任务需要在此开发容器的上下文中完成。
部署和运行
示例存储库包含 Azure OpenAI gpt-4o 模型部署的所有代码和配置文件。 它还使用结构化输出模式和 Python openai SDK 执行实体提取。 按照以下步骤完成示例实体提取示例 Azure 部署过程:
将实体提取示例部署到 Azure
配置 OpenAI 帐户:
azd provision使用下表回答每个参数:
参数 答案 环境名称 保持简短和小写。 添加名称或别名。 例如, struct-output。 它用作资源组名称的一部分。Subscription 选择要在其中创建资源的订阅。 OpenAI 模型的位置 从列表中选择附近的位置。 注释
如果在部署期间收到错误或超时,请尝试更改部署位置。 OpenAI 资源可能存在可用性约束。 要更改位置,请运行:
azd env set AZURE_LOCATION "yournewlocationname"等待应用部署完成。 部署通常需要 5 到 10 分钟才能完成。
运行实体提取示例
此示例包括以下示例:
| 示例演练 | 示例文件名 | Description |
|---|---|---|
| 示例 1 | basic_azure.py |
使用已部署的 Azure OpenAI 资源从输入字符串中提取信息的基本示例。 |
| 示例 2 | extract_github_issue.py |
此示例使用 GitHub API 提取公共 GitHub 问题,然后提取详细信息。 |
| 示例 3 | extract_github_repo.py |
此示例使用 GitHub API 提取公共自述文件,然后提取详细信息。 |
| 示例 4 | extract_image_graph.py |
此示例分析图形的本地图像,并提取标题、轴、图例等详细信息。 |
| 示例 5 | extract_image_table.py |
此示例使用表分析本地图像并提取嵌套表格数据。 |
| 示例 6 | extract_pdf_receipt.py |
此示例使用 pymupdf 包分析本地 PDF 回执,首先将其转换为 Markdown,然后提取订单详细信息。 |
| 示例 7 | extract_webpage.py |
此示例使用 BeautifulSoup 包分析博客文章,并提取元数据(标题、说明和标记)。 |
通过键入 python <example filename>.py 或单击打开的文件上的“运行”按钮来运行示例。
浏览代码示例
此 AI 应用模板包含多个突出显示不同结构化输出用例的示例。 下一节将演练每个示例中的相关代码。
示例 1:使用已部署的 Azure OpenAI 资源从输入字符串中提取信息
此示例演示如何使用 Azure OpenAI 服务从文本输入中提取结构化信息。 它设置 Azure 身份验证、初始化 OpenAI 客户端、定义预期输出的 Pydantic 模型、向 GPT 模型发送请求,并验证并输出响应。 此方法可确保提取的信息结构良好且经过验证,以便更轻松地在下游应用程序中使用。
定义数据模型
定义 Pydantic 模型 可确保从 Azure OpenAI 服务中提取的信息经过结构化和验证。 Pydantic 模型为预期的输出提供明确的架构,这有助于:
- 确保提取的数据与预期的类型和格式匹配。
- 通过强制实施预定义的结构来减少错误和不一致。
- 通过提供清晰且一致的数据模型,更轻松地处理其他应用程序中提取的数据。
- 通过将非结构化数据转换为定义完善的结构化格式来帮助与其他系统集成。
CalendarEvent 模型定义
该 CalendarEvent 模型是一个 Pydantic 模型,用于定义 GPT 模型的预期输出的结构。
class CalendarEvent(BaseModel):
name: str
date: str
participants: list[str]
-
name:事件的名称。 -
date:事件的日期。 -
participants:活动参与者的列表。
如何在调用模型时使用 CalendarEvent
该 CalendarEvent 模型在向 GPT 模型发送请求时指定预期的响应格式。 此方法可确保提取的信息遵循特定的架构。
以下代码片段向 GPT 模型发送请求,并使用 CalendarEvent 获取响应:
completion = client.beta.chat.completions.parse(
model=os.getenv("AZURE_OPENAI_GPT_DEPLOYMENT"),
messages=[
{"role": "system", "content": "Extract the event information."},
{"role": "user", "content": "Alice and Bob are going to a science fair on Friday."},
],
response_format=CalendarEvent,
)
client.beta.chat.completions.parse:向 GPT 模型发送请求以分析输入文本并提取信息。
- 模型:要使用的 GPT 模型。
- 消息:模型的消息列表。 系统消息提供说明,用户消息具有图像 URL。
-
response_format:使用
CalendarEvent模型的预期响应格式。
分析和验证响应
以下代码片段处理 GPT 模型中的响应。 它首先从响应中提取消息。 然后,它会检查模型是否拒绝处理请求。 如果有拒绝,它会输出拒绝信息。 否则,它将输出已分析的响应,其中包含提取的结构化信息。 此方法可确保脚本可以处理 GPT 模型中的成功和失败的响应。
message = completion.choices[0].message
if (message.refusal):
rich.print(message.refusal)
else:
rich.print(message.parsed)
为什么检查拒绝很重要
错误处理:代码检查 GPT 模型是否拒绝处理请求。 如果这样做,它将打印拒绝信息。 此方法可帮助你(或用户)了解提取是否成功,或者是否存在要解决的问题。
提取数据验证:代码打印已分析的响应,以可读格式显示提取的信息。 此方法有助于验证数据是否与模型定义的
CalendarEvent预期结构匹配。
查看响应
分析的响应应类似于以下代码片段:
CalendarEvent(name='Science Fair', date='Friday', participants=['Alice', 'Bob'])
示例 2:使用 GitHub API 提取公共 GitHub 问题,然后提取详细信息
此示例演示如何使用 Azure OpenAI 服务从 GitHub 问题中提取结构化信息。 本演练仅重点介绍处理结构化输出的示例代码。
Issue定义模型
该 Issue 模型是一个 Pydantic 模型,用于定义 GPT 模型的预期输出的结构。
class Issue(BaseModel):
title: str
description: str = Field(..., description="A 1-2 sentence description of the project")
type: IssueType
operating_system: str
- title:问题的标题。
- 说明:问题的简要说明。
-
类型:枚举中
IssueType的问题类型。 - operating_system:与问题相关的作系统。
IssueType 枚举定义
IssueType Python 类是一个枚举,用于定义问题类型的可能值(例如 Bug 报告、功能、文档、回归)。
class IssueType(str, Enum):
BUGREPORT = "Bug Report"
FEATURE = "Feature"
DOCUMENTATION = "Documentation"
REGRESSION = "Regression"
Issue和IssueType的关系
模型 Issue 使用 IssueType 枚举来确保 type 字段仅包含有效值。 此关系在提取的数据中强制实施一致性和验证。
注释
虽然示例 1 侧重于简单的文本输入并使用基本的 CalendarEvent Pydantic 模型,但示例 2 引入了更复杂的 Issue 模型,其中包含问题类型的枚举。 此方法可确保提取的信息遵循特定类型和值。 它演示如何处理更详细和不同的数据,同时保留示例 1 中的结构化输出方法。
提取 GitHub 议题
以下代码片段从指定的 GitHub 存储库中提取问题。
url = "https://api.github.com/repos/Azure-Samples/azure-search-openai-demo/issues/2231"
response = requests.get(url)
if response.status_code != 200:
logging.error(f"Failed to fetch issue: {response.status_code}")
exit(1)
issue_body = response.json()["body"]
- requests.get:发送 GET 请求以从 GitHub API 提取问题。
- response.status_code:检查请求是否成功。
- issue_body:从 JSON 响应中提取问题的正文。
如何在调用模型时使用 Issue
在向 GPT 模型发送请求时,该 Issue 模型用于指定预期的响应格式。 此方法可确保提取的信息遵循特定的架构。
向 GPT 模型发送请求
completion = client.beta.chat.completions.parse(
model=model_name,
messages=[
{"role": "system", "content": "Extract the info from the GitHub issue markdown."},
{"role": "user", "content": issue_body},
],
response_format=Issue,
)
- 模型:要使用的 GPT 模型。
- 消息:模型的消息列表。 系统消息提供说明,用户消息具有图像 URL。
-
response_format:使用
Issue模型的预期响应格式。
分析和验证响应
以下代码片段处理 GPT 模型中的响应。 它首先从响应中提取消息。 然后,它会检查模型是否拒绝处理请求。 如果有拒绝,它会输出拒绝信息。 否则,它将输出已分析的响应,其中包含提取的结构化信息。 此方法可确保脚本可以处理 GPT 模型中的成功和失败的响应。
message = completion.choices[0].message
if (message.refusal):
print(message.refusal)
else:
print(message.parsed)
- message:从响应中的第一个选项中提取消息。
- message.refuse:检查 GPT 模型是否拒绝处理请求。
- print(message.refuse):如果模型拒绝了请求,则打印拒绝消息。
- print(message.parsed):如果提取成功,则打印已分析的响应。
查看响应
分析的响应应类似于以下代码片段:
Issue(
title='Bug with groups metadata tag not updating in Azure Deployment',
description='After setting up the app with authentication and access control turned on, and running necessary scripts, the groups metadata tag does not update with group IDs.',
type=<IssueType.BUGREPORT: 'Bug Report'>,
operating_system='Windows 10'
)
示例 3:使用 GitHub API 提取公共自述文件,然后提取详细信息
此示例演示如何使用 Azure OpenAI 服务从 GitHub 存储库的自述文件获取结构化信息。 本演练仅重点介绍处理结构化输出的示例代码。
如何使用其他定义的 RepoOverview 模型
模型使用RepoOverview、Language、AzureService和Framework枚举来定义提取信息的结构化和验证模式。 此模型用于对 GPT 模型的调用,以确保响应遵循预期格式,提供类型安全性、验证和可读性。 然后,该脚本对提取的信息进行分析、验证和打印,以便于在下游应用程序中使用。
RepoOverview 模型定义
该 RepoOverview 模型是一个 Pydantic 模型,用于定义 GPT 模型的预期输出的结构。 它使用其他定义的模型(Language和AzureServiceFramework)来确保提取的信息遵循特定的枚举和类型。
class RepoOverview(BaseModel):
name: str
description: str = Field(..., description="A 1-2 sentence description of the project")
languages: list[Language]
azure_services: list[AzureService]
frameworks: list[Framework]
- name:表示存储库名称的字符串。
- 说明:提供项目简要说明的字符串。
-
语言:枚举值列表
Language,表示项目中使用的编程语言。 -
azure_services:枚举值列表
AzureService,表示项目中使用的 Azure 服务。 -
框架:枚举值列表
Framework,表示项目中使用的框架。
在 RepoOverview 中使用的枚举
语言:定义编程语言的可能值。
class Language(str, Enum): JAVASCRIPT = "JavaScript" PYTHON = "Python" DOTNET = ".NET"AzureService:为 Azure 服务定义可能的值。
class AzureService(str, Enum): AIFOUNDRY = "AI Foundry" AISEARCH = "AI Search" POSTGRESQL = "PostgreSQL" COSMOSDB = "CosmosDB" AZURESQL = "Azure SQL"框架:定义框架的可能值。
class Framework(str, Enum): LANGCHAIN = "Langchain" SEMANTICKERNEL = "Semantic Kernel" LLAMAINDEX = "Llamaindex" AUTOGEN = "Autogen" SPRINGBOOT = "Spring Boot" PROMPTY = "Prompty"
注释
示例 3 在示例 2 的基础上,通过引入更复杂的模型(RepoOverview)和枚举(Language,AzureService,Framework),以确保提取的信息遵循特定的类型和值。 示例 3 演示如何处理更详细和不同的数据,同时保留示例 2 中的结构化输出方法。
如何在调用模型时使用 RepoOverview
该 RepoOverview 模型在向 GPT 模型发送请求时指定预期的响应格式。 此方法可确保提取的信息遵循特定的架构。
- 模型:要使用的 GPT 模型。
- 消息:模型的消息列表。 系统消息提供说明,用户消息具有图像 URL。
-
response_format:使用
RepoOverview模型的预期响应格式。
completion = client.beta.chat.completions.parse(
model=model_name,
messages=[
{
"role": "system",
"content": "Extract the info from the GitHub issue markdown.",
},
{"role": "user", "content": readme_content},
],
response_format=RepoOverview,
)
分析和验证响应
以下代码片段处理 GPT 模型中的响应。 它首先从响应中提取消息。 然后,它会检查模型是否拒绝处理请求。 如果有拒绝,它会输出拒绝信息。 否则,它将输出已分析的响应,其中包含提取的结构化信息。 此方法可确保脚本可以处理 GPT 模型中的成功和失败的响应。
message = completion.choices[0].message
if (message.refusal):
print(message.refusal)
else:
print(message.parsed)
- message:从响应中的第一个选项中提取消息。
- message.refuse:检查 GPT 模型是否拒绝处理请求。
- print(message.refuse):如果模型拒绝了请求,则打印拒绝消息。
- print(message.parsed):如果提取成功,则打印已分析的响应。
查看响应
分析的响应应类似于以下代码片段:
RepoOverview(
name='Job Finder Chatbot with RAG',
description='A chatbot application aimed at helping users find job opportunities and get relevant answers using Retrieval-Augmented Generation (RAG), leveraging Azure services for efficient search results.',
languages=[<Language.JAVASCRIPT: 'JavaScript'>],
azure_services=[<AzureService.AISTUDIO: 'AI Studio'>, <AzureService.AISEARCH: 'AI Search'>, <AzureService.POSTGRESQL: 'PostgreSQL'>],
frameworks=[<Framework.SPRINGBOOT: 'Spring Boot'>]
)
示例 4:分析图形的本地图像并提取标题、轴和图例等详细信息
此示例演示如何使用 Azure OpenAI 服务从图形的图像获取结构化信息。 该 Graph 模型定义预期的输出结构,确保数据结构良好且经过验证。 该脚本将图像转换为 base64 编码的 URI,将其发送到 GPT 模型,并检查针对 Graph 模型的响应。 此方法可确保信息可靠且易于使用,提供类型安全性和可读性。
定义Graph模型
该 Graph 模型是一个 Pydantic 模型,用于定义 GPT 模型的预期输出的结构。
class Graph(BaseModel):
title: str
description: str = Field(..., description="1 sentence description of the graph")
x_axis: str
y_axis: str
legend: list[str]
- title:显示图形标题的字符串。
- description:一个字符串,提供图形的简要说明。
- x_axis:显示 x 轴标签的字符串。
- y_axis:显示 y 轴标签的字符串。
- 图例:显示图例项的字符串列表。
注释
使用图像作为输入需要额外的步骤来编码和指定内容类型,但整个过程类似于使用结构化输出的文本。
为输入准备映像
若要将图像用作结构化输出的输入,脚本会将图像转换为 base64 编码的 URI。 此方法允许将图像作为请求的一部分发送到 GPT 模型。
def open_image_as_base64(filename):
with open(filename, "rb") as image_file:
image_data = image_file.read()
image_base64 = base64.b64encode(image_data).decode("utf-8")
return f"data:image/png;base64,{image_base64}"
image_url = open_image_as_base64("example_graph_treecover.png")
- open_image_as_base64:读取图像文件的函数,将其编码为 base64,并将其作为数据 URI 返回。
- image_url:图像的 base64 编码 URI,用作 GPT 模型的输入。
注释
示例 4 基于示例 3 构建,通过扩展从文本源中提取结构化信息的概念,从图像中提取详细信息。 示例 4 演示如何通过将图形图像转换为 base64 编码的 URI 并将其发送到 GPT 模型来处理视觉数据。 示例 4 引入了 Graph Pydantic 模型,以确保从图像中提取的信息结构良好且经过验证,类似于示例 3 中用于文本的方法。
向 GPT 模型发送请求
该脚本向 GPT 模型发送请求,以使用结构化输出从图像中提取信息。 模型 Graph 指定为预期的响应格式。 此方法可确保提取的信息遵循特定的架构。
completion = client.beta.chat.completions.parse(
model=model_name,
messages=[
{"role": "system", "content": "Extract the information from the graph"},
{
"role": "user",
"content": [
{"image_url": {"url": image_url}, "type": "image_url"},
],
},
],
response_format=Graph,
)
- 模型:要使用的 GPT 模型。
- 消息:模型的消息列表。 系统消息提供说明,用户消息具有图像 URL。
-
response_format:使用
Graph模型的预期响应格式。
使用图像进行输入与使用文本
将图像用作结构化输出的输入与使用文本的方式不同:
- 输入格式:在将图像发送到 GPT 模型之前,将图像转换为 base64 编码的 URI,而可以直接发送文本。
-
内容类型:必须指定图像
image_url的内容类型,而文本作为纯文本发送。 - 处理:GPT 模型以不同于文本的方式处理图像,提取视觉信息,并根据提供的架构将其转换为结构化数据。
分析和验证响应
以下代码片段处理 GPT 模型中的响应。 它首先从响应中提取消息。 然后,它会检查模型是否拒绝处理请求。 如果有拒绝,它会输出拒绝信息。 否则,它将输出已分析的响应,其中包含提取的结构化信息。 此方法可确保脚本可以处理 GPT 模型中的成功和失败的响应。
message = completion.choices[0].message
if (message.refusal):
print(message.refusal)
else:
print(message.parsed)
- message:从响应中的第一个选项中提取消息。
- message.refuse:检查 GPT 模型是否拒绝处理请求。
- print(message.refuse):如果模型拒绝了请求,则打印拒绝消息。
- print(message.parsed):如果提取成功,则打印已分析的响应。
查看响应
分析的响应应类似于以下代码片段:
Graph(
title='Global tree cover: annual loss',
description='This graph shows the annual loss of global tree cover by region from 2000 to 2020.',
x_axis='Year (2000-2020)',
y_axis='Thousand square kilometers/miles of tree cover lost',
legend=['Boreal', 'Temperate', 'Subtropical', 'Tropical']
)
示例 5:使用表分析本地图像并提取嵌套表格数据
此示例演示如何使用 Azure OpenAI 服务从表的图像中提取结构化信息。 该示例将图像转换为 base64 编码的 URI,将其发送到 GPT 模型,并验证针对 PlantInventory 模型的响应。 和PlantPlantInventory模型定义预期的输出结构,确保提取的数据经过良好结构和验证。
定义Plant和PlantInventory模型
Plant和PlantInventory模型是 Pydantic 模型,用于定义 GPT 模型的预期输出的结构。 此方法可确保提取的信息遵循特定的架构。
植物:代表具有物种、公用名、数量、大小、价格、县和备注的各植物条目。
class Plant(BaseModel): species: str common_name: str quantity: int size: str price: float county: str notes: str- 物种:植物的物种。
- common_name:植物的公用名。
- 数量:植物数。
- 大小:植物的大小。
- 价格:工厂的价格。
- 县:工厂所在的县。
- 备注:有关工厂的任何其他说明。
PlantInventory:表示总体库存,将植物分类为一年生植物、球茎植物和草类植物列表。
class PlantInventory(BaseModel): annuals: list[Plant] bulbs: list[Plant] grasses: list[Plant]-
年度对象:
Plant对象为年度的列表。 -
灯泡:灯泡的对象列表
Plant。 -
草类:一列表示草类的对象
Plant。
-
年度对象:
PlantInventory如何使用Plant模型
模型将 PlantInventory 多个 Plant 对象分组到列表中。 每个类别(一年生植物、球茎、草)都是Plant对象列表。 此结构可帮助示例组织和检查工厂数据。
为输入准备映像
若要将图像用作输入,以下代码片段将图像转换为 base64 编码的 URI。 此方法允许在请求中向 GPT 模型发送图像。
def open_image_as_base64(filename):
with open(filename, "rb") as image_file:
image_data = image_file.read()
image_base64 = base64.b64encode(image_data).decode("utf-8")
return f"data:image/png;base64,{image_base64}"
image_url = open_image_as_base64("example_table_plants.png")
- open_image_as_base64:读取图像文件的函数,将其编码为 base64,并将其作为数据 URI 返回。
- image_url:图像的 base64 编码 URI,用作 GPT 模型的输入。
注释
示例 5 演示如何从表的图像中提取结构化信息。 它引入了 PlantPlantInventory Pydantic 模型来定义预期的输出结构,确保提取的数据组织有序且经过验证。 此方法演示如何处理更详细和嵌套的数据,同时保留示例 4 中使用的结构化输出方法。
在调用 GPT 模型时使用其中的模型
以下代码片段向 GPT 模型发送请求,以使用结构化输出从表的图像中提取信息。 模型 PlantInventory 指定为预期的响应格式,这可确保提取的数据根据定义的架构进行结构化。
向 GPT 模型发送请求
completion = client.beta.chat.completions.parse(
model=model_name,
messages=[
{"role": "system", "content": "Extract the information from the table"},
{
"role": "user",
"content": [
{"image_url": {"url": image_url}, "type": "image_url"},
],
},
],
response_format=PlantInventory,
)
- 模型:要使用的 GPT 模型。
- 消息:模型的消息列表。 系统消息提供说明,用户消息具有图像 URL。
-
response_format:使用
PlantInventory模型的预期响应格式。
分析和验证响应
以下代码片段处理 GPT 模型中的响应。 它首先从响应中提取消息。 然后,它会检查模型是否拒绝处理请求。 如果有拒绝,它会输出拒绝信息。 否则,它将输出已分析的响应,其中包含提取的结构化信息。 此方法可确保脚本可以处理 GPT 模型中的成功和失败的响应。
message = completion.choices[0].message
if (message.refusal):
print(message.refusal)
else:
print(message.parsed)
- message:从响应中的第一个选项中提取消息。
- message.refuse:检查 GPT 模型是否拒绝处理请求。
- print(message.refuse):如果模型拒绝了请求,则打印拒绝消息。
- print(message.parsed):如果提取成功,则打印已分析的响应。
查看响应
分析的响应应类似于以下代码片段:
PlantInventory(
annuals=[
Plant(species='Centromadia pungens', common_name='Common tarweed', quantity=8, size='4"S', price=1.83, county='Unknown', notes='75% off sale'),
Plant(species='Epilobium densiflorum', common_name='Dense Spike-primrose', quantity=3, size='4"S', price=3.65, county='San Mateo', notes='50% off sale'),
Plant(species='Eschscholzia caespitosa', common_name='Tufted Poppy', quantity=119, size='D-16S', price=3.6, county='Unknown', notes='50% off sale'),
Plant(species='Eschscholzia californica', common_name='California poppy', quantity=85, size='D-16S', price=3.6, county='Bay Area', notes='50% off sale'),
Plant(species="Eschscholzia californica 'Purple Gleam'", common_name='Purple Gleam Poppy', quantity=2, size='D-16S', price=3.6, county='Unknown', notes='50% off sale'),
Plant(species='Eschscholzia californica var. maritima', common_name='Coastal California Poppy', quantity=137, size='D-16S', price=3.6, county='Unknown', notes='50% off sale'),
Plant(species='Madia elegans', common_name='Tarweed', quantity=6, size='4"S', price=1.83, county='Unknown', notes='75% off sale'),
Plant(species='Menzelia lindleyi', common_name="Lindley's Blazing Star", quantity=35, size='4"S', price=3.65, county='Unknown', notes='50% off sale'),
Plant(species='Symphyotrichum subulatum', common_name='Slim marsh aster', quantity=10, size='D-16S', price=5.4, county='Contra Costa', notes='25% off sale'),
Plant(species='Trichostema lanceolatum', common_name='Vinegar weed', quantity=11, size='D-16S', price=5.4, county='Contra Costa', notes='25% off sale'),
Plant(species='Trichostema lanceolatum', common_name='Vinegar weed', quantity=20, size='D-16S', price=5.4, county='Stanislaus', notes='25% off sale')
],
bulbs=[
Plant(species='Brodiaea californica', common_name='California brodiaea', quantity=31, size='D-16', price=7.3, county='Bay Area', notes=''),
Plant(species='Chlorogalum pomeridianum', common_name='Soap plant', quantity=20, size='1-Gal', price=15.7, county='E. Marin', notes=''),
Plant(species='Epipactis gigantea', common_name='Stream orchid', quantity=19, size='1-Gal', price=15.7, county='Unknown', notes=''),
Plant(species='Wyethia angustifolia', common_name='Narrowleaf mule ears', quantity=31, size='D-16', price=7.3, county='Marin', notes=''),
Plant(species='Wyethia angustifolia', common_name='Narrowleaf mule ears', quantity=43, size='D-16', price=7.3, county='Sonoma', notes=''),
Plant(species='Wyethia angustifolia', common_name='Narrowleaf mule ears', quantity=2, size='D-40', price=10.9, county='Sonoma', notes=''),
Plant(species='Wyethia mollis', common_name="Woolly Mule's Ear's", quantity=2, size='D-40', price=10.9, county='Sonoma', notes='')
],
grasses=[
Plant(species='Agrostis pallens', common_name='Thingrass', quantity=564, size='StubS', price=0.58, county='Unknown', notes='75% off sale'),
Plant(species='Anthoxanthum occidentale', common_name='Vanilla grass', quantity=146, size='Stub', price=2.3, county='Unknown', notes=''),
Plant(species='Bouteloua gracilis', common_name='Blue grama', quantity=111, size='StubS', price=1.15, county='Unknown', notes='50% off sale'),
Plant(species='Bouteloua gracilis', common_name='Blue grama', quantity=57, size='D-16S', price=5.4, county='Unknown', notes='25% off sale')
]
)
示例 6:通过转换为 Markdown 并提取订单详细信息来分析本地 PDF 收据
此示例演示如何使用 Azure OpenAI 服务从 PDF 收据中提取结构化信息。 和ItemReceipt模型定义预期的输出结构,确保数据结构良好且经过验证。 该示例将 PDF 转换为 Markdown 文本,将其发送到 GPT 模型,并检查针对 Receipt 模型的响应。 将 PDF 文件用作输入需要额外的内容提取和转换步骤,但此过程类似于对结构化输出使用文本。
从 PDF 文件中提取
类似于将图像用作输入,将 PDF 提取为文本。 可以使用托管服务(如 Azure 文档智能 )或本地 Python 包(如 pymupdf)。
使用 PDF 文件进行输入对比使用文本
将 PDF 文件用作结构化输出的输入与使用文本的方式不同:
- 输入格式:在将 PDF 文件发送到 GPT 模型之前,将 PDF 文件转换为 markdown 文本。 可以直接发送文本。
- 内容提取:提取 PDF 内容并将其转换为 GPT 模型可以处理的 markdown 文本。
- 处理:GPT 模型处理 PDF 提取的文本,并根据提供的架构将其转换为结构化数据。
定义Item模型和Receipt模型
Item和Receipt模型是 Pydantic 模型,用于定义 GPT 模型的预期输出的结构。 此方法可确保提取的信息遵循特定的架构。
项目:表示收据上的单个项目,其中包含产品名称、价格和数量字段。
class Item(BaseModel): product: str price: float quantity: int- product:产品名称。
- 价格:产品的价格。
- 数量:产品的数量。
收据:表示总收据,包括总金额、发货成本、付款方式、项目列表和订单编号的字段。 该
Receipt模型使用Item模型来表示结构化收据,其中包含有关每个项的详细信息。class Receipt(BaseModel): total: float shipping: float payment_method: str items: list[Item] order_number: int- 总计:收据的总金额。
- 发货:发货成本。
- payment_method:使用的付款方式。
-
items:收据上的对象列表
Item。 - order_number:订单号。
注释
示例 6 基于示例 5,扩展了从图像中提取结构化信息以处理 PDF 文件的概念。 示例 6 显示了将 PDF 文件转换为 Markdown 文本作为 GPT 模型的输入的额外步骤,同时保留示例 5 中使用的结构化输出方法。
在调用 GPT 模型的过程中使用这些模型
该示例向 GPT 模型发送请求,以使用结构化输出从 PDF 收据中提取信息。 模型 Receipt 指定为预期的响应格式,这可确保提取的数据根据定义的架构进行结构化。
completion = client.beta.chat.completions.parse(
model=model_name,
messages=[
{"role": "system", "content": "Extract the information from the receipt"},
{"role": "user", "content": md_text},
],
response_format=Receipt,
)
- 模型:要使用的 GPT 模型。
- 消息:模型的消息列表。 系统消息提供说明,用户消息具有图像 URL。
-
response_format:使用
Receipt模型的预期响应格式。
分析和验证响应
以下代码片段处理 GPT 模型中的响应。 它首先从响应中提取消息。 然后,它会检查模型是否拒绝处理请求。 如果有拒绝,它会输出拒绝信息。 否则,它将输出已分析的响应,其中包含提取的结构化信息。 此方法可确保脚本可以处理 GPT 模型中的成功和失败的响应。
message = completion.choices[0].message
if (message.refusal):
print(message.refusal)
else:
print(message.parsed)
- message:从响应中的第一个选项中提取消息。
- message.refuse:检查 GPT 模型是否拒绝处理请求。
- print(message.refuse):如果模型拒绝了请求,则打印拒绝消息。
- print(message.parsed):如果提取成功,则打印已分析的响应。
查看响应
分析的响应应类似于以下代码片段:
Receipt(total=242.05, shipping=0.0, payment_method='Credit Card', items=[Item(product='Die Cut ID: 158484 • 3 × 3 • Lamination: Glossy • Shape: Contour', price=242.05, quantity=500)], order_number=43962)
示例 7:分析博客文章并提取元数据
此示例演示如何使用 Azure OpenAI 服务从博客文章中提取结构化信息。 该 BlogPost 模型定义预期的输出结构,确保提取的数据结构良好且经过验证。 该示例提取网页、提取相关内容、将其发送到 GPT 模型,并验证针对 BlogPost 模型的响应。
使用网页输入与文本输入相比
将网页用作结构化输出的输入与通过多种方式使用文本不同:
- 输入格式:提取和分析网页以提取相关内容,然后再将其发送到 GPT 模型。 可以直接发送文本。
- 内容提取:提取网页内容并将其转换为 GPT 模型可以处理的文本格式。
- 处理:GPT 模型处理从网页中提取的文本,并根据提供的架构将其转换为结构化数据。
定义BlogPost模型
该 BlogPost 模型是一个 Pydantic 模型,用于定义 GPT 模型的预期输出的结构。 此方法可确保提取的信息遵循特定的架构。
class BlogPost(BaseModel):
title: str
summary: str = Field(..., description="A 1-2 sentence summary of the blog post")
tags: list[str] = Field(..., description="A list of tags for the blog post, like 'python' or 'openai'")
- 标题:博客文章的标题。
- 摘要:博客文章的简要摘要。
- 标记:与博客文章关联的标记。
为输入准备网页
若要将网页用作结构化输出的输入,以下代码片段提取网页内容,并使用 BeautifulSoup Python 库提取相关部分(标题和正文)。 此过程准备要发送到 GPT 模型的网页内容。
url = "https://blog.pamelafox.org/2024/09/integrating-vision-into-rag-applications.html"
response = requests.get(url)
if response.status_code != 200:
print(f"Failed to fetch the page: {response.status_code}")
exit(1)
soup = BeautifulSoup(response.content, "html.parser")
post_title = soup.find("h3", class_="post-title")
post_contents = soup.find("div", class_="post-body").get_text(strip=True)
- requests.get:发送 GET 请求来提取网页内容。
- BeautifulSoup:分析网页的 HTML 内容。
- post_title:提取博客文章的标题。
- post_contents:提取博客文章的正文。
注释
示例 7 基于示例 6,扩展了从 PDF 提取结构化信息以处理网页的概念。 此方法演示如何使用 BeautifulSoup 分析网页来处理 Web 内容。 然后,分析的内容将发送到 GPT 模型,并将结构化输出作为 BlogPost 模型返回。
使用BlogPost在调用模型时
以下代码片段向 GPT 模型发送请求,以使用结构化输出从准备好的网页文本(post_title 和 post_contents)中提取信息。 模型 BlogPost 指定为预期的响应格式,这可确保提取的数据根据定义的架构进行结构化。
completion = client.beta.chat.completions.parse(
model=model_name,
messages=[
{"role": "system", "content": "Extract the information from the blog post"},
{"role": "user", "content": f"{post_title}\n{post_contents}"},
],
response_format=BlogPost,
)
- 模型:要使用的 GPT 模型。
- 消息:模型的消息列表。 系统消息提供说明,用户消息具有图像 URL。
-
response_format:使用
BlogPost模型的预期响应格式。
分析和验证响应
以下代码片段处理 GPT 模型中的响应。 它首先从响应中提取消息。 然后,它会检查模型是否拒绝处理请求。 如果有拒绝,它会输出拒绝信息。 否则,它将输出已分析的响应,其中包含提取的结构化信息。 此方法可确保脚本可以处理 GPT 模型中的成功和失败的响应。
message = completion.choices[0].message
if (message.refusal):
print(message.refusal)
else:
print(message.parsed)
- message:从响应中的第一个选项中提取消息。
- message.refuse:检查 GPT 模型是否拒绝处理请求。
- print(message.refuse):如果模型拒绝了请求,则打印拒绝消息。
- print(message.parsed):如果提取成功,则打印已分析的响应。
查看响应
分析的响应应类似于以下代码片段:
BlogPost(
title='Integrating Vision into RAG Applications',
summary='This blog post discusses the integration of vision into Retrieval Augmented Generation (RAG) applications, allowing models to utilize image sources alongside text. It introduces multimodal LLMs and embedding models via Azure, demonstrating how these enable RAG to process both text and images, improving responses to queries that involve image data.',
tags=['RAG', 'LLM', 'Azure', 'AI', 'Multimodal', 'OpenAI', 'GPT-4', 'Machine Learning', 'Image Processing']
)
清理资源
清理 Azure 资源
本文中创建的 Azure 资源将计费给 Azure 订阅。 如果你预计将来不需要这些资源,请将其删除,以避免产生更多费用。
要删除 Azure 资源并移除源代码,请运行以下 Azure Developer CLI 命令:
azd down --purge
清理 GitHub Codespaces
删除 GitHub Codespaces 环境可以帮助你最大化帐户的每核心小时免费配额。
重要
有关 GitHub 帐户权利的详细信息,请参阅 GitHub Codespaces 每月包含的存储和核心小时数。
找到从 GitHub 存储库中获取的当前正在运行的代码工作区。
打开代码空间的上下文菜单,然后选择“删除”。
获取帮助
将问题记录到存储库 的问题页。