Поделиться через


Извлечение сущностей с помощью режима структурированных выходных данных Azure OpenAI

В этой статье описано несколько примеров извлечения различных типов сущностей. В этих примерах показано, как создать схему объекта и получить ответ из модели Azure OpenAI. В нем используется Python и режим структурированных выходных данных Azure OpenAI.

Заметка

В этой статье используется один или несколько шаблонов ИИ приложений для примеров и рекомендаций. Шаблоны приложений ИИ предоставляют хорошо поддерживаемые и простые в развертывании эталонные реализации, обеспечивая высококачественную отправную точку для приложений ИИ.

Образец предоставляет всё, что вам нужно. Она включает в себя инфраструктуру и файлы Python для настройки развертывания модели Azure OpenAI gpt-4o. Затем его можно использовать для извлечения сущностей с помощью режима структурированных выходных данных Azure OpenAI и пакета SDK Для Python OpenAI.

Следуя инструкциям в этой статье, вы получите следующее:

Структурированные выходные данные в Azure OpenAI убедитесь, что ответы модели ИИ соответствуют предопределенному схеме JSON. Эта функция обеспечивает несколько ключевых преимуществ:

  • Убедитесь, что ответы соответствуют определенной схеме, уменьшая ошибки и несоответствия.
  • Помогая превратить неструктурированные данные в четко определенные структурированные форматы, что упрощает интеграцию с другими системами.
  • Сокращение потребности в последующей обработке, оптимизации использования маркеров и повышения эффективности.

Структурированные выходные данные полезны для вызова функций, извлечения структурированных данных и создания сложных многофакторных рабочих процессов.

Используйте такой же общий подход для извлечения сущностей во многих типах файлов, если они могут быть представлены в виде текста или изображения.

Заметка

В настоящее время поддержка структурированных выходных данных не осуществляется.

Схема архитектуры

Диаграмма, показывающая, как управляемое удостоверение Microsoft Entra подключается к службам ИИ Azure.

Стоимость

Чтобы сохранить цены как можно ниже в этом примере, большинство ресурсов используют ценовую категорию "Базовый" или "Потребление". Измените уровень по мере необходимости на основе предполагаемого использования. Чтобы прекратить расходы, удалите ресурсы, когда вы закончите со статьей.

Узнайте больше о затратах в образце репозитория.

Необходимые условия

Доступна среда контейнера разработки со всеми необходимыми зависимостями для завершения этой статьи. Контейнер разработки можно запустить в GitHub Codespaces (в браузере) или локально с помощью Visual Studio Code.

Чтобы использовать эту статью, необходимо выполнить следующие предварительные требования:

Открытие среды разработки

Следуйте этим инструкциям, чтобы настроить предварительно настроенную среду разработки со всеми необходимыми зависимостями для выполнения этой статьи.

GitHub Codespaces запускает контейнер разработки, управляемый GitHub, с Visual Studio Code для веб-среды в качестве пользовательского интерфейса. Используйте пространства Кода GitHub для самой простой среды разработки. Он поставляется с правильными средствами разработчика и зависимостями, предварительно установленными для выполнения этой статьи.

Важный

Все учетные записи GitHub могут использовать Codespaces до 60 часов бесплатно каждый месяц с двумя core экземплярами. Дополнительные сведения см. в статье GitHub Codespaces ежемесячно включают в себя хранилище и основные часы.

Выполните следующие действия, чтобы создать новое пространство кода GitHub в ветви main репозитория Azure-Samples/azure-openai-entity-extraction GitHub.

  1. Щелкните правой кнопкой мыши следующую кнопку, а затем выберите Открыть ссылку в новом окне. Это действие делает среду разработки и документацию доступной для проверки.

    кнопка с надписью

  2. На странице Создание кодового пространства ознакомьтесь с информацией, а затем выберите Создать новое кодовое пространство.

  3. Дождитесь запуска кодового пространства. Этот процесс запуска может занять несколько минут.

  4. В терминале в нижней части экрана войдите в Azure с помощью интерфейса командной строки разработчика Azure:

    azd auth login --use-device-code
    
  5. Откройте URL-адрес в терминале.

  6. Скопируйте код из терминала и вставьте его в URL-адрес, который вы только что открыли.

  7. Следуйте инструкциям для входа в учетную запись Azure.

