<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Nabil</title>
    <description>The latest articles on Forem by Nabil (@galaxy_ai).</description>
    <link>https://forem.com/galaxy_ai</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3729737%2F00a15567-d090-4dff-9a30-09006aa7e52d.png</url>
      <title>Forem: Nabil</title>
      <link>https://forem.com/galaxy_ai</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/galaxy_ai"/>
    <language>en</language>
    <item>
      <title>RAG : Comment créer un chatbot IA qui ne ment jamais avec Azure AI</title>
      <dc:creator>Nabil</dc:creator>
      <pubDate>Sat, 24 Jan 2026 08:42:49 +0000</pubDate>
      <link>https://forem.com/galaxy_ai/rag-comment-creer-un-chatbot-ia-qui-ne-ment-jamais-avec-azure-ai-57ng</link>
      <guid>https://forem.com/galaxy_ai/rag-comment-creer-un-chatbot-ia-qui-ne-ment-jamais-avec-azure-ai-57ng</guid>
      <description>&lt;h1&gt;
  
  
  RAG : Comment créer un chatbot IA qui ne ment jamais avec Azure AI
&lt;/h1&gt;

&lt;p&gt;&lt;em&gt;Par Nabil Ghanem, fondateur de &lt;a href="https://galaxyai.life" rel="noopener noreferrer"&gt;Galaxy AI&lt;/a&gt; — Expert Azure AI &amp;amp; Microsoft Partner&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;Les chatbots IA classiques ont un problème majeur : &lt;strong&gt;ils inventent des réponses&lt;/strong&gt;. C'est ce qu'on appelle les "hallucinations". Pour les entreprises, c'est inacceptable. Un chatbot RH qui invente des règles de congés ou un assistant juridique qui cite de fausses lois peut avoir des conséquences désastreuses.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;La solution ? Le RAG (Retrieval Augmented Generation).&lt;/strong&gt; Cette architecture force l'IA à répondre uniquement à partir de vos documents validés.&lt;/p&gt;




&lt;h2&gt;
  
  
  TL;DR — Résumé rapide
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Aspect&lt;/th&gt;
&lt;th&gt;Chatbot classique&lt;/th&gt;
&lt;th&gt;Chatbot RAG&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Source des réponses&lt;/td&gt;
&lt;td&gt;Connaissance générale du modèle&lt;/td&gt;
&lt;td&gt;Vos documents uniquement&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Hallucinations&lt;/td&gt;
&lt;td&gt;Fréquentes&lt;/td&gt;
&lt;td&gt;Quasi-inexistantes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Mise à jour&lt;/td&gt;
&lt;td&gt;Nécessite ré-entraînement&lt;/td&gt;
&lt;td&gt;Immédiate (ajout de documents)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Coût&lt;/td&gt;
&lt;td&gt;Élevé (fine-tuning)&lt;/td&gt;
&lt;td&gt;Modéré (indexation)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Traçabilité&lt;/td&gt;
&lt;td&gt;Aucune&lt;/td&gt;
&lt;td&gt;Citations avec sources&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Qu'est-ce que le RAG ?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;RAG&lt;/strong&gt; signifie &lt;strong&gt;Retrieval Augmented Generation&lt;/strong&gt;. Le principe est simple :&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;L'utilisateur pose une question&lt;/li&gt;
&lt;li&gt;Le système recherche les documents pertinents dans votre base&lt;/li&gt;
&lt;li&gt;L'IA génère une réponse basée &lt;strong&gt;uniquement&lt;/strong&gt; sur ces documents&lt;/li&gt;
&lt;li&gt;La réponse inclut les sources citées&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Architecture RAG sur Azure
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Question utilisateur
       │
       ▼
Azure AI Search (recherche sémantique)
       │
       ├──► Documents pertinents trouvés
       │
       ▼
Azure OpenAI (GPT-4o)
       │
       ├──► Prompt : "Réponds uniquement avec ces documents"
       │
       ▼
Réponse + Citations
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Pourquoi le RAG élimine les hallucinations
&lt;/h2&gt;

