AvancéRAG
30 min de lecture24 vues

RAG Avancé et Agentic RAG avec Agno

Maîtrisez le RAG en production : reranking, Agentic RAG avec KnowledgeTools, mémoire persistante, multi-sources et évaluation de la qualité.

Au-delà du RAG Basique

Dans le cours précédent, vous avez construit un pipeline RAG simple. Mais en production, les exigences sont plus élevées :

  • Les réponses doivent être plus précises
  • Le système doit gérer plusieurs types de sources
  • L''agent doit savoir quand chercher et quand répondre directement
  • Il faut mesurer la qualité et persister les données

Ce cours couvre les techniques avancées pour un RAG de niveau production.


Reranking : Améliorer la Précision

Le problème du Top-K basique

La recherche vectorielle retourne les K documents les plus proches. Mais "proche en vecteur" ne signifie pas toujours "le plus pertinent pour la question".

La solution : le Reranker

Après la recherche vectorielle initiale, un modèle de reranking réévalue et trie les résultats par pertinence réelle.

Implémentation avec Agno et Cohere

from agno.agent import Agent
from agno.knowledge.embedder.cohere import CohereEmbedder
from agno.knowledge.knowledge import Knowledge
from agno.knowledge.reranker.cohere import CohereReranker
from agno.models.openai import OpenAIResponses
from agno.vectordb.lancedb import LanceDb, SearchType

knowledge = Knowledge(
    vector_db=LanceDb(
        uri="tmp/lancedb",
        table_name="docs_reranked",
        search_type=SearchType.hybrid,
        embedder=CohereEmbedder(id="embed-v4.0"),
        reranker=CohereReranker(model="rerank-v3.5"),
    ),
)

# Charger des documents
knowledge.insert(url="https://agno-public.s3.amazonaws.com/recipes/ThaiRecipes.pdf")

agent = Agent(
    model=OpenAIResponses(id="gpt-4o"),
    knowledge=knowledge,
    instructions="Utilise ta base de connaissances. Cite tes sources.",
    markdown=True,
)

agent.print_response("Quelle est la différence entre Pad Thai et Pad See Ew ?", stream=True)

Le reranking améliore typiquement la précision de 10-20%. Le surcoût en latence est faible (~100ms) car il ne traite que les Top-K résultats, pas toute la base.


Stratégies de Chunking Avancées

Le chunking par défaut (fixed size) fonctionne, mais Agno propose des stratégies plus sophistiquées :

Chunking Sémantique

Regroupe les phrases par similarité de sens au lieu de couper à taille fixe. Les chunks respectent les frontières sémantiques.

Chunking Markdown

Découpe par sections (titres h1, h2, h3). Idéal pour la documentation technique.

Chunking Récursif

Essaie d''abord de couper par paragraphes, puis par phrases, puis par mots. Préserve au maximum la structure du texte.

StratégieQualitéVitesseCas d''usage
Fixed SizeMoyenneRapideTexte homogène
RecursiveBonneRapideTexte structuré
SemanticExcellenteLenteQualité maximale
MarkdownExcellenteRapideDocumentation technique
AgenticMaximaleTrès lenteCas critiques

Le chunking agentic utilise un LLM pour décider où couper. C''est la meilleure qualité mais aussi le plus lent et le plus cher. Réservez-le aux documents critiques.


Agentic RAG avec KnowledgeTools

Le problème du RAG naïf

Un RAG basique cherche toujours dans la base de connaissances, même quand la question est triviale ("Bonjour", "Quelle heure est-il ?"). C''est un gaspillage de ressources.

La solution : KnowledgeTools

Au lieu d''injecter automatiquement les documents, on donne à l''agent des outils pour chercher. L''agent décide lui-même quand chercher.

from agno.agent import Agent
from agno.knowledge.embedder.openai import OpenAIEmbedder
from agno.knowledge.knowledge import Knowledge
from agno.models.openai import OpenAIResponses
from agno.tools.knowledge import KnowledgeTools
from agno.vectordb.lancedb import LanceDb, SearchType

# Knowledge Base
knowledge = Knowledge(
    vector_db=LanceDb(
        uri="tmp/lancedb",
        table_name="docs_agentic",
        search_type=SearchType.hybrid,
        embedder=OpenAIEmbedder(id="text-embedding-3-small"),
    ),
)

knowledge.insert(path="./documentation/")

# KnowledgeTools : l''agent décide quand chercher
knowledge_tools = KnowledgeTools(
    knowledge=knowledge,
    think=True,        # L''agent réfléchit avant de chercher
    search=True,       # Peut faire des recherches
    analyze=True,      # Évalue la pertinence des résultats
    add_few_shot=True, # Exemples d''utilisation dans le prompt
)

agent = Agent(
    model=OpenAIResponses(id="gpt-4o"),
    tools=[knowledge_tools],
    instructions=[
        "Tu es un assistant technique.",
        "Utilise tes outils de recherche quand l''utilisateur pose une question factuelle.",
        "Pour les salutations ou questions triviales, réponds directement.",
    ],
    markdown=True,
)

# L''agent ne cherche PAS pour ça :
agent.print_response("Bonjour !", stream=True)

# L''agent CHERCHE pour ça :
agent.print_response("Comment configurer le module d''authentification ?", stream=True)

L''Agentic RAG est plus intelligent et plus efficient que le RAG classique. L''agent ne surcharge pas son contexte avec des documents inutiles et peut reformuler ses recherches si les premiers résultats ne sont pas satisfaisants.


