๐Ÿค– RAG with Gemini File Search ๊ธฐ๋ฐ˜ ์˜๋ฃŒ ์ง„๋‹จ ๊ธฐ๋ก ์นด์นด์˜คํ†ก ์ฑ—๋ด‡ ๊ฐœ๋ฐœ ๊ธฐ๋ก 1๏ธโƒฃ

์นด์นด์˜คํ†ก medical-chatbot ์ฑ„ํŒ…๋ฐฉ์—์„œ ์ฑ—๋ด‡ ๋ฉ”๋‰ด๊ฐ€ ๋ณด์ด๋Š” ํ™”๋ฉด

ํ™˜์ž๊ฐ€ ์นด์นด์˜คํ†ก ์ฑ—๋ด‡์„ ํ†ตํ•ด ์ž์‹ ์˜ ์ง„๋‹จ ๊ธฐ๋ก์— ๋Œ€ํ•ด ์งˆ๋ฌธํ•˜๋ฉด, Gemini File Search๋ฅผ ์ด์šฉํ•ด ๋ฌธ์„œ ๊ธฐ๋ฐ˜ ๋‹ต๋ณ€์„ ์ƒ์„ฑํ•˜๋Š” PoC (Proof of Concept)๋ฅผ ๊ตฌํ˜„ํ•œ ๊ณผ์ •์„ ์ •๋ฆฌํ•˜๊ณ ์ž ํ•œ๋‹ค.

Google Drive์— ์ €์žฅ๋œ ํ™˜์ž๋ณ„ ์ง„๋‹จ ๊ธฐ๋ก PDF ํŒŒ์ผ์„ Google Gemini File Search Store์— ๋™๊ธฐํ™”ํ•˜๊ณ , ์นด์นด์˜คํ†ก ์ฑ—๋ด‡์—์„œ ํ™˜์ž ์ธ์ฆ ํ›„ ํ•ด๋‹น ํ™˜์ž์˜ ์ง„๋‹จ ๊ธฐ๋ก๋งŒ ๊ฒ€์ƒ‰ํ•˜์—ฌ ๋‹ต๋ณ€ํ•˜๋Š” RAG ๊ธฐ๋ฐ˜ ์˜๋ฃŒ ๊ธฐ๋ก ์ฑ—๋ด‡์„ ์šฐ์„  ๋งŒ๋“ค๊ธฐ๋กœ ํ–ˆ๋‹ค.

์ „์ฒด ํ๋ฆ„

Google Drive
  โ””โ”€ ํ™˜์ž๋ณ„ PDF ์ง„๋‹จ ๊ธฐ๋ก
       โ†“
Document Sync
  โ””โ”€ PDF ๋ณ€๊ฒฝ ์—ฌ๋ถ€ ํ™•์ธ
  โ””โ”€ Gemini File Search Store ์—…๋กœ๋“œ
       โ†“
Gemini File Search Store
  โ””โ”€ ํ™˜์ž๋ณ„ Store ๋ถ„๋ฆฌ
       โ†“
KakaoTalk Chatbot
  โ””โ”€ ํ™˜์ž ์ธ์ฆ
  โ””โ”€ ํ•ด๋‹น ํ™˜์ž์˜ Store๋งŒ ์—ฐ๊ฒฐ
       โ†“
Gemini
  โ””โ”€ ๋ฌธ์„œ ๊ธฐ๋ฐ˜ ๋‹ต๋ณ€ ์ƒ์„ฑ

1/ RAG (Retrieval-Augmented Generation)

Retrieval-Augmented Generation์€ LLM์ด ๋‹ต๋ณ€์„ ์ƒ์„ฑํ•˜๊ธฐ ์ „์— ์™ธ๋ถ€ ์ง€์‹ ๋ฒ ์ด์Šค์—์„œ ๊ด€๋ จ ๋ฌธ์„œ๋ฅผ ๋จผ์ € ๊ฒ€์ƒ‰ํ•˜๊ณ , ๊ทธ ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ์ธ ์™ธ๋ถ€ ์ง€์‹์„ ๋ชจ๋ธ์˜ ์ž…๋ ฅ context๋กœ ์ œ๊ณตํ•˜์—ฌ ๋‹ต๋ณ€์„ ์ƒ์„ฑํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค.

์ฆ‰, ์ง€์‹ ์ €์žฅ์†Œ๋Š” ์™ธ๋ถ€์— ๋”ฐ๋กœ / ๋ชจ๋ธ์€ ์ง€์‹ ์ €์žฅ์†Œ๋กœ๋ถ€ํ„ฐ ์ง€์‹์„ ๊ทธ๋•Œ๊ทธ๋•Œ ์ฐพ์•„์„œ ๊ฒ€์ƒ‰ํ•˜๊ณ , ๋‹ต๋ณ€์„ ์ƒ์„ฑํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค.

๐Ÿ—‚๏ธย ์™œ RAG๊ฐ€ ํ•„์š”ํ•œ๊ฐ€?