Остальные задачи в этой статье выполняются в контексте этого контейнера разработки.

Развертывание и запуск

В примере репозитория есть все файлы кода и конфигурации для развертывания модели Azure OpenAI gpt-4o. Он также выполняет извлечение сущностей с помощью режима структурированных выходных данных и пакета SDK для Python openai. Выполните следующие действия, чтобы перейти к примеру процесса извлечения сущностей Azure.

Пример извлечения сущностей в Azure

  1. Подготовка учетной записи OpenAI:

    azd provision
    
  2. Используйте следующую таблицу, чтобы ответить на каждый параметр:

    Параметр Ответ
    Имя среды Оставьте коротким и строчными буквами. Добавьте имя или псевдоним. Например, struct-output. Он используется в качестве части имени группы ресурсов.
    Подписка Выберите подписку, в которой будут создаваться ресурсы.
    Расположение модели OpenAI Выберите место из списка рядом с вами.

    Заметка

    Если во время развертывания возникает ошибка или время ожидания, попробуйте изменить расположение. Для ресурса OpenAI могут быть ограничения доступности. Чтобы изменить расположение, выполните следующие действия:

    azd env set AZURE_LOCATION "yournewlocationname"
    
  3. Дождитесь развертывания приложения. Развертывание обычно занимает от 5 до 10 минут.

Запустите примеры извлечения сущностей

Образец включает следующие примеры:

Пример пошагового руководства Пример имени файла Описание
пример 1 basic_azure.py Базовый пример, использующий развернутый ресурс Azure OpenAI для извлечения сведений из входной строки.
пример 2 extract_github_issue.py В этом примере с помощью API GitHub извлекается общедоступная задача на GitHub, а затем извлекаются сведения.
пример 3 extract_github_repo.py В этом примере извлекается общедоступный README с помощью API GitHub, а затем извлекается сведения.
пример 4 extract_image_graph.py Этот пример анализирует локальное изображение графа и извлекает такие сведения, как заголовок, ось, условные обозначения.
пример 5 extract_image_table.py В этом примере анализируется локальное изображение с таблицами и извлекается вложенные табличные данные.
пример 6 extract_pdf_receipt.py В этом примере анализируется локальная квитанция PDF с помощью пакета pymupdf, чтобы сначала преобразовать его в Markdown, а затем извлечь сведения о заказе.
пример 7 extract_webpage.py Этот пример анализирует запись блога с помощью пакета BeautifulSoup и извлекает метаданные (название, описание и теги).

Запустите пример, введя python <example filename>.py или нажав кнопку "Выполнить" в открытом файле.

Изучение примеров кода

Этот шаблон приложения ИИ содержит несколько примеров выделения различных структурированных вариантов использования выходных данных. В следующих разделах описан соответствующий код в каждом примере.

Пример 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
  • название: название вопроса.
  • описание: краткая характеристика проблемы.
  • тип: тип проблемы из перечня IssueType.
  • operating_system: операционная система, связанная с проблемой.

Определение перечисления IssueType

Класс Python IssueType — это перечисление, определяющее возможные значения для типа проблемы (например, "Отчет об ошибках", "Компонент", "Документация", "Регрессия").

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"]
  • request.get: отправляет запрос GET, чтобы получить проблему из API GitHub.
  • response.status_code: проверяет успешность запроса.
  • issue_body: извлекает текст проблемы из ответа JSON.

Как Issue используется в вызове модели

Модель Issue используется для указания ожидаемого формата ответа при отправке запроса в модель GPT. Этот подход гарантирует, что извлеченные сведения соответствуют определенной схеме.

Отправка запроса в модель 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.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. Получение общедоступного README с помощью API GitHub и извлечение сведений

В этом примере показано, как использовать службу Azure OpenAI для получения структурированной информации из файла README репозитория GitHub. В этом пошаговом руководстве основное внимание уделяется только примеру кода, который имеет дело с структурированными выходными данными.

Как RepoOverview использует другие определенные модели

Модель RepoOverview использует перечисления Language, AzureServiceи Framework для определения структурированной и проверенной схемы для извлеченных сведений. Эта модель используется в вызове модели GPT, чтобы убедиться, что ответ соответствует ожидаемому формату, обеспечивая безопасность типов, проверку и удобочитаемость. Затем скрипт анализирует, проверяет и печатает извлеченные сведения, что упрощает работу с подчиненными приложениями.

