Selon nous, DeepSearch est essentiellement une grande boucle while. En respectant les limites maximales de jetons, il alterne entre la recherche, la lecture et la réflexion jusqu'à ce qu'il trouve la meilleure réponse. L'une des tâches clés du LLM est de déterminer quelle action entreprendre ensuite en fonction de l'état actuel de la mémoire. Doit-il continuer à chercher ? Lire la page web ? Ou répondre directement à la question ?
Dans notre implémentation node-deepresearch, nous utilisons un LLM standard (gemini-2.0-flash
) pour choisir l'action. Nous le qualifions de "standard" car le processus de raisonnement est explicitement défini via l'ingénierie de prompt, et fonctionne ensuite comme une séquence entrée-sortie avec l'action choisie retournée dans un objet JSON. Une question naturelle se pose donc : le remplacement de cette étape de décision par un modèle de raisonnement dédié améliorerait-il les performances de DeepSearch ?

Dans cet article, nous explorons l'utilisation de DeepSeek R1 671b, un LLM de raisonnement pour remplacer gemini-2.0-flash
pour cette étape de décision. Nous pensons que les capacités de raisonnement de R1 l'aideront à résoudre les problèmes complexes de recherche sur le web et d'analyse des résultats.
Pour tester ce concept, nous l'avons mis à l'épreuve sur un exemple pratique : la planification d'un itinéraire de vacances complet sur trois jours, puis nous évaluons ses performances. L'agent effectuant des tâches de recherche approfondie est susceptible de rencontrer les mêmes types de problèmes que les humains, donc dans notre tâche de vacances, le modèle peut rencontrer certains des problèmes suivants :
- Lacunes de connaissances (informations dépendantes d'autres informations) : Par exemple, vous voulez visiter la Tour Eiffel, mais ne savez pas si elle est ouverte les jours fériés. Vous devez trouver à la fois les horaires de la tour pendant les jours fériés et les dates des jours fériés français.
- Informations erronées ou obsolètes : Un blog de voyage de 2020 suggère qu'un restaurant spécifique à Rome est ouvert le dimanche, mais à l'arrivée, vous découvrez qu'il a changé ses horaires et est maintenant fermé le dimanche.
- Informations contradictoires : Un site de voyage affirme qu'un hôtel particulier à New York offre le petit-déjeuner gratuit, tandis qu'un autre site indique que le petit-déjeuner n'est pas inclus dans le prix de la chambre.
- Informations ambiguës : Un message sur un forum de voyage mentionne "une belle plage près de Barcelone" sans préciser quelle plage ni donner d'indications claires, rendant difficile la localisation exacte.
R1 peut décomposer des tâches complexes en étapes réalisables, identifier les lacunes et les incohérences, et surmonter les obstacles comme les sites web bloqués et les murs d'abonnement. Il possède les capacités de raisonnement pour rassembler les connaissances requises et synthétiser une réponse. Cependant, il ne peut pas planifier des vacances pour nous tout seul — cela nécessite de rechercher sur le web et de comprendre les résultats qu'il obtient. Nous devons l'améliorer, en mettant en place un cadre et en renforçant ses capacités, avant qu'il ne soit à la hauteur de la tâche.
tagImplémentation

Pour exécuter le notebook, vous aurez besoin des clés API gratuites de Jina AI et OpenRouter.
Bien que R1 soit le moteur de notre agent, nous ajoutons également des outils, un objet d'état et, bien sûr, un prompt (plutôt volumineux). Voici une représentation simplifiée :

- Les outils peuvent être appelés par le modèle pour rechercher et extraire des informations du web, et les résultats sont stockés dans l'état.
- L'état garde une trace des résultats des outils, du statut des tâches et des connaissances. Il est stocké dans le prompt lui-même.
- Un prompt unique fournit les instructions, spécifiant la tâche et la façon de procéder, tout en stockant l'état.
Nous examinerons chacun de ces éléments plus en détail plus tard dans l'article, en particulier le prompt. Mais, en bref, le système fonctionne comme suit :
Nous commençons avec le prompt avec un objet d'état non rempli. Tant que la tâche est en cours (c'est-à-dire qu'elle essaie de produire une réponse), l'agent exécute la boucle suivante jusqu'à ce qu'il produise une réponse :
- Le modèle examine la tâche et son état à partir du prompt, et réfléchit à la meilleure façon d'utiliser ses outils pour obtenir une réponse.
- Le modèle produit un objet JSON spécifiant son statut (
IN PROGRESS
ouDONE
), les mises à jour de la mémoire, les appels d'outils et la réponse (initialementnull
). - L'agent appelle les outils de manière asynchrone et les résultats sont intégrés dans le prompt, ainsi que l'objet JSON de l'étape 3.
- Le prompt (contenant ces nouvelles informations) est réinjecté dans le modèle pour exécuter une autre boucle.
Dès que le modèle fournit une réponse dans sa sortie, la tâche se termine et la réponse est livrée.
Maintenant que nous avons un aperçu général, examinons les outils, l'état et le prompt tour à tour :
tagOutils
Puisque R1 ne peut pas rechercher ou extraire des informations du web par lui-même, nous accédons à l'API Reader de Jina pour étendre ses capacités. Cela inclut deux modes :
- Mode recherche : recherche sur le web des termes pertinents et renvoie les résultats du moteur de recherche (y compris les URLs, les titres et les descriptions de chaque résultat).
- Mode lecture : extrait les pages des résultats de recherche et les renvoie au format Markdown.
En raison de la fenêtre de contexte limitée de R1, nous ne pouvons pas simplement déverser une page entière dans la section Tool Results
du prompt. Nous avons besoin d'outils supplémentaires pour sélectionner uniquement les informations les plus pertinentes avant de les transmettre au modèle :
- LangChain recursive character text splitter : Nous découpons les longues sorties en segments avec
RecursiveCharacterTextSplitter
, en divisant récursivement les paragraphes et les phrases jusqu'à obtenir la taille de segment souhaitée. Cela garantit que la sortie est facilement digérable par la fenêtre de contexte limitée de R1. - Jina Reranker : Nous reclassons les segments avec jina-reranker-v2-base-multilingual et combinons les segments les mieux classés en un seul résultat.
Malheureusement, DeepSeek R1 ne prend pas en charge l'utilisation d'outils de la même manière que o3-mini
. Par exemple, avec o3-mini
, nous pourrions utiliser quelque chose comme ceci :
def scrape_page(url: str):
"""Scrape a web page with Jina Reader"""
tools = [
{
"type": "function",
"function": {
"name": "scrape_page",
"description": "Scrape the content of a webpage",
"parameters": {
"url": {"type": "string", "description": "The URL to scrape"}
}
}
}
]
client = OpenAI()
response = client.completions.create(
model="o3-mini",
prompt=f"Scrape www.skyscanner.net/routes/gr/de/germany-to-crete.html",
tools=tools
)
Exemple de code o3-mini pour supporter l'utilisation d'outils
Mais ce n'est pas si simple avec R1 : Il n'a pas de paramètre tools
que nous pouvons passer à l'API, et il ne retournera pas de tool_calls
structurés dans sa réponse. En bref, il n'a pas été entraîné à utiliser des outils (et il ne les supportera pas de sitôt). Du moins, il ne les supporte pas au sens traditionnel. Cependant, nous pouvons toujours demander à R1 de produire des appels d'outils au format JSON, et réinjecter les résultats des appels d'outils dans le modèle pour analyse :
Vous devez répondre avec un objet JSON valide contenant :
```json
{
"tool_calls": [
{"tool": "search", "input": "Vols les moins chers d'Allemagne vers la Crète mai 2025"},
{"tool": "scrape", "input": "<https://www.skyscanner.net/routes/gr/de/germany-to-crete.html>"}
]
}
```
Appels d'outils dans le prompt de R1
Après que le modèle produit des appels d'outils à l'itération n, les outils sont appelés et les résultats sont intégrés dans la section Tool Results
du prompt pour que le modèle puisse raisonner à l'itération n+1 :
Tool Results:
Source 1️: search: Cheapest flights from Germany to Crete May 2025
Result:
```
Title: Affordable flights: Germany - Heraklion (Crete) (HER) | Eurowings URL Source: https://www.eurowings.com/en/booking/offers/flights-from/DE/to/GR/HER.html Description: Affordable flights from Germany to Heraklion (Crete) ✈ Eurowings brings you closer to your dream destination from as little as €89.99*. Book now and enjoy.
Title: Are you a person or a robot? URL Source: https://www.skyscanner.com/routes/fran/her/frankfurt-to-crete-heraklion.html Description: Book a one-way ticket from Frankfurt to Heraklion Airport from $78 or travel return from just $154. The prices shown are based on availability and could change ...
```
Résultats des outils, montrant les résultats de recherche pour les vols Allemagne-Crète
tagÉtat
L'état conserve le statut de la tâche (Status
) et les connaissances (Memory
) que le modèle doit analyser et mettre à jour. En bref, c'est la mémoire de travail et les banques de mémoire du système. Ceci est stocké dans une section du prompt appelée {{ workspace }}
et commence comme une page blanche :
Status: IN_PROGRESS
Memory:
... no memory blocks ..
Objet d'état vide
Lorsque le modèle raisonne sur la tâche, exécute des outils et recueille des résultats, l'état est rempli de blocs de mémoire (dérivés des résultats des outils), chacun avec son propre ID attribué aléatoirement. Pour notre exemple de planification de vacances, l'état pourrait ressembler à ceci après une itération de l'agent :
Status: IN_PROGRESS
Memory:
<nuz-032>Potential warm May destinations: Malaga (Spain), Crete (Greece), Algarve (Portugal)</nuz-032>
<xwj-969>URL to scrape for Crete hotel details: <https://www.tripadvisor.com/HotelsList-Crete-Beachfront-Cheap-Hotels-zfp13280541.html></xwj-969>
<vsc-583>URL to scrape for flight details: <https://www.expedia.com/lp/flights/fra/her/frankfurt-to-heraklion></vsc-583>
État peuplé par DeepSeek R1
Les blocs de mémoire sont mis à jour en incluant une liste de memory_updates
dans la réponse JSON du modèle :
{
"memory_updates": [
{"operation": "add", "content": "Round-trip flight from Berlin to Tenerife in May 2025 ranges from €59.99 to €200 round-trip as per the Skyscanner and Iberia sources."},
{"operation": "delete", "id": "nuz-032"},
...
]
}
Mises à jour de la mémoire dans la sortie JSON de R1
- L'opération
add
ajoute un bloc de mémoire et peut être utilisée pour stocker des informations importantes telles que des pistes, des découvertes, des lacunes d'information et des actions déjà entreprises. - L'opération
delete
supprime un bloc de mémoire, permettant au modèle de supprimer les informations anciennes, inutiles ou fausses et de maintenir un espace de travail propre.
replace
, mais nous avons constaté que le modèle générait de grands blocs d'information (s'appuyant trop sur replace
), et avons décidé de supprimer cette option.Par rapport à l'émission d'appels d'outils, R1 est moins familier avec la gestion de sa propre mémoire. Bien que le modèle ait été spécifiquement entraîné pour résoudre des problèmes mathématiques complexes et des tâches de codage — un entraînement qui lui permet de produire des objets JSON précis et d'exécuter des appels d'outils — il n'a pas été entraîné à gérer des états de type mémoire (pas plus qu'aucun autre modèle que nous connaissons).
Stocker les informations en utilisant un état compact de type mémoire présente plusieurs avantages par rapport au stockage de l'ensemble de la sortie du modèle à chaque tour. Cette approche condense l'information dans le prompt, évitant le débordement du contexte tout en améliorant la concentration du modèle sur les connaissances pertinentes. Nous conservons le format JSON car il est facile à mettre à jour, mais le JSON est rendu dans un format lisible par l'homme dans le prompt lui-même.
Néanmoins, la gestion de la mémoire reste en dehors du domaine principal de R1 ; nous avons dû mettre en œuvre plusieurs instructions pour guider le modèle dans la gestion appropriée des opérations de mémoire. Voici la partie de notre prompt qui traite de cela :
... autres contenus du prompt ...
## Memory Block Usage
- Each memory block has a unique ID in format <abc-123>content</abc-123>
- Create separate blocks for distinct pieces of information:
* Discovered URLs (both explored and pending)
* Information gaps that need investigation
* Actions already taken (to avoid repetition)
* Promising leads for future exploration
* Key facts and findings
* Contradictions or inconsistencies found
- Keep each block focused on a single idea or piece of information
- Always cite sources when recording information from tool results
- Use IDs to track and manage your knowledge (e.g., deleting outdated information)
- Make sure to store sources (URLs) for the facts and findings you store
## Lead Management
- Since you can only make 3 tool calls per round, store promising leads for later
- Create dedicated memory blocks for URLs to scrape later
- Maintain blocks for potential search queries to explore in future rounds
- Prioritize leads based on relevance to the task
... autres contenus du prompt ...
Instructions de gestion de la mémoire dans le prompt
tagPrompt
Nous avons créé le prompt en utilisant le format de template Jinja. Il se compose de plusieurs sections :
- Contexte (dans ce cas, la date actuelle).
- Instructions, couvrant le fonctionnement de tout, et indiquant au modèle quels outils sont disponibles.
- État, discuté ci-dessus.
- Sorties des outils, des outils
search
etscrape
.
{% macro format_tool_results(tool_records) %}
{% for to in tool_records %}
Source {{ loop.index }}️: {{ to.tool }}: {{ to.input }}
Result:
```
{{ to.output }}
```
{% endfor %}
{% endmacro %}
The date: `{{ current_date }}`.
You are an information analysis and exploration agent that builds solutions through systematic investigation.
## Investigation Cycle
You operate in a continuous investigation cycle:
1. Review current workspace (your memory blocks)
2. Analyze new tool results (or initial task if first round)
3. Update memory with new insights and track investigation progress
4. Decide on next tools to call based on identified leads and information gaps
5. Repeat until task completion
## Memory Structure
Your memory persists between investigation cycles and consists of:
- **Status**: Always the first line, indicates if the task is IN_PROGRESS or DONE
- **Memory**: A collection of discrete information blocks, each with a unique ID
## Memory Block Usage
- Each memory block has a unique ID in format <abc-123>content</abc-123>
- Create separate blocks for distinct pieces of information:
* Discovered URLs (both explored and pending)
* Information gaps that need investigation
* Actions already taken (to avoid repetition)
* Promising leads for future exploration
* Key facts and findings
* Contradictions or inconsistencies found
- Keep each block focused on a single idea or piece of information
- Always cite sources when recording information from tool results
- Use IDs to track and manage your knowledge (e.g., deleting outdated information)
- Make sure to store sources (URLs) for the facts and findings you store
## Lead Management
- Since you can only make 3 tool calls per round, store promising leads for later
- Create dedicated memory blocks for URLs to scrape later
- Maintain blocks for potential search queries to explore in future rounds
- Prioritize leads based on relevance to the task
## Available Tools
- **search**: Use for broad information gathering on new topics or concepts
* Example: {"tool": "search", "input": "renewable energy statistics 2023"}
- **scrape**: Use for extracting specific details from discovered URLs
* Example: {"tool": "scrape", "input": "https://example.com/energy-report"}
## Tool Usage Guidelines
- **When to use search**: For new concepts, filling knowledge gaps, or exploring new directions
- **When to use scrape**: For URLs discovered that likely contain detailed information
- **Maximum 3 tool calls per round**
- **Never repeat the exact same tool call**
- **Always record valuable information from tool results in memory blocks**
## Response Format
You must respond with a valid JSON object containing:
```json
{
"status_update": "IN_PROGRESS or DONE",
"memory_updates": [
{"operation": "add", "content": "New insight or lead to investigate"},
{"operation": "delete", "id": "abc-123"}
],
"tool_calls": [
{"tool": "search", "input": "specific search query"},
{"tool": "scrape", "input": "https://discovered-url.com"}
],
"answer": "Your final, comprehensive answer when status is DONE"
}
```
## Important Rules
- The "add" operation creates a new memory block
You do not need to specify an ID, it will be added automatically by the system.
- The "delete" operation requires the specific ID of the block to remove
- Never invent or fabricate information - only use facts from your memory or tool results
- Never make up URLs - only use URLs discovered through tool results
- CRITICAL: Any information not recorded in your memory blocks will be lost in the next round
For example, if you find a potential webpage to scrap, you must store the URL and your intention
Example: `{"operation": "add", "content": "Found relevant URL: https://... to scrape ..."}`
- Set status to "DONE" only when you have fully addressed the task
- Only include the "answer" field when status is "DONE"
Task:
```
{{ task }}
```
Current workspace:
```
{{ workspace }}
```
Tool Results:
{{ format_tool_results(tool_records) if tool_records else '... no previous tool results ...'}}
IMPORTANT: Generate a valid JSON response following the format above.
Think carefully about:
- what information do you need to preserve
- which tools to call next
- how to build your answer systematically with focused memory blocks
Prompt complet utilisé dans notre système de recherche approfondie
tagÉvaluation
Nous avons mis notre système à l'épreuve avec notre exemple de planification de vacances. Voici la tâche intégrée dans le prompt :
Help me plan a 3 day holiday in Europe in May for under 2000 EUR
1. I need specific flight and hotel recommendations.
2. I want the destination to be warm.
3. I want to have a beach nearby the hotel.
I live in Germany.
Voici le résultat final (après cinq itérations de la boucle) :
**3-Day Crete Holiday Plan (Total ≈ €600-800)**
✈️ *Flights (From Frankfurt):*
- Skyscanner: €154 round trip (May 2025 dates)
Source: <https://www.skyscanner.com/routes/fran/her/frankfurt-to-crete-heraklion.html>
- Backup: Eurowings €180 round trip
🏨 *Beachfront Hotels:*
1. **Georgioupolis Beach Hotel**
- Direct beach access, bike rentals €10
- Source: <https://www.tripadvisor.com/HotelsList-Crete-Beachfront-Cheap-Hotels-zfp13280541.html>
2. **JT Apartments**
- €57/night, 9.5/10 rating, 5-min walk to beach
- Source: <https://www.booking.com/region/gr/crete.html>
3. **FNK Apartments**
- Sea views, 9.6/10 rating
💰 *Budget Breakdown:*
- Flights: €154
- Hotel (3 nights): €171-250
- Remaining: €1,600+ for meals/activities
*Note:* All hotels are <5 mins from beaches. Crete averages 25°C in May (Source: TravelSupermarket).
Résultat pour la recherche de vacances, après cinq itérations
Cette réponse semble légitime. Mais l'est-elle vraiment ? Après tout, les modèles sont connus pour avoir des hallucinations, et avec un système comportant plusieurs éléments mobiles, il est probable que quelque chose puisse mal tourner. Vérifions quelques détails dans la sortie de R1 :
tagDestination et budget total
Les calculs pour chaque élément s'additionnent correctement (nous verrons si chaque élément est exact ci-dessous). Après tout, R1 a été entraîné sur des problèmes mathématiques. La destination est également correcte ; la Crète est une destination populaire.
tagVols
Les prix des vols sont presque corrects, mais voyons où les choses ont mal tourné. Tout d'abord, voici les prix réels de Skyscanner de Francfort à Héraklion, pour mai 2025, aller-retour :

Nous pouvons voir que les prix sont tous autour de 200 EUR, et non les 154 EUR promis pour un aller-retour ! Mais d'où vient l'erreur ? En examinant les logs, nous trouvons un bloc de mémoire connexe qui a été ajouté au tour 3 :
{"operation": "add", "content": "Crete flight options: Eurowings €89.99* one-way ..."}
Bloc de mémoire lié aux vols Allemagne-Crète
Ce bloc semble être déduit du résultat de recherche joint :
Source 1️: search: Cheapest flights from Germany to Crete May 2025
Result:
```
... other results ...
Title: Are you a person or a robot?
URL Source: https://www.skyscanner.com/routes/fran/her/frankfurt-to-crete-heraklion.html
Description: Book a one-way ticket from Frankfurt to Heraklion Airport from $78 or travel
return from just $154. The prices shown are based on availability and could change ...
```
Résultat de recherche pour les vols Allemagne-Crète
Le modèle n'a jamais essayé d'extraire cette page web pour confirmer les résultats, mais cela n'aurait probablement pas fait de différence. Cependant, il aurait dû au moins remarquer que les résultats de recherche n'incluaient pas "mai" comme période.
tagHôtel
Les hôtels sont corrects, mais nous avons identifié quelques améliorations possibles. Premièrement, nous aurions souhaité que le modèle fasse plus d'efforts pour trouver les prix du Georgioupolis Beach Hotel et des FNK Apartments - bien qu'il fournisse d'autres informations, les prix font malheureusement défaut. Pour comprendre ce que nous voulons dire, voici la sortie brute de l'URL extraite URL qui a été utilisée pour générer les recommandations d'hôtels. Elle ne montre que les prix pour les premiers et derniers résultats, en sautant les trois du milieu :
Source 3️: scrape: https://www.booking.com/region/gr/crete.html
Résultat :
```
Afficher plus Afficher moins
Moritz Allemagne
* ### [JT Apartments](https://www.booking.com/hotel/gr/jt-apatments.html?label=gen173nr-1FCAYoXEIFY3JldGVIM1gEaJUCiAEBmAExuAEZyAEM2AEB6AEB-AECiAIBqAIDuALSvqC-BsACAdICJDc5ZWE5ZDJkLTI2ZWEtNGNiMS04MzNlLTJhNWIyMGI5Y2M3NdgCBeACAQ&sid=f21cdd5fe9eb08dcac7d3a0304f9ccc9)
Kissamos
À partir de 57 $ par nuit
9.5 Exceptionnel 313 avis
Je recommande vivement un séjour aux JT Apartments. En entrant dans l'appartement, nous avons eu une agréable surprise. Tout était bien équipé. Le quartier est paisible, supermarché à proximité. La plage est à quelques pas. C'est un excellent emplacement si vous voulez visiter les plus belles plages de Crète. Grâce à vous, notre séjour était exactement comme nous l'avions rêvé :)
Afficher plus Afficher moins
Katarzyna Pologne
Afficher plus Afficher moins
Aitor Allemagne
* ### [FNK Apartments with Sea View](https://www.booking.com/hotel/gr/f-amp-k-apartments.html?label=gen173nr-1FCAYoXEIFY3JldGVIM1gEaJUCiAEBmAExuAEZyAEM2AEB6AEB-AECiAIBqAIDuALSvqC-BsACAdICJDc5ZWE5ZDJkLTI2ZWEtNGNiMS04MzNlLTJhNWIyMGI5Y2M3NdgCBeACAQ&sid=f21cdd5fe9eb08dcac7d3a0304f9ccc9)
Agia Pelagia
9.6 Exceptionnel 64 avis
Nous étions en Crète pendant une semaine. Durant cette période, nous avons séjourné aux FnK Apartments. Froso et Konstantinos ont été des hôtes super sympathiques et formidables pour nous. Ils étaient toujours prêts à aider si nous avions des questions ou des besoins de toute sorte. L'appartement lui-même offre une vue magnifique sur Agia Pelagia et les baies environnantes (et même le magnifique lever de soleil). Nous ne pouvons que recommander les FnK Apartments !!
Afficher plus Afficher moins
Moritz Allemagne
Afficher plus Afficher moins
mary États-Unis
* ### [Artemis Hotel Apartments](https://www.booking.com/hotel/gr/artemis-hersonisos.html?label=gen173nr-1FCAYoXEIFY3JldGVIM1gEaJUCiAEBmAExuAEZyAEM2AEB6AEB-AECiAIBqAIDuALSvqC-BsACAdICJDc5ZWE5ZDJkLTI2ZWEtNGNiMS04MzNlLTJhNWIyMGI5Y2M3NdgCBeACAQ&sid=f21cdd5fe9eb08dcac7d3a0304f9ccc9)
Limenas Hersonissou, Hersonissos
9.0 Fantastique 419 avis
Si vous voulez vous sentir les bienvenus, être traités comme des amis, savoir que vous obtiendrez de l'aide pour tout, nous vous recommandons vivement de séjourner dans cet hôtel. Merci du fond du cœur à Konstantine pour l'accueil chaleureux et très personnel ! Lors de notre prochaine visite en Crète, nous serons heureux de séjourner à nouveau à l'hôtel Artemis !
Afficher plus Afficher moins
Irina Israël
Afficher plus Afficher moins
Ann Marie Irlande
* ### [Pinelopi Hotel](https://www.booking.com/hotel/gr/pinelopi.html?label=gen173nr-1FCAYoXEIFY3JldGVIM1gEaJUCiAEBmAExuAEZyAEM2AEB6AEB-AECiAIBqAIDuALSvqC-BsACAdICJDc5ZWE5ZDJkLTI2ZWEtNGNiMS04MzNlLTJhNWIyMGI5Y2M3NdgCBeACAQ&sid=f21cdd5fe9eb08dcac7d3a0304f9ccc9)
Platanes
7.8 Bien 198 avis
Excellent emplacement près de la plage, superbes tavernes et aussi bien situé pour voyager en voiture. Quartier calme, parfait pour des vacances merveilleuses. Chambres spacieuses équipées de tout le nécessaire. Excellent rapport qualité-prix. La zone de la piscine était excellente et vous pouvez vous y détendre à tout moment de la journée. La place de parking près de l'hôtel était parfaite. Je reviendrai certainement au Pinelopi Hotel lors de ma prochaine visite en Crète.
Afficher plus Afficher moins
Rita Roumanie
Afficher plus Afficher moins
Katarzyna Pologne
* ### [Elizabeth Suites](https://www.booking.com/hotel/gr/elizabeth-suites.html?label=gen173nr-1FCAYoXEIFY3JldGVIM1gEaJUCiAEBmAExuAEZyAEM2AEB6AEB-AECiAIBqAIDuALSvqC-BsACAdICJDc5ZWE5ZDJkLTI2ZWEtNGNiMS04MzNlLTJhNWIyMGI5Y2M3NdgCBeACAQ&sid=f21cdd5fe9eb08dcac7d3a0304f9ccc9)
Kato Daratso
À partir de 74 $ par nuit
9.1 Fantastique 86 avis
Nous avons passé un excellent séjour rendu encore plus personnel par Epas, le propriétaire, qui avait toujours le sourire et était très serviable, et le personnel était adorable, particulièrement Anna. Nous avons pris le petit-déjeuner quelques jours qui était plus que copieux. Les appartements étaient idéalement situés pour les plages et les restaurants. Nous recommandons vivement The Elizabeth Suites qui a rendu nos premières vacances en Crète 😊
Afficher plus Afficher moins
Jean Royaume-Uni
```
Résultats bruts des recherches d'hôtels en Crète sur booking.com
Deuxièmement, nous avons identifié un problème supplémentaire lors de l'utilisation de Reranker avec son paramètre prédéfini top_n
de 5 résultats - il s'avère que la page scrapée contenait plus de cinq résultats pertinents - nous aurions pu résoudre cela en vérifiant réellement le score de pertinence de chaque résultat, au lieu de prendre simplement les cinq premiers (ou un autre nombre) résultats. Cependant, la configuration idéale du reclassement varie selon les tâches. Une meilleure façon de gérer ce problème serait simplement d'utiliser la page entière scrapée - ce qui n'est malheureusement pas possible en raison de la longueur de contexte limitée de R1.
tagPerformance globale et améliorations potentielles
Le modèle a bien démarré initialement, mais nous avons remarqué qu'il tentait rarement de changer de stratégie ou de développer des plans complexes, sauf si on le lui demandait spécifiquement. Bien que R1 emploie naturellement ces approches pour les problèmes de mathématiques et de codage (domaines sur lesquels il a été spécifiquement entraîné), il n'applique pas le même raisonnement aux tâches de recherche. Bien que nous puissions affiner davantage le prompt (ou même utiliser plusieurs prompts) pour résoudre cette limitation, ce n'était pas notre objectif principal.
Nous avons également observé que R1 ne traitait pas adéquatement les informations sensibles au temps. En bref, si les résultats de recherche ne mentionnent pas explicitement une date incorrecte, le modèle suppose que l'information est valide sans vérification supplémentaire. Par exemple, pour la planification d'un vol le 1er mai :
- Allemagne vers Crète 80 $ 1er mai : Correct - Le modèle peut faire confiance à cette information.
- Allemagne vers Crète 80 $ 1er janvier : Incorrect - Le modèle identifie correctement et écarte cette information.
- Allemagne vers Crète 80 $ : Faux positif - Quand aucune date n'est spécifiée, le modèle ne vérifie pas l'information et suppose incorrectement sa validité.
Si nous devions poursuivre ce projet, nous pourrions envisager plusieurs améliorations potentielles :
- Suivre le nombre de blocs de mémoire et inviter le modèle à résumer les entrées lorsque l'état devient trop volumineux.
- Instruire le modèle à épuiser toutes les pistes avant de finaliser l'exploration et de répondre aux requêtes.
- Mettre l'accent sur la vérification des informations sensibles au temps.
- S'assurer que le modèle vérifie doublement les résultats en scrapant les URLs retournées par l'outil de recherche.
- Tester notre système avec de futurs modèles de raisonnement supportant des fenêtres de contexte plus larges, bien que cela nécessiterait une refactorisation et des tests substantiels pour adapter le prompt à un modèle différent.
tagConclusion
Même depuis la sortie assez récente de R1, le paysage a considérablement évolué. Des projets sont apparus qui entraînent des modèles de raisonnement à des coûts remarquablement bas - certains pour aussi peu que 5 $. Cette démocratisation signifie que l'entraînement de modèles spécialisés est plus accessible que jamais. Nos expériences avec R1 fournissent une base utile alors que nous continuons d'explorer comment les LLM axés sur le raisonnement peuvent être améliorés avec des outils pour traiter des tâches de recherche complexes.
Bien que notre exemple de planification de vacances ait démontré des résultats prometteurs (particulièrement pour un projet de démonstration rapide), il a également révélé les limites de R1 dans le traitement des tâches de recherche et de mémoire par rapport à ses points forts en mathématiques et en codage. Bien que le système ait réussi à produire un plan de voyage dans les limites du budget, il a montré des lacunes dans des domaines comme la vérification des informations sensibles au temps et l'exploration approfondie de toutes les options disponibles, soulignant l'écart entre l'orientation de l'entraînement du modèle et son application à différents domaines.