์˜๋ฃŒ ์ง„๋‹จ ๊ธฐ๋ก ๊ธฐ๋ฐ˜ ๋งž์ถคํ˜• ๋‹ต๋ณ€์„ ์œ„ํ•ด์„œ RAG๊ฐ€ ํ•„์š”ํ•˜๋‹ค. ๋ชจ๋ธ์ด ์‚ฌ์ „์— ์•Œ๊ณ  ์žˆ๋Š” ์ง€์‹์ด ์•„๋‹ˆ๋ผ ํŠน์ • ํ™˜์ž์˜ ์ง„๋‹จ ๊ธฐ๋ก๊ณผ ๊ฐ™์€ ์™ธ๋ถ€ ๋ฐ์ดํ„ฐ๋ฅผ ๊ทผ๊ฑฐ๋กœ ๋‹ต๋ณ€์„ ์ƒ์„ฑํ•ด์•ผํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

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

1๏ธโƒฃย ํ•™์Šต๋œ ์‹œ์ ๊นŒ์ง€์˜ ์ •๋ณด๋ฅผ ๋ฐ˜์˜ํ•˜์—ฌ ์ตœ์‹  ์ง€์‹์ด ๋ถ€์กฑํ•œ ๋ฌธ์ œ.

๋ชจ๋ธ์€ ํ•™์Šต๋œ ์‹œ์ ๊นŒ์ง€์˜ ์ •๋ณด๋ฅผ ๊ธฐ์–ตํ•˜์—ฌ ํ•™์Šต ์ดํ›„์˜ ์ตœ์‹  ์ง€์‹์ด ๋ถ€์กฑํ•˜๋‹ค. ๊ทธ๋ž˜์„œ RAG๋ฅผ ํ†ตํ•˜์—ฌ ์ตœ์‹  ์™ธ๋ถ€ ์ •๋ณด๋ฅผ ์ฃผ์ž…ํ•  ํ•„์š”๊ฐ€ ์žˆ๋‹ค.

2๏ธโƒฃย ํ• ๋ฃจ์‹œ๋„ค์ด์…˜ ํ˜„์ƒ

LLM์€ ํ•ญ์ƒ ๊ทธ๋Ÿด๋“ฏํ•˜์ง€๋งŒ ํ‹€๋ฆฐ ๋‹ต์„ ๋งŒ๋“œ๋Š” ํ• ๋ฃจ์‹œ๋„ค์ด์…˜ (ํ™˜๊ฐ) ํ˜„์ƒ์ด ์žˆ๋‹ค. ๊ทธ๋ž˜์„œ RAG๋ฅผ ํ†ตํ•˜์—ฌ ์ •ํ™•ํ•œ ๊ทผ๊ฑฐ ๋ฌธ์„œ๋ฅผ ์ œ๊ณตํ•˜์—ฌ ๋‹ต๋ณ€์˜ ์‚ฌ์‹ค ๊ฐ€๋Šฅ์„ฑ์„ ๋†’์—ฌ์•ผ ํ•œ๋‹ค.

3๏ธโƒฃย ๋„๋ฉ”์ธ ํŠนํ™” ์ง€์‹

์˜๋ฃŒ ๋ฐ ๋ฒ•๋ฅ ๊ณผ ๊ฐ™์ด ํŠน์ • ๋„๋ฉ”์ธ์— ํŠนํ™”๋œ ๊ฒฝ์šฐ์—๋Š” ์ผ๋ฐ˜์  ์ง€์‹์ด ์•„๋‹ˆ๋ฏ€๋กœ, ๋ชจ๋ธ์˜ ๋‚ด์žฌ ์ง€์‹๋งŒ์œผ๋กœ๋Š” ๋ถ€์กฑํ•˜๋‹ค.

4๏ธโƒฃย ์ถœ์ฒ˜ ํ™•์ธ

RAG๋ฅผ ์ ์šฉํ•˜๋ฉด โ€œ์™œ ๊ทธ๋ ‡๊ฒŒ ๋‹ต๋ณ€ํ–ˆ๋Š”์ง€โ€ ๋‹ต๋ณ€ํ•  ๋•Œ ์ฐธ๊ณ ํ•œ ๋ฌธ์„œ๋ฅผ ์ถ”์ ํ•  ์ˆ˜ ์žˆ๋‹ค.

RAG ๊ธฐ๋ณธ ํ”„๋กœ์„ธ์Šค

์งˆ๋ฌธ ์‘๋‹ต์— ์ ์šฉ๋œ RAG์˜ indexing retrieval generation ๊ณผ์ •์„ ์„ค๋ช…ํ•˜๋Š” ๋„์‹

Retrieval-Augmented Generation for Large Language Models: A Survey (2023)

Basic RAG Workflow์™€ RAG Paradigm์„ ๋น„๊ตํ•ด ๋ณด์—ฌ์ฃผ๋Š” RAG ๊ตฌ์กฐ ๋„์‹

A Survey on Retrieval-Augmented Text Generation for Large Language (2024)

