์›๋ฌธ: https://r2r-docs.sciphi.ai/self-hosting/quickstart

๋น ๋ฅธ ์‹œ์ž‘ (Quickstart)

R2R ์‹œ์ž‘ํ•˜๊ธฐ๋Š” ์‰ฝ์Šต๋‹ˆ๋‹ค.

1. ๋ฐฐํฌ ํ™•์ธ (Deployment Checks)

๋จผ์ € R2R ์ธ์Šคํ„ด์Šค๊ฐ€ ๋กœ์ปฌ์— ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๋ฐฐํฌ๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค:

curl http://localhost:7272/v3/health
# {"results":{"response":"ok"}}

SDK ์„ค์น˜ (Install the SDK)

R2R์€ Python ๋ฐ JavaScript SDK๋ฅผ ์ œ๊ณตํ•˜์—ฌ ์ƒํ˜ธ ์ž‘์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Python
pip install r2r
JavaScript
npm i r2r-js

ํŒŒ์ผ ์ˆ˜์ง‘ (Ingesting files)

R2R์— ํŒŒ์ผ์„ ์ˆ˜์ง‘ํ•˜๋ฉด, ์„œ๋ฒ„๋Š” ์ž‘์—…์„ ์ˆ˜๋ฝํ•˜๊ณ , ํŒŒ์ผ์„ ์ฒ˜๋ฆฌ ๋ฐ ์ฒญํฌ๋กœ ๋ถ„ํ• ํ•˜๋ฉฐ, ๋ฌธ์„œ ์š”์•ฝ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

Python
client.documents.create_sample(hi_res=True)
# ์ž์ฒด ๋ฌธ์„œ๋ฅผ ์ˆ˜์ง‘ํ•˜๋ ค๋ฉด `client.documents.create(file_path="/path/to/file")`์„ ์‚ฌ์šฉํ•˜์„ธ์š”
JavaScript
clients.documents.createSample({ ingestionMode: "hi-res" })
// ์ž์ฒด ๋ฌธ์„œ๋ฅผ ์ˆ˜์ง‘ํ•˜๋ ค๋ฉด `client.documents.create({filePath: </path/to/file>})`์„ ์‚ฌ์šฉํ•˜์„ธ์š”

์˜ˆ์‹œ ์ถœ๋ ฅ:

IngestionResponse(message='Document created and ingested successfully.', task_id=None, document_id=UUID('e43864f5-a36f-548e-aacd-6f8d48b30c7f'))

ํŒŒ์ผ ์ƒํƒœ ํ™•์ธ (Getting file status)

ํŒŒ์ผ ์ˆ˜์ง‘์ด ์™„๋ฃŒ๋˜๋ฉด, ๋ฌธ์„œ๋ฅผ ๋ชฉ๋กํ™”ํ•˜์—ฌ ์ƒํƒœ๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Python
client.documents.list()
JavaScript
clients.documents.list()
Curl
curl -X GET https://api.sciphi.ai/v3/documents \
  -H "Content-Type: application/json"

์˜ˆ์‹œ ์ถœ๋ ฅ:

[
  DocumentResponse(
    id=UUID('e43864f5-a36f-548e-aacd-6f8d48b30c7f'),
    collection_ids=[UUID('122fdf6a-e116-546b-a8f6-e4cb2e2c0a09')],
    owner_id=UUID('2acb499e-8428-543b-bd85-0d9098718220'),
    document_type=<DocumentType.PDF: 'pdf'>,
    metadata={'title': 'DeepSeek_R1.pdf', 'version': 'v0'},
    version='v0',
    size_in_bytes=1768572,
    ingestion_status=<IngestionStatus.SUCCESS: 'success'>,
    extraction_status=<GraphExtractionStatus.PENDING: 'pending'>,
    created_at=datetime.datetime(2025, 2, 8, 3, 31, 39, 126759, tzinfo=TzInfo(UTC)),
    updated_at=datetime.datetime(2025, 2, 8, 3, 31, 39, 160114, tzinfo=TzInfo(UTC)),
    ingestion_attempt_number=None,
    summary="์ด ๋ฌธ์„œ๋Š” DeepSeek-AI๊ฐ€ ๊ฐœ๋ฐœํ•œ ์ถ”๋ก  ๋ชจ๋ธ ์‹œ๋ฆฌ์ฆˆ์ธ DeepSeek-R1์— ๋Œ€ํ•œ ํฌ๊ด„์ ์ธ ๊ฐœ์š”๋ฅผ ๋‹ด๊ณ  ์žˆ์œผ๋ฉฐ, DeepSeek-R1-Zero์™€ DeepSeek-R1์„ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค. DeepSeek-R1-Zero๋Š” ์ง€๋„ ๋ฏธ์„ธ ์กฐ์ • ์—†์ด ๋Œ€๊ทœ๋ชจ ๊ฐ•ํ™” ํ•™์Šต(RL)์„ ํ™œ์šฉํ•˜์—ฌ ์ธ์ƒ์ ์ธ ์ถ”๋ก  ๋Šฅ๋ ฅ์„ ๋ณด์—ฌ์ฃผ์ง€๋งŒ, ๊ฐ€๋…์„ฑ ๋ฐ ์–ธ์–ด ํ˜ผํ•ฉ๊ณผ ๊ฐ™์€ ๋ฌธ์ œ์— ์ง๋ฉดํ•ฉ๋‹ˆ๋‹ค. ์„ฑ๋Šฅ ํ–ฅ์ƒ์„ ์œ„ํ•ด DeepSeek-R1์€ ๋‹ค๋‹จ๊ณ„ ํ›ˆ๋ จ๊ณผ ์ฝœ๋“œ ์Šคํƒ€ํŠธ ๋ฐ์ดํ„ฐ๋ฅผ ํ†ตํ•ฉํ•˜์—ฌ ๋‹ค์–‘ํ•œ ์ถ”๋ก  ์ž‘์—…์—์„œ OpenAI ๋ชจ๋ธ๊ณผ ์œ ์‚ฌํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋‹ฌ์„ฑํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ฌธ์„œ๋Š” ๋ชจ๋ธ์˜ ํ›ˆ๋ จ ๊ณผ์ •, ์—ฌ๋Ÿฌ ๋ฒค์น˜๋งˆํฌ์— ๊ฑธ์นœ ํ‰๊ฐ€ ๊ฒฐ๊ณผ, ๊ทธ๋ฆฌ๊ณ  ์ถ”๋ก  ๋Šฅ๋ ฅ์„ ์œ ์ง€ํ•˜๋ฉด์„œ ๋” ์ž‘๊ณ  ํšจ์œจ์ ์ธ ์ฆ๋ฅ˜ ๋ชจ๋ธ์˜ ๋„์ž…์„ ์ƒ์„ธํžˆ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ํ˜„์žฌ ๋ชจ๋ธ์˜ ํ•œ๊ณ„(์˜ˆ: ์–ธ์–ด ํ˜ผํ•ฉ ๋ฐ ํ”„๋กฌํ”„ํŠธ ๋ฏผ๊ฐ๋„)๋ฅผ ๋…ผ์˜ํ•˜๊ณ , ์†Œํ”„ํŠธ์›จ์–ด ์—”์ง€๋‹ˆ์–ด๋ง ์ž‘์—…์—์„œ ์ผ๋ฐ˜์ ์ธ ๋Šฅ๋ ฅ๊ณผ ํšจ์œจ์„ฑ์„ ๊ฐœ์„ ํ•˜๊ธฐ ์œ„ํ•œ ํ–ฅํ›„ ์—ฐ๊ตฌ ๋ฐฉํ–ฅ์„ ์ œ์‹œํ•ฉ๋‹ˆ๋‹ค. ์ด ์—ฐ๊ตฌ ๊ฒฐ๊ณผ๋Š” ๋Œ€๊ทœ๋ชจ ์–ธ์–ด ๋ชจ๋ธ์—์„œ ์ถ”๋ก  ๋Šฅ๋ ฅ์„ ๊ฐœ๋ฐœํ•˜๋Š” ๋ฐ ์žˆ์–ด RL์˜ ์ž ์žฌ๋ ฅ๊ณผ ์†Œ๊ทœ๋ชจ ๋ชจ๋ธ์„ ์œ„ํ•œ ์ฆ๋ฅ˜ ๊ธฐ์ˆ ์˜ ํšจ๊ณผ๋ฅผ ๊ฐ•์กฐํ•ฉ๋‹ˆ๋‹ค.", summary_embedding=None, total_tokens=29673)] total_entries=1
  ), ...
]

๊ฒ€์ƒ‰ ์ฟผ๋ฆฌ๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค:

Python
client.retrieval.search(
  query="What is DeepSeek R1?",
)
JavaScript
client.retrieval.search({
  query: "What is DeepSeek R1?",
})
Curl
curl -X POST https://api.sciphi.ai/v3/retrieval/search \
  -H "Content-Type: application/json" \
  -d '{
    "query": "What is DeepSeek R1?"
  }'

๊ฒ€์ƒ‰ ์ฟผ๋ฆฌ๋Š” ๊ธฐ๋ณธ์ ์ธ ์œ ์‚ฌ๋„ ๊ฒ€์ƒ‰์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ€์žฅ ๊ด€๋ จ์„ฑ ๋†’์€ ๋ฌธ์„œ๋ฅผ ์ฐพ์Šต๋‹ˆ๋‹ค. ์‚ฌ์šฉ ์‚ฌ๋ก€์— ๋”ฐ๋ผ ํ•˜์ด๋ธŒ๋ฆฌ๋“œ ๊ฒ€์ƒ‰ ๋˜๋Š” ๊ทธ๋ž˜ํ”„ ๊ฒ€์ƒ‰๊ณผ ๊ฐ™์€ ๊ณ ๊ธ‰ ๊ฒ€์ƒ‰ ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์˜ˆ์‹œ ์ถœ๋ ฅ:

AggregateSearchResult(
  chunk_search_results=[
    ChunkSearchResult(
      score=0.643,
      text="๋ฌธ์„œ ์ œ๋ชฉ: DeepSeek_R1.pdf
      ํ…์ŠคํŠธ: 70% ์ด์ƒ์˜ ์ •ํ™•๋„๋ฅผ ๋‹ฌ์„ฑํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.
      DeepSeek-R1์€ ๋˜ํ•œ ๋ชจ๋ธ์ด ํ˜•์‹ ์ง€์นจ์„ ๋”ฐ๋ฅด๋Š” ๋Šฅ๋ ฅ์„ ํ‰๊ฐ€ํ•˜๊ธฐ ์œ„ํ•ด ์„ค๊ณ„๋œ ๋ฒค์น˜๋งˆํฌ์ธ IF-Eval์—์„œ๋„ ์ธ์ƒ์ ์ธ ๊ฒฐ๊ณผ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๊ฐœ์„ ์€ ์ง€๋„ ๋ฏธ์„ธ ์กฐ์ •(SFT) ๋ฐ RL ํ›ˆ๋ จ์˜ ์ตœ์ข… ๋‹จ๊ณ„์—์„œ ์ง€์นจ ์ค€์ˆ˜ ๋ฐ์ดํ„ฐ๊ฐ€ ํฌํ•จ๋œ ๊ฒƒ๊ณผ ๊ด€๋ จ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ AlpacaEval2.0 ๋ฐ ArenaHard์—์„œ ๋†€๋ผ์šด ์„ฑ๋Šฅ์ด ๊ด€์ฐฐ๋˜์—ˆ์œผ๋ฉฐ, ์ด๋Š” DeepSeek-R1์ด ์“ฐ๊ธฐ ์ž‘์—… ๋ฐ ๊ฐœ๋ฐฉํ˜• ์งˆ๋ฌธ ๋‹ต๋ณ€์—์„œ ๊ฐ•์ ์„ ๊ฐ€์ง€๊ณ  ์žˆ์Œ์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. DeepSeek-V3๋ฅผ ํฌ๊ฒŒ ๋Šฅ๊ฐ€ํ•˜๋Š” ์„ฑ๋Šฅ์€ ๋Œ€๊ทœ๋ชจ RL์˜ ์ผ๋ฐ˜ํ™” ์ด์ ์„ ๊ฐ•์กฐํ•˜๋ฉฐ, ์ด๋Š” ์ถ”๋ก  ๋Šฅ๋ ฅ์„ ํ–ฅ์ƒ์‹œํ‚ฌ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๋‹ค์–‘ํ•œ ๋„๋ฉ”์ธ์—์„œ ์„ฑ๋Šฅ์„ ๊ฐœ์„ ํ•ฉ๋‹ˆ๋‹ค. ๋”์šฑ์ด DeepSeek-R1์ด ์ƒ์„ฑํ•˜๋Š” ์š”์•ฝ ๊ธธ์ด๋Š” ๊ฐ„๊ฒฐํ•˜๋ฉฐ, ArenaHard์—์„œ ํ‰๊ท  689 ํ† ํฐ, AlpacaEval 2.0์—์„œ 2,218 ๋ฌธ์ž๋ฅผ ๊ธฐ๋กํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” DeepSeek-R1์ด GPT ๊ธฐ๋ฐ˜ ํ‰๊ฐ€์—์„œ ๊ธธ์ด ํŽธํ–ฅ์„ ๋„์ž…ํ•˜๋Š” ๊ฒƒ์„ ํ”ผํ•˜๋ฉฐ, ์—ฌ๋Ÿฌ ์ž‘์—…์—์„œ ๊ฒฌ๊ณ ์„ฑ์„ ๋”์šฑ ๊ณต๊ณ ํžˆ ํ•จ์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค."
    ), ...
  ],
  graph_search_results=[],
  web_search_results=[],
  context_document_results=[]
)

RAG (Retrieval-Augmented Generation)

RAG ์‘๋‹ต์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค:

Python
client.retrieval.rag(
  query="What is DeepSeek R1?",
)
JavaScript
client.retrieval.rag({
  query: "What is DeepSeek R1?",
})
Curl
curl -X POST https://api.sciphi.ai/v3/retrieval/rag \
  -H "Content-Type: application/json" \
  -d '{
    "query": "What is DeepSeek R1?"
  }'

์˜ˆ์‹œ ์ถœ๋ ฅ:

RAGResponse(
  generated_answer='DeepSeek-R1์€ ๊ฐ•ํ™” ํ•™์Šต(RL)๊ณผ ์ง€๋„ ๋ฏธ์„ธ ์กฐ์ •(SFT)์„ ํ™œ์šฉํ•˜์—ฌ ๊ธฐ๋Šฅ์„ ํ–ฅ์ƒ์‹œํ‚ค๊ณ  ๋‹ค์–‘ํ•œ ์ž‘์—…์—์„œ ์ธ์ƒ์ ์ธ ์„ฑ๋Šฅ์„ ๋ณด์—ฌ์ฃผ๋Š” ๋ชจ๋ธ์ž…๋‹ˆ๋‹ค. ์ด ๋ชจ๋ธ์€ ์“ฐ๊ธฐ ์ž‘์—…, ๊ฐœ๋ฐฉํ˜• ์งˆ๋ฌธ ๋‹ต๋ณ€, IF-Eval, AlpacaEval2.0, ArenaHard์™€ ๊ฐ™์€ ๋ฒค์น˜๋งˆํฌ์—์„œ ๋›ฐ์–ด๋‚œ ์„ฑ๋Šฅ์„ ๋ฐœํœ˜ํ•ฉ๋‹ˆ๋‹ค [1], [2]. DeepSeek-R1์€ ์—ฌ๋Ÿฌ ์˜์—ญ์—์„œ ์ด์ „ ๋ฒ„์ „์ธ DeepSeek-V3๋ฅผ ๋Šฅ๊ฐ€ํ•˜๋ฉฐ, ๋‹ค์–‘ํ•œ ๋„๋ฉ”์ธ์—์„œ ์ถ”๋ก  ๋ฐ ์ผ๋ฐ˜ํ™” ๋Šฅ๋ ฅ์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค [1]. ๋˜ํ•œ SimpleQA์™€ ๊ฐ™์€ ์‚ฌ์‹ค ๊ธฐ๋ฐ˜ ๋ฒค์น˜๋งˆํฌ์—์„œ ๊ฒฝ์Ÿ๋ ฅ ์žˆ๋Š” ๊ฒฐ๊ณผ๋ฅผ ๋‹ฌ์„ฑํ•˜์ง€๋งŒ, ์•ˆ์ „ RL ์ œ์•ฝ์œผ๋กœ ์ธํ•ด ์ค‘๊ตญ์–ด SimpleQA ๋ฒค์น˜๋งˆํฌ์—์„œ๋Š” ์„ฑ๋Šฅ์ด ๋–จ์–ด์ง‘๋‹ˆ๋‹ค [2]. ๋˜ํ•œ DeepSeek-R1์€ ์ถ”๋ก  ๋Šฅ๋ ฅ์„ ์†Œ๊ทœ๋ชจ ๋ชจ๋ธ๋กœ ์ „์ด์‹œํ‚ค๋Š” ์ฆ๋ฅ˜ ํ”„๋กœ์„ธ์Šค์— ๊ด€์—ฌํ•˜๋ฉฐ, ์ด ์†Œ๊ทœ๋ชจ ๋ชจ๋ธ๋“ค์€ ๋ฒค์น˜๋งˆํฌ์—์„œ ๋งค์šฐ ๋›ฐ์–ด๋‚œ ์„ฑ๋Šฅ์„ ๋ณด์ž…๋‹ˆ๋‹ค [4], [6]. ์ด ๋ชจ๋ธ์€ ์˜์–ด์™€ ์ค‘๊ตญ์–ด์— ์ตœ์ ํ™”๋˜์–ด ์žˆ์œผ๋ฉฐ, ํ–ฅํ›„ ์—…๋ฐ์ดํŠธ์—์„œ ์–ธ์–ด ํ˜ผํ•ฉ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ๊ณ„ํš์ž…๋‹ˆ๋‹ค [8].',
  search_results=AggregateSearchResult(
    chunk_search_results=[ChunkSearchResult(score=0.643, text=Document Title: DeepSeek_R1.pdf ...)]
  ),
  citations=[Citation(index=1, rawIndex=1, startIndex=305, endIndex=308, snippetStartIndex=288, snippetEndIndex=315, sourceType='chunk', id='e760bb76-1c6e-52eb-910d-0ce5b567011b', document_id='e43864f5-a36f-548e-aacd-6f8d48b30c7f', owner_id='2acb499e-8428-543b-bd85-0d9098718220', collection_ids=['122fdf6a-e116-546b-a8f6-e4cb2e2c0a09'], score=0.6433466439465674, text='Document Title: DeepSeek_R1.pdf\n\nText: could achieve an accuracy of over 70%.\nDeepSeek-R1 also delivers impressive results on IF-Eval, a benchmark designed to assess a\nmodels ability to follow format instructions. These improvements can be linked to the inclusion\nof instruction-following...]
  metadata={'id': 'chatcmpl-B0BaZ0vwIa58deI0k8NIuH6pBhngw', 'choices': [{'finish_reason': 'stop', 'index': 0, 'logprobs': None, 'message': {'refusal': None, 'role': 'assistant', 'audio': None, 'function_call': None, 'tool_calls': None}}], 'created': 1739384247, 'model': 'gpt-4o-2024-08-06', 'object': 'chat.completion', 'service_tier': 'default', 'system_fingerprint': 'fp_4691090a87', ...}
)

์ŠคํŠธ๋ฆฌ๋ฐ RAG (Streaming RAG)

์ŠคํŠธ๋ฆฌ๋ฐ RAG ์‘๋‹ต์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค:

Python
from r2r import (
    CitationEvent,
    FinalAnswerEvent,
    MessageEvent,
    SearchResultsEvent,
    R2RClient,
)
 
client = R2RClient("http://localhost:7272")
 
result_stream = client.retrieval.rag(
    query="What is DeepSeek R1?",
    search_settings={"limit": 25},
    rag_generation_config={"stream": True},
)
 
# can also do a switch on `type` field
for event in result_stream:
    if isinstance(event, SearchResultsEvent):
        print("Search results:", event.data)
    elif isinstance(event, MessageEvent):
        print("Partial message:", event.data.delta)
    elif isinstance(event, CitationEvent):
        print("New citation detected:", event.data.raw_index)
    elif isinstance(event, FinalAnswerEvent):
        print("Final answer:", event.data.generated_answer)
JavaScript

โ‹ฏ

Curl
curl -X POST https://api.sciphi.ai/v3/retrieval/rag \
  -H "Content-Type: application/json" \
  -d '{
    "query": "What is DeepSeek R1?"
  }'

์˜ˆ์‹œ ์ถœ๋ ฅ:

Search results: id='run_1' object='rag.search_results' data={'chunk_search_results': [{'id': '1e40ee7e-2eef-524f-b5c6-1a1910e73ccc', 'document_id': '652075c0-3a43-519f-9625-f581e7605bc5', 'owner_id': '2acb499e-8428-543b-bd85-0d9098718220', 'collection_ids': ['122fdf6a-e116-546b-a8f6-e4cb2e2c0a09'], 'score': 0.7945216641038179, 'text': 'data, achieving strong performance across various tasks. DeepSeek-R1 is more powerful,\nleveraging cold-start data alongside iterative RL fine-tuning. Ultimately ...
...
Partial message: {'content': [MessageDelta(type='text', text={'value': 'Deep', 'annotations': []})]}
Partial message: {'content': [MessageDelta(type='text', text={'value': 'Seek', 'annotations': []})]}
Partial message: {'content': [MessageDelta(type='text', text={'value': '-R', 'annotations': []})]}
...
Final answer: DeepSeek-R1์€ DeepSeek-AI ์—ฐ๊ตฌํŒ€์ด ๊ฐœ๋ฐœํ•œ ๋Œ€๊ทœ๋ชจ ์–ธ์–ด ๋ชจ๋ธ์ž…๋‹ˆ๋‹ค. ์ด ๋ชจ๋ธ์€ ๊ฐ•ํ™” ํ•™์Šต(RL) ์ „์— ๋‹ค๋‹จ๊ณ„ ํ›ˆ๋ จ๊ณผ ์ฝœ๋“œ ์Šคํƒ€ํŠธ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ›ˆ๋ จ๋œ ์ถ”๋ก  ๋ชจ๋ธ์ž…๋‹ˆ๋‹ค. ์ด ๋ชจ๋ธ์€ MMLU, MMLU-Pro, GPQA Diamond, FRAMES๋ฅผ ํฌํ•จํ•œ ๋‹ค์–‘ํ•œ ๋ฒค์น˜๋งˆํฌ์—์„œ ํŠนํžˆ STEM ๊ด€๋ จ ์งˆ๋ฌธ์—์„œ ์šฐ์ˆ˜ํ•œ ์„ฑ๋Šฅ์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. ...

RAG๋ฅผ ํ™œ์šฉํ•œ ์ถ”๋ก  ์—์ด์ „ํŠธ (agentic-rag)

R2R ์ถ”๋ก  ์—์ด์ „ํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด, ๊ฒ€์ƒ‰ ์ฆ๊ฐ• ์ƒ์„ฑ(RAG)์ด ๋‹จ๊ณ„๋ณ„ ์ถ”๋ก ๊ณผ ๊ฒฐํ•ฉ๋˜์–ด ๋ฌธ์„œ์—์„œ ๋” ๋†’์€ ํ’ˆ์งˆ์˜ ์‘๋‹ต์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

Python
streaming_response = client.retrieval.agentic-rag(
  message={"role":"user", "content": "What does deepseek r1 imply?"},
  rag_generation_config={
    "stream": True,
    "model": "anthropic/claude-3-5-sonnet-20241022",
  }
)
 
for chunk in streaming_response:
    print(chunk)
JavaScript
// 1) ์ŠคํŠธ๋ฆฌ๋ฐ RAG ์š”์ฒญ ์‹œ์ž‘
const resultStream = await client.retrieval.rag({
query: "What is DeepSeek R1?",
searchSettings: { limit: 25 },
ragGenerationConfig: { stream: true },
});
 
// 2) ๋น„๋™๊ธฐ ์ดํ„ฐ๋ ˆ์ดํ„ฐ(์ŠคํŠธ๋ฆฌ๋ฐ)๋ฅผ ๋ฐ›์•˜๋Š”์ง€ ํ™•์ธ
if (Symbol.asyncIterator in resultStream) {
// 2a) ์„œ๋ฒ„์—์„œ ์˜ค๋Š” ๊ฐ ์ด๋ฒคํŠธ๋ฅผ ๋ฐ˜๋ณต
for await (const event of resultStream) {
    switch (event.event) {
    case "search_results":
        console.log("๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ:", event.data);
        break;
    case "message":
        console.log("๋ถ€๋ถ„ ๋ฉ”์‹œ์ง€ ๋ธํƒ€:", event.data.delta);
        break;
    case "citation":
        console.log("์ƒˆ๋กœ์šด ์ธ์šฉ ์ด๋ฒคํŠธ:", event.data);
        break;
    case "final_answer":
        console.log("์ตœ์ข… ๋‹ต๋ณ€:", event.data.generated_answer);
        break;
    // ... ๋‹ค๋ฅธ ์ด๋ฒคํŠธ ์œ ํ˜•(์˜ˆ: tool_call / tool_result)์ด ์žˆ๋‹ค๋ฉด ์ผ€์ด์Šค ์ถ”๊ฐ€
    default:
        console.log("์•Œ ์ˆ˜ ์—†๊ฑฐ๋‚˜ ์ฒ˜๋ฆฌ๋˜์ง€ ์•Š์€ ์ด๋ฒคํŠธ:", event);
    }
}
} else {
// 2b) ์ŠคํŠธ๋ฆฌ๋ฐ์ด ํ™œ์„ฑํ™”๋˜์ง€ ์•Š์•˜๊ฑฐ๋‚˜ ์„œ๋ฒ„๊ฐ€ SSE๋ฅผ ๋ณด๋‚ด์ง€ ์•Š์€ ๊ฒฝ์šฐ,
//     ๋‹จ์ผ ์‘๋‹ต ๊ฐ์ฒด๋ฅผ ๋ฐ›๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
console.log("๋น„์ŠคํŠธ๋ฆฌ๋ฐ RAG ์‘๋‹ต:", resultStream);
}

์˜ˆ์‹œ ์ถœ๋ ฅ:

<Thought>ํ•จ์ˆ˜ ํ˜ธ์ถœ: local_search, ํŽ˜์ด๋กœ๋“œ {"query":"DeepSeek R1"}</Thought>
<Thought>๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ๋Š” DeepSeek-R1์— ๋Œ€ํ•œ ํฌ๊ด„์ ์ธ ๊ฐœ์š”๋ฅผ ์ œ๊ณตํ•˜๋ฉฐ, ๋‹ค์–‘ํ•œ ๋ฒค์น˜๋งˆํฌ ๋ฐ ์ž‘์—…์—์„œ์˜ ๊ธฐ๋Šฅ๊ณผ ์„ฑ๋Šฅ์„ ๊ฐ•์กฐํ•ฉ๋‹ˆ๋‹ค. DeepSeek-R1์€ DeepSeek-AI๊ฐ€ ๊ฐœ๋ฐœํ•œ ์ถ”๋ก  ๋ชจ๋ธ๋กœ, ๊ฐ•ํ™” ํ•™์Šต(RL) ๋ฐ ์ง€์นจ ์ค€์ˆ˜ ๋ฐ์ดํ„ฐ๋ฅผ ํ™œ์šฉํ•˜์—ฌ ์„ฑ๋Šฅ์„ ํ–ฅ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค. ์ด ๋ชจ๋ธ์€ ์“ฐ๊ธฐ, ๊ฐœ๋ฐฉํ˜• ์งˆ๋ฌธ ๋‹ต๋ณ€, ์‚ฌ์‹ค ๊ธฐ๋ฐ˜ ์ฟผ๋ฆฌ ์ฒ˜๋ฆฌ์™€ ๊ฐ™์€ ์ž‘์—…์—์„œ ๋›ฐ์–ด๋‚œ ์„ฑ๋Šฅ์„ ๋ฐœํœ˜ํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ชจ๋ธ์€ ์—ฌ๋Ÿฌ ์˜์—ญ์—์„œ ์ด์ „ ๋ฒ„์ „์ธ DeepSeek-V3๋ฅผ ๋Šฅ๊ฐ€ํ•˜์ง€๋งŒ, ํ•จ์ˆ˜ ํ˜ธ์ถœ ๋ฐ ๋‹ค์ค‘ ํ„ด ์ƒํ˜ธ ์ž‘์šฉ๊ณผ ๊ฐ™์€ ์ผ๋ถ€ ๋ณต์žกํ•œ ์ž‘์—…์—์„œ๋Š” ๋ถ€์กฑํ•ฉ๋‹ˆ๋‹ค. DeepSeek-R1์€ ๋˜ํ•œ ๊ต์œก ์ž‘์—… ๋ฐ ์ฐฝ์˜์  ๊ธ€์“ฐ๊ธฐ์—์„œ ๊ฐ•๋ ฅํ•œ ์„ฑ๋Šฅ์„ ๋ณด์—ฌ์ฃผ๋ฉฐ, ๋‹ค์žฌ๋‹ค๋Šฅํ•จ๊ณผ ๊ฒฌ๊ณ ์„ฑ์„ ์ž…์ฆํ•ฉ๋‹ˆ๋‹ค. DeepSeek-R1์˜ ์ฃผ์š” ํŠน์ง•์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:- IF-Eval, AlpacaEval2.0, ArenaHard์™€ ๊ฐ™์€ ๋ฒค์น˜๋งˆํฌ์—์„œ ์ธ์ƒ์ ์ธ ๊ฒฐ๊ณผ๋ฅผ ๋‹ฌ์„ฑํ•˜์—ฌ ์“ฐ๊ธฐ ๋ฐ ์งˆ๋ฌธ ๋‹ต๋ณ€ ๋Šฅ๋ ฅ์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค [์ถœ์ฒ˜ 1].- ์ด ๋ชจ๋ธ์€ ์ถ”๋ก  ๋Šฅ๋ ฅ์„ ์†Œ๊ทœ๋ชจ ๋ชจ๋ธ๋กœ ์ฆ๋ฅ˜ํ•˜๋Š” ๋ฐ ๊ต์‚ฌ๋กœ ์‚ฌ์šฉ๋˜๋ฉฐ, ์ด ์†Œ๊ทœ๋ชจ ๋ชจ๋ธ๋“ค๋„ ๋ฒค์น˜๋งˆํฌ์—์„œ ์ข‹์€ ์„ฑ๋Šฅ์„ ๋ณด์ž…๋‹ˆ๋‹ค [์ถœ์ฒ˜ 2].- SimpleQA์™€ ๊ฐ™์€ ์‚ฌ์‹ค ๊ธฐ๋ฐ˜ ๋ฒค์น˜๋งˆํฌ์—์„œ DeepSeek-V3๋ฅผ ๋Šฅ๊ฐ€ํ•˜์ง€๋งŒ, ์–ธ์–ด ํ˜ผํ•ฉ ๋ฐ ํŠน์ • ๋ณต์žกํ•œ ์ž‘์—…์—์„œ ํ•œ๊ณ„๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค [์ถœ์ฒ˜ 3, 5].- DeepSeek-R1์€ ์ฝ”๋”ฉ ์ž‘์—…์—์„œ ์ „๋ฌธ๊ฐ€ ์ˆ˜์ค€์˜ ์„ฑ๋Šฅ์„ ๋ณด์—ฌ์ฃผ๋ฉฐ, MMLU ๋ฐ GPQA Diamond์™€ ๊ฐ™์€ ๊ต์œก ๋ฒค์น˜๋งˆํฌ์—์„œ ๊ฐ•๋ ฅํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค [์ถœ์ฒ˜ 6, 9].์ „๋ฐ˜์ ์œผ๋กœ DeepSeek-R1์€ ์ถ”๋ก  ๋ฐ ์ง€์นจ ์ค€์ˆ˜์— ์ค‘์ ์„ ๋‘” ๊ฐ•๋ ฅํ•œ ๋ชจ๋ธ๋กœ, ๊ด‘๋ฒ”์œ„ํ•œ ์ž‘์—…์—์„œ ๊ฒฝ์Ÿ๋ ฅ ์žˆ๋Š” ์„ฑ๋Šฅ์„ ๋‹ฌ์„ฑํ•ฉ๋‹ˆ๋‹ค.</Thought>
<Response>DeepSeek-R1์€ DeepSeek-AI๊ฐ€ ๊ฐœ๋ฐœํ•œ ์ถ”๋ก  ๋ชจ๋ธ๋กœ, ์“ฐ๊ธฐ ์ž‘์—…, ๊ฐœ๋ฐฉํ˜• ์งˆ๋ฌธ ๋‹ต๋ณ€, ์‚ฌ์‹ค ๊ธฐ๋ฐ˜ ์ฟผ๋ฆฌ ์ฒ˜๋ฆฌ์—์„œ ๊ฐ•๋ ฅํ•œ ์„ฑ๋Šฅ์„ ๋ณด์ด๋Š” ๊ฒƒ์œผ๋กœ ์•Œ๋ ค์ ธ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๋ชจ๋ธ์€ ๊ฐ•ํ™” ํ•™์Šต๊ณผ ์ง€์นจ ์ค€์ˆ˜ ๋ฐ์ดํ„ฐ๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๊ธฐ๋Šฅ์„ ํ–ฅ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค. ์ด ๋ชจ๋ธ์€ ์—ฌ๋Ÿฌ ์˜์—ญ์—์„œ ์ด์ „ ๋ฒ„์ „์ธ DeepSeek-V3๋ฅผ ๋Šฅ๊ฐ€ํ•˜๋ฉฐ, ์ถ”๋ก  ๋Šฅ๋ ฅ์„ ์†Œ๊ทœ๋ชจ ๋ชจ๋ธ๋กœ ์ฆ๋ฅ˜ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ๊ฐ•์ ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ , ํ•จ์ˆ˜ ํ˜ธ์ถœ ๋ฐ ์–ธ์–ด ํ˜ผํ•ฉ๊ณผ ๊ฐ™์€ ๋ณต์žกํ•œ ์ž‘์—…์—์„œ๋Š” ํ•œ๊ณ„๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ „๋ฐ˜์ ์œผ๋กœ DeepSeek-R1์€ ๋‹ค์–‘ํ•œ ๋ฒค์น˜๋งˆํฌ์—์„œ ๊ฒฝ์Ÿ๋ ฅ ์žˆ๋Š” ์„ฑ๋Šฅ์„ ๊ฐ€์ง„ ๋‹ค์žฌ๋‹ค๋Šฅํ•˜๊ณ  ๊ฒฌ๊ณ ํ•œ ๋ชจ๋ธ์ž…๋‹ˆ๋‹ค.

์ถ”๊ฐ€ ๊ธฐ๋Šฅ (Additional Features)

R2R์€ ๋ฌธ์„œ ๊ด€๋ฆฌ ๋ฐ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์„ ํ–ฅ์ƒ์‹œํ‚ค๊ธฐ ์œ„ํ•ด ์•„๋ž˜์™€ ๊ฐ™์€ ์ถ”๊ฐ€ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋ž˜ํ”„ (Graphs)

R2R์€ ๋ฌธ์„œ ์ดํ•ด ๋ฐ ๊ฒ€์ƒ‰์„ ํ–ฅ์ƒ์‹œํ‚ค๋Š” ๊ฐ•๋ ฅํ•œ ๊ฐœ์ฒด ๋ฐ ๊ด€๊ณ„ ์ถ”์ถœ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ธฐ๋Šฅ์€ R2R ๋‚ด์—์„œ ์ง€์‹ ๊ทธ๋ž˜ํ”„๋ฅผ ๊ตฌ์ถ•ํ•˜๋Š” ๋ฐ ํ™œ์šฉ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์‹œ์Šคํ…œ์€ ์ž๋™์œผ๋กœ ๊ฐœ์ฒด๋ฅผ ์‹๋ณ„ํ•˜๊ณ , ๊ทธ๋“ค ๊ฐ„์˜ ๊ด€๊ณ„๋ฅผ ๊ตฌ์ถ•ํ•˜๋ฉฐ, ๋ฌธ์„œ ์ปฌ๋ ‰์…˜์—์„œ ํ’๋ถ€ํ•œ ์ง€์‹ ๊ทธ๋ž˜ํ”„๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฌธ์„œ์—์„œ ๊ฐœ์ฒด์™€ ๊ด€๊ณ„๋ฅผ ์ž๋™์œผ๋กœ ์ถ”์ถœํ•˜์—ฌ ์ง€์‹ ๊ทธ๋ž˜ํ”„๋ฅผ ํ˜•์„ฑํ•ฉ๋‹ˆ๋‹ค.

์‚ฌ์šฉ์ž ๋ฐ ์ปฌ๋ ‰์…˜ (Users and Collections)

R2R์€ ์™„์ „ํ•œ ์‚ฌ์šฉ์ž ์ธ์ฆ ๋ฐ ๊ด€๋ฆฌ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜์—ฌ, ์•ˆ์ „ํ•˜๊ณ  ๊ธฐ๋Šฅ์ด ํ’๋ถ€ํ•œ ์ธ์ฆ ์‹œ์Šคํ…œ์„ ๊ตฌํ˜„ํ•˜๊ฑฐ๋‚˜ ์„ ํ˜ธํ•˜๋Š” ์ธ์ฆ ๊ณต๊ธ‰์ž์™€ ํ†ตํ•ฉํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ, ์ปฌ๋ ‰์…˜์€ ์‚ฌ์šฉ์ž ๋ฐ ๋ฌธ์„œ์— ๋Œ€ํ•œ ํšจ์œจ์ ์ธ ์ ‘๊ทผ ์ œ์–ด ๋ฐ ๊ตฌ์„ฑ์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค.

R2R์˜ ๋‚ด์žฅ ์ธ์ฆ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜์—ฌ ์‚ฌ์šฉ์ž ๋“ฑ๋ก, ๋กœ๊ทธ์ธ, ์ด๋ฉ”์ผ ์ธ์ฆ ๋“ฑ์„ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ์•„๋ณด์„ธ์š”.

R2R์—์„œ ์„ธ๋ถ„ํ™”๋œ ์ ‘๊ทผ ์ œ์–ด ๋ฐ ๋ฌธ์„œ ๊ตฌ์„ฑ์„ ์œ„ํ•ด ์ปฌ๋ ‰์…˜์„ ์ƒ์„ฑ, ๊ด€๋ฆฌ ๋ฐ ํ™œ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ์•„๋ณด์„ธ์š”.

๋‹ค์Œ ๋‹จ๊ณ„ (Next Steps)

์ด์ œ R2R์˜ ํ•ต์‹ฌ ๊ธฐ๋Šฅ์— ๋Œ€ํ•œ ๊ธฐ๋ณธ์ ์ธ ์ดํ•ด๋ฅผ ๋งˆ์ณค์œผ๋ฏ€๋กœ, ๋” ๊ณ ๊ธ‰ ์ฃผ์ œ๋ฅผ ํƒ์ƒ‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค: