<?xml version="1.0" encoding="utf-8" standalone="no"?><rss xmlns:betag="https://blogengine.io/schemas/tags" xmlns:blogChannel="http://backend.userland.com/blogChannelModule" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:pingback="http://madskills.com/public/xml/rss/module/pingback/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" version="2.0">
  <channel>
    <title>Dot.Blog</title>
    <description>Consulting DotNet C#, XAML, WinUI, WPF, MAUI, IA</description>
    <link>http://www.e-naxos.com/Blog/</link>
    <docs>http://www.rssboard.org/rss-specification</docs>
    <generator>BlogEngine.NET 3.3.8.0</generator>
    <language>fr-FR</language>
    <blogChannel:blogRoll>http://www.e-naxos.com/Blog/opml.axd</blogChannel:blogRoll>
    <blogChannel:blink>https://www.e-naxos.com/Blog/syndication.axd</blogChannel:blink>
    <dc:creator>Olivier Dahan</dc:creator>
    <dc:title>Dot.Blog</dc:title>
    <geo:lat>0.000000</geo:lat>
    <geo:long>0.000000</geo:long>
    <xhtml:meta content="noindex" name="robots" xmlns:xhtml="http://www.w3.org/1999/xhtml"/><item>
      <title>Azure AI - Bonnes pratiques : sécurité, quotas, versionnement, suivi des coûts pour Azure AI</title>
      <description>&lt;p&gt;Utiliser Azure AI dans vos applications .NET n&amp;eacute;cessite non seulement de ma&amp;icirc;triser la technique, mais aussi d&amp;rsquo;adopter des pratiques solides pour garantir la s&amp;eacute;curit&amp;eacute;, ma&amp;icirc;triser les co&amp;ucirc;ts, g&amp;eacute;rer les quotas, et organiser les versions de vos API et mod&amp;egrave;les. Cet article vous guide pas &amp;agrave; pas sur ces aspects essentiels.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt; S&amp;eacute;curit&amp;eacute;&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;Protection des cl&amp;eacute;s API&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Ne jamais exposer votre cl&amp;eacute; API dans le code client (applications web, mobile, frontend).&lt;/li&gt;
&lt;li&gt;Stockez les cl&amp;eacute;s dans Azure Key Vault ou dans les param&amp;egrave;tres d&amp;rsquo;environnement des services backend.&lt;/li&gt;
&lt;li&gt;Utilisez des API interm&amp;eacute;diaires (ex : Azure Functions) pour s&amp;eacute;curiser les appels.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Authentification et contr&amp;ocirc;le d&amp;rsquo;acc&amp;egrave;s&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Configurez des r&amp;ocirc;les et permissions dans Azure pour limiter l&amp;rsquo;acc&amp;egrave;s aux ressources.&lt;/li&gt;
&lt;li&gt;Activez l&amp;rsquo;authentification bas&amp;eacute;e sur Azure AD quand c&amp;rsquo;est possible.&lt;/li&gt;
&lt;li&gt;Surveillez les logs d&amp;rsquo;acc&amp;egrave;s via Azure Monitor pour d&amp;eacute;tecter les usages anormaux.&lt;/li&gt;
&lt;/ul&gt;
&lt;ol start="2"&gt;
&lt;li&gt;&lt;strong&gt; Gestion des quotas et limitations&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Azure OpenAI impose des quotas sur :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Le nombre de requ&amp;ecirc;tes par minute.&lt;/li&gt;
&lt;li&gt;Le nombre total de tokens trait&amp;eacute;s.&lt;/li&gt;
&lt;li&gt;Le nombre d&amp;rsquo;instances d&amp;eacute;ploy&amp;eacute;es.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Bonnes pratiques&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Impl&amp;eacute;mentez une file d&amp;rsquo;attente ou un m&amp;eacute;canisme de throttling c&amp;ocirc;t&amp;eacute; client ou serveur.&lt;/li&gt;
&lt;li&gt;Surveillez l&amp;rsquo;utilisation via le portail Azure ou Azure Monitor.&lt;/li&gt;
&lt;li&gt;Demandez une augmentation de quotas si n&amp;eacute;cessaire, en justifiant vos usages.&lt;/li&gt;
&lt;/ul&gt;
&lt;ol start="3"&gt;
&lt;li&gt;&lt;strong&gt; Versionnement des API et mod&amp;egrave;les&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;Pourquoi versionner ?&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Permet de d&amp;eacute;ployer de nouvelles fonctionnalit&amp;eacute;s sans casser l&amp;rsquo;existant.&lt;/li&gt;
&lt;li&gt;G&amp;egrave;re la compatibilit&amp;eacute; entre clients et services.&lt;/li&gt;
&lt;li&gt;Facilite les tests A/B et les rollbacks.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Comment versionner ?&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Utilisez les versions d&amp;rsquo;API dans les URL (ex : api-version=2024-02-15-preview).&lt;/li&gt;
&lt;li&gt;Donnez des noms explicites aux d&amp;eacute;ploiements de mod&amp;egrave;les (ex : chatbot-v1, chatbot-v2).&lt;/li&gt;
&lt;li&gt;Documentez clairement les changements dans vos API.&lt;/li&gt;
&lt;/ul&gt;
&lt;ol start="4"&gt;
&lt;li&gt;&lt;strong&gt; Suivi et ma&amp;icirc;trise des co&amp;ucirc;ts&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;Facturation Azure OpenAI&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Le co&amp;ucirc;t d&amp;eacute;pend du nombre de tokens trait&amp;eacute;s (entr&amp;eacute;e + sortie).&lt;/li&gt;
&lt;li&gt;Les mod&amp;egrave;les plus puissants (GPT-4) sont plus co&amp;ucirc;teux que GPT-3.5.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Recommandations&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Surveillez les consommations via le portail Azure et configurez des alertes budg&amp;eacute;taires.&lt;/li&gt;
&lt;li&gt;Optimisez les prompts pour limiter la taille des requ&amp;ecirc;tes et r&amp;eacute;ponses.&lt;/li&gt;
&lt;li&gt;Cachez les r&amp;eacute;ponses fr&amp;eacute;quentes pour &amp;eacute;viter des appels redondants.&lt;/li&gt;
&lt;/ul&gt;
&lt;ol start="5"&gt;
&lt;li&gt;&lt;strong&gt; Outils et services compl&amp;eacute;mentaires&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Azure Monitor&lt;/strong&gt; pour logs et alertes.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Azure Cost Management&lt;/strong&gt; pour analyse des co&amp;ucirc;ts.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Application Insights&lt;/strong&gt; pour surveiller les performances et erreurs.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Conclusion&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;La ma&amp;icirc;trise des aspects s&amp;eacute;curit&amp;eacute;, quotas, versionnement et co&amp;ucirc;ts est indispensable pour d&amp;eacute;ployer sereinement vos solutions Azure AI &amp;agrave; l&amp;rsquo;&amp;eacute;chelle professionnelle.&lt;/p&gt;
&lt;p&gt;Ces bonnes pratiques vous aideront &amp;agrave; garantir robustesse, scalabilit&amp;eacute; et contr&amp;ocirc;le budg&amp;eacute;taire.&lt;/p&gt;
&lt;p&gt;Ici s'ach&amp;egrave;ve la s&amp;eacute;rie de 12 articles sur Azure AI, j'esp&amp;egrave;re qu'elle vous aura permis de vous initier &amp;agrave; cet environnement indispensable &amp;agrave; conna&amp;icirc;tre. Et comme je suis de nature g&amp;eacute;n&amp;eacute;reuse, comme dans mon enfance o&amp;ugrave; les oeufs se vendaient 13 &amp;agrave; la douzaine, il y aura un prochain article pour clore r&amp;eacute;ellement la s&amp;eacute;rie qui s'intitulera :&amp;nbsp;&lt;strong&gt;Cr&amp;eacute;er un chatbot contextuel avec Azure OpenAI + m&amp;eacute;moire conversationnelle en C#&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Une excellente raison de plus de ... Stay Tuned !&lt;/p&gt;</description>
      <link>http://www.e-naxos.com/Blog/post/AzureAI12</link>
      <author>odahan@e-naxos.com</author>
      <comments>http://www.e-naxos.com/Blog/post/AzureAI12#comment</comments>
      <guid>http://www.e-naxos.com/Blog/post.aspx?id=807eaae5-2dc4-4072-a25a-825dfdd8f497</guid>
      <pubDate>ven., 6 mars 2026 13:00:00 +0000</pubDate>
      <category>Azure</category>
      <category>IA</category>
      <betag:tag>azure</betag:tag>
      <betag:tag>IA</betag:tag>
      <betag:tag>ai</betag:tag>
      <dc:publisher>Olivier</dc:publisher>
      <pingback:server>http://www.e-naxos.com/Blog/pingback.axd</pingback:server>
      <pingback:target>http://www.e-naxos.com/Blog/post.aspx?id=807eaae5-2dc4-4072-a25a-825dfdd8f497</pingback:target>
      <slash:comments>0</slash:comments>
      <trackback:ping>http://www.e-naxos.com/Blog/trackback.axd?id=807eaae5-2dc4-4072-a25a-825dfdd8f497</trackback:ping>
      <wfw:comment>http://www.e-naxos.com/Blog/post/AzureAI12#comment</wfw:comment>
      <wfw:commentRss>http://www.e-naxos.com/Blog/syndication.axd?post=807eaae5-2dc4-4072-a25a-825dfdd8f497</wfw:commentRss>
    </item>
    <item>
      <title>Créer un micro moteur RAG en C# avec API + index vectoriel local</title>
      <description>&lt;p&gt;Le principe du &lt;strong&gt;RAG&lt;/strong&gt; (Retrieval-Augmented Generation) est de combiner un moteur de recherche s&amp;eacute;mantique avec un LLM (Large Language Model) afin de g&amp;eacute;n&amp;eacute;rer des r&amp;eacute;ponses contextualis&amp;eacute;es &amp;agrave; partir de documents locaux. Cette approche permet de cr&amp;eacute;er des assistants personnalis&amp;eacute;s, sans avoir &amp;agrave; fine-tuner un mod&amp;egrave;le.&lt;/p&gt;