๊ฐ€์žฅ ๊ธฐ๋ณธ์ ์ธ RAG๋Š” โ€œIndexing โ†’ Retrieval โ†’ Generationโ€ ์„ธ ๋‹จ๊ณ„๋กœ ๊ตฌ์„ฑ๋œ๋‹ค.

1๏ธโƒฃย Indexing

Indexing์€ ๋ชจ๋ธ์ด ์™ธ๋ถ€ ๋ฌธ์„œ๋ฅผ ๊ฒ€์ƒ‰ํ•  ์ˆ˜ ์žˆ๋Š” ํ˜•ํƒœ๋กœ ๋ณ€ํ™˜ํ•˜๊ณ  ์ €์žฅํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ๊ธด ๋ฌธ์„œ๋Š” ์ž‘์€ ๋‹จ์œ„์ธ chunk๋กœ ๋‚˜๋ˆ„๊ณ , ๊ฐ chunk๋Š” embedding์„ ํ†ตํ•ด ๋ฒกํ„ฐ๋กœ ๋ณ€ํ™˜ํ•œ ํ›„ ๋ฒกํ„ฐ DB์— ์ €์žฅ๋œ๋‹ค.

Documents โ†’ Chunks โ†’ Embeddings โ†’ Vector DB

2๏ธโƒฃย Retrieval

Query๊ฐ€ ๋“ค์–ด์˜ค๋ฉด, ํ•ด๋‹น Query์™€ ๊ฐ€์žฅ ๊ด€๋ จ์„ฑ์ด ๋†’์€ (์œ ์‚ฌํ•œ) ๋ฌธ์„œ chunk๋ฅผ ๊ฒ€์ƒ‰ํ•œ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ Query๋กœ embeddingํ•œ ๋’ค, ๋ฒกํ„ฐ DB์— ์ €์žฅ๋œ chunk embedding๋“ค๊ณผ ์œ ์‚ฌ๋„๋ฅผ ๋น„๊ตํ•˜์—ฌ Top-k๊ฐœ์˜ ๊ด€๋ จ ๋ฌธ์„œ๋ฅผ ๊ฐ€์ ธ์˜จ๋‹ค.

Query Input โ†’ Query Embedding โ†’ Top-k chunks Retrieval

3๏ธโƒฃย Generation

๊ฒ€์ƒ‰๋œ ๋ฌธ์„œ chunk๋ฅผ ๋ชจ๋ธ์˜ ์ž…๋ ฅ context๋กœ ์ œ๊ณตํ•˜์—ฌ, ์‚ฌ์šฉ์ž์˜ Query์™€ ํ•จ๊ป˜ ๋ชจ๋ธ์—๊ฒŒ ์ „๋‹ฌ๋œ๋‹ค. ๋”ฐ๋ผ์„œ ๋ชจ๋ธ์€ ์™ธ๋ถ€ ์ง€์‹์„ ์ฐธ๊ณ ํ•˜์—ฌ ๋‹ต๋ณ€์„ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.

Query + Relevant Documents โ†’ LLM โ†’ Answer Generation

4๏ธโƒฃย Pre-Retrieval (Indexing, Query Manipulation, Data Modification)

Retrieval ์ „์— ๋ฌธ์„œ์™€ query๋ฅผ ๊ฒ€์ƒ‰์ด ๋” ์ž˜ ๋˜๋„๋ก ์ „์ฒ˜๋ฆฌํ•˜๋Š” ๊ณผ์ •์ด๋‹ค.

Query Manipulation์€ ์‚ฌ์šฉ์ž์˜ ์งˆ๋ฌธ ์ฟผ๋ฆฌ๋ฅผ ๋” ๋ช…ํ™•ํ•˜๊ฒŒ ๋งŒ๋“ค์–ด ๋” ์ •ํ™•ํ•œ ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ๋ฅผ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ํ•ด๋‹น ์ฑ—๋ด‡์—๋„ Query Manipulation๋ฅผ ํ–ˆ๋‹ค. ์‚ฌ์šฉ์ž ์งˆ๋ฌธ์„ ๋” ๋ช…ํ™•ํ•˜๊ฒŒ ๋ณด์ถฉํ•˜์—ฌ ๊ฒ€์ƒ‰๊ณผ ๋‹ต๋ณ€ ํ˜•์‹์— ๋” ์ ํ•ฉํ•˜๊ฒŒ ๋งŒ๋“ค์—ˆ๋‹ค.

5๏ธโƒฃย Post-Retrieval (Re-Ranking, Filtering, Context Compression)

๊ฒ€์ƒ‰๋œ ๋ฌธ์„œ ๊ทธ๋Œ€๋กœ๋ฅผ ๋ชจ๋ธ์— ์ฃผ์ž…ํ•˜์ง€ ์•Š๊ณ , ๋” ์ค‘์š”ํ•œ ๋ฌธ์„œ๋งŒ ์„ ํƒํ•˜๊ฑฐ๋‚˜ ์ •์ œํ•˜์—ฌ ์ œ๊ณตํ•˜๋Š” ํ›„์ฒ˜๋ฆฌ ๊ณผ์ •์ด๋‹ค.

  • Re-Ranking: ์ฒ˜์Œ ๊ฒ€์ƒ‰๋œ Top-K ๋ฌธ์„œ๋ฅผ Query์™€์˜ ์œ ์‚ฌ๋„๋ฅผ ๊ธฐ์ค€์œผ๋กœ ๋‹ค์‹œ rankingํ•˜๋Š” ๊ฒƒ์ด๋‹ค.
  • Filtering : Query์™€ ๊ด€๋ จ ์—†๋Š” ๋ฌธ์„œ๋ฅผ ํ•„ํ„ฐ๋งํ•˜๋Š” ๊ฒƒ์ด๋‹ค.
  • Context Compression : ๊ธด ๋ฌธ์„œ๋ฅผ ์š”์•ฝํ•˜๊ฑฐ๋‚˜ ํ•„์š”ํ•œ ๋‚ด์šฉ๋งŒ ์ถ”์ถœํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

Gemini File Search๋Š” ํ•œ ๋งˆ๋””๋กœ Google์—์„œ ์ œ๊ณตํ•˜๋Š” โ€œRAG-as-a-Serviceโ€๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ง์ ‘ ๋ฒกํ„ฐ DB์„ ๊ตฌ์ถ•ํ•˜๊ณ , chunking, embedding, retrieval ๋กœ์ง ๊ตฌํ˜„ ๋“ฑ ๊ธฐ์กด RAG ํŒŒ์ดํ”„๋ผ์ธ์„ ๊ตฌํ˜„ํ•  ํ•„์š” ์—†์ด, ํŒŒ์ผ์„ File Search Store์— ์—…๋กœ๋“œํ•˜๋ฉด Gemini๊ฐ€ ๋ชจ๋ธ์ด ๊ฒ€์ƒ‰ ๊ฐ€๋Šฅํ•˜๋„๋ก ๋ฌธ์„œ๋ฅผ ์ฒ˜๋ฆฌํ•œ๋‹ค.

ํŒŒ์ผ์„ File Search Store์— ์—…๋กœ๋“œํ•˜๋ฉด Gemini๊ฐ€ chunking, embedding, indexingํ•˜๊ณ  ๋‹ต๋ณ€์„ ์ƒ์„ฑํ•  ๋•Œ ํ•ด๋‹น Store์—์„œ ๊ด€๋ จ ์ •๋ณด๋ฅผ ๊ฒ€์ƒ‰ํ•ด ๋‹ต๋ณ€ ์ƒ์„ฑ์— ํ™œ์šฉํ•œ๋‹ค.

๐Ÿงย ์™œ Gemini File Search๋ฅผ ์‚ฌ์šฉํ•˜๋‚˜?

  • ๋ณ„๋„์˜ ๋ฒกํ„ฐ DB๋ฅผ ์šด์˜ํ•˜์ง€ ์•Š์•„๋„ ๋œ๋‹ค.
  • ์œ ์ง€ ๋ณด์ˆ˜ ๋น„์šฉ์„ ์ ˆ์•ฝํ•  ์ˆ˜ ์žˆ๋‹ค.
  • chunking, embedding, retrieval ํŒŒ์ดํ”„๋ผ์ธ์„ ๊ตฌํ˜„ํ•˜์ง€ ์•Š์•„๋„ ๋œ๋‹ค.
  • ํ™˜์ž๋ณ„ File Search Store๋ฅผ ๋ถ„๋ฆฌํ•ด ๊ด€๋ฆฌํ•˜๊ธฐ ์šฉ์ดํ•˜๋‹ค.
  • Google Drive์™€ ์—ฐ๋™์„ฑ์ด ์ข‹๋‹ค.

ํŠนํžˆ ํ™˜์ž๋ณ„๋กœ ์˜๋ฃŒ ๊ธฐ๋ก์ด ์ž˜ ๋ถ„๋ฆฌ๋˜์–ด์•ผ ํ•˜๋ฏ€๋กœ, ํ•˜๋‚˜์˜ Store์— ๋ชจ๋“  ํ™˜์ž๋“ค์˜ ์˜๋ฃŒ ๊ธฐ๋ก์„ ๋„ฃ์ง€ ์•Š๊ณ , ํ™˜์ž๋งˆ๋‹ค Store๋ฅผ ๋‚˜๋ˆ„์–ด ๋งŒ๋“œ๋Š” ๊ตฌ์กฐ๋กœ ์ง„ํ–‰ํ–ˆ๋‹ค.

ํ™˜์ž๊ฐ€ ์งˆ๋ฌธ์„ ์ž…๋ ฅํ•˜๋ฉด ํ•ด๋‹น ํ™˜์ž์˜ file_search_store_name๋งŒ Gemini ๋ชจ๋ธ์—๊ฒŒ ์ „๋‹ฌํ•˜์—ฌ, ๋‹ค๋ฅธ ํ™˜์ž์˜ ๋ฌธ์„œ๋“ค์€ ๊ฒ€์ƒ‰ ๋Œ€์ƒ์ด ๋˜์ง€ ์•Š๋„๋ก ํ•œ๋‹ค.

๐Ÿงย File Search Store vs. Files API

์ฒ˜์Œ์—๋Š” Gemini Files API๋ฅผ ์‚ฌ์šฉํ–ˆ๋‹ค. Files API๋Š” ํŒŒ์ผ ์ž์ฒด๋ฅผ Gemini์— ์—…๋กœ๋“œํ•˜์—ฌ ๋‹ต๋ณ€์„ ์ƒ์„ฑํ•  ๋•Œ ํ•ด๋‹น ํŒŒ์ผ์„ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๋„๋ก ๋งŒ๋“œ๋Š” ๊ธฐ๋Šฅ์ด๋‹ค.

๋ฐ”๋กœ ํŒŒ์ผ์„ ๋ชจ๋ธ์—๊ฒŒ ์ฒจ๋ถ€ํ•  ์ˆ˜ ์žˆ์–ด์„œ ๊ตฌํ˜„๋„ ๋น ๋ฅด๊ณ  ๊ฐ„๋‹จํ•˜๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ Files API๋Š” ๋‹จ์ผ ์š”์ฒญ ๋˜๋Š” ๋‹จ๊ธฐ๊ฐ„ ์‚ฌ์šฉํ•˜๋Š” ํŒŒ์ผ ์ฒจ๋ถ€ ๊ธฐ๋Šฅ์ด๋‹ค. ์—…๋กœ๋“œํ•œ ํŒŒ์ผ์€ ์ตœ๋Œ€ 48์‹œ๊ฐ„๋™์•ˆ๋งŒ ์œ ์ง€๋˜๊ณ  ์ดํ›„์—๋Š” ์ž๋™ ์‚ญ์ œ๋œ๋‹ค. ๋˜ํ•œ ์—…๋กœ๋“œํ•œ ํŒŒ์ผ์„ ๋‹ค์‹œ ๋‹ค์šด๋กœ๋“œํ•  ์ˆ˜ ์—†๋‹ค.

์˜๋ฃŒ ์ง„๋‹จ ๊ธฐ๋ก ์ฑ—๋ด‡์€ ๋‹จ์ˆœํžˆ ์˜๋ฃŒ ์ง„๋‹จ ๊ธฐ๋ก ์ฒจ๋ถ€ ํ›„ ๋‹ต๋ณ€ ์ƒ์„ฑ์ด ์•„๋‹ˆ๋ผ, ํ™˜์ž๋ณ„๋กœ ์—ฌ๋Ÿฌ ์˜๋ฃŒ ๊ธฐ๋ก์„ ์ €์žฅํ•ด๋‘๊ณ , ํ™˜์ž๊ฐ€ ์งˆ๋ฌธํ•  ๋•Œ๋งˆ๋‹ค ํ•ด๋‹น ํ™˜์ž์˜ ์ง„๋‹จ ๊ธฐ๋ก ์ค‘ ๊ด€๋ จ๋œ ๋‚ด์šฉ์„ ๊ฒ€์ƒ‰ํ•ด ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค.

๋”ฐ๋ผ์„œ Gemni File Search Store๋ฅผ ์‚ฌ์šฉํ–ˆ๋‹ค.

File Search Store๋Š” ์ง์ ‘ Store๋ฅผ ์‚ญ์ œํ•˜์ง€ ์•Š๋Š” ํ•œ ์žฅ๊ธฐ์ ์œผ๋กœ ๋ฌธ์„œ๋ฅผ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ํŒŒ์ผ์„ ์—…๋กœ๋“œํ•˜๋ฉด chunking, embedding, indexing์„ ๋‚ด๋ถ€์ ์œผ๋กœ ์ง„ํ–‰ํ•ด RAG๋ฅผ ์ ์šฉํ•˜๋Š” ๋ฐ ์ ํ•ฉํ–ˆ๋‹ค.

3/ Gemini File Search ๊ตฌํ˜„ ๊ณผ์ •

Gemini File Search๋ฅผ ์ค‘์‹ฌ์œผ๋กœ ๊ตฌํ˜„ ๊ณผ์ •์„ ์ •๋ฆฌํ•˜๊ณ ์ž ํ•œ๋‹ค. ๊ฐ„๋‹จํ•˜๊ฒŒ ํ๋ฆ„์„ ์ •๋ฆฌํ•˜๋ฉด, ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

  1. ํ™˜์ž๋ณ„ File Search Store ์ƒ์„ฑ
  2. Google Drive PDF ๋‹ค์šด๋กœ๋“œ ํ›„ Store ์—…๋กœ๋“œ
  3. ํ™˜์ž๊ฐ€ ์งˆ๋ฌธ์„ ์ž…๋ ฅํ•˜๋ฉด ํ•ด๋‹น ํ™˜์ž์˜ Store๋ฅผ Gemini File Search tool๋กœ ์—ฐ๊ฒฐ

1๏ธโƒฃย ํ™˜์ž๋ณ„ File Search Store ์ƒ์„ฑ

client = genai.Client(api_key=gemini_api_key)

# store ์ƒ์„ฑ
store = client.file_search_stores.create(
    config={"display_name": f"patient-{patient_id}"}
)

file_search_store_name = store.name

genai.Client(api_key=...)๋กœ Gemini client๋ฅผ ๋งŒ๋“ค๊ณ , file_search_stores.create()๋กœ Store๋ฅผ ์ƒ์„ฑํ•œ๋‹ค. ์ƒ์„ฑ๋œ Store ์ด๋ฆ„์€ fileSearchStores/... ํ˜•ํƒœ์ด๋‹ค.

2๏ธโƒฃย Google Drive PDF ๋‹ค์šด๋กœ๋“œ ํ›„ Store ์—…๋กœ๋“œ

๋จผ์ €, Google Drive API๋ฅผ ํ™œ์šฉํ•˜์—ฌ PDF ํŒŒ์ผ์„ bytes๋กœ ๋‹ค์šด๋กœ๋“œํ•œ๋‹ค. ์ด๋ฅผ ์—…๋กœ๋“œํ•˜๊ธฐ ์œ„ํ•ด ์ž„์‹œ ํŒŒ์ผ๋กœ ์ €์žฅํ•œ ๋’ค multipart ์š”์ฒญ body์— ๋„ฃ์–ด Gemini File Search Store์— ์—…๋กœ๋“œํ–ˆ๋‹ค.

# ํŒŒ์ผ ์—…๋กœ๋“œ + ์ž๋™ ์ธ๋ฑ์‹ฑ
operation = client.file_search_stores.upload_to_file_search_store(
    file=temp_path,
    file_search_store_name=file_search_store_name,
    config={"display_name": display_name},
)

# ์ธ๋ฑ์‹ฑ ์™„๋ฃŒ ๋Œ€๊ธฐ
while not operation.done:
    time.sleep(5)
    operation = client.operations.get(operation)

PDF๋ฅผ File Search Store์— ์—…๋กœ๋“œํ•˜๋ฉด ๋‚ด๋ถ€์ ์œผ๋กœ chunking, embedding, indexing ๋“ฑ ์ž‘์—…์ด ์ด๋ฃจ์–ด์ง„๋‹ค. ์ฆ‰ ์—…๋กธ๋“œํ•˜์ž๋งˆ์ž ๋ฐ”๋กœ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š๊ณ , operation์ด๋ผ๋Š” ์ž‘์—… ๊ฐœ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ๊ทธ๋ž˜์„œ operation์ด ์™„๋ฃŒ๋  ๋•Œ๊นŒ์ง€ pollingํ•ด์•ผ ํ•œ๋‹ค. (๊ธฐ๋‹ค๋ ค์•ผ ํ•œ๋‹ค.)

*uploadToFileSearchStore๋Š” ํŒŒ์ผ ์—…๋กœ๋“œ + File Search Store์— import + chunking, embedding, indexing์„ ํ•œ ๋ฒˆ์— ์ฒ˜๋ฆฌํ•œ๋‹ค.

3๏ธโƒฃย ์งˆ๋ฌธ ๋“ค์–ด์˜ค๋ฉด File Search tool ์—ฐ๊ฒฐ

response = client.models.generate_content(
    model=model,
    contents=prompt,
    config=types.GenerateContentConfig(
        system_instruction=system_instruction,
        tools=[
            types.Tool(
                file_search=types.FileSearch(
                    file_search_store_names=[file_search_store_name],
                    top_k=top_k,
                )
            )
        ],
        temperature=0.1,
        max_output_tokens=4096,
        thinking_config=types.ThinkingConfig(thinking_budget=0),
    ),
)

์งˆ๋ฌธ์ด ๋“ค์–ด์˜ค๋ฉด Gemini ๋ชจ๋ธ์ด ์‘๋‹ต์„ ์ƒ์„ฑํ•˜๋Š” generate_content์„ ํ˜ธ์ถœํ•˜๊ณ , ์ด๋•Œ, types.Tool(file_search=types.FileSearch(...)) ํ˜•ํƒœ๋กœ ์งˆ๋ฌธ์„ ์ž…๋ ฅํ•œ ํ™˜์ž์˜ file_search_store_name์„ ์—ฐ๊ฒฐํ•œ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด ํ™˜์ž A๊ฐ€ ์งˆ๋ฌธํ•˜๋ฉด, ํ™˜์ž A์˜ File Search Store๋งŒ ๊ฒ€์ƒ‰ํ•˜๊ณ , ๋‹ค๋ฅธ ํ™˜์ž์˜ ์˜๋ฃŒ ๊ธฐ๋ก์€ ๊ฒ€์ƒ‰ํ•˜์ง€ ์•Š๋Š”๋‹ค.

