Compréhension du contenu Azure

ContentUnderstandingContextProvideranalyse les pièces jointes de fichiers avec Azure Content Understanding et injecte des résultats structurés dans le contexte de l’agent. Il prend en charge les documents, les images, l’audio et la vidéo, notamment l’OCR, les tables, les champs structurés, la transcription, la diarisation et les résumés de segments.

Cette intégration utilise le modèle de prétraitement : il transforme le contenu entrant avant l’appel de modèle et peut conserver l’état traité pour les tours ultérieurs.

Pour les documents volumineux, le fournisseur peut téléverser du markdown extrait dans une base vectorielle de recherche de fichiers au lieu de placer l’intégralité du résultat dans le contexte du modèle.

Prerequisites

  • Un abonnement Azure.
  • Azure Content Understanding dans une région prise en charge.
  • Déploiements de modèles requis par le service.
  • Accès à la ressource via l’identité Azure.

Installer le package

pip install agent-framework-azure-contentunderstanding --pre

Analyser un document

Joignez ContentUnderstandingContextProvider à l’agent et envoyez une pièce jointe binaire prise en charge. Le fournisseur supprime l’entrée binaire après analyse et fournit le contenu extrait au modèle.

async def main() -> None:
    credential = AzureCliCredential()

    # Set up Azure Content Understanding context provider
    cu = ContentUnderstandingContextProvider(
        endpoint=os.environ["AZURE_CONTENTUNDERSTANDING_ENDPOINT"],
        credential=credential,
        analyzer_id="prebuilt-documentSearch",  # RAG-optimized document analyzer
        max_wait=None,  # wait until CU analysis finishes (no background deferral)
    )

    # Set up the LLM client
    client = FoundryChatClient(
        project_endpoint=os.environ["FOUNDRY_PROJECT_ENDPOINT"],
        model=os.environ["FOUNDRY_MODEL"],
        credential=credential,
    )

    # Create agent with CU context provider.
    # The provider extracts document content via CU and injects it into the
    # LLM context so the agent can answer questions about the document.
    async with credential, cu:
        agent = Agent(
            client=client,
            name="DocumentQA",
            instructions=(
                "You are a helpful document analyst. Use the analyzed document "
                "content and extracted fields to answer questions precisely."
            ),
            context_providers=[cu],
        )

        # --- Turn 1: Upload PDF and ask a question ---
        # 4. Upload PDF and ask questions
        # The CU provider extracts markdown + fields from the PDF and injects
        # the full content into context so the agent can answer precisely.
        print("--- Upload PDF and ask questions ---")

        pdf_bytes = SAMPLE_PDF_PATH.read_bytes()

        response = await agent.run(
            Message(
                role="user",
                contents=[
                    Content.from_text(
                        "What is this document about? Who is the vendor, and what is the total amount due?"
                    ),
                    Content.from_data(
                        pdf_bytes,
                        "application/pdf",
                        # Always provide filename — used as the document key
                        additional_properties={"filename": SAMPLE_PDF_PATH.name},
                    ),
                ],
            )
        )
        usage = response.usage_details or {}
        print(f"Agent: {response}")
        print(f"  [Input tokens: {usage.get('input_token_count', 'N/A')}]\n")

Options de traitement

  • Laissez analyzer_id non défini pour sélectionner un analyseur de recherche de document, audio ou vidéo en fonction du type de média.
  • Définissez max_wait=None le moment où l’exécution doit attendre la fin de l’analyse.
  • Utilisez FileSearchConfig pour une récupération économe en jetons dans de grands documents extraits.
  • Réutilisez AgentSession pour préserver l’état du document analysé d’un tour à l’autre.

Étapes suivantes

Aller plus loin :