&lt;p&gt;Dans cet article, nous allons construire un moteur RAG minimaliste en C# qui interroge un index vectoriel local (via QDrant) et appelle l&amp;rsquo;API OpenAI pour g&amp;eacute;n&amp;eacute;rer des r&amp;eacute;ponses.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&#129513; Architecture cible&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Documents&lt;/strong&gt; vectoris&amp;eacute;s (embeddings)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Index vectoriel local&lt;/strong&gt; (QDrant)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;API Web locale&lt;/strong&gt; (ASP.NET Minimal API)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Appel &amp;agrave; OpenAI&lt;/strong&gt; pour g&amp;eacute;n&amp;eacute;rer la r&amp;eacute;ponse finale&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;&#128230; &amp;Eacute;tape 1 : pr&amp;eacute;parer les documents vectoris&amp;eacute;s&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;string[] documents = [&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; "Le C# est un langage de programmation orient&amp;eacute; objet.",&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; "Les records permettent de mod&amp;eacute;liser des donn&amp;eacute;es immuables.",&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; "Span&amp;lt;T&amp;gt; optimise l&amp;rsquo;acc&amp;egrave;s m&amp;eacute;moire en .NET."&lt;br /&gt;];&lt;br /&gt;&lt;br /&gt;foreach (var doc in documents)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; var vector = await openAiClient.EmbedAsync(doc);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; await qdrantClient.UpsertAsync("docs", docId, vector, payload: new { texte = doc });&lt;br /&gt;}&lt;/pre&gt;
&lt;pre&gt;&lt;strong&gt;// &#127760; &amp;Eacute;tape 2 : Minimal API de requ&amp;ecirc;tage en ASP.NET&lt;/strong&gt;&lt;/pre&gt;
&lt;pre&gt;var builder = WebApplication.CreateBuilder();&lt;br /&gt;var app = builder.Build();&lt;br /&gt;&lt;br /&gt;app.MapPost("/ask", async (AskRequest req) =&amp;gt;&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; var questionVector = await openAiClient.EmbedAsync(req.Question);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; var matches = await qdrantClient.SearchAsync("docs", questionVector, top: 5);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; string context = string.Join("\n", matches.Select(m =&amp;gt; m.Payload["texte"]));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; string prompt = $"Voici des extraits :\n{context}\n\nQuestion : {req.Question}\nR&amp;eacute;ponds de mani&amp;egrave;re claire et concise.";&lt;br /&gt;&lt;br /&gt; &amp;nbsp;&amp;nbsp; var response = await openAiClient.ChatAsync(prompt);&lt;br /&gt; &amp;nbsp;&amp;nbsp; return Results.Ok(response);&lt;br /&gt;});&lt;br /&gt;app.Run();&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;&#128295; &amp;Eacute;tape 3 : impl&amp;eacute;mentation de OpenAI et QDrant clients simplifi&amp;eacute;s&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Extrait simplifi&amp;eacute; de client d&amp;rsquo;embedding OpenAI :&lt;/p&gt;
&lt;pre&gt;public async Task&amp;lt;float[]&amp;gt; EmbedAsync(string input)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; var body = new { model = "text-embedding-3-small", input };&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; var content = new StringContent(JsonSerializer.Serialize(body), Encoding.UTF8, "application/json");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; var response = await httpClient.PostAsync("https://api.openai.com/v1/embeddings", content);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; var json = JsonDocument.Parse(await response.Content.ReadAsStringAsync());&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return json.RootElement.GetProperty("data")[0].GetProperty("embedding")&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .EnumerateArray().Select(x =&amp;gt; x.GetSingle()).ToArray();&lt;br /&gt;}&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;&#128228; Exemple de requ&amp;ecirc;te&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;POST /ask&lt;br /&gt;{&lt;br /&gt;&amp;nbsp; "question": "Comment fonctionne Span&amp;lt;T&amp;gt; ?"&lt;br /&gt;}&lt;/pre&gt;
&lt;p&gt;R&amp;eacute;ponse : texte g&amp;eacute;n&amp;eacute;r&amp;eacute; par GPT-4 &amp;agrave; partir des documents les plus proches.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&#128204; R&amp;eacute;sum&amp;eacute; du flux&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Embedding de la question &amp;rarr; vecteur&lt;/li&gt;
&lt;li&gt;Recherche dans QDrant &amp;rarr; documents similaires&lt;/li&gt;
&lt;li&gt;Construction d&amp;rsquo;un prompt contextuel&lt;/li&gt;
&lt;li&gt;Appel &amp;agrave; OpenAI pour compl&amp;eacute;ter&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;&#129514; Perspectives&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Ajouter un cache de r&amp;eacute;ponse locale&lt;/li&gt;
&lt;li&gt;Ajouter de la pond&amp;eacute;ration sur la similarit&amp;eacute;&lt;/li&gt;
&lt;li&gt;Indexer automatiquement des fichiers Markdown, PDF, etc.&lt;/li&gt;
&lt;li&gt;Proposer une UI WinUI ou Blazor locale&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;&#128282; Conclusion&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Avec quelques dizaines de lignes de C#, il est possible de construire un moteur RAG simple mais puissant, utilisable localement et sans infrastructure cloud externe. Cette base est id&amp;eacute;ale pour explorer des assistants sp&amp;eacute;cialis&amp;eacute;s, des FAQ intelligentes, ou des moteurs documentaires embarqu&amp;eacute;s.&lt;/p&gt;
&lt;p&gt;C'est vraiment quelque chose d'important sur lequel il faut que vous vous penchiez, car c'est l&amp;agrave; que se joue l'avenir de l'informatique. Elle a commenc&amp;eacute; par envahir tous les objets du four micro-onde &amp;agrave; la t&amp;eacute;l&amp;eacute; en passant par les bracelets montres, et maintenant qu'elle est partout elle va servir de voie royale &amp;agrave; l'IA pour s'insinuer partout. D&amp;eacute;velopper demain obligera &amp;agrave; savoir int&amp;eacute;grer l'IA dans ses Apps...&lt;/p&gt;
&lt;p&gt;Stay Tuned !&lt;/p&gt;</description>
      <link>http://www.e-naxos.com/Blog/post/RAG</link>
      <author>odahan@e-naxos.com</author>
      <comments>http://www.e-naxos.com/Blog/post/RAG#comment</comments>
      <guid>http://www.e-naxos.com/Blog/post.aspx?id=6cc1e980-194e-4e5f-92fc-ca2fd43a3e14</guid>
      <pubDate>ven., 27 févr. 2026 13:00:00 +0000</pubDate>
      <category>IA</category>
      <betag:tag>ai</betag:tag>
      <betag:tag>IA</betag:tag>
      <dc:publisher>Olivier</dc:publisher>
      <pingback:server>http://www.e-naxos.com/Blog/pingback.axd</pingback:server>
      <pingback:target>http://www.e-naxos.com/Blog/post.aspx?id=6cc1e980-194e-4e5f-92fc-ca2fd43a3e14</pingback:target>
      <slash:comments>0</slash:comments>
      <trackback:ping>http://www.e-naxos.com/Blog/trackback.axd?id=6cc1e980-194e-4e5f-92fc-ca2fd43a3e14</trackback:ping>
      <wfw:comment>http://www.e-naxos.com/Blog/post/RAG#comment</wfw:comment>
      <wfw:commentRss>http://www.e-naxos.com/Blog/syndication.axd?post=6cc1e980-194e-4e5f-92fc-ca2fd43a3e14</wfw:commentRss>
    </item>
    <item>
      <title>Azure AI - Déployer une API d’IA personnalisée avec Azure Functions</title>
      <description>&lt;p&gt;Une fois que vous avez un mod&amp;egrave;le Azure OpenAI op&amp;eacute;rationnel, il est souvent pratique de cr&amp;eacute;er une&amp;nbsp;&lt;strong&gt;API interm&amp;eacute;diaire&lt;/strong&gt;&amp;nbsp;qui encapsule les appels &amp;agrave; ce mod&amp;egrave;le. Cela facilite la maintenance, la s&amp;eacute;curisation et la r&amp;eacute;utilisation du service dans vos applications clientes.&lt;/p&gt;