4/ ๊ตฌํ˜„ ์ค‘ ๋ฐœ์ƒํ•œ ์ด์Šˆ๋“ค

1๏ธโƒฃย GEMINI API Key ๋ฌธ์ œ

Gemini REST request failed method=POST status=401 attempt=1/3 body={
"error": {
"code": 401,
"message": "The request does not have valid authentication credentials.",
"status": "UNAUTHENTICATED"
}
}

์ฒ˜์Œ์—๋Š” File Search Store import ๊ณผ์ •์—์„œ 401 ์—๋Ÿฌ๊ฐ€ ๊ณ„์† ๋ฐœ์ƒํ–ˆ์—ˆ๋‹ค. ์ฝ”๋“œ ๋ฌธ์ œ๋ผ๊ณ  ์ƒ๊ฐํ•ด ์ฝ”๋“œ๋ฅผ ๋ช‡ ์‹œ๊ฐ„๋™์•ˆ ๊ณ„์† ์‚ดํŽด๋ณด์•˜๋‹ค.

Google AI Forum์˜ AQ prefix API Key๋กœ File Search Store ์—…๋กœ๋“œ๊ฐ€ ์‹คํŒจํ•˜๋Š” ์ด์Šˆ ๊ธ€ ํ™”๋ฉด

๊ทธ๋Ÿฌ๋‹ค๊ฐ€ Google AI Developers Forum์—์„œ AQ. prefix API Key๊ฐ€ File Search Store ์—…๋กœ๋“œ์— ์‹คํŒจํ•œ๋‹คโ€๋Š” ์ด์Šˆ ๊ธ€์„ ๋ณด๊ฒŒ ๋˜์—ˆ๋‹ค. ์•Œ๊ณ ๋ณด๋‹ˆ GEMINI API Key ๋ฌธ์ œ์˜€๋˜ ๊ฒƒ์ด์—ˆ๋‹ค.

Google AI Forum์—์„œ non-AQ prefix API Key ์‚ฌ์šฉ์„ ์•ˆ๋‚ดํ•˜๋Š” ๋‹ต๋ณ€ ํ™”๋ฉด

Google ์ธก์—์„œ ํ˜„์žฌ AQ. prefix key issue๋Š” ํ˜„์žฌ ํ•ด๊ฒฐ ์ค‘์ด๋ผ non-AQ key๋ฅผ ์‚ฌ์šฉํ•˜๋ผ๋Š” ๋‹ต๋ณ€์ด ์žˆ์—ˆ๋‹ค.

Google AI Studio์˜ Gemini API Key ์„ธ๋ถ€์ •๋ณด ํ™”๋ฉด

๊ทธ๋ž˜์„œ Google AI Studio์—์„œ AIza... GEMINI API Key๋ฅผ ์ƒ์„ฑํ•ด (Google Cloud Console์—์„œ๋Š” AQ. prefix GEMINI API Key๋งŒ ์ƒ์„ฑ๋˜์—ˆ๋‹ค?) ์ฝ”๋“œ๋ฅผ ๋Œ๋ฆฌ๋‹ˆ File Search Store์— ํŒŒ์ผ์„ importํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.

2๏ธโƒฃย Callback API ์„ค์ •

AI ์ฑ—๋ด‡ ์ฝœ๋ฐฑ ๊ฐœ๋ฐœ ๊ฐ€์ด๋“œ

์นด์นด์˜ค๋น„์ฆˆ๋‹ˆ์Šค ์ฑ—๋ด‡ ๊ด€๋ฆฌ์ž์„ผํ„ฐ์˜ AI ์ฑ—๋ด‡ ๊ด€๋ฆฌ ์„ค์ • ํ™”๋ฉด

์ƒ์„ฑํ˜• AI ๋ชจ๋ธ์„ ํ™œ์šฉํ•ด ๋‹ต๋ณ€์„ ์ „์†กํ•˜๋Š” ๊ฒฝ์šฐ, ๋‹ต๋ณ€์„ ์ƒ์„ฑํ•˜๋Š” ๋ฐ ์‹œ๊ฐ„์ด ๊ฑธ๋ฆด ์ˆ˜ ์žˆ๋‹ค. ํŠนํžˆ RAG ๊ธฐ๋ฐ˜ ๋‹ต๋ณ€์€ ๊ด€๋ จ ๋ฌธ์„œ๋ฅผ ๊ฒ€์ƒ‰ํ•œ ๋’ค ๋‹ต๋ณ€์„ ์ƒ์„ฑํ•˜๋ฏ€๋กœ, ์ผ๋ฐ˜์ ์œผ๋กœ ์‹œ๊ฐ„์ด ๋” ๊ฑธ๋ฆฌ๋Š” ํŽธ์ด๋‹ค.

์นด์นด์˜ค ์ฑ—๋ด‡ ํ”Œ๋žซํผ์—์„œ ๋‹ต๋ณ€ ์ „์†ก ์‹œ๊ฐ„์ด 5์ดˆ๋ฅผ ์ดˆ๊ณผํ•˜๋Š” ๊ฒฝ์šฐ์— timeout ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค. ๊ทธ๋ž˜์„œ 5์ดˆ๋ฅผ ์ดˆ๊ณผํ•˜๋Š” ๊ฒฝ์šฐ AI ์ฑ—๋ด‡ Callback ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๊ธธ ๋ฐ”๋ž€๋‹ค. ์ฒ˜์Œ์—๋Š” Callback URL์„ ๋ชฐ๋ผ์„œ ๋‹นํ•ญํ–ˆ๋‹ค. (์–ด๋–ป๊ฒŒ 5์ดˆ ์•ˆ์— ๋ฉ”์‹œ์ง€๋ฅผ ์ „์†กํ•˜์ง€?)

์ฑ—๋ด‡ > ์„ค์ • > AI ์ฑ—๋ด‡ ๊ด€๋ฆฌ์—์„œ AI ์ฑ—๋ด‡์œผ๋กœ ์ „ํ™˜ํ•˜์—ฌ Callback ์˜ต์…˜์„ ์„ค์ •ํ•˜๋ฉด 5์ดˆ๋ฅผ ์ดˆ๊ณผํ•  ๋•Œ์—๋„ ๋‹ต๋ณ€์„ ์ „์†กํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ callback URL์€ 1ํšŒ์— ์ตœ๋Œ€ 1๋ถ„๋™์•ˆ ์œ ํšจํ•˜๋‹ค. ์ฆ‰, ๋‹ต๋ณ€์„ ์ƒ์„ฑํ•˜๋Š” ๋ฐ ์ตœ๋Œ€ 1๋ถ„๊นŒ์ง€ ์‹œ๊ฐ„์ด ๊ฑธ๋ ค๋„ ๋œ๋‹ค๋Š” ๋ง์ด๋‹ค.

์นด์นด์˜คํ†ก medical-chatbot์ด ๊ฒ€์‚ฌ ๊ฒฐ๊ณผ ์งˆ๋ฌธ์— ๋‹ต๋ณ€ ์ค€๋น„ ์•ˆ๋‚ด ํ›„ ๊ฒฐ๊ณผ๋ฅผ ์„ค๋ช…ํ•˜๋Š” ํ™”๋ฉด

์˜ˆ๋ฅผ ๋“ค์–ด, ์‚ฌ์šฉ์ž๊ฐ€ โ€œ๋‚ด ๊ฒ€์‚ฌ ๊ฒฐ๊ณผ ์„ค๋ช…ํ•ด์ค˜โ€ ์™€ ๊ฐ™์ด ์งˆ๋ฌธํ•˜๋ฉด, ์ƒ์„ฑํ˜• ๋ชจ๋ธ์ด ๋‹ต๋ณ€์„ ์ƒ์„ฑํ•˜๊ธฐ๊นŒ์ง€ ์‹œ๊ฐ„์ด ๊ฑธ๋ฆฌ๋ฏ€๋กœ, ์ตœ์ข… ๋‹ต๋ณ€์„ ๋ฐ”๋กœ ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š๊ณ  โ€œ์ง„๋‹จ ๊ธฐ๋ก์„ ํ™•์ธํ•˜๊ณ  ๋‹ต๋ณ€์„ ์ค€๋น„ํ•˜๊ณ  ์žˆ์–ด์š”.โ€์™€ ๊ฐ™์ด ๋‹ต๋ณ€ ์ค€๋น„ํ•˜๊ณ  ์žˆ๋‹ค๋Š” ์•ˆ๋‚ด ๋ฉ”์‹œ์ง€๋ฅผ ์‚ฌ์šฉ์ž์—๊ฒŒ ๋จผ์ € ์ „๋‹ฌํ•˜๋„๋ก ํ–ˆ๋‹ค.

์‚ฌ์šฉ์ž๊ฐ€ ์นด์นด์˜คํ†ก ์ฑ—๋ด‡์— ์งˆ๋ฌธ ์ž…๋ ฅ
โ†’ ์นด์นด์˜ค ์ฑ—๋ด‡์ด ์Šคํ‚ฌ ์„œ๋ฒ„ ํ˜ธ์ถœ
โ†’ ์Šคํ‚ฌ ์„œ๋ฒ„๊ฐ€ useCallback=true ์™€ ๋‹ต๋ณ€ ์ค€๋น„ ์ค‘ ์•ˆ๋‚ด ๋ฉ”์‹œ์ง€ ๋ฐ˜ํ™˜
โ†’ ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ AI ๋ชจ๋ธ ๋‹ต๋ณ€ ์ƒ์„ฑ
โ†’ ๋‹ต๋ณ€ ์ƒ์„ฑ ์™„๋ฃŒ ํ›„ callbackUrl๋กœ ์ƒ์„ฑ๋œ ๋‹ต๋ณ€ ์ „์†ก

Reference