Nota
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
En este artículo, explorará varios ejemplos para extraer diferentes tipos de entidades. En estos ejemplos se muestra cómo crear un esquema de objeto y obtener una respuesta del modelo de Azure OpenAI. Usa Python y el modo de salidas estructuradas de Azure OpenAI.
Nota
En este artículo se usan una o varias plantillas de aplicación de IA de para obtener ejemplos e instrucciones. Las plantillas de aplicación de IA proporcionan implementaciones de referencia bien mantenidas y fáciles de implementar, lo que garantiza un punto de partida de alta calidad para las aplicaciones de inteligencia artificial.
El ejemplo proporciona todo lo que necesita. Incluye la infraestructura y los archivos de Python para configurar una implementación de modelos gpt-4o
de Azure OpenAI. Después, puede usarlo para realizar la extracción de entidades con el modo de salidas estructuradas de Azure OpenAI y el SDK de OpenAI de Python.
Siguiendo las instrucciones de este artículo, hará lo siguiente:
- Implemente un modelo en la lista de modelos admitidos para las salidas estructuradas.
- Ejecute los archivos Python de ejemplo que utilizan el paquete OpenAI Python y los modelos Pydantic para realizar solicitudes de salidas estructuradas.
Las salidas estructuradas en Azure OpenAI aseguran que las respuestas del modelo de IA sigan un esquema JSON predefinido . Esta característica proporciona varias ventajas clave por:
- Asegúrese de que las respuestas coinciden con el esquema definido, lo que reduce los errores e incoherencias.
- Ayudar a convertir los datos no estructurados en formatos bien definidos y estructurados, lo que facilita la integración con otros sistemas.
- Reducir la necesidad de posprocesamiento, optimizar el uso de tokens y mejorar la eficacia.
Las salidas estructuradas son útiles para llamar a funciones, extraer datos estructurados y crear flujos de trabajo complejos de varios pasos.
Use este mismo enfoque general para la extracción de entidades en muchos tipos de archivo, siempre que se puedan representar en un formulario de texto o imagen.
Nota
Actualmente las salidas estructuradas no están soportadas con:
- Escenarios Bring your own data.
- Assistants o Azure AI Agents Service.
- Versión
gpt-4o-audio-preview
ygpt-4o-mini-audio-preview
:2024-12-17
.
Diagrama de arquitectura
Costo
Para mantener los precios lo más bajos posibles en este ejemplo, la mayoría de los recursos usan un nivel de precios Básico o Consumo. Modifique el nivel según sea necesario en función del uso previsto. Para dejar de incurrir en cargos, elimine los recursos cuando haya terminado con el artículo.
Obtenga más información sobre el costo en el repositorio de muestras.
Prerrequisitos
Hay disponible un entorno contenedor de desarrollo con todas las dependencias necesarias para completar este artículo. Puede ejecutar el contenedor de desarrollo en GitHub Codespaces (en un explorador) o localmente mediante Visual Studio Code.
Para usar este artículo, debe cumplir los siguientes requisitos previos:
Una suscripción de Azure. Crear uno gratis.
Permisos de cuenta de Azure. Su cuenta de Azure debe tener los permisos
Microsoft.Authorization/roleAssignments/write
, como Administrador de acceso de usuario o Propietario.
Apertura de un entorno de desarrollo
Siga estas instrucciones para configurar un entorno de desarrollo preconfigurado con todas las dependencias necesarias para completar este artículo.
GitHub Codespaces ejecuta un contenedor de desarrollo administrado por GitHub con Visual Studio Code para web como interfaz de usuario. Use GitHub Codespaces para el entorno de desarrollo más sencillo. Viene con las herramientas de desarrollo y las dependencias adecuadas preinstaladas para completar este artículo.
Importante
Todas las cuentas de GitHub pueden usar Codespaces durante un máximo de 60 horas gratis cada mes con dos instancias principales. Para obtener más información, consulte Almacenamiento y horas de núcleo incluidas mensualmente en GitHub Codespaces.
Siga estos pasos para crear un nuevo espacio de código de GitHub en la rama main
del repositorio de GitHub de Azure-Samples/azure-openai-entity-extraction
.
Haga clic con el botón derecho en el botón siguiente y seleccione Abrir enlace en una nueva ventana. Esta acción hace que el entorno de desarrollo y la documentación estén disponibles para su revisión.
En la página Crear espacio de código, revise la información y, a continuación, seleccione Crear nuevo espacio de código.
Espere a que se inicie Codespace. Este proceso de inicio puede tardar unos minutos.
En el terminal de la parte inferior de la pantalla, inicie sesión en Azure mediante la CLI para desarrolladores de Azure:
azd auth login --use-device-code
Abra la dirección URL en el terminal.
Copie el código del terminal y péguelo en la dirección URL que acaba de abrir.
Siga las instrucciones para iniciar sesión en su cuenta de Azure.
Las tareas restantes de este artículo tienen lugar en el contexto de este contenedor de desarrollo.
Implementación y ejecución
El repositorio de ejemplo tiene todos los archivos de código y configuración de una implementación del modelo gpt-4o de Azure OpenAI. También realiza la extracción de entidades mediante el modo de salidas estructuradas y el SDK de Python openai
. Siga estos pasos para llevar a cabo el proceso de implementación de ejemplo de extracción de entidades en Azure:
Ejemplo de implementación de extracción de entidades en Azure
Configure la cuenta de OpenAI:
azd provision
Use la tabla siguiente para responder a cada parámetro:
Parámetro Respuesta Nombre del entorno Manténgalo corto y en minúsculas. Agregue su nombre o alias. Por ejemplo, struct-output
. Se usa como parte del nombre del grupo de recursos.Suscripción Seleccione la suscripción en la que crear los recursos. Ubicación del modelo de OpenAI Seleccione una ubicación cercana a usted en la lista. Nota
Si se produce un error o se agota el tiempo de espera durante la implementación, pruebe a cambiar la ubicación. Puede haber restricciones de disponibilidad para el recurso de OpenAI. Para cambiar la ubicación, ejecute:
azd env set AZURE_LOCATION "yournewlocationname"
Espere hasta que se implemente la aplicación. La implementación suele tardar entre 5 y 10 minutos en completarse.
Ejecución de los ejemplos de extracción de entidades
El ejemplo incluye los ejemplos siguientes:
Tutorial de ejemplo | Por ejemplo, nombreDeArchivo. | Descripción |
---|---|---|
ejemplo 1 | basic_azure.py |
Ejemplo básico que usa un recurso de Azure OpenAI implementado para extraer información de una cadena de entrada. |
ejemplo 2 | extract_github_issue.py |
En este ejemplo se captura un problema público de GitHub mediante la API de GitHub y, a continuación, se extraen los detalles. |
ejemplo 3 | extract_github_repo.py |
En este ejemplo se captura un archivo Léame público usando la API de GitHub y se extraen los detalles. |
ejemplo 4 | extract_image_graph.py |
En este ejemplo se analiza una imagen local de un grafo y se extraen detalles como título, eje, leyenda. |
ejemplo 5 | extract_image_table.py |
En este ejemplo se analiza una imagen local con tablas y se extraen datos tabulares anidados. |
ejemplo 6 | extract_pdf_receipt.py |
En este ejemplo se analiza un recibo de PDF local mediante el paquete de pymupdf para convertirlo primero en Markdown y, a continuación, extraer los detalles del pedido. |
ejemplo 7 | extract_webpage.py |
En este ejemplo se analiza una entrada de blog con el paquete de BeautifulSoup y se extraen metadatos (título, descripción y etiquetas). |
Ejecute un ejemplo escribiendo python <example filename>.py
o haciendo clic en el botón Ejecutar del archivo abierto.
Exploración de los ejemplos de código
Esta plantilla de aplicación de IA contiene varios ejemplos que resaltan distintos casos de uso de salida estructurados. En las secciones siguientes se explica el código pertinente en cada ejemplo.
Ejemplo 1: Uso de un recurso de Azure OpenAI implementado para extraer información de una cadena de entrada
En este ejemplo se muestra cómo usar el servicio Azure OpenAI para extraer información estructurada de una entrada de texto. Configura la autenticación de Azure, inicializa el cliente de OpenAI, define un modelo pydantic para la salida esperada, envía una solicitud al modelo GPT y valida e imprime la respuesta. Este enfoque garantiza que la información extraída esté bien estructurada y validada, lo que facilita el trabajo con en aplicaciones descendentes.
Definición del modelo de datos
Definir un modelo Pydantic garantiza que la información extraída del servicio Azure OpenAI esté bien estructurada y validada. Los modelos pydantic proporcionan un esquema claro para la salida esperada, lo que ayuda en:
- Asegurarse de que los datos extraídos coinciden con los tipos y formatos esperados.
- Reducir los errores e incoherencias aplicando una estructura predefinida.
- Facilitar el trabajo con los datos extraídos en otras aplicaciones proporcionando un modelo de datos claro y coherente.
- Ayudar a integrar con otros sistemas mediante la conversión de datos no estructurados en formatos bien definidos y estructurados.
definición del modelo de CalendarEvent
El modelo de CalendarEvent
es un modelo Pydantic que define la estructura de la salida esperada del modelo GPT.
class CalendarEvent(BaseModel):
name: str
date: str
participants: list[str]
name
: nombre del evento.date
: fecha del evento.participants
: una lista de los participantes del evento.
Cómo se usa CalendarEvent
en la llamada al modelo
El modelo CalendarEvent
especifica el formato de respuesta esperado al enviar una solicitud al modelo GPT. Este enfoque garantiza que la información extraída sigue un esquema específico.
El siguiente fragmento de código envía una solicitud al modelo GPT mediante el CalendarEvent
para la respuesta:
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: envía una solicitud al modelo GPT para analizar el texto de entrada y extraer información.
- modelo: El modelo GPT a utilizar.
- messages: Una lista de mensajes para el modelo. El mensaje del sistema proporciona instrucciones y el mensaje de usuario tiene la dirección URL de la imagen.
- response_format: Formato de respuesta esperado usando el modelo
CalendarEvent
.
Análisis y validación de la respuesta
El siguiente fragmento de código controla la respuesta del modelo GPT. Primero extrae el mensaje de la respuesta. A continuación, comprueba si el modelo se negó a procesar la solicitud. Si hay una negativa, imprime el mensaje de denegación. De lo contrario, imprime la respuesta analizada, que contiene la información estructurada extraída. Este enfoque garantiza que el script pueda controlar las respuestas correctas y incorrectas del modelo GPT.
message = completion.choices[0].message
if (message.refusal):
rich.print(message.refusal)
else:
rich.print(message.parsed)
¿Por qué es importante comprobar la denegación?
control de errores: el código comprueba si el modelo GPT se negó a procesar la solicitud. Si es así, imprime el mensaje de denegación. Este enfoque le ayuda (o al usuario) a comprender si la extracción se realizó correctamente o si hubo problemas para solucionar.
Validación de datos extraídos: el código imprime la respuesta analizada para mostrar la información extraída en un formato legible. Este enfoque ayuda a comprobar que los datos coinciden con la estructura esperada definida por el modelo de
CalendarEvent
.
Visualización de la respuesta
La respuesta analizada debe ser similar al fragmento de código siguiente:
CalendarEvent(name='Science Fair', date='Friday', participants=['Alice', 'Bob'])
Ejemplo 2: Captura de un problema público de GitHub mediante la API de GitHub y, a continuación, extraer detalles
En este ejemplo se muestra cómo usar el servicio Azure OpenAI para extraer información estructurada de un problema de GitHub. Este tutorial solo se centra en el código de ejemplo que trata con la salida estructurada.
Definición del modelo de Issue
El modelo de Issue
es un modelo Pydantic que define la estructura de la salida esperada del modelo GPT.
class Issue(BaseModel):
title: str
description: str = Field(..., description="A 1-2 sentence description of the project")
type: IssueType
operating_system: str
- title: título de la cuestión.
- Descripción: una breve descripción del problema.
- type: tipo de problema de la enumeración
IssueType
. - operating_system: sistema operativo relacionado con el problema.
IssueType
Definición de enumeración
La clase IssueType
Python es una enumeración que define los valores posibles para el tipo de problema (por ejemplo, Informe de errores, Característica, Documentación, Regresión).
class IssueType(str, Enum):
BUGREPORT = "Bug Report"
FEATURE = "Feature"
DOCUMENTATION = "Documentation"
REGRESSION = "Regression"
Relación entre Issue
y IssueType
El modelo de Issue
usa la enumeración IssueType
para asegurarse de que el campo type
solo contiene valores válidos. Esta relación aplica coherencia y validación en los datos extraídos.
Nota
Aunque el ejemplo 1 se centra en una entrada de texto simple y usa un modelo básico CalendarEvent
Pydantic, el ejemplo 2 presenta un modelo de Issue
más complejo con enumeraciones para los tipos de problema. Este enfoque garantiza que la información extraída siga los tipos y valores específicos. Muestra cómo controlar datos más detallados y variados al tiempo que mantiene el enfoque de salida estructurado del ejemplo 1.
Captura del problema de GitHub
El siguiente fragmento de código captura el problema de un repositorio de GitHub especificado.
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: envía una solicitud GET para obtener la incidencia de la API de GitHub.
- response.status_code: comprueba si la solicitud se realizó correctamente.
- issue_body: extrae el cuerpo del problema de la respuesta JSON.
Cómo se usa Issue
en la llamada al modelo
El modelo de Issue
se usa para especificar el formato de respuesta esperado al enviar una solicitud al modelo GPT. Este enfoque garantiza que la información extraída sigue un esquema específico.
Envío de una solicitud al modelo 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,
)
- modelo: El modelo GPT a utilizar.
- mensajes: Lista de mensajes para el modelo. El mensaje del sistema proporciona instrucciones y el mensaje de usuario tiene la dirección URL de la imagen.
- response_format: formato de respuesta esperado mediante el modelo
Issue
.
Análisis y validación de la respuesta
El siguiente fragmento de código controla la respuesta del modelo GPT. Primero extrae el mensaje de la respuesta. A continuación, comprueba si el modelo se negó a procesar la solicitud. Si hay una negativa, imprime el mensaje de denegación. De lo contrario, imprime la respuesta analizada, que contiene la información estructurada extraída. Este enfoque garantiza que el script pueda controlar las respuestas correctas y incorrectas del modelo GPT.
message = completion.choices[0].message
if (message.refusal):
print(message.refusal)
else:
print(message.parsed)
- mensaje: extrae el mensaje de la primera opción en la respuesta.
- message.refuse: comprueba si el modelo GPT se negó a procesar la solicitud.
- print(message.refuse): imprime el mensaje de denegación si el modelo rechazó la solicitud.
- print(message.parsed): imprime la respuesta analizada si la extracción se realizó correctamente.
Visualización de la respuesta
La respuesta analizada debe ser similar al fragmento de código siguiente:
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'
)
Ejemplo 3: Captura de un archivo LÉAME público mediante la API de GitHub y, a continuación, extraer detalles
En este ejemplo se muestra cómo usar el servicio Azure OpenAI para obtener información estructurada del archivo LÉAME de un repositorio de GitHub. Este tutorial solo se centra en el código de ejemplo que trata con la salida estructurada.
Cómo RepoOverview
usa los otros modelos definidos
El modelo de RepoOverview
usa las enumeraciones Language
, AzureService
y Framework
para definir un esquema estructurado y validado para la información extraída. Este modelo se usa en la llamada al modelo GPT para asegurarse de que la respuesta cumple el formato esperado, proporcionando seguridad de tipos, validación y legibilidad. A continuación, el script analiza, valida e imprime la información extraída, lo que facilita el trabajo con aplicaciones posteriores.
definición del modelo de RepoOverview
El modelo de RepoOverview
es un modelo Pydantic que define la estructura de la salida esperada del modelo GPT. Usa los otros modelos definidos (Language
, AzureService
y Framework
) para asegurarse de que la información extraída se adhiere a enumeraciones y tipos específicos.
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]
- nombre: una cadena que representa el nombre del repositorio.
- descripción: una cadena que proporciona una breve descripción del proyecto.
- lenguajes: una lista de valores de enumeración
Language
, que representan los lenguajes de programación usados en el proyecto. - azure_services: una lista de
AzureService
valores de enumeración, que representan los servicios de Azure usados en el proyecto. - frameworks: lista de valores de enumeración de
Framework
, que representan los marcos usados en el proyecto.
Enumeraciones usadas en RepoOverview
Language: define los valores posibles para los lenguajes de programación.
class Language(str, Enum): JAVASCRIPT = "JavaScript" PYTHON = "Python" DOTNET = ".NET"
AzureService: define los valores posibles para los servicios de Azure.
class AzureService(str, Enum): AIFOUNDRY = "AI Foundry" AISEARCH = "AI Search" POSTGRESQL = "PostgreSQL" COSMOSDB = "CosmosDB" AZURESQL = "Azure SQL"
Framework: define los valores posibles para los marcos de trabajo.
class Framework(str, Enum): LANGCHAIN = "Langchain" SEMANTICKERNEL = "Semantic Kernel" LLAMAINDEX = "Llamaindex" AUTOGEN = "Autogen" SPRINGBOOT = "Spring Boot" PROMPTY = "Prompty"
Nota
El ejemplo 3 se basa en el ejemplo 2 mediante la introducción de modelos más complejos (RepoOverview
) y enumeraciones (Language
, AzureService
, Framework
) para asegurarse de que la información extraída sigue valores y tipos específicos. En el ejemplo 3 se muestra cómo controlar datos más detallados y variados, al tiempo que se mantiene el enfoque de salida estructurado del ejemplo 2.
Cómo se usa RepoOverview
en la llamada al modelo
El modelo RepoOverview
especifica el formato de respuesta esperado al enviar una solicitud al modelo GPT. Este enfoque garantiza que la información extraída sigue un esquema específico.
- model: modelo GPT que se va a usar.
- messages: Una lista de mensajes para el modelo. El mensaje del sistema proporciona instrucciones y el mensaje de usuario tiene la dirección URL de la imagen.
- response_format: el formato de respuesta esperado mediante el modelo de
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,
)
Análisis y validación de la respuesta
El siguiente fragmento de código controla la respuesta del modelo GPT. Primero extrae el mensaje de la respuesta. A continuación, comprueba si el modelo se negó a procesar la solicitud. Si hay una negativa, imprime el mensaje de denegación. De lo contrario, imprime la respuesta analizada, que contiene la información estructurada extraída. Este enfoque garantiza que el script pueda controlar las respuestas correctas y incorrectas del modelo GPT.
message = completion.choices[0].message
if (message.refusal):
print(message.refusal)
else:
print(message.parsed)
- mensaje: extrae el mensaje de la primera opción en la respuesta.
- message.refuse: comprueba si el modelo GPT se negó a procesar la solicitud.
- print(message.refuse): imprime el mensaje de denegación si el modelo rechazó la solicitud.
- print(message.parsed): imprime la respuesta analizada si la extracción se realizó correctamente.
Visualización de la respuesta
La respuesta analizada debe ser similar al fragmento de código siguiente:
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'>]
)
Ejemplo 4: Análisis de una imagen local de un grafo y extracción de detalles como título, eje y leyenda
En este ejemplo se muestra cómo usar el servicio Azure OpenAI para obtener información estructurada de una imagen de un grafo. El modelo Graph
define la estructura de salida esperada, asegurándose de que los datos están bien estructurados y validados. El script convierte la imagen en un URI codificado en base64, lo envía al modelo GPT y comprueba la respuesta con el modelo de Graph
. Este enfoque garantiza que la información sea confiable y fácil de usar, proporcionando seguridad de tipos y legibilidad.
Definición del modelo de Graph
El modelo de Graph
es un modelo Pydantic que define la estructura de la salida esperada del modelo 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]
- título: una cadena que muestra el título del gráfico.
- descripción: una cadena que proporciona una breve descripción del gráfico.
- x_axis: cadena que muestra la etiqueta del eje X.
- y_axis: cadena que muestra la etiqueta del eje Y.
- legend: una lista de cadenas que muestra las entradas de leyenda del gráfico.
Nota
El uso de imágenes como entrada necesita pasos adicionales para codificar y especificar el tipo de contenido, pero el proceso general es similar al uso de texto para la salida estructurada.
Preparación de la imagen para la entrada
Para usar una imagen como entrada para la salida estructurada, el script convierte la imagen en un URI codificado en base64. Este enfoque permite que la imagen se envíe como parte de la solicitud al modelo 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: una función que lee un archivo de imagen, la codifica en base64 y la devuelve como un URI de datos.
- image_url: el URI codificado en base64 de la imagen, que se usa como entrada para el modelo GPT.
Nota
El ejemplo 4 se basa en el ejemplo 3 mediante la ampliación del concepto de extracción de información estructurada de orígenes de texto a la extracción de detalles de imágenes. En el ejemplo 4 se muestra cómo controlar los datos visuales mediante la conversión de una imagen de grafo a un URI codificado en base64 y su envío al modelo GPT. En el ejemplo 4 se presenta el Graph
modelo Pydantic para asegurarse de que la información extraída de la imagen está bien estructurada y validada, similar al enfoque usado para el texto en el ejemplo 3.
Envío de una solicitud al modelo GPT
El script envía una solicitud al modelo GPT para extraer información de la imagen mediante salidas estructuradas. El modelo de Graph
se especifica como formato de respuesta esperado. Este enfoque garantiza que la información extraída sigue un esquema específico.
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,
)
- model: modelo GPT que se va a usar.
- messages: Una lista de mensajes para el modelo. El mensaje del sistema proporciona instrucciones y el mensaje de usuario tiene la dirección URL de la imagen.
- response_format: el formato de respuesta esperado mediante el modelo de
Graph
.
Uso de imágenes para la entrada frente al uso de texto
El uso de imágenes como entrada para la salida estructurada difiere del uso de texto de varias maneras:
- Formato de Entrada: Convierta las imágenes en un URI codificado en base64 antes de enviarlas al modelo GPT, y el texto se puede enviar directamente.
- tipo de contenido: debe especificar el tipo de contenido para las imágenes como
image_url
, mientras que el texto se envía como texto sin formato. - Procesamiento: el modelo GPT procesa imágenes de forma diferente del texto, la extracción de información visual y la conversión en datos estructurados basados en el esquema proporcionado.
Análisis y validación de la respuesta
El siguiente fragmento de código controla la respuesta del modelo GPT. Primero extrae el mensaje de la respuesta. A continuación, comprueba si el modelo se negó a procesar la solicitud. Si hay una negativa, imprime el mensaje de denegación. De lo contrario, imprime la respuesta analizada, que contiene la información estructurada extraída. Este enfoque garantiza que el script pueda controlar las respuestas correctas y incorrectas del modelo GPT.
message = completion.choices[0].message
if (message.refusal):
print(message.refusal)
else:
print(message.parsed)
- mensaje: extrae el mensaje de la primera opción en la respuesta.
- message.refuse: comprueba si el modelo GPT se negó a procesar la solicitud.
- print(message.refuse): imprime el mensaje de denegación si el modelo rechazó la solicitud.
- print(message.parsed): imprime la respuesta analizada si la extracción se realizó correctamente.
Visualización de la respuesta
La respuesta analizada debe ser similar al fragmento de código siguiente:
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']
)
Ejemplo 5: Análisis de una imagen local con tablas y extracción de datos tabulares anidados
En este ejemplo se muestra cómo usar el servicio Azure OpenAI para extraer información estructurada de una imagen de una tabla. En el ejemplo se convierte la imagen en un URI codificado en base64, se envía al modelo GPT y se valida la respuesta en el modelo de PlantInventory
. Los modelos Plant
y PlantInventory
definen la estructura de salida esperada, lo que garantiza que los datos extraídos están bien estructurados y validados.
Definir los modelos de Plant
y PlantInventory
Los modelos Plant
y PlantInventory
son modelos Pydantic que definen la estructura de la salida esperada del modelo GPT. Este enfoque garantiza que la información extraída sigue un esquema específico.
Planta: representa entradas vegetales individuales con campos para especies, nombre común, cantidad, tamaño, precio, condado y notas.
class Plant(BaseModel): species: str common_name: str quantity: int size: str price: float county: str notes: str
- species: la especie de la planta.
- common_name: nombre común de la planta.
- quantity: El número de plantas.
- size: tamaño de la planta.
- price: el precio de la planta.
- condado: el condado donde se encuentra la planta.
- notes: cualquier otra nota sobre la planta.
PlantInventory: representa el inventario general, clasificando las plantas en listas de anuales, bulbos y gramíneas.
class PlantInventory(BaseModel): annuals: list[Plant] bulbs: list[Plant] grasses: list[Plant]
- annuals: una lista de objetos de
Plant
que son anuales. - bombillas: una lista de objetos
Plant
que son bombillas. - grasses: una lista de objetos
Plant
que son hierbas.
- annuals: una lista de objetos de
Cómo PlantInventory
usa el modelo de Plant
El modelo PlantInventory
agrupa varios objetos Plant
en listas. Cada categoría (anuales, bulbos, gramíneas) es una lista de Plant
objetos. Esta estructura ayuda al modelo a organizar y verificar los datos de la planta.
Preparación de la imagen para la entrada
Para usar una imagen como entrada, el siguiente fragmento de código convierte la imagen en un URI codificado en base64. Este enfoque permite enviar la imagen en la solicitud al modelo 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: una función que lee un archivo de imagen, la codifica en base64 y la devuelve como un URI de datos.
- image_url: el URI codificado en base64 de la imagen, que se usa como entrada para el modelo GPT.
Nota
En el ejemplo 5 se muestra cómo extraer información estructurada de una imagen de una tabla. Presenta los modelos de Plant
y PlantInventory
Pydantic para definir la estructura de salida esperada, lo que garantiza que los datos extraídos están bien organizados y validados. Este enfoque muestra cómo controlar datos más detallados y anidados al tiempo que mantiene el método de salida estructurado usado en el ejemplo 4.
Utilizar modelos en la llamada al modelo GPT
El siguiente fragmento de código envía una solicitud al modelo GPT para extraer información de una imagen de una tabla mediante salidas estructuradas. El modelo PlantInventory
se especifica como el formato de respuesta esperado, lo que garantiza que los datos extraídos se estructuran según el esquema definido.
Envío de una solicitud al modelo 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,
)
- model: modelo GPT que se va a usar.
- messages: Una lista de mensajes para el modelo. El mensaje del sistema proporciona instrucciones y el mensaje de usuario tiene la dirección URL de la imagen.
- response_format: el formato de respuesta esperado mediante el modelo de
PlantInventory
.
Análisis y validación de la respuesta
El siguiente fragmento de código controla la respuesta del modelo GPT. Primero extrae el mensaje de la respuesta. A continuación, comprueba si el modelo se negó a procesar la solicitud. Si hay una negativa, imprime el mensaje de denegación. De lo contrario, imprime la respuesta analizada, que contiene la información estructurada extraída. Este enfoque garantiza que el script pueda controlar las respuestas correctas y incorrectas del modelo GPT.
message = completion.choices[0].message
if (message.refusal):
print(message.refusal)
else:
print(message.parsed)
- mensaje: extrae el mensaje de la primera opción en la respuesta.
- message.refuse: comprueba si el modelo GPT se negó a procesar la solicitud.
- print(message.refuse): imprime el mensaje de denegación si el modelo rechazó la solicitud.
- print(message.parsed): imprime la respuesta analizada si la extracción se realizó correctamente.
Visualización de la respuesta
La respuesta analizada debe ser similar al fragmento de código siguiente:
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')
]
)
Ejemplo 6: Análisis de una recepción de PDF local mediante la conversión a Markdown y, a continuación, la extracción de detalles del pedido
En este ejemplo se muestra cómo usar el servicio Azure OpenAI para extraer información estructurada de un recibo pdf. Los modelos Item
y Receipt
definen la estructura de salida esperada, lo que garantiza que los datos están bien estructurados y validados. El ejemplo convierte el PDF en texto markdown, lo envía al modelo GPT y comprueba la respuesta en el modelo de Receipt
. El uso de archivos PDF como entrada necesita pasos adicionales para la extracción y conversión de contenido, pero el proceso es similar al uso de texto para la salida estructurada.
Extracción de archivos PDF
De forma similar al uso de imágenes como entrada, se extrae el PDF como texto. Puede usar un servicio hospedado como azure Document Intelligence o un paquete de Python local, como pymupdf.
Uso de archivos PDF para la entrada frente al uso de texto
El uso de archivos PDF como entrada para la salida estructurada difiere del uso de texto de varias maneras:
- Formato de entrada: Convierta archivos PDF en texto de markdown antes de enviarlos al modelo GPT. El texto se puede enviar directamente.
- Extracción de Contenido: Extraer y convertir el contenido del PDF a formato markdown que pueda ser procesado por el modelo GPT.
- Processing: el modelo GPT procesa el texto extraído del PDF y lo convierte en datos estructurados basados en el esquema proporcionado.
Definir los modelos de Item
y Receipt
Los modelos Item
y Receipt
son modelos Pydantic que definen la estructura de la salida esperada del modelo GPT. Este enfoque garantiza que la información extraída sigue un esquema específico.
item: representa elementos individuales en el recibo con campos para el nombre del producto, el precio y la cantidad.
class Item(BaseModel): product: str price: float quantity: int
- producto: el nombre del producto.
- price: el precio del producto.
- cantidad: la cantidad del producto.
recibo: representa el recibo general, incluidos los campos del importe total, el costo de envío, el método de pago, una lista de artículos y el número de pedido. El modelo de
Receipt
usa el modelo deItem
para representar un recibo estructurado con información detallada sobre cada elemento.class Receipt(BaseModel): total: float shipping: float payment_method: str items: list[Item] order_number: int
- total: el importe total del recibo.
- shipping: el coste de envío.
- payment_method: método de pago utilizado.
- items: una lista de los objetos
Item
que aparecen en el recibo. - order_number: número de pedido.
Nota
El ejemplo 6 se basa en el ejemplo 5 mediante la extensión del concepto de extracción de información estructurada de imágenes para controlar archivos PDF. En el ejemplo 6 se muestra un paso adicional que convierte el archivo PDF en texto markdown como entrada en el modelo GPT, al tiempo que mantiene el método de salida estructurado usado en el ejemplo 5.
Utilizar los modelos durante la llamada al modelo GPT
En el ejemplo se envía una solicitud al modelo GPT para extraer información de un recibo PDF mediante salidas estructuradas. El modelo Receipt
se especifica como el formato de respuesta esperado, lo que garantiza que los datos extraídos se estructuran según el esquema definido.
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,
)
- model: modelo GPT que se va a usar.
- messages: Una lista de mensajes para el modelo. El mensaje del sistema proporciona instrucciones y el mensaje de usuario tiene la dirección URL de la imagen.
- response_format: formato de respuesta esperado utilizando el modelo
Receipt
.
Análisis y validación de la respuesta
El siguiente fragmento de código controla la respuesta del modelo GPT. Primero extrae el mensaje de la respuesta. A continuación, comprueba si el modelo se negó a procesar la solicitud. Si hay una negativa, imprime el mensaje de denegación. De lo contrario, imprime la respuesta analizada, que contiene la información estructurada extraída. Este enfoque garantiza que el script pueda controlar las respuestas correctas y incorrectas del modelo GPT.
message = completion.choices[0].message
if (message.refusal):
print(message.refusal)
else:
print(message.parsed)
- mensaje: extrae el mensaje de la primera opción en la respuesta.
- message.refuse: comprueba si el modelo GPT se negó a procesar la solicitud.
- print(message.refuse): imprime el mensaje de denegación si el modelo rechazó la solicitud.
- print(message.parsed): imprime la respuesta analizada si la extracción se realizó correctamente.
Visualización de la respuesta
La respuesta analizada debe ser similar al fragmento de código siguiente:
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)
Ejemplo 7: Análisis de una entrada de blog y extracción de metadatos
En este ejemplo se muestra cómo usar el servicio Azure OpenAI para extraer información estructurada de una entrada de blog. El modelo de BlogPost
define la estructura de salida esperada, lo que garantiza que los datos extraídos están bien estructurados y validados. En el ejemplo se captura la página web, se extrae el contenido pertinente, se envía al modelo GPT y se valida la respuesta con el modelo de BlogPost
.
Uso de páginas web para la entrada frente al uso de texto
El uso de páginas web como entrada para la salida estructurada difiere del uso de texto de varias maneras:
- Formato de Entrada: Capturar y analizar páginas web para extraer contenido relevante antes de enviarlas al modelo GPT. El texto se puede enviar directamente.
- extracción de contenido: extraiga y convierta el contenido de la página web en un formato de texto que el modelo GPT pueda procesar.
- Processing: el modelo GPT procesa el texto extraído de la página web y lo convierte en datos estructurados basados en el esquema proporcionado.
Definición del modelo de BlogPost
El modelo de BlogPost
es un modelo Pydantic que define la estructura de la salida esperada del modelo GPT. Este enfoque garantiza que la información extraída sigue un esquema específico.
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'")
- título: título de la entrada de blog.
- resumen: breve resumen de la entrada de blog.
- etiquetas: etiquetas asociadas a la entrada de blog.
Prepare la página web para la entrada
Para usar una página web como entrada para la salida estructurada, el siguiente fragmento de código captura el contenido de la página web y extrae las partes pertinentes (título y cuerpo) mediante la biblioteca de Python BeautifulSoup. Este proceso prepara el contenido de la página web que se enviará al modelo 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: envía una solicitud GET para capturar el contenido de la página web.
- BeautifulSoup: analiza el contenido HTML de la página web.
- post_title: extrae el título de una entrada de blog.
- post_contents: extrae el cuerpo del artículo de blog".
Nota
El ejemplo 7 se basa en el ejemplo 6 mediante la extensión del concepto de extracción de información estructurada de archivos PDF para controlar páginas web. Este enfoque muestra cómo controlar el contenido web mediante el análisis de la página web con BeautifulSoup. A continuación, el contenido analizado se envía al modelo GPT y devuelve la salida estructurada como el modelo de BlogPost
.
Uso de BlogPost
en la llamada al modelo
El siguiente fragmento de código envía una solicitud al modelo GPT para extraer información del texto de la página web preparada (post_title
y post_contents
) mediante salidas estructuradas. El modelo BlogPost
se especifica como el formato de respuesta esperado, lo que garantiza que los datos extraídos se estructuran según el esquema definido.
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,
)
- model: modelo GPT que se va a usar.
- messages: Una lista de mensajes para el modelo. El mensaje del sistema proporciona instrucciones y el mensaje de usuario tiene la dirección URL de la imagen.
- response_format: el formato de respuesta esperado mediante el modelo de
BlogPost
.
Análisis y validación de la respuesta
El siguiente fragmento de código controla la respuesta del modelo GPT. Primero extrae el mensaje de la respuesta. A continuación, comprueba si el modelo se negó a procesar la solicitud. Si hay una negativa, imprime el mensaje de denegación. De lo contrario, imprime la respuesta analizada, que contiene la información estructurada extraída. Este enfoque garantiza que el script pueda controlar las respuestas correctas y incorrectas del modelo GPT.
message = completion.choices[0].message
if (message.refusal):
print(message.refusal)
else:
print(message.parsed)
- mensaje: extrae el mensaje de la primera opción en la respuesta.
- message.refuse: comprueba si el modelo GPT se negó a procesar la solicitud.
- print(message.refuse): imprime el mensaje de denegación si el modelo rechazó la solicitud.
- print(message.parsed): imprime la respuesta analizada si la extracción se realizó correctamente.
Visualización de la respuesta
La respuesta analizada debe ser similar al fragmento de código siguiente:
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']
)
Limpieza de recursos
Limpieza de recursos de Azure
Los recursos de Azure que creó en este artículo se facturan a la suscripción de Azure. Si no espera necesitar estos recursos en el futuro, elimínelos para evitar incurrir en más cargos.
Para eliminar los recursos de Azure y quitar el código fuente, ejecute el siguiente comando de la CLI para desarrolladores de Azure:
azd down --purge
Limpieza de GitHub Codespaces
La eliminación del entorno de GitHub Codespaces le ayuda a maximizar la cantidad de derechos de horas gratuitas por núcleo que obtiene para su cuenta.
Importante
Para obtener más información sobre los derechos de la cuenta de GitHub, consulte Almacenamiento y horas de núcleo incluidas mensualmente en GitHub Codespaces.
Inicie sesión en el panel de GitHub Codespaces.
Busque el codespace que se ejecuta actualmente procedente del repositorio de GitHub
Azure-Samples//azure-openai-entity-extraction
.Abra el menú contextual del espacio de código y seleccione Eliminar.
Obtener ayuda
Registre el problema en la página de problemas del repositorio.