Ce que nous allons construire
L’implémentation de référence est un petit projet Python avec quelques parties clairement définies :| Partie | Ce qu’elle fait |
|---|---|
| CLI | Accepte un sujet de recherche, un modèle, des fournisseurs, des paramètres de profondeur, un chemin de sortie et un répertoire d’artefacts |
| Client Venice | Appelle les chat completions, les chat completions en streaming et POST /augment/scrape |
| Couche de recherche | Recherche sur DuckDuckGo par défaut, avec une découverte optionnelle de papiers arXiv |
| Modèles de données | Suit les URL sources, les URL canoniques, les chunks, les preuves, les notes, les erreurs et les rapports |
| Agent de recherche | Planifie les recherches, lit les sources, extrait les preuves, analyse les lacunes, génère des requêtes complémentaires et rédige le rapport final |
| Rédacteur d’artefacts | Stocke des enregistrements JSONL auditables pour les requêtes, lacunes de recherche, résultats, fetches, chunks, notes de sources, brouillons de rapports, erreurs et rapports |
- Demander à Venice de générer des requêtes de recherche diversifiées pour le sujet.
- Rechercher sur le web avec un ou plusieurs fournisseurs.
- Dédupliquer les URL avant de les lire.
- Utiliser l’endpoint de scraping de Venice pour transformer chaque page source publique en Markdown.
- Diviser les longues pages en chunks.
- Demander à Venice d’extraire les preuves de chaque chunk.
- Demander à Venice de transformer les preuves des chunks en notes de source.
- Identifier les lacunes de recherche et les problèmes d’équilibre des sources avant de générer des requêtes complémentaires.
- Demander à Venice de synthétiser le rapport final avec des citations de style notes de bas de page.
Configuration du projet
Le projet de référence utilise Python 3.13 etuv, mais le même code fonctionne aussi avec un environnement virtuel normal.
Créez un nouveau projet :
pip, créez un environnement virtuel et installez les mêmes paquets :
.env pour le développement local :
VENICE_MODEL afin que vous puissiez changer de modèle sans modifier le code. L’implémentation de référence utilise actuellement openai-gpt-55 par défaut, mais vous pouvez le remplacer par un autre modèle de chat disponible pour votre compte Venice.
Création des modèles de données
Avant d’écrire la logique de l’agent, nous allons définir les objets qui circulent dans le pipeline. Ces modèles facilitent la compréhension du reste du code car chaque source porte sa provenance : d’où elle vient, quelle requête l’a trouvée, quand elle a été récupérée et comment elle a été découpée en chunks. Créezresearch_agent/models.py :
canonical_url, content_hash et chunks.
canonical_url permet à l’agent d’éviter de lire la même source plusieurs fois lorsque les résultats de recherche ne diffèrent que par des paramètres de suivi ou des fragments. content_hash aide à détecter les pages dupliquées même lorsqu’elles se trouvent à des URL différentes. chunks nous permet de résumer de longues pages en petits morceaux au lieu de perdre des preuves utiles à cause des limites de contexte.
Ajoutez les fonctions utilitaires sous les dataclasses :
Construction du client Venice
Ensuite, nous allons créer un petit client Venice. Vous pourriez utiliser le SDK Python d’OpenAI pour les chat completions car Venice est compatible OpenAI, mais l’implémentation de référence utilise directementhttpx afin que le même client puisse appeler l’endpoint POST /augment/scrape de Venice.
Créez research_agent/venice.py :
from_env() empêche les secrets de figurer dans votre code source. Il rend également le développement local pratique car python-dotenv peut charger VENICE_API_KEY et VENICE_MODEL depuis .env.
Maintenant, ajoutez les chat completions :
_post_chat_stream() qui lit les server-sent events des chat completions en streaming. Vous pouvez commencer sans streaming, puis l’ajouter une fois que le reste du flux de recherche fonctionne.
Ajout des fournisseurs de recherche
La couche de recherche a deux tâches : trouver les URL sources et récupérer ces URL via le scraper Venice. L’implémentation de référence utilise l’endpoint HTML de DuckDuckGo pour la recherche web générale et l’API Atom d’arXiv pour les papiers. Créezresearch_agent/web.py :
WebSearch coordonne les fournisseurs et récupère les pages :
Écriture des artefacts locaux
Pour les workflows de recherche, l’auditabilité est importante. Si le rapport final dit quelque chose de surprenant, vous devriez pouvoir inspecter quelle source y a mené. Créezresearch_agent/artifacts.py :
Construction de l’agent de recherche
Maintenant que nous avons Venice, la recherche, les modèles et les artefacts, nous pouvons construire l’agent lui-même. Créezresearch_agent/agent.py :
models.py si vous ne les avez pas encore ajoutées :
ResearchAgent :
run() coordonne les passes de recherche :
seen_* sont ce qui empêche l’agent de perdre du temps sur des sources dupliquées. La déduplication d’URL détecte les liens répétés. La déduplication par hachage de contenu détecte les miroirs, les articles syndiqués et les pages qui redirigent vers le même contenu final.
Planification des recherches initiales et complémentaires
Le premier appel au modèle transforme le sujet en requêtes de recherche :_gap_follow_up_queries(), qui demande à Venice de renvoyer à la fois les enregistrements de lacunes et les requêtes :
--artifacts est activé, ces enregistrements sont écrits dans research_gaps.jsonl. Cela vous donne une trace d’audit utile pour comprendre pourquoi l’agent a recherché une requête particulière en deuxième passe.
Le parseur doit être tolérant. Si le modèle renvoie un JSON mal formé, l’agent revient au sujet original :
Lecture et résumé des sources
Maintenant, nous collectons les notes de source. L’agent recherche chaque requête, récupère chaque résultat via le scraping Venice, découpe le Markdown en chunks et résume les preuves utiles.Rédaction du rapport final
Une fois que l’agent dispose des notes de source, il peut rédiger le rapport. Commencez par un rédacteur de rapport en une seule passe :Ajout de la CLI
Nous avons maintenant besoin d’un point d’entrée en ligne de commande. Créezmain.py :
| Option | Ce qu’elle contrôle |
|---|---|
--iterations | Nombre de passes de recherche |
--queries | Requêtes de recherche générées par passe |
--results | Résultats lus par fournisseur pour chaque requête |
--providers | Fournisseurs de recherche, comme duckduckgo ou duckduckgo,arxiv |
--max-sources | Nombre maximal de sources utilisables à collecter |
--chunk-chars | Taille approximative des chunks avant l’extraction des preuves de source |
--max-chunks-per-source | Nombre de chunks résumés par source |
--report-style | Profondeur du rapport final : brief, standard ou deep |
--artifacts | Répertoire pour les enregistrements d’audit JSONL |
--output | Chemin pour le rapport Markdown final |
Exécution de l’agent
Exécutez une passe de recherche rapide :brief pour un briefing concis sourcé, standard pour une étude plus complète et deep pour le workflow par étapes plan/section/éditeur.
Enregistrez des artefacts auditables :
source_notes.jsonl montre les preuves de source résumées, research_gaps.jsonl montre pourquoi des recherches complémentaires ont été générées, et errors.jsonl montre les pages qui ont échoué pendant la recherche, le scraping ou le résumé.
Notes sur la confidentialité et la fiabilité
Un agent de recherche touche à plusieurs systèmes, il est donc utile d’être précis sur ce qui va où :| Couche | Ce qui voit les données |
|---|---|
| CLI locale | Le sujet, la configuration, les notes de source, les artefacts et les rapports finaux restent sur votre machine |
| Fournisseur de recherche | Les requêtes de recherche sont envoyées au fournisseur que vous choisissez, comme DuckDuckGo ou arXiv |
| Scraping Venice | Les URL des sources publiques sont envoyées à l’endpoint de scraping de Venice |
| Chat completions Venice | Les prompts, les chunks de source, les notes de source et les instructions de génération de rapport sont envoyés à Venice |
| Fichiers de sortie | Les rapports Markdown et les artefacts JSONL sont écrits localement |
POST /augment/search de Venice au lieu d’interroger directement DuckDuckGo. L’implémentation de référence utilise des fournisseurs publics légers afin que la démo reste facile à exécuter et à comprendre.
Pour la fiabilité, gardez ces valeurs par défaut prudentes :
- Utilisez des retries pour les appels à Venice et les requêtes web.
- Ajoutez un petit
--request-delaysi vous lisez de nombreuses pages du même hôte. - Plafonnez
--max-sourcespour que les sujets larges ne s’exécutent pas indéfiniment. - Enregistrez
--artifactspour les rapports importants afin de pouvoir auditer la sortie finale. - Traitez le rapport comme un briefing, pas comme une vérité absolue. Suivez les citations jusqu’à la source originale lorsque la précision est importante.
Tester les composants
Vous n’avez pas besoin de requêtes web en direct ni d’appels Venice pour tester la plupart du système. Le dépôt de référence utilise de fausses classes Venice et web pour tester la boucle de recherche, le comportement de déduplication, les artefacts et les prompts de rapport. Un premier test utile est la canonicalisation des URL :Benchmarking
De nombreux fournisseurs d’IA ont maintenant leurs propres workflows de recherche approfondie, donc le dépôt de référence inclut un benchmark simple comparé à l’outil Deep Research de Perplexity. Les deux agents ont été chargés de rédiger un rapport sur l’architecture des frameworks d’agents IA, puis les rapports générés ont été commités dans le dépôt GitHub. Ceci n’est pas censé être un benchmark formel. C’est une façon pratique d’inspecter la structure du rapport, la couverture des sources, la qualité des citations et de voir si l’agent se concentre trop sur un cluster de sources. C’est aussi pour cela que l’implémentation mise à jour suitresearch_gaps.jsonl et l’équilibre des sources avant les recherches complémentaires.
Étendre cet exemple
Une fois que l’agent de base fonctionne, voici des moyens pratiques de l’améliorer :- Ajouter un fournisseur de recherche Venice en utilisant
POST /augment/search. - Stocker les rapports et les artefacts dans une petite base de données SQLite au lieu de fichiers JSONL.
- Ajouter des allowlists ou blocklists de sources pour les domaines de recherche de confiance.
- Ajouter le support PDF en combinant le scraping Venice avec l’analyse de documents pour les sources qui n’exposent pas de HTML propre.
- Ajouter un ensemble d’évaluation de sujets et de types de sources attendus afin de pouvoir comparer la qualité de la recherche après des modifications de prompts.
- Ajouter une étape de relecture qui demande à Venice de trouver les affirmations non étayées dans le rapport final avant de l’enregistrer.