DEV Community

Nabil
Nabil

Posted on

RAG : Comment créer un chatbot IA qui ne ment jamais avec Azure AI

RAG : Comment créer un chatbot IA qui ne ment jamais avec Azure AI

Par Nabil Ghanem, fondateur de Galaxy AI — Expert Azure AI & Microsoft Partner


Les chatbots IA classiques ont un problème majeur : ils inventent des réponses. 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.

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


TL;DR — Résumé rapide

Aspect Chatbot classique Chatbot RAG
Source des réponses Connaissance générale du modèle Vos documents uniquement
Hallucinations Fréquentes Quasi-inexistantes
Mise à jour Nécessite ré-entraînement Immédiate (ajout de documents)
Coût Élevé (fine-tuning) Modéré (indexation)
Traçabilité Aucune Citations avec sources

Qu'est-ce que le RAG ?

RAG signifie Retrieval Augmented Generation. Le principe est simple :

  1. L'utilisateur pose une question
  2. Le système recherche les documents pertinents dans votre base
  3. L'IA génère une réponse basée uniquement sur ces documents
  4. La réponse inclut les sources citées

Architecture RAG sur Azure

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
Enter fullscreen mode Exit fullscreen mode

Pourquoi le RAG élimine les hallucinations

Un LLM comme GPT-4 possède une connaissance générale massive, mais cette connaissance :

  • Date de son entraînement (pas les infos récentes)
  • Ne contient pas vos données internes
  • Peut mélanger des informations incorrectes

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.

Exemple de prompt système RAG

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}
Enter fullscreen mode Exit fullscreen mode

💡 Astuce : Une température basse (0.1–0.3) réduit encore plus les hallucinations car le modèle devient moins "créatif".


Les composants Azure pour un RAG performant

1. Azure AI Search

C'est le moteur de recherche qui retrouve les documents pertinents :

  • Recherche sémantique — Comprend le sens, pas juste les mots-clés
  • Recherche vectorielle — Compare les embeddings pour trouver des similarités
  • Recherche hybride — Combine les deux pour de meilleurs résultats
  • Filtrage — Par date, catégorie, département, etc.

2. Azure OpenAI

Le cerveau qui génère les réponses :

  • GPT-4o pour les réponses complexes
  • GPT-4o-mini pour les cas simples (moins cher)
  • Embeddings text-embedding-3-large pour la vectorisation

3. Azure Blob Storage

Stockage des documents sources :

  • PDF, Word, Excel, PowerPoint
  • Pages web crawlées
  • Bases de données exportées

Implémentation pas à pas

Étape 1 : Indexation des documents

from azure.search.documents.indexes import SearchIndexClient
from azure.search.documents.indexes.models import (
    SearchIndex,
    SearchField,
    SearchFieldDataType,
    VectorSearch,
    HnswAlgorithmConfiguration,
    VectorSearchProfile,
    SemanticConfiguration,
    SemanticField,
    SemanticPrioritizedFields,
    SemanticSearch
)

index = SearchIndex(
    name="documents-rh",
    fields=[
        SearchField(name="id", type=SearchFieldDataType.String, key=True),
        SearchField(name="content", type=SearchFieldDataType.String, searchable=True),
        SearchField(name="title", type=SearchFieldDataType.String, searchable=True),
        SearchField(name="category", type=SearchFieldDataType.String, filterable=True),
        SearchField(
            name="content_vector",
            type=SearchFieldDataType.Collection(SearchFieldDataType.Single),
            searchable=True,
            vector_search_dimensions=3072,
            vector_search_profile_name="vector-profile"
        )
    ],
    vector_search=VectorSearch(
        algorithms=[HnswAlgorithmConfiguration(name="hnsw-config")],
        profiles=[VectorSearchProfile(
            name="vector-profile",
            algorithm_configuration_name="hnsw-config"
        )]
    ),
    semantic_search=SemanticSearch(
        configurations=[SemanticConfiguration(
            name="semantic-config",
            prioritized_fields=SemanticPrioritizedFields(
                content_fields=[SemanticField(field_name="content")],
                title_field=SemanticField(field_name="title")
            )
        )]
    )
)

index_client.create_or_update_index(index)
Enter fullscreen mode Exit fullscreen mode

Étape 2 : Vectorisation des documents

from azure.openai import AzureOpenAI

openai_client = AzureOpenAI(
    azure_endpoint="https://votre-instance.openai.azure.com",
    api_key="votre-api-key",
    api_version="2024-02-01"
)

def get_embedding(text):
    response = openai_client.embeddings.create(
        input=text,
        model="text-embedding-3-large"
    )
    return response.data[0].embedding

for doc in documents:
    doc["content_vector"] = get_embedding(doc["content"])
    search_client.upload_documents([doc])
Enter fullscreen mode Exit fullscreen mode

Étape 3 : Recherche et génération