&lt;p&gt;Cet article d&amp;eacute;taille comment cr&amp;eacute;er et d&amp;eacute;ployer une API serverless simple avec&amp;nbsp;&lt;strong&gt;Azure Functions&lt;/strong&gt;&amp;nbsp;en C#, qui re&amp;ccedil;oit une requ&amp;ecirc;te, interroge Azure OpenAI, puis renvoie la r&amp;eacute;ponse.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Pr&amp;eacute;requis&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;Un abonnement Azure actif&lt;/li&gt;
&lt;li&gt;Une fonction Azure Functions configur&amp;eacute;e (runtime .NET 7 ou sup&amp;eacute;rieur recommand&amp;eacute;)&lt;/li&gt;
&lt;li&gt;Une ressource Azure OpenAI op&amp;eacute;rationnelle avec cl&amp;eacute; d&amp;rsquo;API&lt;/li&gt;
&lt;li&gt;Visual Studio 2022 ou Visual Studio Code avec les extensions Azure Functions&lt;/li&gt;
&lt;/ul&gt;
&lt;ol start="2"&gt;
&lt;li&gt;&lt;strong&gt;Cr&amp;eacute;ation d&amp;rsquo;un projet Azure Functions HTTP Trigger&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Dans Visual Studio :&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Cr&amp;eacute;er un nouveau projet&lt;/strong&gt;&amp;nbsp;&amp;rarr; s&amp;eacute;lectionnez&amp;nbsp;&lt;strong&gt;Azure Functions&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Nommer le projet, choisir .NET 7 ou sup&amp;eacute;rieur&lt;/li&gt;
&lt;li&gt;S&amp;eacute;lectionner le&amp;nbsp;&lt;strong&gt;type Trigger HTTP&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Autoriser&amp;nbsp;&lt;strong&gt;Anonymous&lt;/strong&gt;&amp;nbsp;ou&amp;nbsp;&lt;strong&gt;Function&lt;/strong&gt;&amp;nbsp;pour l&amp;rsquo;authentification selon besoin&lt;/li&gt;
&lt;/ol&gt;
&lt;ol start="3"&gt;
&lt;li&gt;&lt;strong&gt;Impl&amp;eacute;mentation de la fonction C#&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Voici un exemple simple d&amp;rsquo;une fonction qui re&amp;ccedil;oit un JSON contenant un prompt, appelle Azure OpenAI via HttpClient, et retourne la r&amp;eacute;ponse :&lt;/p&gt;
&lt;pre&gt;using System.Net.Http.Headers;&lt;br /&gt;using System.Text;&lt;br /&gt;using System.Text.Json;&lt;br /&gt;using Microsoft.Azure.Functions.Worker;&lt;br /&gt;using Microsoft.Azure.Functions.Worker.Http;&lt;br /&gt;&lt;br /&gt;public class OpenAIProxyFunction&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; private readonly HttpClient _httpClient;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; private readonly string _azureOpenAiEndpoint = Environment.GetEnvironmentVariable("AZURE_OPENAI_ENDPOINT");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; private readonly string _azureOpenAiApiKey = Environment.GetEnvironmentVariable("AZURE_OPENAI_API_KEY");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; private readonly string _deploymentName = Environment.GetEnvironmentVariable("AZURE_OPENAI_DEPLOYMENT");&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public OpenAIProxyFunction(HttpClient httpClient)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; _httpClient = httpClient;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; [Function("OpenAIProxy")]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public async Task&amp;lt;HttpResponseData&amp;gt; Run([HttpTrigger(AuthorizationLevel.Function, "post")] HttpRequestData req)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; var requestBody = await new StreamReader(req.Body).ReadToEndAsync();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; var jsonDoc = JsonDocument.Parse(requestBody);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; var userMessage = jsonDoc.RootElement.GetProperty("prompt").GetString();&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; var apiUrl = $"{_azureOpenAiEndpoint}/openai/deployments/{_deploymentName}/chat/completions?api-version=2024-02-15-preview";&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; var payload = new&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; messages = new[]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; new { role = "system", content = "Vous &amp;ecirc;tes un assistant." },&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; new { role = "user", content = userMessage }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; },&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; temperature = 0.7&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; };&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; var content = new StringContent(JsonSerializer.Serialize(payload), Encoding.UTF8, "application/json");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; _httpClient.DefaultRequestHeaders.Clear();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; _httpClient.DefaultRequestHeaders.Add("api-key", _azureOpenAiApiKey);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; var response = await _httpClient.PostAsync(apiUrl, content);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; var responseContent = await response.Content.ReadAsStringAsync();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; var res = req.CreateResponse(response.StatusCode);&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; res.Headers.Add("Content-Type", "application/json");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; await res.WriteStringAsync(responseContent);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return res;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;}&lt;/pre&gt;
&lt;ol start="4"&gt;
&lt;li&gt;&lt;strong&gt;Configuration des variables d&amp;rsquo;environnement&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Pour s&amp;eacute;curiser les informations sensibles, placez dans le fichier local.settings.json ou dans la configuration Azure :&lt;/p&gt;
&lt;pre&gt;{&lt;br /&gt;&amp;nbsp; "IsEncrypted": false,&lt;br /&gt;&amp;nbsp; "Values": {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; "AZURE_OPENAI_ENDPOINT": "https://votre-instance.openai.azure.com",&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; "AZURE_OPENAI_API_KEY": "votre-cle-api",&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; "AZURE_OPENAI_DEPLOYMENT": "chatbot-deploy",&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; "AzureWebJobsStorage": "UseDevelopmentStorage=true"&lt;br /&gt;&amp;nbsp; }&lt;br /&gt;}&lt;/pre&gt;
&lt;ol start="5"&gt;
&lt;li&gt;&lt;strong&gt;D&amp;eacute;ploiement sur Azure&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Utilisez Visual Studio ou Azure CLI :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Visual Studio : clic droit sur le projet &amp;rarr;&amp;nbsp;&lt;strong&gt;Publier&lt;/strong&gt;&amp;nbsp;&amp;rarr; s&amp;eacute;lectionner votre abonnement et cr&amp;eacute;er une Function App&lt;/li&gt;
&lt;li&gt;Azure CLI :&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre&gt;func azure functionapp publish &amp;lt;nom-de-votre-function-app&amp;gt;&lt;/pre&gt;
&lt;ol start="6"&gt;
&lt;li&gt;&lt;strong&gt;Tester l&amp;rsquo;API&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Apr&amp;egrave;s d&amp;eacute;ploiement, votre API est accessible via une URL publique.&lt;/p&gt;
&lt;p&gt;Exemple de requ&amp;ecirc;te HTTP POST :&lt;/p&gt;
&lt;pre&gt;POST &lt;a href="https://%3Cvotre-function-app%3E.azurewebsites.net/api/OpenAIProxy"&gt;https://&amp;lt;votre-function-app&amp;gt;.azurewebsites.net/api/OpenAIProxy&lt;/a&gt;&lt;br /&gt;Content-Type: application/json&lt;br /&gt;{&lt;br /&gt;&amp;nbsp; "prompt": "Peux-tu expliquer Azure Functions ?"&lt;br /&gt;}&lt;/pre&gt;
&lt;p&gt;R&amp;eacute;ponse JSON contenant la g&amp;eacute;n&amp;eacute;ration du mod&amp;egrave;le.&lt;/p&gt;
&lt;ol start="7"&gt;
&lt;li&gt;&lt;strong&gt;Avantages et bonnes pratiques&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Centralisation&lt;/strong&gt;&amp;nbsp;: votre logique d&amp;rsquo;appel &amp;agrave; Azure OpenAI est centralis&amp;eacute;e et contr&amp;ocirc;l&amp;eacute;e&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;S&amp;eacute;curit&amp;eacute;&lt;/strong&gt;&amp;nbsp;: cl&amp;eacute; API prot&amp;eacute;g&amp;eacute;e c&amp;ocirc;t&amp;eacute; serveur, pas expos&amp;eacute;e au client&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Extensibilit&amp;eacute;&lt;/strong&gt;&amp;nbsp;: ajoutez la journalisation, limitation de d&amp;eacute;bit, validation des requ&amp;ecirc;tes&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Interop&amp;eacute;rabilit&amp;eacute;&lt;/strong&gt;&amp;nbsp;: accessible depuis toute application (web, mobile, desktop)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Conclusion&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Cr&amp;eacute;er une API Azure Functions autour d&amp;rsquo;Azure OpenAI facilite l&amp;rsquo;int&amp;eacute;gration dans vos applications et am&amp;eacute;liore la s&amp;eacute;curit&amp;eacute; et la maintenabilit&amp;eacute;.&lt;/p&gt;
&lt;p&gt;Mais ce n'est qu'un simple sc&amp;eacute;nario de d&amp;eacute;monstration pour vous aider &amp;agrave; comprendre les principes pr&amp;eacute;sent&amp;eacute;s. Il peut m&amp;ecirc;me y avoir des cas o&amp;ugrave; la centralisation de la cl&amp;eacute; API est un inconv&amp;eacute;nient.Supposons une App MAUI mise sur le Store (Android Play par exemple). Il est fort probable que la gestion des API va poser des probl&amp;egrave;mes tr&amp;egrave;s diff&amp;eacute;rents de ceux soulev&amp;eacute;s en entreprise. Cette derni&amp;egrave;re a int&amp;eacute;r&amp;ecirc;t &amp;agrave; utiliser une centralisation des cl&amp;eacute;s API, pour la s&amp;eacute;curit&amp;eacute; notamment, c&amp;ocirc;t&amp;eacute; co&amp;ucirc;t c'est elle qui paye pour tout le monde donc cela ne pose aucun souci. Mais pour l'App &amp;agrave; disposition sur un Store... Soit elle elle int&amp;egrave;gre un abonnement avec achat in-App ou autre afin de financer le co&amp;ucirc;t de l'IA, soit elle doit offrir &amp;agrave; l'utilisateur de saisir sa propre cl&amp;eacute;, charge &amp;agrave; lui de prendre un abonnement Azure AI ou directement OpenAI mais cela lui complique la vie ce qui n'est jamais bon d'un point de vue marketting ...&lt;/p&gt;
&lt;p&gt;Bref, Il existe de nombreuses situations diff&amp;eacute;rentes et je n'ai pas ici dans cette s&amp;eacute;rie de 12 articles sur Azure AI la na&amp;iuml;vet&amp;eacute; de croire que je peux vous apprendre toutes les fa&amp;ccedil;ons d'aborder cette complexe t&amp;acirc;che qu'est l'int&amp;eacute;gration de l'IA dans vos Apps. Mais j'esp&amp;egrave;re pouvoir participer &amp;agrave; votre compr&amp;eacute;hension des principes essentiels, en misant sur votre intelligence, naturelle celle-l&amp;agrave;, pour le reste !&lt;/p&gt;
&lt;p&gt;Dans le dernier volet de cette s&amp;eacute;rie de 12 articles sur Azure AI j'aborderai la question des&amp;nbsp;&lt;strong&gt;Bonnes pratiques : s&amp;eacute;curit&amp;eacute;, quotas, versionnement, suivi des co&amp;ucirc;ts pour Azure AI&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Stay Tuned !&lt;/p&gt;</description>
      <link>http://www.e-naxos.com/Blog/post/AzureAI11</link>
      <author>odahan@e-naxos.com</author>
      <comments>http://www.e-naxos.com/Blog/post/AzureAI11#comment</comments>
      <guid>http://www.e-naxos.com/Blog/post.aspx?id=e5ff7ec5-4836-42d8-81fc-301f8f526730</guid>
      <pubDate>ven., 20 févr. 2026 13:00:00 +0000</pubDate>
      <category>Azure</category>
      <category>IA</category>
      <betag:tag>azure</betag:tag>
      <betag:tag>ai</betag:tag>
      <betag:tag>IA</betag:tag>
      <dc:publisher>Olivier</dc:publisher>
      <pingback:server>http://www.e-naxos.com/Blog/pingback.axd</pingback:server>
      <pingback:target>http://www.e-naxos.com/Blog/post.aspx?id=e5ff7ec5-4836-42d8-81fc-301f8f526730</pingback:target>
      <slash:comments>0</slash:comments>
      <trackback:ping>http://www.e-naxos.com/Blog/trackback.axd?id=e5ff7ec5-4836-42d8-81fc-301f8f526730</trackback:ping>
      <wfw:comment>http://www.e-naxos.com/Blog/post/AzureAI11#comment</wfw:comment>
      <wfw:commentRss>http://www.e-naxos.com/Blog/syndication.axd?post=e5ff7ec5-4836-42d8-81fc-301f8f526730</wfw:commentRss>
    </item>
  </channel>
</rss>