我々の見方では、DeepSearch は本質的に一つの大きな while ループです。最大トークン予算の中で、最適な回答を見つけるまで検索、読解、思考のサイクルを繰り返します。LLM の重要なタスクの一つは、現在のメモリ状態に基づいて次にどのアクションを取るべきかを判断することです。検索を続けるべきでしょうか?ウェブページを読むべきでしょうか?それとも直接質問に答えるべきでしょうか?
私たちの node-deepresearch の実装では、アクションの選択に 標準的な LLM(gemini-2.0-flash
)を使用しています。これを「標準的」と呼ぶのは、推論プロセスがプロンプトエンジニアリングを通じて明示的に概要化され、選択されたアクションが JSON オブジェクトとして返される sequence-in, sequence-out として動作するからです。そこで自然な疑問が生じます:この判断ステップを専用の推論モデルに置き換えることで、DeepSearch のパフォーマンスは向上するでしょうか?

この投稿では、DeepSeek R1 671b という推論 LLM を使用して、この判断ステップの gemini-2.0-flash
を置き換えることを検討します。R1 の推論能力は、ウェブ検索とその結果の分析における複雑な問題の解決に役立つと考えています。
このコンセプトをテストするために、実践的な例として包括的な 3 日間の休暇計画を立てるタスクを実行し、その性能を評価します。ディープサーチタスクを実行するエージェントは、人間と同じような問題に遭遇する可能性が高いため、この休暇タスクでは以下のような問題に直面する可能性があります:
- 知識のギャップ(他の情報に依存する情報):例えば、エッフェル塔を訪れたいが、祝日に開いているかどうかわからない。塔の休日スケジュールとフランスの祝日の日付の両方を調べる必要があります。
- 誤ったまたは古い情報:2020 年の旅行ブログでは、ローマのある特定のレストランが日曜日に営業していると書かれていますが、実際に行ってみると営業時間が変更されており、現在は日曜日が休業日になっています。
- 矛盾する情報:あるウェブサイトではニューヨークのあるホテルが無料の朝食を提供すると主張している一方で、別のサイトでは朝食は宿泊料金に含まれていないと述べています。
- 曖昧な情報:旅行フォーラムの投稿で「バルセロナ近くの素晴らしいビーチ」と言及されているが、具体的なビーチ名や明確な方向が示されておらず、正確な場所を特定するのが困難です。
R1 は複雑なタスクを実行可能なステップに分解し、ギャップと矛盾を特定し、ブロックされたウェブサイトや購読者向けウォールなどの障害を乗り越えることができます。必要な知識を収集し、回答を統合する推論能力を持っています。しかし、単独で休暇を計画することはできません — それにはウェブ検索とその結果の理解が必要です。このタスクに対応できるようにするには、フレームワークを設定し、その能力を強化する必要があります。
tag実装

ノートブックを実行するには、Jina AIとOpenRouterの無料 API キーが必要です。
R1 はエージェントのエンジンですが、いくつかのツール、状態オブジェクト、そしてもちろん(かなり大きな)プロンプトも追加します。以下は簡略化した表現です:

- ツールはモデルから呼び出して Web の検索とスクレイピングを行い、結果は状態に保存されます。
- 状態はツールの結果、タスクのステータス、知識を追跡します。これはプロンプト自体に保存されます。
- 単一のプロンプトは指示を提供し、タスクとその実行方法を指定するとともに、状態を保存します。
これらの詳細については後ほど、特にプロンプトについて説明します。簡単に言うと、システムは次のように機能します:
状態オブジェクトが未設定のプロンプトから始まります。タスクが進行中(つまり回答を生成しようとしている)の間、エージェントは回答を生成するまで以下のループを実行します:
- モデルはプロンプトからタスクとその状態を検証し、回答を得るためにツールをどのように使用するのが最適かを推論します。
- モデルはステータス(
IN PROGRESS
またはDONE
)、メモリの更新、ツールの呼び出し、回答(最初はnull
)を指定する JSON オブジェクトを出力します。 - エージェントは非同期でツールを呼び出し、結果はステップ 3 の JSON オブジェクトとともにプロンプトに埋め込まれます。
- この新しい情報を含むプロンプトがモデルに戻され、別のループを実行します。
モデルが出力で回答を提供し次第、タスクは終了し、回答が配信されます。
全体像を把握したところで、ツール、状態、プロンプトを順番に見ていきましょう:
tagツール
R1 は単独で Web の検索やスクレイピングができないため、Jina の Reader API を使用してその機能を拡張します。これには 2 つのモードがあります:
- 検索モード:関連する用語の Web 検索を行い、検索エンジンの結果(各結果の URL、タイトル、説明を含む)を返します。
- 読み取りモード:検索結果からページをスクレイピングし、Markdown 形式で返します。
R1 のコンテキストウィンドウには制限があるため、プロンプトの Tool Results
セクションにページ全体をダンプすることはできません。モデルに渡す前に最も関連性の高い情報だけを選択するための追加のツールが必要です:
- LangChain recursive character text splitter:
RecursiveCharacterTextSplitter
を使用して長い出力を段落と文で再帰的に分割し、目的のセグメントサイズを得ます。これにより、R1 の限られたコンテキストウィンドウで処理しやすい出力が保証されます。 - Jina Reranker:jina-reranker-v2-base-multilingual でセグメントを再ランク付けし、上位ランクのセグメントを 1 つの結果に結合します。
残念ながら、DeepSeek R1 は o3-mini
のようなツールの使用をサポートしていません。例えば、o3-mini
では以下のようなことができます:
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
)
ツール使用をサポートする o3-mini コードの例
しかし、これは R1 では簡単ではありません:API に渡せる tools
パラメータはなく、レスポンスの一部として構造化された tool_calls
を返しません。簡単に言えば、ツールを使用するように訓練されていないのです(そして近い将来もサポートされる予定はありません)。少なくとも、従来の意味ではサポートしていません。しかし、R1 にツール呼び出しを JSON 形式で出力させ、ツール呼び出しの結果をモデルに戻して分析させることは可能です:
You must respond with a valid JSON object containing:
```json
{
"tool_calls": [
{"tool": "search", "input": "Cheapest flights from Germany to Crete May 2025"},
{"tool": "scrape", "input": "<https://www.skyscanner.net/routes/gr/de/germany-to-crete.html>"}
]
}
```
R1 のプロンプトの一部としてのツール呼び出し
モデルが反復 n でツール呼び出しを出力した後、ツールが呼び出され、その結果は反復 n+1 でモデルが推論するためのプロンプトの Tool Results
セクションに埋め込まれます:
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 ...
```
ドイツ-クレタ間のフライト検索結果を示すツール結果
tag状態
状態は、タスクのステータス(Status
)とモデルが分析・更新する必要のある知識(Memory
)を追跡します。簡単に言えば、システムのワーキングメモリとメモリバンクです。これは {{ workspace }}
と呼ばれるプロンプトのセクションに保存され、白紙の状態から始まります:
Status: IN_PROGRESS
Memory:
... no memory blocks ..
空の状態オブジェクト
モデルがタスクについて推論し、ツールを実行し、出力を収集するにつれて、状態にはランダムに割り当てられた ID を持つメモリブロック(ツール出力から導出)が追加されていきます。私たちの休暇プランニングの例では、エージェントの 1 回の反復を実行した後、状態は次のようになります:
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>
DeepSeek R1 によって追加された状態
メモリブロックは、モデルの JSON レスポンスに memory_updates
のリストを含めることで更新されます:
{
"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"},
...
]
}
R1 の JSON 出力の一部としてのメモリ更新
add
操作はメモリブロックを追加し、リード、発見、情報ギャップ、すでに実行したアクションなどの重要な情報を保存するために使用できます。delete
操作はメモリブロックを削除し、古い、不要な、または誤った情報を削除してクリーンなワークスペースを維持することができます。
replace
操作もテストしましたが、モデルが大きな情報ブロックを生成し(replace
に過度に依存)、このオプションを削除することにしました。ツール呼び出しと比較すると、R1 は自身のメモリ管理にはそれほど慣れていません。モデルは複雑な数学問題やコーディングタスクを推論するように特別にトレーニングされていました(これにより正確な JSON オブジェクトを生成しツール呼び出しを実行できます)が、メモリのような状態を管理するようにはトレーニングされていませんでした(私たちの知る限り、他のモデルもそうです)。
コンパクトなメモリのような状態を使用して情報を保存することは、モデルの各ラウンドの出力全体を保存することと比べていくつかの利点があります。このアプローチではプロンプト内の情報を凝縮し、コンテキストのオーバーフローを防ぎながら、関連する知識へのモデルの焦点を強化します。JSON は更新が容易なため JSON として保持しますが、JSON はプロンプト内で人間が読みやすい形式でレンダリングされます。
それでもなお、メモリ管理は R1 のコアドメイン外にあります。モデルが適切にメモリ操作を処理するように、複数の指示を実装する必要がありました。以下がそれを扱うプロンプトの部分です:
... プロンプトの他の内容 ...
## 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
... プロンプトの他の内容 ...
プロンプト内のメモリ処理指示
tagプロンプト
プロンプトは Jinja テンプレート形式を使用して作成しました。以下のセクションで構成されています:
- コンテキスト(この場合、現在の日付)
- 指示、すべての動作方法と、利用可能なツールについてモデルに伝えます
- 状態、上記で説明したもの
- ツール出力、
search
とscrape
ツールからの出力
{% 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
ディープサーチシステムで使用される完全なプロンプト
tag評価
私たちは休暇計画の例でシステムをテストしました。以下がプロンプトに組み込まれたタスクです:
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.
これが最終的な結果です(ループ5回後):
**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).
休暇検索タスクの結果(5回のイテレーション後)
この回答は正当に見えます。しかし、本当にそうでしょうか?モデルは幻覚を見ることで知られており、複数の部品が動くシステムでは、何かが間違う可能性が高いです。R1の出力のいくつかの詳細を検証してみましょう:
tag目的地と総予算
各項目の計算は全て合計が合います(各項目が正確かどうかは後で詳しく見ていきます)。結局のところ、R1は数学の問題で訓練されました。目的地も確認できます。クレタ島は人気のある場所です。
tagフライト
フライト料金はほぼ合計が合いますが、どこが間違っているか見てみましょう。まず、フランクフルトからヘラクリオンへの2025年5月の往復の実際の Skyscanner の価格は次の通りです:

価格は全て200 EUR前後で、約束された往復154 EURではありません!しかし、このエラーはどこから来たのでしょうか?ログを見ると、ラウンド3で関連するメモリブロックが追加されていました:
{"operation": "add", "content": "Crete flight options: Eurowings €89.99* one-way ..."}
ドイツ-クレタ間フライトに関連するメモリブロック
このブロックは添付された検索結果から推測されたようです:
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 ...
```
ドイツ-クレタ間フライトの検索結果
モデルは結果を確認するためにこのウェブページをスクレイピングしようとしませんでしたが、それは違いを生まなかったかもしれません。しかし、少なくとも検索結果に「5月」という期間が含まれていないことに気付くべきでした。
tagホテル
ホテルは確認できますが、いくつかの改善点が見つかりました。まず、モデルが Georgioupolis Beach Hotel と FNK Apartments の価格を見つけることにもっと努力を払うべきでした - 他の情報は提供していますが、残念ながら価格が欠けています。これが何を意味するのか、ホテルの推薦に使用されたURLのスクレイピング結果の生データを見てみましょう。最初と最後の結果の価格しか表示されておらず、真ん中の3つは省略されています:
ソース 3️: スクレイプ: https://www.booking.com/region/gr/crete.html
結果:
```
もっと表示 閉じる
Moritz ドイツ
* ### [JT Apartments](https://www.booking.com/hotel/gr/jt-apatments.html?label=gen173nr-1FCAYoXEIFY3JldGVIM1gEaJUCiAEBmAExuAEZyAEM2AEB6AEB-AECiAIBqAIDuALSvqC-BsACAdICJDc5ZWE5ZDJkLTI2ZWEtNGNiMS04MzNlLTJhNWIyMGI5Y2M3NdgCBeACAQ&sid=f21cdd5fe9eb08dcac7d3a0304f9ccc9)
キッサモス
1泊 $57 から
9.5 特exceptional 313件のレビュー
JT Apartments への滞在を強くお勧めします。アパートメントに入った時、素晴らしい驚きがありました。すべてが完備されていました。周辺は静かで、近くにスーパーマーケットがあります。ビーチまで徒歩圏内です。クレタ島で最も美しいビーチを訪れたい方にとって、絶好のロケーションです。おかげで私たちの滞在は夢見ていた通りになりました :)
もっと表示 閉じる
Katarzyna ポーランド
もっと表示 閉じる
Aitor ドイツ
* ### [FNK Apartments with Sea View](https://www.booking.com/hotel/gr/f-amp-k-apartments.html?label=gen173nr-1FCAYoXEIFY3JldGVIM1gEaJUCiAEBmAExuAEZyAEM2AEB6AEB-AECiAIBqAIDuALSvqC-BsACAdICJDc5ZWE5ZDJkLTI2ZWEtNGNiMS04MzNlLTJhNWIyMGI5Y2M3NdgCBeACAQ&sid=f21cdd5fe9eb08dcac7d3a0304f9ccc9)
アギア・ペラギア
9.6 特exceptional 64件のレビュー
私たちは1週間クレタ島に滞在しました。その間、FnK Apartments に泊まりました。Froso と Konstantinos は非常にフレンドリーで素晴らしいホストでした。質問や要望があれば、いつでも対応してくれました。アパートメント自体はアギア・ペラギアと周辺の入り江の美しい眺め(そして美しい日の出も)があります。FnK Apartments を強くお勧めします!
もっと表示 閉じる
Moritz ドイツ
もっと表示 閉じる
mary アメリカ合衆国
* ### [Artemis Hotel Apartments](https://www.booking.com/hotel/gr/artemis-hersonisos.html?label=gen173nr-1FCAYoXEIFY3JldGVIM1gEaJUCiAEBmAExuAEZyAEM2AEB6AEB-AECiAIBqAIDuALSvqC-BsACAdICJDc5ZWE5ZDJkLTI2ZWEtNGNiMS04MzNlLTJhNWIyMGI5Y2M3NdgCBeACAQ&sid=f21cdd5fe9eb08dcac7d3a0304f9ccc9)
リメナス・ヘルソニソス、ヘルソニソス
9.0 すばらしい 419件のレビュー
歓迎され、友人のように扱われ、何事にも助けてもらえると感じたい方には、このホテルをお勧めします。温かく非常に個人的な対応をしてくれた Konstantine に心から感謝します!次回クレタ島を訪れる際も、ぜひ Artemis Hotel に滞在したいと思います!
もっと表示 閉じる
Irina イスラエル
もっと表示 閉じる
Ann Marie アイルランド
* ### [Pinelopi Hotel](https://www.booking.com/hotel/gr/pinelopi.html?label=gen173nr-1FCAYoXEIFY3JldGVIM1gEaJUCiAEBmAExuAEZyAEM2AEB6AEB-AECiAIBqAIDuALSvqC-BsACAdICJDc5ZWE5ZDJkLTI2ZWEtNGNiMS04MzNlLTJhNWIyMGI5Y2M3NdgCBeACAQ&sid=f21cdd5fe9eb08dcac7d3a0304f9ccc9)
プラタネス
7.8 良い 198件のレビュー
ビーチに近い絶好のロケーション、素晴らしいタベルナがあり、車での観光にも便利な場所です。静かなエリアで、素晴らしい休暇を過ごすのに最適です。必要なものがすべて揃った広々とした客室。価格に見合う価値があります。プールエリアは素晴らしく、一日中くつろげます。ホテル近くの駐車場は完璧でした。次回クレタ島を訪れる際も、必ず Pinelopi Hotel に戻ってきます。
もっと表示 閉じる
Rita ルーマニア
もっと表示 閉じる
Katarzyna ポーランド
* ### [Elizabeth Suites](https://www.booking.com/hotel/gr/elizabeth-suites.html?label=gen173nr-1FCAYoXEIFY3JldGVIM1gEaJUCiAEBmAExuAEZyAEM2AEB6AEB-AECiAIBqAIDuALSvqC-BsACAdICJDc5ZWE5ZDJkLTI2ZWEtNGNiMS04MzNlLTJhNWIyMGI5Y2M3NdgCBeACAQ&sid=f21cdd5fe9eb08dcac7d3a0304f9ccc9)
カト・ダラツォ
1泊 $74 から
9.1 すばらしい 86件のレビュー
素晴らしい滞在でした。オーナーの Epas は常に笑顔で、とても親切でしたし、特に Anna などのスタッフも素敵でした。朝食を2日ほど取りましたが、十分すぎるほどでした。アパートメントはビーチやレストランへのアクセスに最適な場所にありました。Elizabeth Suites は私たちの初めてのクレタ島での休暇を素晴らしいものにしてくれました 😊
もっと表示 閉じる
Jean イギリス
```
booking.com のクレタ島ホテル一覧の生スクレイプ結果
次に、Reranker を事前定義された top_n
が 5 の結果で使用している際に追加の問題を特定しました。スクレイプしたページには5件以上の関連結果が含まれていることが判明しました。各結果の関連性スコアを実際にチェックし、上位5件(または任意の数)だけを取るのではなく、これに対処することができました。しかし、理想的な再ランク付けの設定はタスクによって異なります。この問題に対するより良い対処方法は、スクレイプしたページ全体を使用することですが、残念ながら R1 のコンテキスト長の制限により不可能です。
tag全体的なパフォーマンスと改善の可能性
モデルは最初は順調でしたが、特に指示されない限り、戦略を切り替えたり複雑な計画を立てたりすることはほとんどありませんでした。R1 は数学やコーディングの問題(特に訓練された分野)にはこれらのアプローチを自然に採用しますが、検索タスクには同じ推論を適用しません。この制限に対処するためにプロンプトをさらに微調整(または複数のプロンプトを使用)することもできましたが、それは私たちの主な目標ではありませんでした。
また、R1 が時間に敏感な情報を適切に扱っていないことも確認されました。要するに、検索結果が明示的に誤った日付に言及していない場合、モデルはさらなる検証なしにその情報が有効であると仮定します。例えば、5月1日のフライトを計画する場合:
- ドイツからクレタ島まで $80 5月1日: 正確 - モデルはこの情報を信頼できます。
- ドイツからクレタ島まで $80 1月1日: 不正確 - モデルは適切に識別し、この情報を破棄します。
- ドイツからクレタ島まで $80: 誤検知 - 日付が指定されていない場合、モデルは情報を検証せず、誤って有効と仮定します。
このプロジェクトを継続する場合、以下のような潜在的な改善を検討できます:
- メモリブロック数を追跡し、状態が大きくなりすぎた場合にエントリを要約するようモデルに指示する。
- 探索を終了して質問に回答する前に、すべての手がかりを使い切るようモデルに指示する。
- 時間に敏感な情報の検証を強調する。
- 検索ツールが返した URL をスクレイプして、モデルが結果をダブルチェックするようにする。
- より大きなコンテキストウィンドウをサポートする将来の推論モデルでシステムをテストする。ただし、これには異なるモデル用にプロンプトを適応させるための大幅なリファクタリングとテストが必要になります。
tag結論
R1 のリリースからそれほど時間が経っていないにもかかわらず、状況は大きく進化しています。驚くほど低コスト(中には $5 程度)で推論モデルを訓練するプロジェクトが登場しています。この民主化により、専門モデルの訓練がこれまで以上にアクセスしやすくなっています。R1 での実験は、複雑な検索タスクに取り組むためのツールで推論重視の LLM をどのように強化できるかを引き続き探求する上で、有用なベースラインを提供しています。
休暇プランニングの例は有望な結果を示しましたが(特に短期デモプロジェクトとしては)、数学やコーディングでの強みと比較して、検索やメモリタスクの処理における R1 の限界も明らかになりました。システムは予算内で旅行計画を作成することに成功しましたが、時間に敏感な情報の検証や利用可能なすべてのオプションの徹底的な探索などの面で不十分でした。これは、モデルのトレーニングの焦点と異なるドメインへの応用との間のギャップを浮き彫りにしています。