&lt;p&gt;Un LLM comme GPT-4 possède une connaissance générale massive, mais cette connaissance :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Date de son entraînement&lt;/strong&gt; (pas les infos récentes)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Ne contient pas vos données internes&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Peut mélanger des informations incorrectes&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Avec le RAG, on "injecte" vos documents dans le contexte de la requête. Le modèle n'a plus le choix : il doit se baser sur ce qu'on lui fournit.&lt;/p&gt;

&lt;h3&gt;
  
  
  Exemple de prompt système RAG
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Tu es un assistant RH pour l'entreprise XYZ.
Réponds UNIQUEMENT en utilisant les documents fournis ci-dessous.
Si l'information n'est pas dans les documents, dis
"Je n'ai pas cette information dans la documentation disponible."
Ne jamais inventer de réponse.

Documents :
{documents_retrouvés}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;💡 &lt;strong&gt;Astuce&lt;/strong&gt; : Une température basse (0.1–0.3) réduit encore plus les hallucinations car le modèle devient moins "créatif".&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Les composants Azure pour un RAG performant
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Azure AI Search
&lt;/h3&gt;

&lt;p&gt;C'est le &lt;strong&gt;moteur de recherche&lt;/strong&gt; qui retrouve les documents pertinents :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;✅ &lt;strong&gt;Recherche sémantique&lt;/strong&gt; — Comprend le sens, pas juste les mots-clés&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;Recherche vectorielle&lt;/strong&gt; — Compare les embeddings pour trouver des similarités&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;Recherche hybride&lt;/strong&gt; — Combine les deux pour de meilleurs résultats&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;Filtrage&lt;/strong&gt; — Par date, catégorie, département, etc.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2. Azure OpenAI
&lt;/h3&gt;

&lt;p&gt;Le &lt;strong&gt;cerveau&lt;/strong&gt; qui génère les réponses :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;GPT-4o&lt;/strong&gt; pour les réponses complexes&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GPT-4o-mini&lt;/strong&gt; pour les cas simples (moins cher)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Embeddings text-embedding-3-large&lt;/strong&gt; pour la vectorisation&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  3. Azure Blob Storage
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Stockage&lt;/strong&gt; des documents sources :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;PDF, Word, Excel, PowerPoint&lt;/li&gt;
&lt;li&gt;Pages web crawlées&lt;/li&gt;
&lt;li&gt;Bases de données exportées&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Implémentation pas à pas
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Étape 1 : Indexation des documents
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;azure.search.documents.indexes&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;SearchIndexClient&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;azure.search.documents.indexes.models&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;SearchIndex&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;SearchField&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;SearchFieldDataType&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;VectorSearch&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;HnswAlgorithmConfiguration&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;VectorSearchProfile&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;SemanticConfiguration&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;SemanticField&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;SemanticPrioritizedFields&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;SemanticSearch&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;index&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;SearchIndex&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;documents-rh&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;fields&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="nc"&gt;SearchField&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;SearchFieldDataType&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;String&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="nc"&gt;SearchField&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;SearchFieldDataType&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;String&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;searchable&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="nc"&gt;SearchField&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;title&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;SearchFieldDataType&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;String&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;searchable&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="nc"&gt;SearchField&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;category&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;SearchFieldDataType&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;String&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;filterable&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="nc"&gt;SearchField&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content_vector&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="nb"&gt;type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;SearchFieldDataType&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Collection&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;SearchFieldDataType&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Single&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
            &lt;span class="n"&gt;searchable&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;vector_search_dimensions&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;3072&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;vector_search_profile_name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;vector-profile&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
        &lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="n"&gt;vector_search&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nc"&gt;VectorSearch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;algorithms&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nc"&gt;HnswAlgorithmConfiguration&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;hnsw-config&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)],&lt;/span&gt;
        &lt;span class="n"&gt;profiles&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nc"&gt;VectorSearchProfile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;vector-profile&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;algorithm_configuration_name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;hnsw-config&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
        &lt;span class="p"&gt;)]&lt;/span&gt;
    &lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="n"&gt;semantic_search&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nc"&gt;SemanticSearch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;configurations&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nc"&gt;SemanticConfiguration&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;semantic-config&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;prioritized_fields&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nc"&gt;SemanticPrioritizedFields&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
                &lt;span class="n"&gt;content_fields&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nc"&gt;SemanticField&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;field_name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)],&lt;/span&gt;
                &lt;span class="n"&gt;title_field&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nc"&gt;SemanticField&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;field_name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;title&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;)]&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;index_client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create_or_update_index&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Étape 2 : Vectorisation des documents
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;azure.openai&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;AzureOpenAI&lt;/span&gt;

