Prérequis
Dans l'architecture de solutions d'IA d'entreprise, le défi le plus courant n'est pas de construire un modèle unique et impressionnant. Il s'agit de relier plusieurs services d'IA en un pipeline de production fiable, observable, qui résout réellement un problème commercial. Les clients disposent souvent de composants puissants fonctionnant en silos – un service de reconnaissance vocale ici, un modèle de langage étendu (LLM) là – mais ils peinent à les orchestrer en un flux de travail cohérent. Imaginez un centre de support mondial qui doit traiter les appels entrants des clients, comprendre le sentiment, identifier les problèmes critiques et traduire les points clés pour les équipes régionales. Ce n'est pas un seul appel d'API ; c'est un pipeline intelligent multi-étapes.
Cet article est un guide pratique pour résoudre ce problème précis. Je vous guiderai à travers la façon dont j'utilise l'AIProjectClient du SDK Azure AI pour construire un pipeline d'IA robuste qui intègre trois outils distincts : la reconnaissance vocale (speech-to-text), l'analyse des sentiments basée sur l'IA générative et la traduction. Nous définirons l'infrastructure avec Terraform, implémenterons la logique en Python et verrons comment tout cela s'intègre dans la structure de gouvernance d'un Azure AI Hub et d'un projet d'IA. Enfin, je vous donnerai mon avis sur la façon dont l'approche basée sur les agents d'Azure se compare à ce que j'ai vu sur des projets utilisant AWS Bedrock et Google Vertex AI.
Pour construire et exécuter ce pipeline, vous aurez besoin d'un environnement avec les composants suivants. Je pars du principe que vous disposez d'une configuration d'entreprise standard avec les autorisations appropriées pour créer et gérer des ressources.
- Abonnement Azure : Un abonnement actif avec les autorisations pour créer des groupes de ressources et des services d'IA.
- Ressources Azure AI :
- Un Azure AI Hub et un projet d'IA. Nous provisionnerons les services ci-dessous et les connecterons à votre projet.
- Un compte multi-services Azure AI Services (pour la parole et le traducteur).
- Une ressource Azure OpenAI Service avec un modèle déployé (j'utilise
gpt-4o).
- Python 3.12+ : Ma norme pour tout nouveau projet Python.
- Azure CLI : La dernière version, authentifiée à votre abonnement (
az login). - Terraform CLI : La dernière version pour le provisionnement de l'infrastructure.
- Bibliothèques Python : Vous aurez besoin des SDK Azure pour Python. Vous pouvez les installer avec
pip:
python3.12 -m pip install azure-ai-projects azure-identity openai azure-cognitiveservices-speech httpx numpy scipy
Architecture : l'agent comme orchestrateur
Une orchestration d'IA efficace commence par une base architecturale solide. Dans Azure, le projet d'IA, hébergé au sein d'un AI Hub, sert de plan de contrôle central. C'est la source de vérité pour gérer l'ensemble du cycle de vie d'une solution d'IA. L'AIProjectClient est votre clé programmatique pour ce plan de contrôle, vous permettant de définir, de versionner et de gérer les composants de votre pipeline, que nous structurerons comme un agent avec un ensemble d'outils.
Dans notre scénario, l'agent est une construction logique, alimentée par un LLM, qui comprend un objectif de haut niveau, invoque des outils spécifiques pour l'atteindre et enchaîne leurs sorties. Voici comment nos composants fonctionneront :
- Outil de reconnaissance vocale (Speech-to-Text) : Prend un chemin de fichier audio, appelle le service Azure Speech et renvoie le texte transcrit.
- Outil d'analyse GenAI : La transcription est transmise à cet outil, qui utilise un modèle Azure OpenAI pour effectuer une analyse nuancée – extrayant le sentiment général, les problèmes spécifiques et un résumé.
- Outil de traduction : L'analyse résultante est ensuite transmise au service Azure Translator pour être localisée dans une langue cible.
L'AIProjectClient nous permet d'enregistrer ces fonctions comme des outils appelables que l'agent peut utiliser. Cette modularité est essentielle pour construire des systèmes d'IA complexes et maintenables.
Le projet d'IA comme plan de contrôle
Lors de l'architecture d'un système sur Azure, nous devrions désormais utiliser le projet d'IA au sein d'un AI Hub comme source de vérité définitive pour les définitions d'agents et d'outils. Il centralise la gestion, permet le versionnement et fournit une surface d'API unifiée pour le CI/CD. C'est bien supérieur à la dispersion de la logique des outils à travers des microservices disparates, un modèle qui peut rapidement dégénérer en un cauchemar de gestion et de sécurité.
Avant de construire les outils, voyons comment nous nous connectons au projet. L'AIProjectClient est initialisé avec le point de terminaison unique du projet et un credential authentifié.
# Conceptual example of client initialization
import os
from azure.ai.projects.aio import AIProjectClient
from azure.identity.aio import DefaultAzureCredential
async def initialize_ai_project_client():
# Your AI Project endpoint is found in the Azure AI Studio.
# It looks like: https://<your-hub-name>.<region>.inference.ai.azure.com/api/projects/<your-project-name>
project_endpoint = os.environ.get("AZURE_AI_PROJECT_ENDPOINT")
if not project_endpoint:
raise ValueError("AZURE_AI_PROJECT_ENDPOINT environment variable not set.")
# DefaultAzureCredential is my standard for authentication.
# It automatically uses environment variables, Managed Identity, or Azure CLI login.
credential = DefaultAzureCredential()
client = AIProjectClient(endpoint=project_endpoint, credential=credential)
print(f"AIProjectClient initialized for project at: {project_endpoint}")
return client, credential
Cet extrait montre l'étape fondamentale. L'utilisation de DefaultAzureCredential offre un modèle d'authentification sécurisé et flexible qui fonctionne de manière transparente entre le développement local et les déploiements cloud sans modification du code.
Guide d'implémentation
Passons maintenant à l'implémentation pratique. Nous commencerons par provisionner nos ressources Azure avec Terraform avant de définir et d'orchestrer les outils d'IA en Python.
1. Provisionner les ressources Azure avec Terraform
L'infrastructure en tant que code (IaC) est le seul moyen de construire des systèmes de production. J'utilise Terraform pour définir et gérer les ressources cloud de manière déclarative. Cela évite la dérive de configuration et rend l'environnement entier reproductible.
Créez un fichier nommé main.tf :
# main.tf - Provisioning AI Services for our pipeline
terraform {
required_providers {
azurerm = {
source = "hashicorp/azurerm"
version = "~> 3.0"
}
}
}
provider "azurerm" {
features {}
}
# Variables for naming and location
variable "resource_group_name" {
description = "Name of the resource group."
type = string
default = "rg-ai-pipeline-dev-euw"
}
variable "location" {
description = "Azure region for deployment."
type = string
default = "westeurope"
}
variable "base_name" {
description = "A unique base name for resources to avoid collisions."
type = string
default = "tcapipelineeuw"
}
# Create a resource group in our target region
resource "azurerm_resource_group" "main" {
name = var.resource_group_name
location = var.location
}
# Create an Azure AI Services account (for Speech and Translator)
resource "azurerm_cognitive_account" "ai_services" {
name = "ais-${var.base_name}"
location = azurerm_resource_group.main.location
resource_group_name = azurerm_resource_group.main.name
kind = "CognitiveServices"
sku_name = "S0" # Standard tier
}
# Create an Azure OpenAI Service account
resource "azurerm_cognitive_account" "openai" {
name = "aoai-${var.base_name}"
location = azurerm_resource_group.main.location
resource_group_name = azurerm_resource_group.main.name
kind = "OpenAI"
sku_name = "S0"
}
# Deploy a GPT-4o model to the Azure OpenAI account
resource "azurerm_cognitive_deployment" "openai_deployment" {
name = "gpt-4o"
cognitive_account_id = azurerm_cognitive_account.openai.id
model {
format = "OpenAI"
name = "gpt-4o"
version = "2024-05-13"
}
scale {
type = "Standard"
capacity = 10 # Throughput units (10 = 10k tokens/min)
}
# Note: Ensure your subscription has quota for this model in the target region.
}
# Outputs for our Python application
output "ai_services_endpoint" {
value = azurerm_cognitive_account.ai_services.endpoint
}
output "ai_services_region" {
value = azurerm_cognitive_account.ai_services.location
}
output "openai_endpoint" {
value = azurerm_cognitive_account.openai.endpoint
}
output "openai_deployment_name" {
value = azurerm_cognitive_deployment.openai_deployment.name
}
Pour provisionner ces ressources, exécutez les commandes Terraform standard :
# Log into Azure first
az login
# Initialize Terraform
terraform init
# Plan and apply the changes
terraform plan
terraform apply --auto-approve
Après application, Terraform affichera les points de terminaison et les noms dont vous aurez besoin pour les variables d'environnement de votre application.
2. Configurer votre environnement Python
Définissez les variables d'environnement suivantes dans votre shell, en utilisant les sorties de Terraform et le point de terminaison de votre projet d'IA dans Azure AI Studio.
# Get this from the 'Develop' section of your AI Project in Azure AI Studio
export AZURE_AI_PROJECT_ENDPOINT="https://<your-hub-name>.<region>.inference.ai.azure.com/api/projects/<your-project-name>"
# Use these if you're authenticating with a Service Principal
export AZURE_CLIENT_ID="<your-service-principal-client-id>"
export AZURE_CLIENT_SECRET="<your-service-principal-client-secret>"
export AZURE_TENANT_ID="<your-tenant-id>"
# From Terraform outputs
export AZURE_AI_SERVICES_ENDPOINT="https://ais-tcapipelineeuw.cognitiveservices.azure.com/"
export AZURE_AI_SERVICES_REGION="westeurope"
export AZURE_OPENAI_ENDPOINT="https://aoai-tcapipelineeuw.openai.azure.com/"
export AZURE_OPENAI_DEPLOYMENT_NAME="gpt-4o"
N'oubliez pas d'accorder à l'identité que vous utilisez (votre compte d'utilisateur ou votre principal de service) le rôle 'Utilisateur des services cognitifs' sur les ressources AI Services et OpenAI, ainsi que les autorisations appropriées (par exemple, 'Contributeur') sur le projet d'IA lui-même.
3. Définir les outils du pipeline
Maintenant, créons les fonctions Python qui serviront d'outils à notre agent. Je les placerai dans un fichier nommé ai_pipeline_tools.py. Toutes les fonctions sont async pour garantir des E/S non bloquantes, ce qui est essentiel pour des services évolutifs.
# ai_pipeline_tools.py
import os
import json
import httpx
from typing import Dict, Any
import azure.cognitiveservices.speech as speechsdk
from openai import AsyncAzureOpenAI
from azure.identity.aio import DefaultAzureCredential
# --- Implémentations des outils ---
async def speech_to_text(audio_file_path: str, credential: DefaultAzureCredential) -> str:
"""Transcrire un fichier audio en texte à l'aide du service Azure Speech."""
speech_region = os.environ["AZURE_AI_SERVICES_REGION"]
# Le SDK Speech a besoin d'un jeton d'authentification. Nous en obtiendrons un en utilisant notre credential asynchrone.
token = await credential.get_token("https://cognitiveservices.azure.com/.default")
speech_config = speechsdk.SpeechConfig(auth_token=token.token, region=speech_region)
audio_config = speechsdk.AudioConfig(filename=audio_file_path)
speech_recognizer = speechsdk.SpeechRecognizer(speech_config=speech_config, audio_config=audio_config)
print(f"Effectuer la reconnaissance vocale sur {audio_file_path}...")
result = await speech_recognizer.recognize_once_async()
if result.reason == speechsdk.ResultReason.RecognizedSpeech:
print(f"Reconnu : {result.text}")
return result.text
elif result.reason == speechsdk.ResultReason.NoMatch:
print("Aucune parole n'a pu être reconnue.")
elif result.reason == speechsdk.ResultReason.Canceled:
cancellation = result.cancellation_details
print(f"Reconnaissance vocale annulée : {cancellation.reason}")
if cancellation.reason == speechsdk.CancellationReason.Error:
print(f"Détails de l'erreur : {cancellation.error_details}")
raise RuntimeError(f"Échec de la reconnaissance vocale : {cancellation.error_details}")
return ""
async def genai_sentiment_analysis(text: str, credential: DefaultAzureCredential) -> Dict[str, Any]:
"""Analyse le texte pour le sentiment et extrait les points clés à l'aide d'Azure OpenAI."""
# Cette fonction d'aide fournit un jeton rafraîchi au client OpenAI.
async def token_provider():
token = await credential.get_token("https://cognitiveservices.azure.com/.default")
return token.token
client = AsyncAzureOpenAI(
azure_endpoint=os.environ["AZURE_OPENAI_ENDPOINT"],
api_version="2024-05-01-preview",
azure_ad_token_provider=token_provider,
)
prompt = f"""Analysez la transcription d'appel client suivante. Identifiez le sentiment général, les problèmes spécifiques soulevés et résumez les points clés. Votre réponse DOIT être un objet JSON valide avec trois clés : 'overall_sentiment' (chaîne : 'positive', 'neutral' ou 'negative'), 'issues' (liste de chaînes) et 'key_takeaways' (liste de chaînes).
Transcript: \"\"\"{text}\"\"\"
JSON Output:"""
print(f"Effectuer une analyse GenAI sur : {text[:60]}...")
response = await client.chat.completions.create(
model=os.environ["AZURE_OPENAI_DEPLOYMENT_NAME"],
response_format={ "type": "json_object" },
messages=[
{"role": "system", "content": "Vous êtes un assistant IA expert pour l'analyse du service client."},
{"role": "user", "content": prompt}
]
)
analysis_result = json.loads(response.choices[0].message.content)
print(f"Analyse GenAI : {analysis_result}")
await client.close()
return analysis_result
async def translate_text(text: str, credential: DefaultAzureCredential, target_language: str = "fr") -> str:
"""Traduit le texte vers une langue cible à l'aide du service Azure Translator."""
translator_endpoint = os.environ["AZURE_AI_SERVICES_ENDPOINT"]
token = await credential.get_token('https://cognitiveservices.azure.com/.default')
headers = {
'Authorization': f'Bearer {token.token}',
'Content-Type': 'application/json',
}
api_endpoint = f"{translator_endpoint.rstrip('/')}/translator/text/v3.0/translate"
params = {'api-version': '3.0', 'to': target_language}
body = [{'text': text}]
print(f"Traduction du texte vers '{target_language}' : {text[:60]}...")
async with httpx.AsyncClient() as client:
response = await client.post(api_endpoint, params=params, headers=headers, json=body)
response.raise_for_status()
translation = response.json()
translated_text = translation[0]['translations'][0]['text']
print(f"Traduit : {translated_text}")
return translated_text
4. Définir et déployer l'agent
Nos outils étant implémentés, nous pouvons maintenant définir un agent qui sait les utiliser. Nous utiliserons l'AIProjectClient pour enregistrer la définition de l'agent, y compris ses instructions et le schéma des outils qu'il peut appeler. Créez un fichier deploy_agent.py :
# deploy_agent.py
import asyncio
import os
from azure.ai.projects.aio import AIProjectClient
from azure.ai.projects.models import PromptAgentDefinition, FunctionTool
from azure.identity.aio import DefaultAzureCredential
async def main():
project_endpoint = os.environ["AZURE_AI_PROJECT_ENDPOINT"]
openai_deployment_name = os.environ["AZURE_OPENAI_DEPLOYMENT_NAME"]
credential = DefaultAzureCredential()
async with AIProjectClient(endpoint=project_endpoint, credential=credential) as client:
agent_name = "call-analysis-pipeline-agent"
# Définir les outils que l'agent peut utiliser en fonction de leurs signatures de fonction
speech_tool = FunctionTool(
name="speech_to_text_transcription",
description="Transcrire un chemin de fichier audio en texte.",
parameters={
"type": "object",
"properties": {"audio_file_path": {"type": "string"}},
"required": ["audio_file_path"]
}
)
sentiment_tool = FunctionTool(
name="genai_sentiment_analysis_tool",
description="Analyse le texte pour le sentiment, les problèmes et les points clés.",
parameters={
"type": "object",
"properties": {"text": {"type": "string"}},
"required": ["text"]
}
)
translation_tool = FunctionTool(
name="translate_text_tool",
description="Traduit le texte vers une langue cible spécifiée.",
parameters={
"type": "object",
"properties": {
"text": {"type": "string"},
"target_language": {"type": "string", "default": "fr"}
},
"required": ["text"]
}
)
# Définir les instructions de l'agent et lier les outils
agent_definition = PromptAgentDefinition(
model=f"azure_openai:/{openai_deployment_name}",
instructions=(
"Vous êtes un assistant d'analyse d'appels. Votre travail consiste à prendre un chemin de fichier audio, "
"à le transcrire, à analyser la transcription pour le sentiment et les problèmes, et enfin "
"à traduire le résumé de l'analyse dans une langue cible (par défaut le français)."
),
tools=[speech_tool, sentiment_tool, translation_tool]
)
print(f"Création ou mise à jour de l'agent '{agent_name}'...")
agent_version = await client.agents.create_version(
agent_name=agent_name,
definition=agent_definition
)
print(f"Déploiement de l'agent terminé. Nom : {agent_version.name}, Version : {agent_version.version}")
await credential.close()
if __name__ == "__main__":
asyncio.run(main())
L'exécution de ce script enregistre notre agent dans le projet d'IA. Le LLM de l'agent sait désormais quels outils il possède et à quoi ils servent, prêt à les orchestrer en fonction d'une invite.
5. Exécuter le pipeline
Enfin, exécutons le pipeline. Le script suivant, run_pipeline.py, simule une requête utilisateur. Pour cette démonstration, nous orchestrerons manuellement les appels aux outils pour montrer la logique étape par étape. Dans une application réelle, vous interagiriez avec le point de terminaison de l'agent déployé, et l'agent lui-même gérerait cette orchestration en interne.
Orchestration par agent vs. Appels directs
Le script ci-dessous appelle manuellement les fonctions des outils pour des raisons de clarté. Dans un scénario de production, vous ne feriez pas cela. Au lieu de cela, vous enverriez une invite de haut niveau (par exemple, « Analysez cet audio d'appel et résumez en français ») au point de terminaison de l'agent déployé. Le LLM de l'agent déciderait alors de manière autonome d'appeler `speech_to_text`, puis `genai_sentiment_analysis`, puis `translate_text` dans la bonne séquence. C'est la puissance du modèle d'agent – il découple la logique d'orchestration de votre code d'application.
# run_pipeline.py
import asyncio
import os
import json
import numpy as np
import scipy.io.wavfile as wavfile
from azure.identity.aio import DefaultAzureCredential
# Import our tool implementations
from ai_pipeline_tools import speech_to_text, genai_sentiment_analysis, translate_text
def create_dummy_audio_file(filename="sample_call.wav"):
"""Crée un fichier WAV factice. Le contenu est juste une onde sinusoïdale."""
samplerate = 16000
duration = 3.0
frequency = 440.0
t = np.linspace(0., duration, int(samplerate * duration))
amplitude = np.iinfo(np.int16).max * 0.3
data = amplitude * np.sin(2. * np.pi * frequency * t)
wavfile.write(filename, samplerate, data.astype(np.int16))
print(f"Fichier audio factice '{filename}' créé pour l'entrée STT.")
return filename
async def main():
credential = DefaultAzureCredential()
# --- Configuration de la simulation ---
# Pour cette démonstration, nous utiliserons un texte clair et connu comme solution de repli,
# car la transcription d'une onde sinusoïdale factice ne produira pas de résultats significatifs.
audio_file = create_dummy_audio_file()
mock_transcript = "Le client a signalé un problème critique avec la stabilité du service. Les performances se sont dégradées de manière significative au cours de la dernière heure."
print("\n--- Simulation de l'exécution du pipeline de l'agent ---")
# Étape 1 : Reconnaissance vocale (Speech-to-Text)
print("\n[AGENT] Appel de l'outil de reconnaissance vocale...")
transcribed_text = await speech_to_text(audio_file, credential)
if not transcribed_text:
print("Le STT n'a renvoyé aucun résultat sur l'audio factice, utilisation de la transcription simulée.")
transcribed_text = mock_transcript
# Étape 2 : Analyse des sentiments GenAI
print("\n[AGENT] Appel de l'outil d'analyse GenAI...")
analysis = await genai_sentiment_analysis(transcribed_text, credential)
summary_for_translation = f"Sentiment: {analysis.get('overall_sentiment')}. Problèmes: {analysis.get('issues')}. Points clés: {analysis.get('key_takeaways')}."
# Étape 3 : Traduction
print("\n[AGENT] Appel de l'outil de traduction...")
translated_summary = await translate_text(summary_for_translation, credential, target_language="fr")
print("\n--- Sortie finale du pipeline ---")
print(f"Transcription originale : {transcribed_text}")
print(f"Analyse (JSON) : {json.dumps(analysis, indent=2)}")
print(f"Résumé traduit (fr) : {translated_summary}")
await credential.close()
if __name__ == "__main__":
asyncio.run(main())
Lorsque vous l'exécutez, vous verrez le pipeline complet en action : l'audio factice est créé, le service vocal est appelé (et échoue probablement, déclenchant le repli), le texte simulé est analysé par le LLM, et le résumé résultant est traduit en français.
Comparaison avec AWS et GCP
Comment l'approche d'Azure se compare-t-elle aux autres grands fournisseurs de cloud ?
-
Projets Azure AI (Hub/Foundry) : La force d'Azure réside dans son intégration étroite avec la gouvernance d'entreprise et le service Azure OpenAI. L'
AIProjectClientet le framework d'agents offrent un modèle axé sur l'orchestrateur. Vous définissez des outils et donnez des instructions à un LLM. L'agent raisonne ensuite sur la manière de séquencer ces outils. C'est extrêmement puissant pour les flux de travail dynamiques, conversationnels et complexes. La structure Hub/Projet est conçue pour le développement en équipe avec des limites claires. -
Agents AWS Bedrock : Ceci est philosophiquement très similaire à l'approche d'Azure. Vous créez un agent, lui donnez accès à des modèles de fondation (comme Claude d'Anthropic ou Titan d'Amazon) et définissez les actions qu'il peut effectuer, généralement en invoquant des fonctions AWS Lambda. La principale proposition de valeur de Bedrock est le choix des modèles sous-jacents et son intégration transparente avec l'écosystème sans serveur d'AWS. Comme Azure, l'agent abstrait la logique d'orchestration.
-
GCP Vertex AI : Pour les flux de travail ML structurés et répétables, les Pipelines Vertex AI (basés sur Kubeflow) sont la référence. Ils sont excellents pour le MLOps traditionnel. Pour l'utilisation d'outils pilotée par LLM, vous disposez des Extensions Vertex AI, qui permettent à un LLM d'appeler des outils externes (comme les fonctions Cloud ou les API tierces). Vous pouvez les combiner, mais l'orchestration agentive et basée sur le raisonnement est moins un produit unique et unifié qu'une capacité que vous construisez en combinant les puissants composants de Vertex AI. Elle offre une grande flexibilité mais peut nécessiter plus d'intégration manuelle que les frameworks d'agents d'Azure et d'AWS.
En bref, les trois vous permettent d'atteindre votre objectif. Azure et AWS offrent un framework d'agents plus complet, tandis que GCP fournit des blocs de construction puissants et composables.
Points clés à retenir
La construction d'un pipeline intelligent est davantage une question d'orchestration que de modèle d'IA unique. L'AIProjectClient d'Azure fournit l'interface programmatique à un framework puissant basé sur des agents qui simplifie la création et la gestion de ces systèmes complexes.
Voici mes recommandations finales :
- Centralisez avec les projets d'IA : Utilisez les projets Azure AI comme plan de contrôle. Il est conçu pour la gouvernance d'entreprise, la sécurité et le MLOps.
- Adoptez les agents et les outils : Définissez les capacités de votre pipeline comme des
FunctionTools discrets et réutilisables et laissez un agent les orchestrer. C'est plus flexible qu'un processus séquentiel codé en dur. - Infrastructure as Code : Provisionnez toujours vos ressources cloud sous-jacentes à l'aide de Terraform. C'est le seul moyen de conserver une cohérence entre les environnements.
- Authentifiez-vous en toute sécurité : Utilisez
DefaultAzureCredentialpartout. Cela supprime les informations d'identification de votre code et s'adapte automatiquement aux différents environnements.
Ensuite, je recommande d'explorer comment ajouter de la mémoire à votre agent à l'aide des MemoryStoresOperations du SDK pour créer des expériences conversationnelles plus contextuelles. L'espace de l'IA évolue incroyablement vite, alors consultez toujours la documentation officielle de Microsoft Learn pour les dernières fonctionnalités du SDK et les meilleures pratiques pour Azure AI Studio !