from azure.search.documents import SearchClient
from azure.search.documents.models import VectorizedQuery

def ask_rag(question: str) -> str:
    question_vector = get_embedding(question)

    results = search_client.search(
        search_text=question,
        vector_queries=[VectorizedQuery(
            vector=question_vector,
            k_nearest_neighbors=5,
            fields="content_vector"
        )],
        query_type="semantic",
        semantic_configuration_name="semantic-config",
        top=5
    )

    context = ""
    sources = []
    for result in results:
        context += f"\n\n---\nDocument: {result['title']}\n{result['content']}"
        sources.append(result['title'])

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

Documents disponibles:
{context}"""
            },
            {"role": "user", "content": question}
        ],
        temperature=0.1
    )

    answer = response.choices[0].message.content
    return f"{answer}\n\nSources: {', '.join(sources)}"
Enter fullscreen mode Exit fullscreen mode

Optimisations avancées

1. Chunking intelligent

Ne pas indexer des documents entiers, mais des morceaux (chunks) :

def chunk_document(text, chunk_size=500, overlap=50):
    chunks = []
    start = 0
    while start < len(text):
        end = start + chunk_size
        chunk = text[start:end]
        chunks.append(chunk)
        start = end - overlap
    return chunks
Enter fullscreen mode Exit fullscreen mode

📏 Taille optimale : 300–800 tokens selon le type de document

2. Reranking

Après la recherche, re-classer les résultats :

results = search_client.search(
    search_text=question,
    query_type="semantic",
    semantic_configuration_name="semantic-config",
    query_caption="extractive",
    query_answer="extractive"
)
Enter fullscreen mode Exit fullscreen mode

3. Filtrage contextuel

Limiter la recherche selon le profil utilisateur :

results = search_client.search(
    search_text=question,
    filter="category eq 'Finance' or category eq 'General'",
    ...
)
Enter fullscreen mode Exit fullscreen mode

Cas d'usage entreprise

🏢 Assistant RH interne

  • Questions sur les congés, mutuelle, avantages
  • Procédures internes
  • Onboarding nouveaux employés

📞 Support client niveau 1

  • FAQ produits
  • Procédures de dépannage
  • Politique de retour/remboursement

💻 Base de connaissances technique

  • Documentation produit
  • Guides d'intégration API
  • Troubleshooting

⚖️ Juridique et conformité

  • Contrats types
  • Réglementations applicables
  • Procédures de conformité

Coûts estimatifs (Azure, janvier 2025)

Composant Tarif
Azure AI Search (Basic) ~70 €/mois
Azure OpenAI GPT-4o 2.50 €/1M tokens input
Azure OpenAI Embeddings 0.13 €/1M tokens
Azure Blob Storage ~2 €/100 Go/mois

Pour une PME avec 1000 documents et 500 requêtes/jour :

💰 Coût mensuel estimé : 100–150 €


Erreurs à éviter

❌ Chunks trop grands ou trop petits

  • Trop grands : Perte de précision, contexte dilué
  • Trop petits : Perte de sens, réponses incomplètes
  • Optimal : 300–800 tokens

❌ Ignorer les métadonnées

  • Date du document (éviter les infos obsolètes)
  • Source (crédibilité)
  • Catégorie (filtrage)

❌ Température trop élevée

  • Utilisez temperature=0.1 à 0.3 pour le RAG
  • Plus la température est basse, moins l'IA "improvise"

❌ Pas de fallback

  • Toujours prévoir : "Je n'ai pas trouvé cette information"
  • Éviter les réponses inventées

Conclusion

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

✅ Des réponses fiables basées sur vos documents

✅ Une traçabilité complète avec citations

✅ Une mise à jour instantanée (ajout de documents = nouvelles connaissances)

✅ Un coût maîtrisé sans fine-tuning

Pour les entreprises qui ne peuvent pas se permettre d'hallucinations, le RAG n'est plus une option, c'est une nécessité.


À propos de l'auteur

Nabil Ghanem est le fondateur de Galaxy AI, 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.

🌐 galaxyai.life

💼 LinkedIn

📅 Prendre rendez-vous


Cet article a été rédigé en janvier 2025. Les tarifs et fonctionnalités peuvent évoluer.

Tags : #Azure #ArtificialIntelligence #RAG #Chatbot #AzureOpenAI #MachineLearning #EnterpriseAI #LLM

Top comments (1)

Collapse
 
okthoi profile image
oknao

🤖 AhaChat AI Ecosystem is here!
💬 AI Response – Auto-reply to customers 24/7
🎯 AI Sales – Smart assistant that helps close more deals
🔍 AI Trigger – Understands message context & responds instantly
🎨 AI Image – Generate or analyze images with one command
🎤 AI Voice – Turn text into natural, human-like speech
📊 AI Funnel – Qualify & nurture your best leads automatically