&lt;span class="n"&gt;openai_client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;AzureOpenAI&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;azure_endpoint&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://votre-instance.openai.azure.com&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;api_key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;votre-api-key&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;api_version&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;2024-02-01&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;get_embedding&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;openai_client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;embeddings&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="nb"&gt;input&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;text-embedding-3-large&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="n"&gt;embedding&lt;/span&gt;

&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;doc&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;documents&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;doc&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content_vector&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;get_embedding&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;doc&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
    &lt;span class="n"&gt;search_client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;upload_documents&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="n"&gt;doc&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Étape 3 : Recherche et génération
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;azure.search.documents&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;SearchClient&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;azure.search.documents.models&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;VectorizedQuery&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;ask_rag&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;question&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;question_vector&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;get_embedding&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;question&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="n"&gt;results&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;search_client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;search&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;search_text&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;question&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;vector_queries&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nc"&gt;VectorizedQuery&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="n"&gt;vector&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;question_vector&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;k_nearest_neighbors&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;fields&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content_vector&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
        &lt;span class="p"&gt;)],&lt;/span&gt;
        &lt;span class="n"&gt;query_type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;semantic&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;semantic_configuration_name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;semantic-config&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;top&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="n"&gt;context&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;""&lt;/span&gt;
    &lt;span class="n"&gt;sources&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;results&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;context&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\n\n&lt;/span&gt;&lt;span class="s"&gt;---&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;Document: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;title&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
        &lt;span class="n"&gt;sources&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;title&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;

    &lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;openai_client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;completions&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;gpt-4o&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;
            &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;role&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;system&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Tu es un assistant RH.
Réponds UNIQUEMENT en utilisant les documents ci-dessous.
Si l&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;information n&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;est pas disponible, dis-le clairement.
Cite toujours la source de ta réponse.

Documents disponibles:
&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
            &lt;span class="p"&gt;},&lt;/span&gt;
            &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;role&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;user&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;question&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="p"&gt;],&lt;/span&gt;
        &lt;span class="n"&gt;temperature&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;0.1&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="n"&gt;answer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;choices&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;content&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;answer&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="se"&gt;\n\n&lt;/span&gt;&lt;span class="s"&gt;Sources: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;, &lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sources&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Optimisations avancées
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Chunking intelligent
&lt;/h3&gt;

&lt;p&gt;Ne pas indexer des documents entiers, mais des &lt;strong&gt;morceaux (chunks)&lt;/strong&gt; :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;chunk_document&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;chunk_size&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;500&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;overlap&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;chunks&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
    &lt;span class="n"&gt;start&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
    &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="n"&gt;start&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;end&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;start&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;chunk_size&lt;/span&gt;
        &lt;span class="n"&gt;chunk&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;start&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;end&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
        &lt;span class="n"&gt;chunks&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;chunk&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;start&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;end&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;overlap&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;chunks&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;📏 &lt;strong&gt;Taille optimale&lt;/strong&gt; : 300–800 tokens selon le type de document&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  2. Reranking
&lt;/h3&gt;

&lt;p&gt;Après la recherche, &lt;strong&gt;re-classer&lt;/strong&gt; les résultats :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;results&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;search_client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;search&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;search_text&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;question&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;query_type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;semantic&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;semantic_configuration_name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;semantic-config&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;query_caption&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;extractive&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;query_answer&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;extractive&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  3. Filtrage contextuel
&lt;/h3&gt;

&lt;p&gt;Limiter la recherche selon le &lt;strong&gt;profil utilisateur&lt;/strong&gt; :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;results&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;search_client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;search&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;search_text&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;question&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nb"&gt;filter&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;category eq &lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Finance&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt; or category eq &lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;General&lt;/span&gt;&lt;span class="sh"&gt;'"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="bp"&gt;...&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Cas d'usage entreprise
&lt;/h2&gt;