RAG en Production avec Mémoire

En production, l''agent doit :

  • Se souvenir des conversations précédentes
  • Persister ses données entre les redémarrages

Agent RAG avec SQLite Storage

import asyncio
from agno.agent import Agent
from agno.db.sqlite import SqliteDb
from agno.knowledge.embedder.openai import OpenAIEmbedder
from agno.knowledge.knowledge import Knowledge
from agno.models.openai import OpenAIResponses
from agno.vectordb.lancedb import LanceDb, SearchType

# Knowledge Base
knowledge = Knowledge(
    vector_db=LanceDb(
        uri="tmp/lancedb",
        table_name="production_docs",
        search_type=SearchType.hybrid,
        embedder=OpenAIEmbedder(id="text-embedding-3-small"),
    ),
)

# Charger les documents de manière asynchrone
asyncio.run(knowledge.ainsert(
    name="Documentation",
    url="https://docs.agno.com/llms-full.txt"
))

# Agent avec mémoire persistante
agent = Agent(
    name="Assistant Production",
    model=OpenAIResponses(id="gpt-4o"),
    knowledge=knowledge,
    instructions=[
        "Cherche dans ta base de connaissances avant de répondre.",
        "Si tu ne trouves pas l''information, dis-le clairement.",
        "Réponds en français.",
    ],
    # Mémoire persistante via SQLite
    db=SqliteDb(
        session_table="sessions",
        db_file="tmp/agents.db",
    ),
    add_history_to_context=True,  # Inclut l''historique dans le contexte
    markdown=True,
)

# L''agent se souvient des conversations précédentes
agent.print_response("Je travaille sur le module d''auth", stream=True)
# ... plus tard ...
agent.print_response("Quels sont les paramètres de configuration ?", stream=True)
# → L''agent sait qu''on parle du module d''auth

PgVector pour la production

En production, remplacez LanceDB par PgVector :

from agno.vectordb.pgvector import PgVector, SearchType

knowledge = Knowledge(
    vector_db=PgVector(
        db_url="postgresql://user:pass@localhost:5432/mydb",
        table_name="documents",
        search_type=SearchType.hybrid,
        embedder=OpenAIEmbedder(id="text-embedding-3-small"),
    ),
)
# Installation pour PgVector
pip install agno openai pgvector psycopg pypdf

En production, utilisez PgVector plutôt que LanceDB. PgVector est une extension PostgreSQL qui s''intègre dans votre infrastructure existante, supporte les transactions et le backup standard.


Évaluer la Qualité du RAG

Les 4 métriques clés

MétriqueQuestionMesure
Context PrecisionLes docs récupérés sont-ils pertinents ?% de chunks utiles parmi les récupérés
Context RecallA-t-on récupéré tous les docs nécessaires ?% de docs pertinents trouvés
FaithfulnessLa réponse est-elle fidèle aux documents ?Pas d''info inventée
Answer RelevancyLa réponse répond-elle à la question ?Pertinence de la réponse

Évaluation manuelle (recommandée pour commencer)

# Créer un dataset de test
test_cases = [
    {
        "question": "Comment configurer l''authentification ?",
        "expected_docs": ["auth-config.md", "security-guide.md"],
        "expected_answer_contains": ["JWT", "token", "middleware"],
    },
    {
        "question": "Quels sont les prérequis système ?",
        "expected_docs": ["requirements.md"],
        "expected_answer_contains": ["Python 3.8", "PostgreSQL"],
    },
]

# Tester chaque cas
for case in test_cases:
    response = agent.run(case["question"])
    answer = response.content

    # Vérifier que les mots-clés attendus sont présents
    found = [kw for kw in case["expected_answer_contains"] if kw.lower() in answer.lower()]
    missing = [kw for kw in case["expected_answer_contains"] if kw.lower() not in answer.lower()]

    print(f"Question : {case['question']}")
    print(f"Mots-clés trouvés : {found}")
    print(f"Mots-clés manquants : {missing}")
    print(f"Score : {len(found)}/{len(case['expected_answer_contains'])}")
    print("---")

Évaluation avec l''API Agno

Agno supporte des évaluations via son API REST avec plusieurs types : accuracy, agent_as_judge, performance, reliability.


Checklist de Production

Avant de déployer votre RAG en production, vérifiez :

  • Vector DB : PgVector ou Pinecone (pas LanceDB)
  • Recherche hybride activée
  • Reranking configuré (Cohere rerank-v3.5)
  • Chunking adapté au type de documents
  • Mémoire persistante (SQLite ou PostgreSQL)
  • Tests d''évaluation sur un dataset de référence
  • Rate limiting sur l''API
  • Logging des questions et réponses pour amélioration continue
  • Fallback si la vector DB est indisponible

Pour Aller Plus Loin

  • Explorez la documentation Agno pour les fonctionnalités avancées
  • Testez le chunking sémantique sur vos documents et comparez avec le chunking fixe
  • Implémentez un feedback loop : les utilisateurs notent les réponses et vous améliorez le dataset
  • Combinez RAG + function calling pour un agent qui peut chercher ET agir (créer un ticket, envoyer un email)

Specialiste IA — Master Intelligence Artificielle

Diplome d'un Master en Intelligence Artificielle, je travaille au quotidien sur des projets IA en entreprise. J'ai cree IwanttolearnAI pour rendre l'apprentissage de l'IA accessible a tous, gratuitement.