определение модели RepoOverview

Модель RepoOverview — это модель Pydantic, которая определяет структуру ожидаемых выходных данных из модели GPT. Он использует другие определенные модели (Language, AzureServiceи Framework) для обеспечения соответствия извлеченных сведений определенным перечислениям и типам.

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]
  • имя: строка, представляющая имя репозитория.
  • описание: строка, предоставляющая краткое описание проекта.
  • языках: список значений перечисления 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"
    
  • Framework: определяет возможные значения для платформ.

    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.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 определяет ожидаемую структуру выходных данных, убедившись, что данные хорошо структурированы и проверены. Скрипт преобразует изображение в URI с кодировкой Base64, отправляет его модели 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]
  • заголовок: строка, показывающая заголовок графа.
  • описание: строка, которая дает краткое описание графа.
  • x_axis: строка, отображающая метку оси x.
  • y_axis: строка, отображающая метку оси Y.
  • легенда: список строк, показывающих элементы легенды графика.

Заметка

Использование изображений в качестве входных данных требует дополнительных шагов для кодирования и указания типа контента, но общий процесс аналогичен использованию текста для структурированных выходных данных.

Подготовка изображения к входным данным

Чтобы использовать изображение в качестве входных данных для структурированных выходных данных, скрипт преобразует изображение в URI в кодировке Base64. Этот подход позволяет отправлять изображение в рамках запроса в модель 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: URI изображения в кодировке Base64, используемый как входные данные для модели GPT.

Заметка

Пример 4 основан на примере 3 путем расширения концепции извлечения структурированной информации из текстовых источников до извлечения сведений из изображений. В примере 4 показано, как обрабатывать визуальные данные, преобразовав изображение графа в URI в кодировке Base64 и отправив его в модель 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.

Использование изображений для ввода по сравнению с текстом

Использование изображений в качестве входных данных для структурированных выходных данных отличается от использования текста несколькими способами:

  • Формат данных на входе: Преобразуйте изображения в URI, закодированный в Base64, перед отправкой в модель GPT, а текст можно отправлять напрямую.
  • тип контента: необходимо указать тип контента для изображений как image_url, а текст отправляется как обычный текст.
  • обработка: модель GPT обрабатывает изображения иначе, чем текст, извлекая визуальную информацию и преобразуя её в структурированные данные на основе предоставленной схемы.

Анализ и проверка ответа

Следующий фрагмент кода обрабатывает ответ из модели GPT. Сначала он извлекает сообщение из ответа. Затем он проверяет, отказалась ли модель обработать запрос. Если есть отказ, он печатает сообщение об отказе. В противном случае он выводит проанализированный ответ, содержащий структурированную информацию, извлеченную. Этот подход гарантирует, что скрипт может обрабатывать как успешные, так и неудачные ответы из модели GPT.

message = completion.choices[0].message
if (message.refusal):
    print(message.refusal)
else:
    print(message.parsed)
  • сообщение: извлекает сообщение из первого выбора в ответе.
  • 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 для извлечения структурированной информации из изображения таблицы. В примере изображение преобразуется в универсальный идентификатор ресурса (URI) с кодировкой Base64, отправляется в модель GPT с проверкой ответа на соответствие модели PlantInventory. Модели Plant и PlantInventory определяют ожидаемую структуру выходных данных, гарантируя, что извлеченные данные хорошо структурированы и проверены.

Определение моделей 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 объектов. Эта структура помогает примеру упорядочивать и проверять данные завода.

Подготовка изображения к входным данным

Чтобы использовать изображение в качестве входных данных, следующий фрагмент кода преобразует изображение в URI в кодировке Base64. Такой подход позволяет отправить изображение в запросе в модель 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: универсальный код ресурса (URI) в кодировке Base64 изображения, используемый в качестве входных данных для модели GPT.

Заметка

В примере 5 показано, как извлечь структурированную информацию из изображения таблицы. В ней представлены модели Pydantic Plant и PlantInventory, которые используются для определения структуры ожидаемого вывода, обеспечивая упорядоченные и проверенные данные. Этот подход показывает, как обрабатывать более подробные и вложенные данные при сохранении структурированного метода вывода, используемого в примере 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.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. Анализ локальной квитанции PDF путем преобразования в Markdown и извлечения сведений о заказе