&lt;h3&gt;
  
  
  🏢 Assistant RH interne
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Questions sur les congés, mutuelle, avantages&lt;/li&gt;
&lt;li&gt;Procédures internes&lt;/li&gt;
&lt;li&gt;Onboarding nouveaux employés&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  📞 Support client niveau 1
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;FAQ produits&lt;/li&gt;
&lt;li&gt;Procédures de dépannage&lt;/li&gt;
&lt;li&gt;Politique de retour/remboursement&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  💻 Base de connaissances technique
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Documentation produit&lt;/li&gt;
&lt;li&gt;Guides d'intégration API&lt;/li&gt;
&lt;li&gt;Troubleshooting&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  ⚖️ Juridique et conformité
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Contrats types&lt;/li&gt;
&lt;li&gt;Réglementations applicables&lt;/li&gt;
&lt;li&gt;Procédures de conformité&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Coûts estimatifs (Azure, janvier 2025)
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Composant&lt;/th&gt;
&lt;th&gt;Tarif&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Azure AI Search (Basic)&lt;/td&gt;
&lt;td&gt;~70 €/mois&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Azure OpenAI GPT-4o&lt;/td&gt;
&lt;td&gt;2.50 €/1M tokens input&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Azure OpenAI Embeddings&lt;/td&gt;
&lt;td&gt;0.13 €/1M tokens&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Azure Blob Storage&lt;/td&gt;
&lt;td&gt;~2 €/100 Go/mois&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Pour une PME avec 1000 documents et 500 requêtes/jour :&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;💰 Coût mensuel estimé : &lt;strong&gt;100–150 €&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Erreurs à éviter
&lt;/h2&gt;

&lt;h3&gt;
  
  
  ❌ Chunks trop grands ou trop petits
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Trop grands&lt;/strong&gt; : Perte de précision, contexte dilué&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Trop petits&lt;/strong&gt; : Perte de sens, réponses incomplètes&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;Optimal&lt;/strong&gt; : 300–800 tokens&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  ❌ Ignorer les métadonnées
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Date du document (éviter les infos obsolètes)&lt;/li&gt;
&lt;li&gt;Source (crédibilité)&lt;/li&gt;
&lt;li&gt;Catégorie (filtrage)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  ❌ Température trop élevée
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Utilisez &lt;code&gt;temperature=0.1&lt;/code&gt; à &lt;code&gt;0.3&lt;/code&gt; pour le RAG&lt;/li&gt;
&lt;li&gt;Plus la température est basse, moins l'IA "improvise"&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  ❌ Pas de fallback
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Toujours prévoir : &lt;em&gt;"Je n'ai pas trouvé cette information"&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;Éviter les réponses inventées&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Le RAG est aujourd'hui &lt;strong&gt;la meilleure architecture&lt;/strong&gt; pour déployer des chatbots IA en entreprise. En combinant Azure AI Search et Azure OpenAI, vous obtenez :&lt;/p&gt;

&lt;p&gt;✅ Des réponses &lt;strong&gt;fiables&lt;/strong&gt; basées sur vos documents&lt;/p&gt;

&lt;p&gt;✅ Une &lt;strong&gt;traçabilité complète&lt;/strong&gt; avec citations&lt;/p&gt;

&lt;p&gt;✅ Une &lt;strong&gt;mise à jour instantanée&lt;/strong&gt; (ajout de documents = nouvelles connaissances)&lt;/p&gt;

&lt;p&gt;✅ Un &lt;strong&gt;coût maîtrisé&lt;/strong&gt; sans fine-tuning&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Pour les entreprises qui ne peuvent pas se permettre d'hallucinations, le RAG n'est plus une option, c'est une nécessité.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  À propos de l'auteur
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Nabil Ghanem&lt;/strong&gt; est le fondateur de &lt;a href="https://galaxyai.life" rel="noopener noreferrer"&gt;Galaxy AI&lt;/a&gt;, une entreprise spécialisée dans les solutions Azure AI pour entreprises. Microsoft Partner certifié, Galaxy AI accompagne les entreprises dans le déploiement de chatbots RAG et d'agents vocaux IA.&lt;/p&gt;

&lt;p&gt;🌐 &lt;a href="https://galaxyai.life" rel="noopener noreferrer"&gt;galaxyai.life&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;💼 &lt;a href="https://www.linkedin.com/company/galaxy-ai" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;📅 &lt;a href="https://galaxyai.life/appointments" rel="noopener noreferrer"&gt;Prendre rendez-vous&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Cet article a été rédigé en janvier 2025. Les tarifs et fonctionnalités peuvent évoluer.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tags&lt;/strong&gt; : #Azure #ArtificialIntelligence #RAG #Chatbot #AzureOpenAI #MachineLearning #EnterpriseAI #LLM&lt;/p&gt;

</description>
      <category>ai</category>
      <category>azure</category>
      <category>rag</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Voice Live vs Real-Time API : Quelle solution choisir sur Azure AI Foundry ?</title>
      <dc:creator>Nabil</dc:creator>
      <pubDate>Sat, 24 Jan 2026 08:06:20 +0000</pubDate>
      <link>https://forem.com/galaxy_ai/-voice-live-vs-real-time-api-quelle-solution-choisir-sur-azure-ai-foundry--54m0</link>
      <guid>https://forem.com/galaxy_ai/-voice-live-vs-real-time-api-quelle-solution-choisir-sur-azure-ai-foundry--54m0</guid>
      <description>&lt;h1&gt;
  
  
  Voice Live vs Real-Time API : Quelle solution choisir sur Azure AI Foundry ?
&lt;/h1&gt;

&lt;p&gt;&lt;em&gt;Par Nabil Ghanem, fondateur de &lt;a href="https://galaxyai.life" rel="noopener noreferrer"&gt;Galaxy AI&lt;/a&gt; - Expert Azure AI &amp;amp; Microsoft Partner&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;Avec l'essor des agents vocaux IA, Azure AI Foundry propose deux approches distinctes pour le traitement vocal en temps réel : &lt;strong&gt;Voice Live&lt;/strong&gt; (via Azure Communication Services) et &lt;strong&gt;Real-Time API&lt;/strong&gt; (via Azure OpenAI). Ces deux technologies répondent à des besoins différents. Voici un guide complet pour choisir la bonne solution.&lt;/p&gt;

&lt;h2&gt;
  
  
  TL;DR - Résumé rapide
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Critère&lt;/th&gt;
&lt;th&gt;Voice Live (ACS)&lt;/th&gt;
&lt;th&gt;Real-Time API (OpenAI)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Cas d'usage principal&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Téléphonie d'entreprise&lt;/td&gt;
&lt;td&gt;Applications conversationnelles&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Latence&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;300-500ms&lt;/td&gt;
&lt;td&gt;200-400ms&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Intégration téléphonique&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Native (PSTN, SIP)&lt;/td&gt;
&lt;td&gt;Nécessite passerelle&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Coût&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Par minute d'appel&lt;/td&gt;
&lt;td&gt;Par token + audio&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Complexité&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Moyenne&lt;/td&gt;
&lt;td&gt;Élevée&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Qu'est-ce que Voice Live (Azure Communication Services) ?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Voice Live&lt;/strong&gt; est la solution de téléphonie IA intégrée à Azure Communication Services (ACS). Elle permet de créer des agents vocaux capables de :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Répondre aux appels téléphoniques entrants&lt;/li&gt;
&lt;li&gt;Passer des appels sortants automatisés&lt;/li&gt;
&lt;li&gt;S'intégrer nativement aux réseaux PSTN et SIP&lt;/li&gt;
&lt;li&gt;Gérer le transfert vers des agents humains&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Architecture Voice Live
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Appelant (PSTN/SIP)
       │
       ▼
Azure Communication Services
       │
       ├──► Speech-to-Text (Azure AI Speech)
       │
       ├──► Azure OpenAI (GPT-4o)
       │
       └──► Text-to-Speech (Azure AI Speech)
       │
       ▼
Réponse vocale à l'appelant
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Avantages de Voice Live
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Intégration téléphonique native&lt;/strong&gt; : Achetez un numéro de téléphone directement dans Azure et recevez des appels sans infrastructure supplémentaire.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Gestion des appels complète&lt;/strong&gt; : Transfert, mise en attente, conférence, enregistrement - tout est géré nativement.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Facturation simple&lt;/strong&gt; : Tarification à la minute, prévisible pour les centres d'appels.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Conformité entreprise&lt;/strong&gt; : Certifications SOC 2, HIPAA, GDPR incluses.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Exemple de code Voice Live
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;azure.communication.callautomation&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;CallAutomationClient&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;azure.communication.callautomation&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;PhoneNumberIdentifier&lt;/span&gt;

&lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;CallAutomationClient&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;from_connection_string&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;connection_string&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Répondre à un appel entrant
&lt;/span&gt;&lt;span class="n"&gt;call_connection&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;answer_call&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;incoming_call_context&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;incoming_call_context&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;callback_url&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://votre-webhook.com/events&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Lancer la reconnaissance vocale avec Azure OpenAI
&lt;/span&gt;&lt;span class="n"&gt;call_connection&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;start_recognizing_media&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;input_type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;speech&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;target_participant&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nc"&gt;PhoneNumberIdentifier&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;caller_number&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="n"&gt;speech_recognition_model_endpoint_id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;votre-deployment-openai&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Qu'est-ce que Real-Time API (Azure OpenAI) ?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Real-Time API&lt;/strong&gt; est une fonctionnalité d'Azure OpenAI qui permet des conversations vocales bidirectionnelles en streaming. Contrairement à Voice Live, elle n'est pas liée à la téléphonie mais offre une latence ultra-faible.&lt;/p&gt;

&lt;h3&gt;
  
  
  Architecture Real-Time API
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Application client (Web/Mobile)
       │
       ▼ (WebSocket)
Azure OpenAI Real-Time API
       │
       ├──► Audio Input Stream
       │
       ├──► GPT-4o-realtime
       │
       └──► Audio Output Stream
       │
       ▼
Réponse vocale instantanée
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Avantages de Real-Time API
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Latence minimale&lt;/strong&gt; : Streaming audio bidirectionnel, réponses quasi-instantanées.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Interruptions naturelles&lt;/strong&gt; : L'utilisateur peut interrompre l'IA mid-sentence, comme une vraie conversation.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Multimodalité native&lt;/strong&gt; : Audio + texte dans le même flux, sans étapes intermédiaires.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Contrôle granulaire&lt;/strong&gt; : Gestion fine des tours de parole, détection de silence, etc.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Exemple de code Real-Time API
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;asyncio&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;azure.openai&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;AsyncAzureOpenAI&lt;/span&gt;

&lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;AsyncAzureOpenAI&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;azure_endpoint&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://votre-instance.openai.azure.com&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;api_key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;votre-api-key&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;api_version&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;2024-10-01-preview&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;conversation&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;realtime&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;connect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;deployment&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;gpt-4o-realtime-preview&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;connection&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;

        &lt;span class="c1"&gt;# Configurer la session
&lt;/span&gt;        &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;connection&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;session&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;update&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="n"&gt;modalities&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;text&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;audio&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
            &lt;span class="n"&gt;voice&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;alloy&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;input_audio_format&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;pcm16&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;output_audio_format&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;pcm16&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
        &lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="c1"&gt;# Envoyer l'audio de l'utilisateur
