우리의 관점에서 DeepSearch는 본질적으로 큰 while-loop입니다. (링크) 최대 토큰 예산이 주어지면, 최상의 답을 찾을 때까지 검색, 읽기, 생각하기를 반복합니다. LLM의 주요 작업 중 하나는 현재 메모리 상태를 기반으로 다음에 취할 행동을 결정하는 것입니다. 계속 검색해야 할까요? 웹페이지를 읽어야 할까요? 아니면 질문에 직접 답해야 할까요?
우리의 node-deepresearch 구현에서는 행동을 선택하기 위해 표준 LLM(gemini-2.0-flash)을 사용합니다. 추론 과정이 프롬프트 엔지니어링을 통해 명시적으로 개략되고, 선택된 행동이 JSON 객체로 반환되는 sequence-in, sequence-out 방식으로 작동하기 때문에 "표준"이라고 부릅니다. 그래서 자연스러운 질문이 생깁니다: 이 의사결정 단계를 전용 추론 모델로 대체하면 DeepSearch의 성능이 향상될까요?

이 포스트에서는 이 의사결정 단계에서 gemini-2.0-flash를 대체하기 위해 추론 LLM인 DeepSeek R1 671b를 사용하는 것을 탐구합니다. R1의 추론 능력이 웹 검색과 결과 분석의 복잡한 문제를 해결하는 데 도움이 될 것이라고 믿습니다.
이 개념을 테스트하기 위해, 실용적인 예시로 3일간의 종합적인 휴가 일정을 계획하도록 하고 그 성능을 평가해보았습니다. 딥 서치 작업을 수행하는 에이전트는 인간과 같은 종류의 문제에 직면할 수 있으므로, 우리의 휴가 작업에서 모델은 다음과 같은 문제를 마주할 수 있습니다:
- 지식 격차(다른 정보에 의존하는 정보): 예를 들어, 에펠탑을 방문하고 싶지만 공휴일에 문을 여는지 모릅니다. 탑의 휴일 일정과 프랑스 공휴일 날짜를 모두 찾아야 합니다.
- 잘못되거나 오래된 정보: 2020년의 여행 블로그에서 로마의 특정 레스토랑이 일요일에 영업한다고 제안했지만, 도착해보니 영업시간이 변경되어 이제는 일요일에 문을 닫습니다.
- 모순된 정보: 한 여행 웹사이트는 뉴욕의 특정 호텔이 무료 조식을 제공한다고 주장하는 반면, 다른 사이트는 조식이 객실 요금에 포함되지 않는다고 명시합니다.
- 모호한 정보: 여행 포럼 게시물에서 "바르셀로나 근처의 훌륭한 해변"을 언급하지만 어떤 해변인지 구체적으로 명시하거나 명확한 방향을 제공하지 않아 정확한 위치를 파악하기 어렵습니다.
R1은 복잡한 작업을 실행 가능한 단계로 분해하고, 격차와 불일치를 식별하며, 차단된 웹사이트와 구독자 벽과 같은 장애물을 탐색할 수 있습니다. 필요한 지식을 수집하고 답변을 종합하는 추론 능력을 가지고 있습니다. 하지만 혼자서 휴가를 계획할 수는 없습니다 — 그것은 웹을 검색하고 검색 결과를 이해하는 것이 필요합니다. 이 작업을 수행할 수 있도록 프레임워크를 구축하고 능력을 향상시켜야 합니다.
tag구현

노트북을 실행하려면 무료 Jina AI와 OpenRouter API 키가 필요합니다.
R1이 우리 에이전트의 엔진이지만, 우리는 여기에 몇 가지 도구, 상태 객체, 그리고 물론 (꽤 큰) 프롬프트도 추가합니다. 다음은 단순화된 표현입니다:

