Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
В этом кратком руководстве показано, как использовать REST API content Understanding для получения структурированных данных из многомодального содержимого в документах, изображениях, аудио и видеофайлах.
Совет
Для интерактивных сценариев, требующих немедленного ответа от Read или Layout, см. Краткое руководство. Использование синхронных операций Content Understanding.
Необходимые условия
- Активная подписка Azure. Если у вас нет учетной записи Azure, создайте её бесплатно.
- Ресурс Microsoft Foundry, созданный в поддерживаемом регионе. Чтобы создать ресурс, вам потребуется роль участника или более поздняя в целевой подписке или группе ресурсов.
- Настройте развертывания моделей по умолчанию для ресурса Content Understanding. По умолчанию вы создаете подключение к моделям Microsoft Foundry, используемым для запросов на распознавание контента. Выберите один из следующих методов:
Перейдите на страницу параметров распознавания содержимого.
Нажмите кнопку +Добавить ресурс в левом верхнем углу.
Выберите ресурс Foundry, который вы хотите использовать, и нажмите кнопку "Далее>сохранить".
Убедитесь, что установлен флажок Enable autodeployment для обязательных моделей, если значения по умолчанию недоступны. Для разных анализаторов требуются разные модели. Сведения о текущем списке см. в разделе "Поддерживаемые модели создания".
Важно
Семейство моделей GPT-4.1 (
gpt-4.1,gpt-4.1-mini, )gpt-4.1-nanoотменяется в октябре 2026 года. Мы рекомендуем выполнить миграцию наgpt-5.2, который обеспечивает расширенные возможности. Для получения полного графика выведения из эксплуатации см. раздел Выведение из эксплуатации моделей Azure OpenAI.
- cURL установлен в вашей среде разработки.
Начало работы с предварительно созданным анализатором
В этом кратком руководстве используются предварительно созданные анализаторы — конфигурация не требуется. Сведения о настройке анализаторов для ваших потребностей см. в разделе "Предварительно созданные анализаторы".
Отправка файла для анализа
Перед выполнением следующей команды cURL внесите следующие изменения в HTTP-запрос:
- Замените
{endpoint}и{key}соответствующими значениями из экземпляра Foundry на портале Azure.
запрос POST
В этом примере анализатор prebuilt-invoice используется для извлечения структурированных данных из документа счета.
curl -i -X POST "{endpoint}/contentunderstanding/analyzers/prebuilt-invoice:analyze?api-version=2025-11-01" \
-H "Ocp-Apim-Subscription-Key: {key}" \
-H "Content-Type: application/json" \
-d '{
"inputs":[{"url": "https://github.com/Azure-Samples/azure-ai-content-understanding-python/raw/refs/heads/main/data/invoice.pdf"}]
}'
Справочник. Анализаторы содержимого — анализ
Ответ POST
Заголовок ответа содержит Operation-Location поле, которое используется для получения результатов асинхронной операции анализа.
HTTP/1.1 202 Accepted
Transfer-Encoding: chunked
Content-Type: application/json
request-id: aaa-bbb-ccc-ddd
x-ms-request-id: aaa-bbb-ccc-ddd
Operation-Location: {endpoint}/contentunderstanding/analyzerResults/{request-id}?api-version=2025-11-01
x-envoy-upstream-service-time: 800
apim-request-id: {request-id}
Strict-Transport-Security: max-age=31536000; includeSubDomains; preload
x-content-type-options: nosniff
x-ms-region: West US
Date: Fri, 31 Oct 2025 05:30:17 GMT
Connection: close
Важно
Скопируйте URL-адрес расположения операции из заголовка ответа. Этот URL-адрес будет использоваться на следующем шаге для получения результатов анализа.
Получение результата анализа
Operation-Location Используйте ответ из POST ответа и получите результат анализа. Успешный ответ возвращает status: "Succeeded" с извлеченными полями в объекте result.
GET запрос
curl -i -X GET "{endpoint}/contentunderstanding/analyzerResults/{request-id}?api-version=2025-11-01" \
-H "Ocp-Apim-Subscription-Key: {key}"
Справочник. Результаты анализатора — получение
ОТВЕТ GET
Ответ JSON 200 (OK) включает status поле. Если операция не завершена, status имеет Running значение или NotStarted. Опрашивайте URL-адрес каждые 1–2 секунды, пока status не станет Succeeded.
{
"id": "ce05fb5a-579e-4f0b-afb5-3532bcddeaee",
"status": "Succeeded",
"result": {
"analyzerId": "prebuilt-invoice",
"apiVersion": "2025-11-01",
"createdAt": "2025-11-13T20:04:55Z",
"warnings": [],
"contents": [
{
"path": "input1",
"markdown": "CONTOSO LTD.\n\n\n# INVOICE\n\nContoso Headquarters\n123 456th St\nNew York, NY, 10001\n\nINVOICE: INV-100\n\nINVOICE DATE: 11/15/2019\n\nDUE DATE: 12/15/2019\n\nCUSTOMER NAME: MICROSOFT CORPORATION...",
"fields": {
"AmountDue": {
"type": "object",
"valueObject": {
"Amount": {
"type": "number",
"valueNumber": 610,
"spans": [
{
"offset": 1522,
"length": 7
}
],
"confidence": 0.773,
"source": "D(1,7.3628,8.0459,7.9272,8.0459,7.9272,8.2070,7.3628,8.2070)"
},
"CurrencyCode": {
"type": "string",
"valueString": "USD"
}
}
},
"BalanceForward": {
"type": "object",
"valueObject": {
"Amount": {
"type": "number",
"valueNumber": 500,
"spans": [
{
"offset": 1474,
"length": 7
}
],
"confidence": 0.901,
"source": "D(1,7.3628,7.7445,7.9278,7.7467,7.9272,7.9092,7.3622,7.9070)"
},
"CurrencyCode": {
"type": "string",
"valueString": "USD"
}
}
},
"BillingAddress": {
"type": "string",
"valueString": "123 Bill St, Redmond WA, 98052",
"spans": [
{
"offset": 325,
"length": 12
},
"..."
],
"confidence": 0.712,
"source": "D(1,0.5805,3.9471,1.2858,3.9478,1.2856,4.1115,0.5803,4.1108);..."
},
"BillingAddressRecipient": {
"type": "string",
"valueString": "Microsoft Finance",
"spans": [
{
"offset": 307,
"length": 17
}
],
"confidence": 0.815,
"source": "D(1,0.5734,3.7392,1.8060,3.7521,1.8043,3.9201,0.5717,3.9072)"
},
"CountryRegion": {
"type": "string",
"valueString": "USA"
},
"CustomerAddress": {
"type": "string",
"valueString": "123 Other St, Redmond WA, 98052",
"spans": [
"..."
],
"confidence": 0.744,
"source": "..."
},
"CustomerAddressRecipient": {
"type": "string",
"valueString": "Microsoft Corp",
"spans": [
"..."
],
"confidence": 0.437,
"source": "..."
},
"CustomerId": {
"type": "string",
"valueString": "CID-12345",
"spans": [
"..."
],
"confidence": 0.936,
"source": "..."
},
"CustomerName": {
"type": "string",
"valueString": "MICROSOFT CORPORATION",
"spans": [
"..."
],
"confidence": 0.46,
"source": "..."
},
"CustomerTaxId": {
"type": "string",
"confidence": 0.912
},
"DueDate": {
"type": "date",
"valueDate": "2019-12-15",
"spans": [
"..."
],
"confidence": 0.97,
"source": "..."
},
"InvoiceDate": {
"type": "date",
"valueDate": "2019-11-15",
"spans": [
"..."
],
"confidence": 0.939,
"source": "..."
},
"InvoiceId": {
"type": "string",
"valueString": "INV-100",
"spans": [
"..."
],
"confidence": 0.733,
"source": "..."
},
"LineItems": {
"type": "array",
"valueArray": [
{
"type": "object",
"valueObject": {
"Date": {
"type": "date",
"valueDate": "2021-03-04",
"spans": [
"..."
],
"confidence": 0.894,
"source": "..."
},
"Description": {
"type": "string",
"valueString": "Consulting Services",
"spans": [
"..."
],
"confidence": 0.589,
"source": "..."
},
"ProductCode": {
"type": "string",
"valueString": "A123",
"spans": [
"..."
],
"confidence": 0.879,
"source": "..."
},
"Quantity": {
"type": "number",
"valueNumber": 2,
"spans": [
"..."
],
"confidence": 0.939,
"source": "..."
},
"QuantityUnit": {
"type": "string",
"valueString": "hours",
"spans": [
"..."
],
"confidence": 0.85,
"source": "..."
},
"TaxAmount": {
"type": "object",
"valueObject": {
"Amount": {
"type": "number",
"valueNumber": 6,
"spans": [
"..."
],
"confidence": 0.522,
"source": "..."
},
"CurrencyCode": {
"type": "string",
"valueString": "USD"
}
}
},
"TaxRate": {
"type": "number",
"confidence": 0.915
},
"TotalAmount": {
"type": "object",
"valueObject": {
"Amount": {
"type": "number",
"valueNumber": 60,
"spans": [
"..."
],
"confidence": 0.972,
"source": "..."
},
"CurrencyCode": {
"type": "string",
"valueString": "USD"
}
}
},
"UnitPrice": {
"type": "object",
"valueObject": {
"Amount": {
"type": "number",
"valueNumber": 30,
"spans": [
"..."
],
"confidence": 0.97,
"source": "..."
},
"CurrencyCode": {
"type": "string",
"valueString": "USD"
}
}
}
}
},
"... (2 additional line items)"
]
}
/*additional fields omitted*/
},
"kind": "document",
"startPageNumber": 1,
"endPageNumber": 1,
"unit": "inch",
"pages": [
{
"pageNumber": 1,
"angle": 0,
"width": 8.5,
"height": 11,
"words": [
"... (words omitted for brevity)"
],
"selectionMarks": [],
"lines": [
"... (lines omitted for brevity)"
],
"barcodes": [],
"formulas": []
}
],
"tables": [
"... (tables omitted for brevity)"
],
"analyzerId": "prebuilt-invoice",
"mimeType": "application/pdf"
}
]
},
"usage": {
"documentPagesStandard": 1,
"contextualizationTokens": 2345,
"tokens": {
"gpt-5.2-input": 1234,
"gpt-5.2-output": 567
}
}
}
Совет
При использовании видеоанализатора ключевые кадры возвращаются в виде URL-адресов в ответе JSON (например, в разделе result.contents.frames[]). Скачайте ключевые кадры с помощью стандартного HTTP-запроса GET :
curl -O "<keyframeUrl>"
библиотека Client | Samples | SDK source
В этом кратком руководстве показано, как использовать пакет SDK для распознавания содержимого Python для извлечения структурированных данных с помощью предварительно созданных анализаторов из документов, изображений, аудио и видеофайлов. Дополнительные сведения о предварительно созданных анализаторах и других функциях см. в документации по предварительно созданным анализаторам.
Необходимые условия
- Активная подписка Azure. Если у вас нет учетной записи Azure, создайте её бесплатно.
- Ресурс Microsoft Foundry, созданный в поддерживаемом регионе.
- Конечная точка ресурса и ключ API (найденные в разделе "Ключи" и "Конечная точка" на портале Azure).
- Развертывание модели по умолчанию настроено для вашего ресурса. Инструкции по настройке см. в Модели и развертывания или в этом однократном скрипте настройки.
- Python 3.9 или более поздней версии.
Настройка
Установите клиентскую библиотеку "Content Understanding" для Python с помощью pip:
pip install --pre azure-ai-contentunderstandingПри необходимости установите библиотеку удостоверений Azure для проверки подлинности Microsoft Entra:
pip install azure-identity
Настройка переменных среды
Чтобы выполнить проверку подлинности в службе "Распознавание содержимого", задайте переменные среды собственными значениями перед выполнением примера:
-
CONTENTUNDERSTANDING_ENDPOINT— конечная точка для ресурса Content Understanding. -
CONTENTUNDERSTANDING_KEY— ключ API распознавания содержимого (необязательно, если используется Microsoft Entra ID DefaultAzureCredential).
Windows
setx CONTENTUNDERSTANDING_ENDPOINT "your-endpoint"
setx CONTENTUNDERSTANDING_KEY "your-key"
Linux или macOS
export CONTENTUNDERSTANDING_ENDPOINT="your-endpoint"
export CONTENTUNDERSTANDING_KEY="your-key"
Создание клиента
ContentUnderstandingClient — это основная точка входа для взаимодействия со службой. Создайте экземпляр, указав конечную точку и учетные данные.
import os
from azure.ai.contentunderstanding import ContentUnderstandingClient
from azure.core.credentials import AzureKeyCredential
endpoint = os.environ["CONTENTUNDERSTANDING_ENDPOINT"]
key = os.environ["CONTENTUNDERSTANDING_KEY"]
client = ContentUnderstandingClient(endpoint=endpoint, credential=AzureKeyCredential(key))
Начало работы с предварительно созданным анализатором
Анализаторы определяют, как обрабатывается содержимое и извлекаются аналитические сведения. Мы предлагаем предварительно созданные анализаторы для распространенных вариантов использования. Предварительно созданные анализаторы можно настроить в соответствии с конкретными потребностями и вариантами использования. В этом кратком руководстве используются предварительно созданные анализаторы счетов, изображений, аудио и видео, чтобы помочь вам приступить к работе.
В этом примере анализатор prebuilt-invoice используется для извлечения структурированных данных из документа счета.
import sys
from azure.ai.contentunderstanding.models import (
AnalysisInput,
AnalysisResult,
DocumentContent,
ArrayField,
ObjectField,
)
# Sample invoice
invoice_url = (
"https://raw.githubusercontent.com/"
"Azure-Samples/"
"azure-ai-content-understanding-assets/"
"main/document/invoice.pdf"
)
poller = client.begin_analyze(
analyzer_id="prebuilt-invoice",
inputs=[AnalysisInput(url=invoice_url)],
)
result: AnalysisResult = poller.result()
if not result.contents or len(result.contents) == 0:
print("No content found in the analysis result.")
sys.exit(0)
# Get the document content
document_content: DocumentContent = (
result.contents[0] # type: ignore
)
print(
f"Document unit: {document_content.unit or 'unknown'}"
)
print(
f"Pages: {document_content.start_page_number}"
f" to {document_content.end_page_number}"
)
if not document_content.fields:
print("No fields found in the analysis result.")
sys.exit(0)
# Extract simple string fields
customer_name = document_content.fields.get("CustomerName")
if customer_name:
print(f"Customer Name: {customer_name.value}")
if customer_name.confidence:
print(
f" Confidence: {customer_name.confidence:.2f}"
)
print(f" Source: {customer_name.source or 'N/A'}")
# Extract date fields
invoice_date = document_content.fields.get("InvoiceDate")
if invoice_date:
print(f"Invoice Date: {invoice_date.value}")
if invoice_date.confidence:
print(
f" Confidence: {invoice_date.confidence:.2f}"
)
# Extract object fields (nested structures)
total_amount = document_content.fields.get("TotalAmount")
if (
isinstance(total_amount, ObjectField)
and total_amount.value
):
amount_field = total_amount.value.get("Amount")
currency_field = total_amount.value.get(
"CurrencyCode"
)
amount = (
amount_field.value if amount_field else None
)
currency = (
currency_field.value
if currency_field and currency_field.value
else ""
)
if isinstance(amount, (int, float)):
print(f"\nTotal: {currency}{amount:.2f}")
else:
print(f"\nTotal: {currency}{amount or '(None)'}")
# Extract array fields (line items)
line_items = document_content.fields.get("LineItems")
if (
isinstance(line_items, ArrayField)
and line_items.value
):
print(f"\nLine Items ({len(line_items.value)}):")
for i, item in enumerate(line_items.value, 1):
if (
isinstance(item, ObjectField)
and item.value
):
desc = item.value.get("Description")
qty = item.value.get("Quantity")
description = (
desc.value
if desc and desc.value
else "N/A"
)
quantity = (
qty.value
if qty and qty.value
else "N/A"
)
print(f" Item {i}: {description}")
print(f" Quantity: {quantity}")
При этом будут выведены следующие выходные данные:
Document unit: LengthUnit.INCH
Pages: 1 to 1
Customer Name: MICROSOFT CORPORATION
Confidence: 0.39
Source: D(1,6.2250,2.0092,8.0020,2.0077,8.0021,2.1638,6.2251,2.1653)
Invoice Date: 2019-11-15
Confidence: 0.91
Total: USD110.00
Line Items (3):
Item 1: Consulting Services
Quantity: 2.0
Item 2: Document Fee
Quantity: 3.0
Item 3: Printing Fee
Quantity: 10.0
Примечание
Этот код основан на примере sample_analyze_invoice.py в репозитории SDK.
библиотека Client | Samples | SDK source
В этом кратком руководстве показано, как использовать пакет SDK для распознавания содержимого .NET для извлечения структурированных данных с помощью предварительно созданных анализаторов из документов, изображений, аудио и видеофайлов. Дополнительные сведения о предварительно созданных анализаторах и других функциях см. в документации по предварительно созданным анализаторам.
Необходимые условия
- Активная подписка Azure. Если у вас нет учетной записи Azure, создайте её бесплатно.
- Ресурс Microsoft Foundry, созданный в поддерживаемом регионе.
- Конечная точка ресурса и ключ API (найденные в разделе "Ключи" и "Конечная точка" на портале Azure).
- Развертывание модели по умолчанию настроено для вашего ресурса. Инструкции по настройке см. в Модели и развертывания или в этом однократном скрипте настройки.
- Текущая версия .NET.
Настройка
Создайте консольное приложение .NET:
dotnet new console -n ContentUnderstandingQuickstart cd ContentUnderstandingQuickstartУстановите клиентскую библиотеку "Понимание содержимого" для .NET:
dotnet add package Azure.AI.ContentUnderstanding --prereleaseПри необходимости установите библиотеку удостоверений Azure для проверки подлинности Microsoft Entra:
dotnet add package Azure.Identity
Настройка переменных среды
Чтобы выполнить проверку подлинности в службе "Распознавание содержимого", задайте переменные среды собственными значениями перед выполнением примера:
-
CONTENTUNDERSTANDING_ENDPOINT— конечная точка для ресурса Content Understanding. -
CONTENTUNDERSTANDING_KEY— ключ API распознавания содержимого (необязательно, если используется Microsoft Entra ID DefaultAzureCredential).
Windows
setx CONTENTUNDERSTANDING_ENDPOINT "your-endpoint"
setx CONTENTUNDERSTANDING_KEY "your-key"
Linux или macOS
export CONTENTUNDERSTANDING_ENDPOINT="your-endpoint"
export CONTENTUNDERSTANDING_KEY="your-key"
Создание клиента
ContentUnderstandingClient — это основная точка входа для взаимодействия со службой. Создайте экземпляр, указав конечную точку и учетные данные.
using Azure;
using Azure.AI.ContentUnderstanding;
string endpoint = Environment.GetEnvironmentVariable("CONTENTUNDERSTANDING_ENDPOINT");
string key = Environment.GetEnvironmentVariable("CONTENTUNDERSTANDING_KEY");
var client = new ContentUnderstandingClient(
new Uri(endpoint),
new AzureKeyCredential(key)
);
Начало работы с предварительно созданным анализатором
Анализаторы определяют, как обрабатывается содержимое и извлекаются аналитические сведения. Мы предлагаем предварительно созданные анализаторы для распространенных вариантов использования. Предварительно созданные анализаторы можно настроить в соответствии с конкретными потребностями и вариантами использования. В этом кратком руководстве используются предварительно созданные анализаторы счетов, изображений, аудио и видео, чтобы помочь вам приступить к работе.
В этом примере анализатор prebuilt-invoice используется для извлечения структурированных данных из документа счета.
// Sample invoice
Uri invoiceUrl = new Uri("https://raw.githubusercontent.com/Azure-Samples/azure-ai-content-understanding-assets/main/document/invoice.pdf");
Operation<AnalysisResult> operation = await client.AnalyzeAsync(
WaitUntil.Completed,
"prebuilt-invoice",
inputs: new[] { new AnalysisInput { Uri = invoiceUrl } });
AnalysisResult result = operation.Value;
DocumentContent documentContent = (DocumentContent)result.Contents!.First();
// Print document unit information
// The unit indicates the measurement system used for coordinates in the source field
Console.WriteLine($"Document unit: {documentContent.Unit ?? "unknown"}");
Console.WriteLine($"Pages: {documentContent.StartPageNumber} to {documentContent.EndPageNumber}");
if (documentContent.Pages != null && documentContent.Pages.Count > 0)
{
var page = documentContent.Pages[0];
var unit = documentContent.Unit?.ToString() ?? "units";
Console.WriteLine($"Page dimensions: {page.Width} x {page.Height} {unit}");
}
Console.WriteLine();
// Extract simple string fields
var customerNameField = documentContent.Fields["CustomerName"];
Console.WriteLine($"Customer Name: {customerNameField.Value ?? "(None)"}");
Console.WriteLine($" Confidence: {customerNameField.Confidence?.ToString("F2") ?? "N/A"}");
if (customerNameField.Spans?.Count > 0)
{
var span = customerNameField.Spans[0];
Console.WriteLine($" Position in markdown: offset={span.Offset}, length={span.Length}");
}
// Extract simple date field
var invoiceDateField = documentContent.Fields.GetFieldOrDefault("InvoiceDate");
Console.WriteLine($"Invoice Date: {invoiceDateField?.Value ?? "(None)"}");
Console.WriteLine($" Confidence: {invoiceDateField?.Confidence?.ToString("F2") ?? "N/A"}");
// Access parsed sources for date field
if (invoiceDateField?.Sources != null)
{
foreach (var source in invoiceDateField.Sources)
{
if (source is DocumentSource docSource)
{
Console.WriteLine($" Page {docSource.PageNumber}");
Console.WriteLine($" BoundingBox: {docSource.BoundingBox}");
}
}
}
if (invoiceDateField?.Spans?.Count > 0)
{
var span = invoiceDateField.Spans[0];
Console.WriteLine($" Position in markdown: offset={span.Offset}, length={span.Length}");
}
// Extract object fields (nested structures)
if (documentContent.Fields.GetFieldOrDefault("TotalAmount") is ContentObjectField totalAmountObj)
{
var amount = totalAmountObj.Value?.GetFieldOrDefault("Amount")?.Value as double?;
var currency = totalAmountObj.Value?.GetFieldOrDefault("CurrencyCode")?.Value;
Console.WriteLine($"Total: {currency ?? "$"}{amount?.ToString("F2") ?? "(None)"}");
// Access parsed sources for object field
if (totalAmountObj.Sources != null)
{
foreach (var source in totalAmountObj.Sources)
{
if (source is DocumentSource docSource)
{
Console.WriteLine($" Page {docSource.PageNumber}");
Console.WriteLine($" BoundingBox: {docSource.BoundingBox}");
}
}
}
}
// Extract array fields (collections like line items)
if (documentContent.Fields.GetFieldOrDefault("LineItems") is ContentArrayField lineItems)
{
Console.WriteLine($"Line Items ({lineItems.Count}):");
for (int i = 0; i < lineItems.Count; i++)
{
if (lineItems[i] is ContentObjectField item)
{
var description = item.Value?.GetFieldOrDefault("Description")?.Value;
var quantity = item.Value?.GetFieldOrDefault("Quantity")?.Value as double?;
Console.WriteLine($" Item {i + 1}: {description ?? "N/A"} (Qty: {quantity?.ToString() ?? "N/A"})");
}
}
}
При этом будут выведены следующие выходные данные:
Document unit: inch
Pages: 1 to 1
Page dimensions: 8.5 x 11 inch
Customer Name: MICROSOFT CORPORATION
Confidence: 0.44
Position in markdown: offset=162, length=21
Invoice Date: 11/15/2019 12:00:00 AM +00:00
Confidence: 0.94
Page 1
BoundingBox: {X=7.2398,Y=1.5908,Width=0.7662997,Height=0.16179991}
Position in markdown: offset=113, length=10
Total: USD110.00
Line Items (3):
Item 1: Consulting Services (Qty: 2)
Item 2: Document Fee (Qty: 3)
Item 3: Printing Fee (Qty: 10)
Примечание
Этот код основан на примере AnalyzeInvoice в репозитории SDK.
библиотека Client | Samples | SDK source
В этом кратком руководстве показано, как использовать пакет SDK для распознавания содержимого Java для извлечения структурированных данных с помощью предварительно созданных анализаторов из документов, изображений, аудио и видеофайлов. Дополнительные сведения о предварительно созданных анализаторах и других функциях см. в документации по предварительно созданным анализаторам.
Необходимые условия
- Активная подписка Azure. Если у вас нет учетной записи Azure, создайте её бесплатно.
- Ресурс Microsoft Foundry, созданный в поддерживаемом регионе.
- Конечная точка ресурса и ключ API (найденные в разделе "Ключи" и "Конечная точка" на портале Azure).
- Развертывание модели по умолчанию настроено для вашего ресурса. Инструкции по настройке см. в Модели и развертывания или в этом однократном скрипте настройки.
- Java комплект средств разработки (JDK) версии 8 или более поздней.
- Apache Maven.
Настройка
Создайте проект Maven:
mvn archetype:generate -DgroupId=com.example \ -DartifactId=content-understanding-quickstart \ -DarchetypeArtifactId=maven-archetype-quickstart \ -DinteractiveMode=false cd content-understanding-quickstartДобавьте зависимость "Content Understanding" в файл pom.xml в секцию
<dependencies>.<dependency> <groupId>com.azure</groupId> <artifactId>azure-ai-contentunderstanding</artifactId> <version>1.1.0-beta.3</version> </dependency>При необходимости добавьте библиотеку удостоверений Azure для проверки подлинности Microsoft Entra:
<dependency> <groupId>com.azure</groupId> <artifactId>azure-identity</artifactId> <version>1.14.2</version> </dependency>
Настройка переменных среды
Чтобы выполнить проверку подлинности в службе "Распознавание содержимого", задайте переменные среды собственными значениями перед выполнением примера:
-
CONTENTUNDERSTANDING_ENDPOINT— конечная точка для ресурса Content Understanding. -
CONTENTUNDERSTANDING_KEY— ключ API распознавания содержимого (необязательно, если используется Microsoft Entra ID DefaultAzureCredential).
Windows
setx CONTENTUNDERSTANDING_ENDPOINT "your-endpoint"
setx CONTENTUNDERSTANDING_KEY "your-key"
Linux или macOS
export CONTENTUNDERSTANDING_ENDPOINT="your-endpoint"
export CONTENTUNDERSTANDING_KEY="your-key"
Создание клиента
ContentUnderstandingClient — это основная точка входа для взаимодействия со службой. Создайте экземпляр, указав конечную точку и учетные данные.
import com.azure.core.credential.AzureKeyCredential;
import com.azure.ai.contentunderstanding.ContentUnderstandingClient;
import com.azure.ai.contentunderstanding.ContentUnderstandingClientBuilder;
String endpoint = System.getenv("CONTENTUNDERSTANDING_ENDPOINT");
String key = System.getenv("CONTENTUNDERSTANDING_KEY");
ContentUnderstandingClient client =
new ContentUnderstandingClientBuilder()
.endpoint(endpoint)
.credential(new AzureKeyCredential(key))
.buildClient();
Начало работы с предварительно созданным анализатором
Анализаторы определяют, как обрабатывается содержимое и извлекаются аналитические сведения. Мы предлагаем предварительно созданные анализаторы для распространенных вариантов использования. Предварительно созданные анализаторы можно настроить в соответствии с конкретными потребностями и вариантами использования. В этом кратком руководстве используются предварительно созданные анализаторы счетов, изображений, аудио и видео, чтобы помочь вам приступить к работе.
В этом примере анализатор prebuilt-invoice используется для извлечения структурированных данных из документа счета.
import java.util.Arrays;
import java.util.List;
import com.azure.core.credential.AzureKeyCredential;
import com.azure.core.util.polling.SyncPoller;
import com.azure.ai.contentunderstanding.ContentUnderstandingClient;
import com.azure.ai.contentunderstanding.ContentUnderstandingClientBuilder;
import com.azure.ai.contentunderstanding.models.*;
public class test_document {
public static void main(String[] args) {
String endpoint = System.getenv("CONTENTUNDERSTANDING_ENDPOINT");
String key = System.getenv("CONTENTUNDERSTANDING_KEY");
ContentUnderstandingClient client =
new ContentUnderstandingClientBuilder()
.endpoint(endpoint)
.credential(new AzureKeyCredential(key))
.buildClient();
// Sample invoice
String invoiceUrl =
"https://raw.githubusercontent.com/"
+ "Azure-Samples/"
+ "azure-ai-content-understanding-assets/"
+ "main/document/invoice.pdf";
AnalysisInput input = new AnalysisInput();
input.setUrl(invoiceUrl);
SyncPoller<ContentAnalyzerAnalyzeOperationStatus, AnalysisResult> poller =
client.beginAnalyze(
"prebuilt-invoice",
Arrays.asList(input)
);
AnalysisResult result = poller.getFinalResult();
// BEGIN:ContentUnderstandingExtractInvoiceFields
// Get the invoice document content
AnalysisContent firstContent = result.getContents().get(0);
if (firstContent instanceof DocumentContent) {
DocumentContent documentContent = (DocumentContent) firstContent;
// Print document unit information
System.out.println("Document unit: "
+ (documentContent.getUnit() != null ? documentContent.getUnit().toString() : "unknown"));
System.out.println(
"Pages: " + documentContent.getStartPageNumber() + " to " + documentContent.getEndPageNumber());
System.out.println();
// Extract simple string fields using getValue() convenience method
// getValue() returns the typed value regardless of field type (StringField, NumberField, DateField, etc.)
ContentField customerNameField
= documentContent.getFields() != null ? documentContent.getFields().get("CustomerName") : null;
ContentField invoiceDateField
= documentContent.getFields() != null ? documentContent.getFields().get("InvoiceDate") : null;
// Use getValue() instead of casting to specific types
// Note: getValue() returns the actual typed value - String, Number, LocalDate, etc.
String customerName = customerNameField != null ? (String) customerNameField.getValue() : null;
Object invoiceDateValue = invoiceDateField != null ? invoiceDateField.getValue() : null;
String invoiceDate = invoiceDateValue != null ? invoiceDateValue.toString() : null;
System.out.println("Customer Name: " + (customerName != null ? customerName : "(None)"));
if (customerNameField != null) {
System.out.println(" Confidence: " + (customerNameField.getConfidence() != null
? String.format("%.2f", customerNameField.getConfidence())
: "N/A"));
// Parse into DocumentSource for page number and bounding box
List<ContentSource> sources = customerNameField.getSources();
if (sources != null) {
for (ContentSource src : sources) {
if (src instanceof DocumentSource) {
DocumentSource docSrc = (DocumentSource) src;
System.out.println(" Source: page " + docSrc.getPageNumber()
+ ", polygon " + docSrc.getPolygon()
+ ", bounding box " + docSrc.getBoundingBox());
}
}
}
List<ContentSpan> spans = customerNameField.getSpans();
if (spans != null && !spans.isEmpty()) {
ContentSpan span = spans.get(0);
System.out
.println(" Position in markdown: offset=" + span.getOffset() + ", length=" + span.getLength());
}
}
System.out.println("Invoice Date: " + (invoiceDate != null ? invoiceDate : "(None)"));
if (invoiceDateField != null) {
System.out.println(" Confidence: " + (invoiceDateField.getConfidence() != null
? String.format("%.2f", invoiceDateField.getConfidence())
: "N/A"));
System.out.println(
" Source: " + (invoiceDateField.getSources() != null ? invoiceDateField.getSources() : "N/A"));
List<ContentSpan> spans = invoiceDateField.getSpans();
if (spans != null && !spans.isEmpty()) {
ContentSpan span = spans.get(0);
System.out
.println(" Position in markdown: offset=" + span.getOffset() + ", length=" + span.getLength());
}
}
// Extract object fields (nested structures) using getFieldOrDefault() convenience method
ContentField totalAmountField
= documentContent.getFields() != null ? documentContent.getFields().get("TotalAmount") : null;
if (totalAmountField instanceof ContentObjectField) {
ContentObjectField totalAmountObj = (ContentObjectField) totalAmountField;
ContentField amountField = totalAmountObj.getFieldOrDefault("Amount");
ContentField currencyField = totalAmountObj.getFieldOrDefault("CurrencyCode");
Double amount = amountField != null ? (Double) amountField.getValue() : null;
String currency = currencyField != null ? (String) currencyField.getValue() : null;
System.out.println("Total: " + (currency != null ? currency : "")
+ (amount != null ? String.format("%.2f", amount) : "(None)"));
if (totalAmountObj.getConfidence() != null) {
System.out.println(" Confidence: " + String.format("%.2f", totalAmountObj.getConfidence()));
}
if (totalAmountObj.getSources() != null && !totalAmountObj.getSources().isEmpty()) {
System.out.println(" Source: " + totalAmountObj.getSources());
}
}
// Extract array fields using size() and get() convenience methods
ContentField lineItemsField
= documentContent.getFields() != null ? documentContent.getFields().get("LineItems") : null;
if (lineItemsField instanceof ContentArrayField) {
ContentArrayField lineItems = (ContentArrayField) lineItemsField;
System.out.println("Line Items (" + lineItems.size() + "):");
for (int i = 0; i < lineItems.size(); i++) {
ContentField itemField = lineItems.get(i);
if (itemField instanceof ContentObjectField) {
ContentObjectField item = (ContentObjectField) itemField;
ContentField descField = item.getFieldOrDefault("Description");
ContentField qtyField = item.getFieldOrDefault("Quantity");
String description = descField != null ? (String) descField.getValue() : null;
Double quantity = qtyField != null ? (Double) qtyField.getValue() : null;
System.out.println(" Item " + (i + - + ": " + (description != null ? description : "N/A"));
System.out.println(" Quantity: " + (quantity != null ? quantity : "N/A"));
if (qtyField != null && qtyField.getConfidence() != null) {
System.out.println(" Quantity Confidence: " + String.format("%.2f", qtyField.getConfidence()));
} else {
System.out.println(" Quantity Confidence: N/A");
}
}
}
}
} // END:ContentUnderstandingExtractInvoiceFields
}
}
При этом будут выведены следующие выходные данные:
Document unit: inch
Pages: 1 to 1
Customer Name: MICROSOFT CORPORATION
Confidence: 0.43
Source: page 1, polygon [(6.225, 2.0092), (8.002, 2.0077), (8.0021, 2.1638), (6.2251, 2.1653)], bounding box [x=6.225, y=2.0077, width=1.7771001, height=0.15759993]
Position in markdown: offset=162, length=21
Invoice Date: 2019-11-15
Confidence: 0.94
Source: [D(1,7.2399,1.5954,8.0061,1.5908,8.0061,1.7482,7.2398,1.7526)]
Position in markdown: offset=113, length=10
Total: USD110.00
Line Items (3):
Item 1: Consulting Services
Quantity: 2.0
Quantity Confidence: 0.96
Item 2: Document Fee
Quantity: 3.0
Quantity Confidence: 0.90
Item 3: Printing Fee
Quantity: 10.0
Quantity Confidence: 0.94
Примечание
Этот код основан на примере AnalyzeInvoice](https://github.com/Azure/azure-sdk-for-java/blob/main/sdk/contentunderstanding/azure-ai-contentunderstanding/src/samples/java/com/azure/ai/contentunderstanding/samples/Sample03_AnalyzeInvoice.java) в репозитории SDK.
библиотека Client | Samples | SDK source
В этом кратком руководстве показано, как использовать пакет SDK JavaScript для распознавания содержимого для извлечения структурированных данных с помощью предварительно созданных анализаторов из документов, изображений, аудио и видеофайлов. Дополнительные сведения о предварительно созданных анализаторах и других функциях см. в документации по предварительно созданным анализаторам.
Необходимые условия
- Активная подписка Azure. Если у вас нет учетной записи Azure, создайте её бесплатно.
- Ресурс Microsoft Foundry, созданный в поддерживаемом регионе.
- Конечная точка ресурса и ключ API (найденные в разделе "Ключи" и "Конечная точка" на портале Azure).
- Развертывание модели по умолчанию настроено для вашего ресурса. Инструкции по настройке см. в Модели и развертывания или в этом однократном скрипте настройки.
- Node.js Версия LTS.
Настройка
Создайте проект Node.js:
mkdir content-understanding-quickstart cd content-understanding-quickstart npm init -yУстановите клиентскую библиотеку для понимания контента:
npm install @azure/ai-content-understanding@nextПри необходимости установите библиотеку удостоверений Azure для проверки подлинности Microsoft Entra:
npm install @azure/identity
Настройка переменных среды
Чтобы выполнить проверку подлинности в службе "Распознавание содержимого", задайте переменные среды собственными значениями перед выполнением примера:
-
CONTENTUNDERSTANDING_ENDPOINT— конечная точка для ресурса Content Understanding. -
CONTENTUNDERSTANDING_KEY— ключ API распознавания содержимого (необязательно, если используется Microsoft Entra ID DefaultAzureCredential).
Windows
setx CONTENTUNDERSTANDING_ENDPOINT "your-endpoint"
setx CONTENTUNDERSTANDING_KEY "your-key"
Linux или macOS
export CONTENTUNDERSTANDING_ENDPOINT="your-endpoint"
export CONTENTUNDERSTANDING_KEY="your-key"
Создание клиента
ContentUnderstandingClient — это основная точка входа для взаимодействия со службой. Создайте экземпляр, указав конечную точку и учетные данные.
const { AzureKeyCredential } = require("@azure/core-auth");
const {
ContentUnderstandingClient,
} = require("@azure/ai-content-understanding");
const endpoint = process.env["CONTENTUNDERSTANDING_ENDPOINT"];
const key = process.env["CONTENTUNDERSTANDING_KEY"];
const client = new ContentUnderstandingClient(
endpoint,
new AzureKeyCredential(key)
);
Начало работы с предварительно созданным анализатором
Анализаторы определяют, как обрабатывается содержимое и извлекаются аналитические сведения. Мы предлагаем предварительно созданные анализаторы для распространенных вариантов использования. Предварительно созданные анализаторы можно настроить в соответствии с конкретными потребностями и вариантами использования. В этом кратком руководстве используются предварительно созданные анализаторы счетов, изображений, аудио и видео, чтобы помочь вам приступить к работе.
В этом примере анализатор prebuilt-invoice используется для извлечения структурированных данных из документа счета.
async function main() {
const client = new ContentUnderstandingClient(
endpoint,
new AzureKeyCredential(key)
);
// Sample invoice
const invoiceUrl =
"https://raw.githubusercontent.com/"
+ "Azure-Samples/"
+ "azure-ai-content-understanding-assets/"
+ "main/document/invoice.pdf";
const poller = client.analyze(
"prebuilt-invoice",
[{ url: invoiceUrl }]
);
const result = await poller.pollUntilDone();
if (
!result.contents
|| result.contents.length === 0
) {
console.log(
"No content found in the analysis result."
);
return;
}
const content = result.contents[0];
// Get the document content
if (content.kind === "document") {
const documentContent = content;
console.log(
`Document unit: `
+ `${documentContent.unit ?? "unknown"}`
);
console.log(
`Pages: ${documentContent.startPageNumber}`
+ ` to ${documentContent.endPageNumber}`
);
if (!documentContent.fields) {
console.log("No fields found.");
return;
}
// Extract simple string fields
const customerNameField =
documentContent.fields["CustomerName"];
if (customerNameField) {
console.log(
`Customer Name: `
+ `${customerNameField.value ?? "(None)"}`
);
if (
customerNameField.confidence !== undefined
) {
console.log(
` Confidence: `
+ `${customerNameField.confidence
.toFixed(2)}`
);
}
}
// Extract date fields
const invoiceDateField =
documentContent.fields["InvoiceDate"];
if (invoiceDateField) {
console.log(
`Invoice Date: `
+ `${invoiceDateField.value ?? "(None)"}`
);
if (
invoiceDateField.confidence !== undefined
) {
console.log(
` Confidence: `
+ `${invoiceDateField.confidence
.toFixed(2)}`
);
}
}
// Extract object fields (nested structures)
const totalAmountField =
documentContent.fields["TotalAmount"];
if (
totalAmountField
&& totalAmountField.type === "object"
) {
const objField = totalAmountField;
if (objField.value) {
const amountField =
objField.value["Amount"];
const currencyField =
objField.value["CurrencyCode"];
const amount =
amountField?.value ?? "(None)";
const currency =
currencyField?.value ?? "";
console.log(
`\nTotal: ${currency}${amount}`
);
}
}
// Extract array fields (line items)
const lineItemsField =
documentContent.fields["LineItems"];
if (
lineItemsField
&& lineItemsField.type === "array"
) {
const arrField = lineItemsField;
if (
arrField.value
&& arrField.value.length > 0
) {
console.log(
`\nLine Items `
+ `(${arrField.value.length}):`
);
arrField.value.forEach((item, index) => {
if (item.type === "object") {
const itemObj = item;
if (itemObj.value) {
const descField =
itemObj.value[
"Description"
];
const qtyField =
itemObj.value["Quantity"];
const description =
descField?.value ?? "N/A";
const quantity =
qtyField?.value ?? "N/A";
console.log(
` Item ${index + 1}: `
+ `${description}`
);
console.log(
` Quantity: ${quantity}`
);
}
}
});
}
}
}
}
main().catch((err) => {
console.error("The sample encountered an error:", err);
});
При этом будут выведены следующие выходные данные:
Document unit: inch
Pages: 1 to 1
Customer Name: MICROSOFT CORPORATION
Confidence: 0.44
Invoice Date: Thu Nov 14 2019 19:00:00 GMT-0500 (Eastern Standard Time)
Confidence: 0.94
Total: USD110
Line Items (3):
Item 1: Consulting Services
Quantity: 2
Item 2: Document Fee
Quantity: 3
Item 3: Printing Fee
Quantity: 10
Примечание
Этот код основан на примере analyzeInvoice.js в репозитории SDK.
библиотека Client | Samples | SDK source
В этом кратком руководстве показано, как использовать пакет SDK для Распознавания содержимого TypeScript для извлечения структурированных данных с помощью предварительно созданных анализаторов из документов, изображений, аудио и видеофайлов. Дополнительные сведения о предварительно созданных анализаторах и других функциях см. в документации по предварительно созданным анализаторам.
Необходимые условия
- Активная подписка Azure. Если у вас нет учетной записи Azure, создайте её бесплатно.
- Ресурс Microsoft Foundry, созданный в поддерживаемом регионе.
- Конечная точка ресурса и ключ API (найденные в разделе "Ключи" и "Конечная точка" на портале Azure).
- Развертывание модели по умолчанию настроено для вашего ресурса. Инструкции по настройке см. в Модели и развертывания или в этом однократном скрипте настройки.
- Node.js Версия LTS.
- Typescript 5.x или более поздней версии.
Настройка
Создайте проект Node.js:
mkdir content-understanding-quickstart cd content-understanding-quickstart npm init -yУстановите TypeScript и библиотеку клиента для распознавания содержания.
npm install typescript ts-node @azure/ai-content-understanding@nextПри необходимости установите библиотеку удостоверений Azure для проверки подлинности Microsoft Entra:
npm install @azure/identity
Настройка переменных среды
Чтобы выполнить проверку подлинности в службе "Распознавание содержимого", задайте переменные среды собственными значениями перед выполнением примера:
-
CONTENTUNDERSTANDING_ENDPOINT— конечная точка для ресурса Content Understanding. -
CONTENTUNDERSTANDING_KEY— ключ API распознавания содержимого (необязательно, если используется Microsoft Entra ID DefaultAzureCredential).
Windows
setx CONTENTUNDERSTANDING_ENDPOINT "your-endpoint"
setx CONTENTUNDERSTANDING_KEY "your-key"
Linux или macOS
export CONTENTUNDERSTANDING_ENDPOINT="your-endpoint"
export CONTENTUNDERSTANDING_KEY="your-key"
Создание клиента
ContentUnderstandingClient — это основная точка входа для взаимодействия со службой. Создайте экземпляр, указав конечную точку и учетные данные.
import { AzureKeyCredential } from "@azure/core-auth";
import {
ContentUnderstandingClient,
} from "@azure/ai-content-understanding";
const endpoint = process.env["CONTENTUNDERSTANDING_ENDPOINT"];
const key = process.env["CONTENTUNDERSTANDING_KEY"];
const client = new ContentUnderstandingClient(
endpoint,
new AzureKeyCredential(key)
);
Начало работы с предварительно созданным анализатором
Анализаторы определяют, как обрабатывается содержимое и извлекаются аналитические сведения. Мы предлагаем предварительно созданные анализаторы для распространенных вариантов использования. Предварительно созданные анализаторы можно настроить в соответствии с конкретными потребностями и вариантами использования. В этом кратком руководстве используются предварительно созданные анализаторы счетов, изображений, аудио и видео, чтобы помочь вам приступить к работе.
В этом примере анализатор prebuilt-invoice используется для извлечения структурированных данных из документа счета.
import {
type DocumentContent,
type ArrayField,
type ObjectField,
} from "@azure/ai-content-understanding";
async function main(): Promise<void> {
const client = new ContentUnderstandingClient(
endpoint,
new AzureKeyCredential(key)
);
// Sample invoice
const invoiceUrl =
"https://raw.githubusercontent.com/"
+ "Azure-Samples/"
+ "azure-ai-content-understanding-assets/"
+ "main/document/invoice.pdf";
const poller = client.analyze(
"prebuilt-invoice",
[{ url: invoiceUrl }]
);
const result = await poller.pollUntilDone();
if (
!result.contents
|| result.contents.length === 0
) {
console.log(
"No content found in the analysis result."
);
return;
}
const content = result.contents[0];
// Get the document content
if (content.kind === "document") {
const documentContent =
content as DocumentContent;
console.log(
`Document unit: `
+ `${documentContent.unit ?? "unknown"}`
);
console.log(
`Pages: ${documentContent.startPageNumber}`
+ ` to ${documentContent.endPageNumber}`
);
if (!documentContent.fields) {
console.log("No fields found.");
return;
}
// Extract simple string fields
const customerNameField =
documentContent.fields["CustomerName"];
if (customerNameField) {
console.log(
`Customer Name: `
+ `${customerNameField.value ?? "(None)"}`
);
if (
customerNameField.confidence !== undefined
) {
console.log(
` Confidence: `
+ `${customerNameField.confidence
.toFixed(2)}`
);
}
}
// Extract date fields
const invoiceDateField =
documentContent.fields["InvoiceDate"];
if (invoiceDateField) {
console.log(
`Invoice Date: `
+ `${invoiceDateField.value ?? "(None)"}`
);
if (
invoiceDateField.confidence !== undefined
) {
console.log(
` Confidence: `
+ `${invoiceDateField.confidence
.toFixed(2)}`
);
}
}
// Extract object fields (nested structures)
const totalAmountField =
documentContent.fields["TotalAmount"];
if (
totalAmountField
&& totalAmountField.type === "object"
) {
const objField =
totalAmountField as ObjectField;
if (objField.value) {
const amountField =
objField.value["Amount"];
const currencyField =
objField.value["CurrencyCode"];
const amount =
amountField?.value ?? "(None)";
const currency =
currencyField?.value ?? "";
console.log(
`\nTotal: ${currency}${amount}`
);
}
}
// Extract array fields (line items)
const lineItemsField =
documentContent.fields["LineItems"];
if (
lineItemsField
&& lineItemsField.type === "array"
) {
const arrField =
lineItemsField as ArrayField;
if (
arrField.value
&& arrField.value.length > 0
) {
console.log(
`\nLine Items `
+ `(${arrField.value.length}):`
);
arrField.value.forEach(
(item, index) => {
if (item.type === "object") {
const itemObj =
item as ObjectField;
if (itemObj.value) {
const descField =
itemObj.value[
"Description"
];
const qtyField =
itemObj.value[
"Quantity"
];
const description =
descField?.value
?? "N/A";
const quantity =
qtyField?.value
?? "N/A";
console.log(
` Item `
+ `${index + 1}: `
+ `${description}`
);
console.log(
` Quantity: `
+ `${quantity}`
);
}
}
}
);
}
}
}
}
main().catch((err) => {
console.error("The sample encountered an error:", err);
});
При этом будут выведены следующие выходные данные:
Document unit: inch
Pages: 1 to 1
Customer Name: MICROSOFT CORPORATION
Confidence: 0.39
Invoice Date: Thu Nov 14 2019 19:00:00 GMT-0500 (Eastern Standard Time)
Confidence: 0.94
Total: USD110
Line Items (3):
Item 1: Consulting Services
Quantity: 2
Item 2: Document Fee
Quantity: 3
Item 3: Printing Fee
Quantity: 10
Примечание
Этот код основан на примере analyzeInvoice.ts в репозитории SDK.
Дальнейшие действия
- Дополнительные примеры пакета SDK Python
- Исследуйте больше примеров .NET SDK
- Узнать больше примеров Java SDK
- Дополнительные примеры пакета SDK JavaScript
- Дополнительные примеры пакета SDK TypeScript
- Создание пользовательского анализатора
- Предварительно созданные анализаторы
- Поддержка языка и региона