&lt;/span&gt;        &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;connection&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;input_audio_buffer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;audio_data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="c1"&gt;# Recevoir la réponse en streaming
&lt;/span&gt;        &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;event&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;connection&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;event&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nb"&gt;type&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;response.audio.delta&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                &lt;span class="nf"&gt;play_audio&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;event&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;delta&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Comparaison détaillée
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Latence et performance
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Métrique&lt;/th&gt;
&lt;th&gt;Voice Live&lt;/th&gt;
&lt;th&gt;Real-Time API&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Temps de première réponse&lt;/td&gt;
&lt;td&gt;400-600ms&lt;/td&gt;
&lt;td&gt;200-350ms&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Latence bout-en-bout&lt;/td&gt;
&lt;td&gt;500-800ms&lt;/td&gt;
&lt;td&gt;300-500ms&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Gestion des interruptions&lt;/td&gt;
&lt;td&gt;Limitée&lt;/td&gt;
&lt;td&gt;Native&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Verdict&lt;/strong&gt; : Real-Time API gagne sur la latence pure, mais Voice Live reste acceptable pour la téléphonie traditionnelle.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Intégration téléphonique
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Fonctionnalité&lt;/th&gt;
&lt;th&gt;Voice Live&lt;/th&gt;
&lt;th&gt;Real-Time API&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Numéros PSTN&lt;/td&gt;
&lt;td&gt;Natif&lt;/td&gt;
&lt;td&gt;Via passerelle SIP&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Transfert d'appel&lt;/td&gt;
&lt;td&gt;Natif&lt;/td&gt;
&lt;td&gt;Manuel&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Enregistrement&lt;/td&gt;
&lt;td&gt;Natif&lt;/td&gt;
&lt;td&gt;À implémenter&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;IVR/Menu vocal&lt;/td&gt;
&lt;td&gt;Natif&lt;/td&gt;
&lt;td&gt;À implémenter&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Verdict&lt;/strong&gt; : Voice Live est clairement supérieur pour les cas d'usage téléphoniques.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Coûts (estimations janvier 2025)
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Composant&lt;/th&gt;
&lt;th&gt;Voice Live&lt;/th&gt;
&lt;th&gt;Real-Time API&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Audio entrant&lt;/td&gt;
&lt;td&gt;$0.004/min&lt;/td&gt;
&lt;td&gt;$0.06/min (100 tokens/sec)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Audio sortant&lt;/td&gt;
&lt;td&gt;$0.004/min&lt;/td&gt;
&lt;td&gt;$0.24/min (400 tokens/sec)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;LLM (GPT-4o)&lt;/td&gt;
&lt;td&gt;$0.005/1K tokens&lt;/td&gt;
&lt;td&gt;Inclus dans audio&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Numéro téléphone&lt;/td&gt;
&lt;td&gt;$2/mois&lt;/td&gt;
&lt;td&gt;N/A&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Exemple pour 1000 minutes d'appels/mois&lt;/strong&gt; :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Voice Live : ~$50-80&lt;/li&gt;
&lt;li&gt;Real-Time API : ~$300-400&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Verdict&lt;/strong&gt; : Voice Live est significativement moins cher pour les gros volumes téléphoniques.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Qualité conversationnelle
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Aspect&lt;/th&gt;
&lt;th&gt;Voice Live&lt;/th&gt;
&lt;th&gt;Real-Time API&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Naturalité&lt;/td&gt;
&lt;td&gt;Bonne&lt;/td&gt;
&lt;td&gt;Excellente&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Gestion du contexte&lt;/td&gt;
&lt;td&gt;Via prompt&lt;/td&gt;
&lt;td&gt;Native&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Émotions/Ton&lt;/td&gt;
&lt;td&gt;Limité&lt;/td&gt;
&lt;td&gt;Avancé&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Multilingue&lt;/td&gt;
&lt;td&gt;Oui&lt;/td&gt;
&lt;td&gt;Oui&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Verdict&lt;/strong&gt; : Real-Time API offre une expérience plus naturelle et fluide.&lt;/p&gt;