- 도구들은 모델이 웹을 검색하고 스크랩하기 위해 호출할 수 있으며, 결과는 상태에 저장됩니다.
- 상태는 도구 결과, 작업 상태, 지식을 추적합니다. 프롬프트 자체에 저장됩니다.
- 단일 프롬프트는 작업과 수행 방법을 지정하는 지침을 제공하고 상태를 저장합니다.
이들 각각에 대해 나중에 자세히 살펴보겠습니다, 특히 프롬프트에 대해서는요. 하지만 간단히 말하면, 시스템은 다음과 같이 작동합니다:
채워지지 않은 상태 객체가 있는 프롬프트로 시작합니다. 작업이 진행 중인 동안(즉, 답변을 생성하려고 시도하는 동안) 에이전트는 답변을 생성할 때까지 다음 루프를 실행합니다:
- 모델이 프롬프트에서 작업과 상태를 검토하고, 답변을 얻기 위해 도구를 가장 잘 사용하는 방법을 추론합니다.
- 모델은 상태(
IN PROGRESS또는DONE), 메모리 업데이트, 도구 호출, 답변(초기에는null)을 지정하는 JSON 객체를 출력합니다. - 에이전트는 도구를 비동기적으로 호출하고 결과는 3단계의 JSON 객체와 함께 프롬프트에 다시 임베딩됩니다.
- 이 새로운 정보가 포함된 프롬프트는 다시 모델에 입력되어 다른 루프를 실행합니다.
모델이 출력에서 답변을 제공하는 즉시 작업이 종료되고 답변이 전달됩니다.
이제 고수준 개요를 살펴보았으니, 도구, 상태, 프롬프트를 차례로 살펴보겠습니다:
tag도구
R1이 혼자서는 웹을 검색하거나 스크랩할 수 없기 때문에, Jina의 Reader API를 사용하여 기능을 확장합니다. 여기에는 두 가지 모드가 포함됩니다:
- 검색 모드: 관련 용어를 웹에서 검색하고 검색 엔진 결과를 반환합니다(각 결과의 URL, 제목, 설명 포함).
- 읽기 모드: 검색 결과에서 페이지를 스크랩하고 Markdown 형식으로 반환합니다.
R1의 제한된 컨텍스트 윈도우 때문에, 전체 페이지를 프롬프트의 Tool Results 섹션에 그냥 넣을 수는 없습니다. 모델에 전달하기 전에 가장 관련성 있는 정보만 선택하기 위한 추가 도구가 필요합니다:
- LangChain recursive character text splitter:
RecursiveCharacterTextSplitter로 긴 출력을 단락과 문장 단위로 재귀적으로 분할하여 원하는 세그먼트 크기를 얻습니다. 이를 통해 출력이 R1의 제한된 컨텍스트 윈도우에서 쉽게 처리될 수 있습니다. - Jina Reranker: jina-reranker-v2-base-multilingual로 세그먼트의 순위를 재조정하고 상위 순위 세그먼트를 하나의 결과로 결합합니다.
안타깝게도, 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를 가진 메모리 블록(도구 출력에서 도출됨)으로 채워집니다. 우리의 휴가 계획 예시에서, 에이전트의 한 반복을 실행한 후 상태는 다음과 같을 수 있습니다:
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은 프롬프트 자체에서 사람이 읽을 수 있는 형식으로 렌더링됩니다.
그렇다 하더라도, 메모리 관리는 여전히 R1의 핵심 영역을 벗어납니다. 우리는 모델이 메모리 연산을 적절히 처리하도록 지도하기 위해 여러 지시사항을 구현해야 했습니다. 다음은 그와 관련된 우리 프롬프트의 일부입니다:
... other contents of the 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
... other contents of the prompt ...프롬프트의 메모리 처리 지시사항
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.다음은 최종 결과입니다(다섯 번의 반복 후):
**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️: 스크랩: 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 최고 313개 후기
JT Apartments에 머무시는 것을 강력히 추천합니다. 아파트에 들어섰을 때 pleasant한 surprise가 기다리고 있었습니다. 모든 것이 잘 구비되어 있었습니다. 주변은 조용하고 근처에 슈퍼마켓이 있습니다. 해변까지는 걸어서 금방입니다. 크레타의 가장 아름다운 해변들을 방문하고 싶으시다면 최고의 위치입니다. 덕분에 우리의 체류는 꿈꾸던 그대로였습니다 :)
더 보기 접기
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 최고 64개 후기
우리는 크레타에서 일주일을 보냈습니다. 이 기간 동안 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개 후기
해변과 가까운 훌륭한 위치, 좋은 타베르나들이 있고 차로 여행하기에도 좋은 위치입니다. 조용한 지역으로 완벽한 휴가를 보내기에 좋습니다. 필요한 모든 것이 갖춰진 넓은 객실. 가격 대비 가치가 훌륭합니다. 수영장 area가 훌륭했고 하루 중 언제든 휴식을 취할 수 있었습니다. 호텔 근처 주차장이 완벽했습니다. 다음에 크레타를 방문할 때도 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와 같은 직원들 덕분에 더욱 개인적인 경험이 되었습니다. 아침식사를 몇 번 했는데 매우 풍성했습니다. 아파트는 해변과 레스토랑을 가기에 완벽한 위치에 있었습니다. Elizabeth Suites를 강력히 추천합니다. 크레타에서의 첫 휴가를 완벽하게 만들어주었습니다 😊
더 보기 접기
Jean 영국
```booking.com의 크레타 호텔 리스트 원본 스크랩 결과
둘째로, Reranker를 사전 정의된 top_n 5개 결과와 함께 사용하면서 추가적인 문제를 발견했습니다 — 스크랩된 페이지에 5개 이상의 관련 결과가 포함되어 있었다는 것입니다. 단순히 상위 5개(또는 임의의 수)의 결과를 가져오는 대신 각 결과의 관련성 점수를 실제로 확인함으로써 이 문제를 해결할 수 있었습니다. 하지만 이상적인 재순위 구성은 작업마다 다릅니다. 이 문제를 해결하는 더 나은 방법은 스크랩된 페이지 전체를 사용하는 것이었을 것입니다 - 하지만 안타깝게도 R1의 제한된 컨텍스트 길이 때문에 이것이 불가능했습니다.
tag전반적인 성능과 잠재적 개선사항
모델은 처음에는 잘 시작했지만, 특별히 프롬프트를 주지 않는 한 전략을 전환하거나 복잡한 계획을 세우려 하지 않는 것을 발견했습니다. R1은 수학과 코딩 문제(특별히 훈련된 영역)에서는 자연스럽게 이러한 접근 방식을 사용하지만, 검색 작업에는 동일한 추론을 적용하지 않습니다. 이러한 한계를 해결하기 위해 프롬프트를 더 미세 조정하거나 (또는 여러 프롬프트를 사용할 수도 있었지만), 그것은 우리의 주요 목표가 아니었습니다.
또한 R1이 시간에 민감한 정보를 적절히 처리하지 못한다는 것을 관찰했습니다. 간단히 말해서, 검색 결과에 잘못된 날짜가 명시적으로 언급되지 않으면 모델은 추가 확인 없이 정보가 유효하다고 가정합니다. 예를 들어, 5월 1일 항공편을 계획할 때:
- 독일에서 크레타까지 5월 1일 $80: 정확함 - 모델이 이 정보를 신뢰할 수 있습니다.
- 독일에서 크레타까지 1월 1일 $80: 부정확함 - 모델이 적절히 식별하고 폐기합니다.
- 독일에서 크레타까지 $80: 거짓 양성 - 날짜가 명시되지 않았을 때, 모델은 정보를 확인하지 않고 잘못된 유효성을 가정합니다.
이 프로젝트를 계속 진행한다면, 다음과 같은 잠재적 개선사항을 고려해볼 수 있습니다:
- 메모리 블록 수를 추적하고 상태가 너무 커질 때 모델에게 항목을 요약하도록 프롬프트하기.
- 탐색을 마치고 쿼리에 응답하기 전에 모델에게 모든 실마리를 소진하도록 지시하기.
- 시간에 민감한 정보의 확인을 강조하기.
- 검색 도구가 반환한 URL들을 스크랩하여 모델이 결과를 이중 확인하도록 하기.
- 프롬프트를 다른 모델에 맞게 상당한 리팩토링과 테스트가 필요하겠지만, 더 큰 컨텍스트 윈도우를 지원하는 미래의 추론 모델로 우리 시스템을 테스트하기.
tag결론
R1이 최근에 출시된 이후로도 상황은 크게 변화했습니다. 매우 저렴한 비용—일부는 $5 정도—으로 추론 모델을 훈련시키는 프로젝트들이 등장했습니다. 이러한 민주화는 전문화된 모델을 훈련시키는 것이 그 어느 때보다 접근하기 쉽다는 것을 의미합니다. R1과의 실험은 추론 중심 LLM이 복잡한 검색 작업을 해결하기 위해 도구들과 함께 어떻게 향상될 수 있는지 계속 탐구해 나가는 데 유용한 기준선을 제공합니다.
우리의 휴가 계획 예시는 유망한 결과를 보여주었지만(특히 빠른 데모 프로젝트로서는), 수학과 코딩에서의 강점에 비해 검색과 메모리 작업을 처리하는 데 있어 R1의 한계도 드러냈습니다. 시스템이 예산 제약 내에서 성공적으로 여행 계획을 수립했지만, 시간에 민감한 정보 확인이나 사용 가능한 모든 옵션을 철저히 탐색하는 등의 영역에서는 부족함을 보였으며, 이는 모델의 훈련 중점과 다른 도메인에 적용하는 것 사이의 격차를 강조합니다.








