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égie | Qualité | Vitesse | Cas d''usage |
|---|---|---|---|
| Fixed Size | Moyenne | Rapide | Texte homogène |
| Recursive | Bonne | Rapide | Texte structuré |
| Semantic | Excellente | Lente | Qualité maximale |
| Markdown | Excellente | Rapide | Documentation technique |
| Agentic | Maximale | Très lente | Cas 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"),
),
)
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étrique | Question | Mesure |
|---|---|---|
| Context Precision | Les docs récupérés sont-ils pertinents ? | % de chunks utiles parmi les récupérés |
| Context Recall | A-t-on récupéré tous les docs nécessaires ? | % de docs pertinents trouvés |
| Faithfulness | La réponse est-elle fidèle aux documents ? | Pas d''info inventée |
| Answer Relevancy | La 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.
Continuer a apprendre
Stratégies de Chunking et Indexation pour le RAG
La qualité d'un RAG repose à 80% sur le chunking. Découvrez comment découper vos documents pour maximiser la pertinence des réponses de votre agent IA.
GraphRAG et Hybrid Search : BM25 + Vecteur
Le RAG vectoriel pur a ses limites. Hybrid search (BM25 + embedding) et GraphRAG résolvent les cas complexes — apprenez à les implémenter avec Agno et LanceDB.
Vector Databases : pgvector vs Pinecone vs Weaviate : Comparatif Complet
pgvector, Pinecone, Weaviate, LanceDB, Qdrant… comment choisir sa vector database ? Comparatif complet avec intégration Agno et cas pratique Supabase.