&lt;h2&gt;
  
  
  Cas d'usage recommandés
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Utilisez Voice Live si :
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Vous créez un &lt;strong&gt;centre d'appels automatisé&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Vous avez besoin d'&lt;strong&gt;intégration PSTN/SIP&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Le &lt;strong&gt;volume d'appels est élevé&lt;/strong&gt; (&amp;gt;1000 min/mois)&lt;/li&gt;
&lt;li&gt;Vous voulez une &lt;strong&gt;facturation prévisible&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Vous avez besoin de &lt;strong&gt;transfert vers agents humains&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Exemples&lt;/strong&gt; :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Standard téléphonique IA 24/7&lt;/li&gt;
&lt;li&gt;Qualification de leads par téléphone&lt;/li&gt;
&lt;li&gt;Support client niveau 1&lt;/li&gt;
&lt;li&gt;Prise de rendez-vous automatisée&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Utilisez Real-Time API si :
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Vous créez une &lt;strong&gt;application web/mobile&lt;/strong&gt; avec voix&lt;/li&gt;
&lt;li&gt;La &lt;strong&gt;latence ultra-faible&lt;/strong&gt; est critique&lt;/li&gt;
&lt;li&gt;Vous voulez des &lt;strong&gt;conversations très naturelles&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;L'utilisateur doit pouvoir &lt;strong&gt;interrompre&lt;/strong&gt; l'IA&lt;/li&gt;
&lt;li&gt;Vous intégrez dans une &lt;strong&gt;expérience immersive&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Exemples&lt;/strong&gt; :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Assistant vocal dans une app mobile&lt;/li&gt;
&lt;li&gt;Tuteur IA conversationnel&lt;/li&gt;
&lt;li&gt;Jeu vidéo avec PNJ vocaux&lt;/li&gt;
&lt;li&gt;Interface vocale pour IoT&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Architecture hybride : Le meilleur des deux mondes
&lt;/h2&gt;

&lt;p&gt;Pour certains projets, combiner les deux approches peut être optimal :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;                    Appel téléphonique
                           │
                           ▼
                Azure Communication Services
                           │
           ┌───────────────┴───────────────┐
           │                               │
           ▼                               ▼
    Requêtes simples              Conversations complexes
    (IVR, routage)                (négociation, support)
           │                               │
           ▼                               ▼
    Voice Live standard            Real-Time API
    (Speech + GPT-4o)              (streaming natif)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Cette architecture permet de :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Utiliser Voice Live pour le routage initial et les requêtes simples&lt;/li&gt;
&lt;li&gt;Basculer vers Real-Time API pour les conversations complexes nécessitant plus de fluidité&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Voice Live&lt;/strong&gt; et &lt;strong&gt;Real-Time API&lt;/strong&gt; ne sont pas en compétition directe - ils répondent à des besoins différents.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Voice Live&lt;/strong&gt; excelle dans la &lt;strong&gt;téléphonie d'entreprise&lt;/strong&gt; avec son intégration native PSTN, sa tarification prévisible et ses fonctionnalités de centre d'appels.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Real-Time API&lt;/strong&gt; brille pour les &lt;strong&gt;expériences conversationnelles immersives&lt;/strong&gt; où la latence et la naturalité sont primordiales.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Le choix dépend de votre cas d'usage principal. Et pour les projets ambitieux, une architecture hybride peut offrir le meilleur des deux mondes.&lt;/p&gt;




&lt;h2&gt;
  
  
  À propos de l'auteur
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Nabil Ghanem&lt;/strong&gt; est le fondateur de &lt;a href="https://galaxyai.life" rel="noopener noreferrer"&gt;Galaxy AI&lt;/a&gt;, une entreprise spécialisée dans les solutions Azure AI pour entreprises. Microsoft Partner certifié, Galaxy AI accompagne les entreprises dans le déploiement de chatbots RAG et d'agents vocaux IA.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Site web : &lt;a href="https://galaxyai.life" rel="noopener noreferrer"&gt;galaxyai.life&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;LinkedIn : &lt;a href="https://www.linkedin.com/company/galaxy-ai" rel="noopener noreferrer"&gt;Galaxy AI&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Contact : &lt;a href="https://galaxyai.life/appointments" rel="noopener noreferrer"&gt;Prendre rendez-vous&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;em&gt;Cet article a été rédigé en janvier 2026. Les tarifs et fonctionnalités peuvent évoluer. Consultez la documentation officielle Azure pour les informations les plus récentes.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tags&lt;/strong&gt; : #Azure #AzureAI #VoiceAI #AzureOpenAI #RealTimeAPI #AzureCommunicationServices #VoiceLive #Chatbot #IA #MicrosoftPartner&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>azure</category>
      <category>ai</category>
    </item>
  </channel>
</rss>