В этом примере показано, как использовать службу Azure OpenAI для извлечения структурированной информации из квитанции PDF. Модели Item и Receipt определяют ожидаемую структуру выходных данных, обеспечивая хорошо структурированные и проверенные данные. Пример преобразует PDF-файл в текст в формате markdown, отправляет его в модель GPT и сопоставляет ответ с моделью Receipt. Использование PDF-файлов в качестве входных данных требует дополнительных шагов для извлечения и преобразования содержимого, но процесс аналогичен использованию текста для структурированных выходных данных.

Извлечение из PDF-файлов

Как и при использовании изображений в качестве входных данных, вы извлекаете PDF-файл в виде текста. Вы можете использовать размещенную службу, например azure Document Intelligence или локальный пакет Python, например pymupdf.

Использование PDF-файлов для ввода по сравнению с использованием текста

Использование PDF-файлов в качестве входных данных для структурированных выходных данных отличается от использования текста несколькими способами:

  • Формат ввода: преобразование PDF-файлов в текст в формате markdown перед отправкой в модель GPT. Текст можно отправлять напрямую.
  • извлечение содержимого: извлечение и преобразование содержимого PDF в текст markdown, который может обрабатывать модель GPT.
  • обработка: модель GPT обрабатывает извлеченный текст из PDF-файла и преобразует его в структурированные данные на основе предоставленной схемы.

Определение моделей Item и Receipt

Модели Item и Receipt — это модели Pydantic, определяющие структуру ожидаемых выходных данных из модели GPT. Этот подход гарантирует, что извлеченные сведения соответствуют определенной схеме.

  • элемент: представляет отдельные элементы в квитанции с полями для имени продукта, цены и количества.

    class Item(BaseModel):
        product: str
        price: float
        quantity: int
    
    • продукта: название продукта.
    • цена: цена продукта.
    • количество: количество продукта.
  • квитанция: представляет собой общую квитанцию, включая поля для общей суммы, стоимости доставки, способа оплаты, перечня товаров и номера заказа. Модель Receipt использует модель Item для представления структурированной квитанции с подробными сведениями о каждом элементе.

    class Receipt(BaseModel):
        total: float
        shipping: float
        payment_method: str
        items: list[Item]
        order_number: int
    
    • общий: общая сумма квитанции.
    • доставка: стоимость доставки.
    • payment_method: используемый метод оплаты.
    • элементы: список объектов 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.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.

Использование веб-страниц для ввода vs использование текста

Использование веб-страниц в качестве входных данных для структурированных выходных данных отличается от использования текста несколькими способами:

  • Формат ввода: сбор и анализ веб-страниц для выделения соответствующего содержимого перед отправкой в модель 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'")
  • заголовок: заголовок блога.
  • краткое содержание: краткое содержание блога.
  • теги: теги, связанные с постом в блоге.

Подготовка веб-страницы к входным данным

Чтобы использовать веб-страницу в качестве входных данных для структурированных выходных данных, следующий фрагмент кода извлекает содержимое веб-страницы и извлекает соответствующие части (название и текст) с помощью библиотеки Python BeautifulSoup. Этот процесс подготавливает содержимое веб-страницы для отправки в модель 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)
  • request.get: отправляет запрос GET, чтобы получить содержимое веб-страницы.
  • BeautifulSoup: анализирует HTML-содержимое веб-страницы.
  • post_title: извлекает название публикации в блоге.
  • post_contents: извлекает содержимое записи блога.

Заметка

Пример 7 основан на примере 6, расширяя концепцию извлечения структурированных сведений из PDF-файлов для обработки веб-страниц. Этот подход показывает, как обрабатывать веб-содержимое, анализируя веб-страницу с помощью BeautifulSoup. Затем проанализированное содержимое отправляется в модель 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.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.

  1. Войдите на панель мониторингаGitHub Codespaces.

  2. Найдите текущее работающее пространство кода, исходное из репозитория Azure-Samples//azure-openai-entity-extraction GitHub.

  3. Откройте контекстное меню для пространства кода и выберите Удалить.

Получите помощь

Зарегистрируйте вашу проблему на странице репозитория.

Ресурсы