RAG ์—ฐ๋™ ์›น ์•ฑ

2026. 1. 23. 17:20ยท๐ŸŒ WEB
728x90

 

1. RAG ?

๊ฒ€์ƒ‰(Retrieval) + ๋‹ต๋ณ€ ์ƒ์„ฑ(Generation)์„ ๊ฒฐํ•ฉํ•œ ๊ธฐ์ˆ . ๋งˆ์น˜ ์˜คํ”ˆ๋ถ ์‹œํ—˜์ฒ˜๋Ÿผ, ํ•„์š”ํ•œ ์ž๋ฃŒ๋ฅผ ์ฐพ์•„๋ณด๋ฉด์„œ ๋‹ต๋ณ€ํ•˜๋Š” ๋ฐฉ์‹.
์™ธ๋ถ€ ๋ฌธ์„œ๋ฅผ ์—…๋กœ๋“œํ•˜๊ณ  ์งˆ๋ฌธ์— ๋Œ€ํ•œ ๋‹ต๋ณ€์„ ์ƒ์„ฑํ•  ๋•Œ ๊ด€๋ จ ๋ฌธ์„œ๋ฅผ ๊ฒ€์ƒ‰ํ•ด์„œ LLM์ด ๋” ์ •ํ™•ํ•œ ๋‹ต๋ณ€์„ ์ƒ์„ฑ.

์™œ ํ•„์š”ํ• ๊นŒ?

LLM์€ ํ•™์Šต ๋ฐ์ดํ„ฐ์—๋งŒ ์˜์กด. ํ•˜์ง€๋งŒ RAG๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด?

  • ์ตœ์‹  ์ •๋ณด ํ™œ์šฉ ๊ฐ€๋Šฅ
  • ์‚ฌ๋‚ด ๋ฌธ์„œ, ๊ฐœ์ธ ์ž๋ฃŒ ๋“ฑ ์™ธ๋ถ€ ์ง€์‹ ํ™œ์šฉ
  • Hallucination(ํ—›์†Œ๋ฆฌ) ๊ฐ์†Œ
  • ๋‹ต๋ณ€์˜ ์ถœ์ฒ˜ ์ถ”์  ๊ฐ€๋Šฅ

2. ๋ฐ๋ชจ

2.1 ์š”์•ฝ

  • ๋ฌธ์„œ๋ฅผ ๋ฒกํ„ฐ๋กœ ๋ณ€ํ™˜ํ•ด์„œ Vector DB์— ์ €์žฅ
  • ์งˆ๋ฌธ๋„ ๋ฒกํ„ฐ๋กœ ๋ณ€ํ™˜ํ•ด์„œ ์œ ์‚ฌํ•œ ๋ฌธ์„œ ๊ฒ€์ƒ‰
  • ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ + ์งˆ๋ฌธ์„ LLM์— ์ „๋‹ฌํ•ด ๋‹ต๋ณ€ ์ƒ์„ฑ

2.2 ์ค€๋น„

  • Gemini key ์ƒ์„ฑํ•ด์„œ ๊ฐ€์ ธ์˜ค๊ธฐ
  • https://aistudio.google.com/api-keys

2.3 sample.txt ์ƒ์„ฑ

์ง€ํฌ: "์—ฌ๊ธฐ๊นŒ์ง€ ํ˜ผ์ž ์ซ“์•„์˜ฌ ์ค„์€ ๋ชฐ๋ž๊ตฐ… ๋ฆฌ๋ฐ”์ด."
๋ฆฌ๋ฐ”์ด: "๋„Œ ๊ณ„์† ๋„๋ง์น˜๊ธฐ๋งŒ ํ•˜๋ฉด ์‚ด ์ˆ˜ ์žˆ์„ ์ค„ ์•Œ์•˜์ง€."
์ง€ํฌ: "๋„ค๊ฐ€ ๊ทธ ๋งŽ์€ ๋ณ‘์‚ฌ๋“ค์„ ๋ฒ ๊ณ  ์˜จ ๊ฑธ ์•Œ๋ฉด์„œ๋„… ํ”๋“ค๋ฆฌ์ง€ ์•Š๋‚˜ ๋ณด๊ตฐ."
๋ฆฌ๋ฐ”์ด: "๊ทธ๊ฑด ๋„ค๊ฐ€ ๋งŒ๋“  ์„ ํƒ์ด์•ผ. ๋„ค๊ฐ€ ์ฃฝ์ธ ๊ฑด ๊ทธ์ € ์ˆซ์ž๊ฐ€ ์•„๋‹ˆ๊ณ … ๋‚ด ๋™๋ฃŒ๋“ค์ด์—ˆ๋‹ค."
์ง€ํฌ: "์ „์Ÿ์ด๋ž€ ๊ทธ๋Ÿฐ ๊ฑฐ์ง€. ๋ˆ„๊ฐ€ ์˜ณ์€์ง€ ๋”ฐ์ง€๊ธฐ ์ „์—, ๋ˆ„๊ตฌ๋ฅผ ๋จผ์ € ์ œ๊ฑฐํ•˜๋А๋ƒ๊ฐ€ ๊ฒฐ์ •ํ•œ๋‹ค."
๋ฆฌ๋ฐ”์ด: "๋ง ์ฐธ ์ž˜ํ•˜๋„ค. ๋งˆ์น˜ ํ”ผํ•ด์ž์ธ ์ฒ™."
์ง€ํฌ: "๋„ˆํฌ๋“ค์€ ์–ธ์ œ๋‚˜ ‘์ธ๋ฅ˜์˜ ์ž์œ ’๋ผ๋Š” ์ด๋ฆ„์œผ๋กœ ํ•™์‚ด์„ ์ •๋‹นํ™”ํ•˜์ง€."
๋ฆฌ๋ฐ”์ด: "๋„ค ์ž…์—์„œ ๊ทธ๋Ÿฐ ๋ง์ด ๋‚˜์˜ค๋‹ค๋‹ˆ ์›ƒ๊ธฐ์ง€๋„ ์•Š๋Š”๊ตฐ."
์ง€ํฌ: "๊ทธ๋ž˜… ๋„ˆํฌ๋Š” ๋‚ด๊ฐ€ ์ง์Šน๊ฑฐ์ธ์ด๊ธฐ ๋•Œ๋ฌธ์— ์•…๋งˆ๋ผ๊ณ  ๋ถ€๋ฅด๊ฒ ์ง€. ํ•˜์ง€๋งŒ ์ง„์งœ ์•…๋งˆ๋Š”—"
๋ฆฌ๋ฐ”์ด: "์ž… ๋‹ค๋ฌผ์–ด. ๋„ค ๋ณ€๋ช… ๋“ฃ์ž๊ณ  ์˜จ ๊ฑฐ ์•„๋‹ˆ๋‹ค."
์ง€ํฌ: "…์—ญ์‹œ, ๋Œ€ํ™”๋กœ ์„ค๋“ํ•  ์ˆ˜ ์—†๋Š” ์ข…๋ฅ˜๊ตฐ."
๋ฆฌ๋ฐ”์ด: "๋„ค๊ฐ€ ๋ณด์—ฌ์คฌ์ž–์•„. ๋ง๋กœ๋Š” ์•„๋ฌด๊ฒƒ๋„ ํ•ด๊ฒฐ๋˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฑธ."
์ง€ํฌ: "๊ทธ๋ž˜? ๊ทธ๋Ÿผ ์ง„์งœ ํž˜์œผ๋กœ ๋๋‚ด๋ณด์ž๊ณ . ๋„ค๊ฐ€ ์ž๋ž‘ํ•˜๋Š” ์†๋„, ๊ทธ ์นผ์งˆ… ๋‹ค ์•Œ๊ณ  ์žˆ๋‹ค."
๋ฆฌ๋ฐ”์ด: "์•Œ๋ฉด ์ข‹์ง€. ์ค€๋น„๋ผ๋„ ๋˜์–ด ์žˆ์–ด๋ผ."
์ง€ํฌ: "๋„ˆํฌ ์ธ๊ฐ„์€ ์ฐธ ์ด์ƒํ•ด. ํฌ๋ง์ด ์—†๋‹ค๊ณ  ๋งํ•˜๋ฉด์„œ๋„ ๊ณ„์† ์•ž์œผ๋กœ ์˜ค์ง€."
๋ฆฌ๋ฐ”์ด: "๊ทธ๊ฑด ๋„ค๊ฐ€ ๋ชจ๋ฅด๋Š” ๋ถ€๋ถ„์ด์ง€. ์šฐ๋ฆฐ ์ ˆ๋ง ์†์—์„œ๋„ ๋ฒ„ํ‹ด๋‹ค๋Š” ๊ฑธ."
์ง€ํฌ: "๋ฒ„ํ‹ฐ๋ฉด ๋ญ๊ฐ€ ๋‚จ์ง€? ์‚ด์•„๋‚จ์€ ์ž๋“ค์˜ ์ฃ„์ฑ…๊ฐ๋ฟ์ผ ํ…๋ฐ."
๋ฆฌ๋ฐ”์ด: "๋ˆ„๊ตด ์œ„ํ•ด ๋ฒ„ํ‹ฐ๋Š”์ง€ ๋ชจ๋ฅด๋‹ˆ๊นŒ ๊ทธ๋Ÿฐ ์†Œ๋ฆด ํ•˜์ง€."
์ง€ํฌ: "…์—ญ์‹œ, ๋„ค ๋ˆˆ๋น›์€ ์–ธ์ œ ๋ด๋„ ๋ถˆ์พŒํ•ด. ๊ทธ ๋ฌดํ‘œ์ • ๋’ค์— ๊ฐ์ถฐ์ง„ ์‚ด๊ธฐ๊ฐ€."
๋ฆฌ๋ฐ”์ด: "๋„ค๋†ˆ์„ ๋ฒ ๊ธฐ ์ „๊นŒ์ง€๋Š” ์•ž์œผ๋กœ๋„ ์ด ํ‘œ์ •์ผ ๊ฑฐ๋‹ค."
์ง€ํฌ: "์ข‹์•„. ๊ทธ๋Ÿผ ์„œ๋กœ ๋งˆ๋ฌด๋ฆฌํ•˜์ž."
๋ฆฌ๋ฐ”์ด: "๊ทธ๋ž˜. ์—ฌ๊ธฐ์„œ ๋๋‚ด์ž—์ง€ํฌ."

2.4 DEMO ์ฝ”๋“œ

  • demo.js๋Š” RAG (Retrieval-Augmented Generation) ์‹œ์Šคํ…œ์„ ๊ตฌํ˜„
  • ์•„๋ž˜ ์ฝ”๋“œ ๊ตฌํ˜„ํ•˜๊ณ  key๋„ฃ๊ธฐ
// demo.js (CommonJS ๋ฐฉ์‹)
const { GoogleGenAI } = require('@google/genai');
const fs = require('fs');

const ai = new GoogleGenAI({ apiKey: '{ ์—ฌใ„ฑใ…ฃ ์— ํ‚ค๋ฅผ ๋„ฃ์œผ์„ธ์š”~~!!}' });

async function demo() {
  console.log('1๋‹จ๊ณ„: FileSearchStore ์ƒ์„ฑ ์ค‘...');
  const store = await ai.fileSearchStores.create({
    config: { displayName: 'class-demo-store' }
  });
  console.log(`Store ์ƒ์„ฑ ์™„๋ฃŒ: ${store.name}`);

  console.log('\n 2๋‹จ๊ณ„: ํŒŒ์ผ ์—…๋กœ๋“œ ์ค‘...');
  let operation = await ai.fileSearchStores.uploadToFileSearchStore({
    file: 'sample.txt',
    fileSearchStoreName: store.name,
    config: { displayName: 'sample-document' }
  });

  while (!operation.done) {
    await new Promise(resolve => setTimeout(resolve, 2000));
    operation = await ai.operations.get({ operation });
    console.log('์ฒ˜๋ฆฌ ์ค‘...');
  }
  console.log('์—…๋กœ๋“œ ์™„๋ฃŒ!');

  console.log('\n3๋‹จ๊ณ„: ์งˆ๋ฌธํ•˜๊ธฐ...');
  const response = await ai.models.generateContent({
    model: "gemini-2.5-flash",
    contents: "์ง€ํฌ์˜ ๋Œ€ํ™” ์ข€ ์š”์•ฝํ•ด์ค˜",
    config: {
      tools: [{ fileSearch: { fileSearchStoreNames: [store.name] } }]
    }
  });

  console.log('\n ๋‹ต๋ณ€:');
  console.log(response.text);
}

demo().catch(console.error);

2.5 DEMO ์‹คํ–‰

npm init -y
npm install @google/genai
node demo.js

3. RAG ํŒŒ์ดํ”„๋ผ์ธ ํ๋ฆ„

3.1 ๋ฌธ์„œ ์ค€๋น„ ๋‹จ๊ณ„ (Indexing ๋‹จ๊ณ„)

  • ํŒŒ์ผ์—…๋กœ๋“œ
  • chunking
    • ๋ฌธ์„œ๋ฅผ ์ž‘์€ ์กฐ๊ฐ์œผ๋กœ ๋ถ„ํ•  (์ฑ•ํ„ฐ๋ณ„๋กœ ๋‚˜๋ˆ„๋“ฏ)
  • Embedding
    • ๊ฐ ์กฐ๊ฐ์„ ๋ฒกํ„ฐ(์ˆซ์ž ๋ฐฐ์—ด)๋กœ ๋ณ€ํ™˜ (์˜๋ฏธ๋ฅผ ์ขŒํ‘œ๋กœ ํ‘œํ˜„)
  • Vector store
    • ๋ฒกํ„ฐ๋ฅผ DB์— ์ €์žฅ (๊ฒ€์ƒ‰ ๊ฐ€๋Šฅํ•˜๊ฒŒ)
    • vector : ์˜๋ฏธ๋ฅผ ์ˆซ์ž ๋ฐฐ์—ด๋กœ ํ‘œํ˜„ํ•œ ๊ฒƒ (์˜ˆ: [0.2, -0.5, 0.8, ...]). ๋น„์Šทํ•œ ์˜๋ฏธ๋Š” ๋น„์Šทํ•œ ์ˆซ์ž ํŒจํ„ด์„ ๊ฐ€์ง

3.2 ๊ฒ€์ƒ‰ ๋ฐ ์ƒ์„ฑ ๋‹จ๊ณ„ (Query Phase)

  • ์‚ฌ์šฉ์ž ์งˆ๋ฌธ ์ž…๋ ฅ:
    • ์˜ˆ: "์ด ๋ฌธ์„œ์˜ ํ•ต์‹ฌ ์š”์•ฝ ์•Œ๋ ค์ค˜"
  • ์งˆ๋ฌธ ์ž„๋ฒ ๋”ฉ(Embedding)
    • ์งˆ๋ฌธ์„ ๋ฒกํ„ฐ(์ˆซ์ž ๋ฐฐ์—ด)๋กœ ๋ณ€ํ™˜
    • Embedding: ๋‹จ์–ด/๋ฌธ์žฅ์„ ๋ฒกํ„ฐ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๊ณผ์ •. ๋งˆ์น˜ ๋‹จ์–ด๋ฅผ ์ง€๋„์ƒ์˜ ์ขŒํ‘œ๋กœ ํ‘œํ˜„ํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์Œ
  • ๋ฒกํ„ฐ ๊ฒ€์ƒ‰(Vector Search): ์งˆ๋ฌธ ๋ฒกํ„ฐ์™€ ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ๋ฌธ์„œ ์กฐ๊ฐ(Chunk)๋“ค์„ ์ฐพ์Œ
    • ์œ ํด๋ฆฌ๋“œ ๊ฑฐ๋ฆฌ/์ฝ”์‚ฌ์ธ ์œ ์‚ฌ๋„๋กœ ๋น„๊ต
      • ์ฝ”์‚ฌ์ธ ์œ ์‚ฌ๋„(Cosine Similarity): ๋‘ ๋ฒกํ„ฐ๊ฐ€ ๊ฐ™์€ ๋ฐฉํ–ฅ์„ ๊ฐ€๋ฆฌํ‚ค๋Š”์ง€ ์ธก์ •. 0~1 ์‚ฌ์ด ๊ฐ’ (1์— ๊ฐ€๊นŒ์šธ์ˆ˜๋ก ์œ ์‚ฌ)
    • ์˜๋ฏธ์ ์œผ๋กœ ๊ฐ€์žฅ ๊ด€๋ จ ๋†’์€ ๋ฌธ์„œ Top-K ํšŒ์ˆ˜
  • ๋ฌธ๋งฅ ๊ตฌ์„ฑ(Context Assembly)
    • ๊ฒ€์ƒ‰๋œ ๋ฌธ์„œ ์กฐ๊ฐ๋“ค์„ ํ•˜๋‚˜์˜ ์ปจํ…์ŠคํŠธ๋กœ ๋ฌถ์–ด LLM์—๊ฒŒ ์ „๋‹ฌ
    • ๋ถˆํ•„์š”ํ•œ ์กฐ๊ฐ์€ ์ œ๊ฑฐํ•˜๊ณ  ํ•ต์‹ฌ ์กฐ๊ฐ๋งŒ ์œ ์ง€
  • LLM ์ƒ์„ฑ ๋‹จ๊ณ„
    • (์งˆ๋ฌธ + ๊ฒ€์ƒ‰๋œ ๋ฌธ์„œ ์กฐ๊ฐ๋“ค)์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๋‹ต๋ณ€ ์ƒ์„ฑ
    • ๋ฌธ์„œ ๊ธฐ๋ฐ˜ ๋‹ต๋ณ€, ์š”์•ฝ, ๋ถ„์„ ๋ชจ๋‘ ํ•ด๋‹น ๋‹จ๊ณ„์—์„œ ์ด๋ฃจ์–ด์ง

4. ์ฝ”๋“œ ์ดํ•ดํ•˜๊ธฐ

4.1 ์‚ฌ์šฉํ•œ API

  • Gemini File Search tool
  • ์œ„ ๋ฐ๋ชจ์˜ ๋ฐฉ์‹.
  • ์ฐธ๊ณ 
    • https://blog.google/technology/developers/file-search-gemini-api/
    • https://ai.google.dev/gemini-api/docs/file-search?hl=ko

4.2 FileSearchStore ์ƒ์„ฑ

const store = await ai.fileSearchStores.create({
  config: { displayName: 'class-demo-store' }
});
  • Vector Database ์ดˆ๊ธฐํ™” (๋ฒกํ„ฐ = ์ˆซ์ž ๋ฐฐ์—ด๋กœ ํ‘œํ˜„๋œ ์˜๋ฏธ)
  • ๋ฌธ์„œ์˜ ์ž„๋ฒ ๋”ฉ ๋ฒกํ„ฐ๋“ค์„ ์ €์žฅํ•  ๊ณต๊ฐ„ ์ƒ์„ฑ
  • ๋‚ด๋ถ€์ ์œผ๋กœ ๋ฒกํ„ฐ ์ธ๋ฑ์Šค(Vector Index) ๊ตฌ์กฐ ์ƒ์„ฑ

4.3 ํŒŒ์ผ ์—…๋กœ๋“œ ๋ฐ ์ฒ˜๋ฆฌ

let operation = await ai.fileSearchStores.uploadToFileSearchStore({
  file: 'sample.txt',
  fileSearchStoreName: store.name,
  config: { displayName: 'sample-document' }
});

while (!operation.done) {
  await new Promise(resolve => setTimeout(resolve, 2000));
  operation = await ai.operations.get({ operation });
}

A. ํ…์ŠคํŠธ ํŒŒ์ผ ์ฝ๊ธฐ

sample.txt ๋‚ด์šฉ:
"์—๋ Œ: ๊ถ๊ธˆํ•ด. ํ•˜์ง€๋งŒ ๋‹ค๋“ค ๋ฒฝ ๋ฐ–์€ ์ฃฝ์Œ๋ฟ์ด๋ผ๊ณ ๋งŒ ํ•˜์ž–์•„"

B. Chunking (๋ฌธ์„œ ๋ถ„ํ• )

์ฒญํฌ 1: "์—๋ Œ: ๊ถ๊ธˆํ•ด. ํ•˜์ง€๋งŒ ๋‹ค๋“ค ๋ฒฝ ๋ฐ–์€..."
์ฒญํฌ 2: "๋ฏธ์นด์‚ฌ: ๋„ˆํฌ ๋‘˜ ๋‹ค ๋˜ ์œ„ํ—˜ํ•œ ์–˜๊ธฐ..."
์ฒญํฌ 3: "์•„๋ฅด๋ฏผ: ๋งŒ์•ฝ ๊ฑฐ์ธ์ด ์—†์—ˆ๋‹ค๋ฉด..."
  • ์™œ ๋ถ„ํ• ? : AI๊ฐ€ ํ•œ ๋ฒˆ์— ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ์–‘์ด ์ œํ•œ์ 
  • ์ตœ์  ์ฒญํฌ ํฌ๊ธฐ๋ณดํ†ต : 200~400 ๋‹จ์–ด ์ •๋„

C. Embedding (๋ฒกํ„ฐ ๋ณ€ํ™˜)

๊ฐ ์ฒญํฌ๋ฅผ ๊ณ ์ฐจ์› ๋ฒกํ„ฐ๋กœ ๋ณ€ํ™˜:

# ๊ฐœ๋…์  ์˜ˆ์‹œ (์‹ค์ œ ์ฐจ์›: 768~1536์ฐจ์›)
"์—๋ Œ: ๊ถ๊ธˆํ•ด..." → [0.23, -0.45, 0.89, ..., 0.12]  # 768์ฐจ์›
"๋ฏธ์นด์‚ฌ: ๋„ˆํฌ ๋‘˜..." → [0.11, -0.33, 0.78, ..., 0.09]
  • ์˜๋ฏธ์ ์œผ๋กœ ์œ ์‚ฌํ•œ ํ…์ŠคํŠธ → ๊ฐ€๊นŒ์šด ๋ฒกํ„ฐ๋กœ ๋ณ€ํ™˜
  • ์˜ˆ: "์—๋ Œ์˜ ๊ฟˆ"๊ณผ "์—๋ Œ์˜ ๋ชฉํ‘œ"๋Š” ๋ฒกํ„ฐ ๊ณต๊ฐ„์—์„œ ๊ฐ€๊นŒ์›€
  • BERT ๊ฐ™์€ ์–ธ์–ด ์ดํ•ด AI ๋ชจ๋ธ ์‚ฌ์šฉํ•ด์„œ ๋ฒกํ„ฐํ™”

D. Vector Store์— ์ €์žฅ

[๋ฒกํ„ฐ DB]
ID    | Vector (768์ฐจ์›)          | ์›๋ณธ ํ…์ŠคํŠธ
------+---------------------------+------------------
doc1  | [0.23, -0.45, ...]       | "์—๋ Œ: ๊ถ๊ธˆํ•ด..."
doc2  | [0.11, -0.33, ...]       | "๋ฏธ์นด์‚ฌ: ๋„ˆํฌ..."
doc3  | [-0.05, 0.67, ...]       | "์•„๋ฅด๋ฏผ: ๋งŒ์•ฝ..."

4.4 ์งˆ๋ฌธ ๋ฐ ๋‹ต๋ณ€ ์ƒ์„ฑ

const response = await ai.models.generateContent({
  model: "gemini-2.5-flash",
  contents: "๋Œ€ํ™” ๋‚ด์šฉ์ข€ ์š”์•ฝํ•ด๋ด",
  config: {
    tools: [{ fileSearch: { fileSearchStoreNames: [store.name] } }]
  }
});

A: ์งˆ๋ฌธ Embedding

์งˆ๋ฌธ: "์ง€ํฌ์˜ ์†์…ˆ์€ ๋„๋Œ€์ฒด ๋ญ์ง€?"
     ↓ (Embedding ๋ชจ๋ธ)
query_vector = [0.34, -0.12, 0.88, ..., 0.45]  // 768์ฐจ์›

B. Vector Similarity Search (๋ฒกํ„ฐ ์œ ์‚ฌ๋„ ๊ฒ€์ƒ‰)

similarity(query_vector, doc_vector) = (query · doc) / (||query|| × ||doc||)

# ๊ฒฐ๊ณผ ์˜ˆ์‹œ:
doc1: 0.87  <- "์—๋ Œ๊ณผ ์ง€ํฌ์˜ ๋Œ€ํ™”" (๋†’์€ ์œ ์‚ฌ๋„)
doc2: 0.32  <- "๋ฏธ์นด์‚ฌ์˜ ๋…๋ฐฑ" (๋‚ฎ์€ ์œ ์‚ฌ๋„)
doc3: 0.91  <- "์ง€ํฌ์˜ ์ง„์งœ ๊ณ„ํš" (๊ฐ€์žฅ ๋†’์€ ์œ ์‚ฌ๋„!) 

C: Context ๊ตฌ์„ฑ

LLM์— ์ „๋‹ฌํ•  ํ”„๋กฌํ”„ํŠธ ๊ตฌ์„ฑ:

[์‹œ์Šคํ…œ ํ”„๋กฌํ”„ํŠธ]
๋‹ค์Œ ๋ฌธ์„œ๋ฅผ ์ฐธ๊ณ ํ•ด์„œ ์งˆ๋ฌธ์— ๋‹ต๋ณ€ํ•˜์„ธ์š”.

[๊ฒ€์ƒ‰๋œ ๋ฌธ์„œ]
1. "์•„๋ฅด๋ฏผ: ์ง€ํฌ์˜ ๊ณ„ํš์€ ๋ชจ๋“  ์—˜๋””์•„์ธ์˜ ์ƒ์‹ ๋Šฅ๋ ฅ์„ ์—†์• ๋Š” ๊ฑฐ์•ผ..."
2. "์—๋ Œ: ์ง€ํฌ ํ˜•์€ ์ž์‹ ๋งŒ์˜ ํ•ด๊ฒฐ์ฑ…์„ ๊ฐ€์ง€๊ณ  ์žˆ์–ด..."
3. "์ง€ํฌ: ๋‚ด ์ง„์งœ ๋ชฉ์ ์€ ์—˜๋””์•„์ธ์˜ ๊ณ ํ†ต์„ ๋๋‚ด๋Š” ๊ฒƒ..."

[์‚ฌ์šฉ์ž ์งˆ๋ฌธ]
์ง€ํฌ์˜ ์†์…ˆ์€ ๋„๋Œ€์ฒด ๋ญ์ง€?

[๋‹ต๋ณ€ ์ƒ์„ฑ]

D: LLM ์ƒ์„ฑ

Gemini-2.5-Flash๊ฐ€:

  • ๊ฒ€์ƒ‰๋œ ๋ฌธ์„œ ์ดํ•ด
  • ์งˆ๋ฌธ๊ณผ ๋ฌธ์„œ๋ฅผ ์ข…ํ•ฉ (Cross-Attention: ์งˆ๋ฌธ๊ณผ ๋ฌธ์„œ์˜ ์–ด๋А ๋ถ€๋ถ„์ด ๊ด€๋ จ์žˆ๋Š”์ง€ ํŒŒ์•…)
  • ๋‹ต๋ณ€ ์ƒ์„ฑ (ํ•œ ๋‹จ์–ด์”ฉ ์ˆœ์ฐจ์ ์œผ๋กœ)
์ถœ๋ ฅ: "์ง€ํฌ์˜ ์†์…ˆ์€ ์—˜๋””์•„์ธ์˜ ์ƒ์‹ ๋Šฅ๋ ฅ์„ ์ œ๊ฑฐํ•˜์—ฌ 
      ๊ฑฐ์ธ์˜ ์—ญ์‚ฌ๋ฅผ ํ‰ํ™”๋กญ๊ฒŒ ๋๋‚ด๋ ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค..."

5. ์ฐธ๊ณ  : ์›น ๊ธฐ๋ฐ˜ ๊ตฌํ˜„

5.1์•„ํ‚คํ…์ฒ˜ ๊ฐœ์š”

์ฝ˜์†” ๋ฐ๋ชจ๋Š” ๋กœ์ปฌ ํŒŒ์ผ์„ ์ง์ ‘ ์ฝ์ง€๋งŒ, ์‹ค์ œ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ๋Š” ํด๋ผ์ด์–ธํŠธ-์„œ๋ฒ„ ๊ตฌ์กฐ๊ฐ€ ํ•„์š”ํ•จ.

  • Browser (React)
    • text ์ž…๋ ฅ
    • ์งˆ๋ฌธ ์ž…๋ ฅ
  • WAS(Express Server)
    • file ์ƒ์„ฑ ๋ฐ ์ €์žฅ
    • API ํ˜ธ์ถœ
  • Gemini API(File Search)
    • Vector ์ €์žฅ
    • ๊ฒ€์ƒ‰์ˆ˜ํ–‰

5.2๋ฐ์ดํ„ฐ ํ๋ฆ„

1. ํŒŒ์ผ ์—…๋กœ๋“œ ์‹œํ€€์Šค:

  1. ๋ธŒ๋ผ์šฐ์ €์—์„œ ์‚ฌ์šฉ์ž๊ฐ€ ํ…์ŠคํŠธ ์ž…๋ ฅ
  2. ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์„œ๋ฒ„์— POST ์š”์ฒญ ์ „์†ก (ํ…์ŠคํŠธ ๋‚ด์šฉ ํฌํ•จ)
  3. ์„œ๋ฒ„๊ฐ€ ํ…์ŠคํŠธ๋ฅผ ํŒŒ์ผ๋กœ ์ €์žฅ (temp ๋””๋ ‰ํ† ๋ฆฌ)
  4. ์„œ๋ฒ„๊ฐ€ ์ €์žฅ๋œ ํŒŒ์ผ์„ Gemini File Search Store์— ์—…๋กœ๋“œ
  5. Gemini API๊ฐ€ ํŒŒ์ผ์„ Vector๋กœ ๋ณ€ํ™˜ (Chunking + Embedding)
  6. Vector ๋ณ€ํ™˜ ์™„๋ฃŒ๊นŒ์ง€ ๋Œ€๊ธฐ (Operation Polling)
  7. ์„œ๋ฒ„๊ฐ€ ํด๋ผ์ด์–ธํŠธ์— ์„ฑ๊ณต ์‘๋‹ต ๋ฐ˜ํ™˜
  8. ๋ธŒ๋ผ์šฐ์ €์— ์—…๋กœ๋“œ ์™„๋ฃŒ ๋ฉ”์‹œ์ง€ ํ‘œ์‹œ

 

2. ๊ฒ€์ƒ‰ ์‹œํ€€์Šค:

  1. ๋ธŒ๋ผ์šฐ์ €์—์„œ ์‚ฌ์šฉ์ž๊ฐ€ ์งˆ๋ฌธ ์ž…๋ ฅ
  2. ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์„œ๋ฒ„์— POST ์š”์ฒญ ์ „์†ก (์งˆ๋ฌธ ๋‚ด์šฉ ํฌํ•จ)
  3. ์„œ๋ฒ„๊ฐ€ File Search Store ์ •๋ณด ์กฐํšŒ
  4. ์„œ๋ฒ„๊ฐ€ Gemini API์— ์งˆ๋ฌธ + Store ์ •๋ณด ์ „๋‹ฌ
  5. Gemini API๊ฐ€ Vector ์œ ์‚ฌ๋„ ๊ฒ€์ƒ‰์œผ๋กœ ๊ด€๋ จ ๋ฌธ์„œ ์ฐพ๊ธฐ
  6. Gemini API๊ฐ€ ๊ฒ€์ƒ‰๋œ ๋ฌธ์„œ ๊ธฐ๋ฐ˜์œผ๋กœ LLM ๋‹ต๋ณ€ ์ƒ์„ฑ
  7. ์„œ๋ฒ„๊ฐ€ ํด๋ผ์ด์–ธํŠธ์— ๋‹ต๋ณ€ ๋ฐ˜ํ™˜
  8. ๋ธŒ๋ผ์šฐ์ €์— ๋‹ต๋ณ€ ํ‘œ์‹œ

5.3 ์ฝ”๋“œ ์˜ˆ์‹œ

server/services/geminiService.js - ํŒŒ์ผ ์—…๋กœ๋“œ:

export async function uploadToFileSearchStore(storeName, filePath, displayName) {
  let operation = await ai.fileSearchStores.uploadToFileSearchStore({
    file: filePath,
    fileSearchStoreName: storeName,
    config: { displayName }
  });

  let retryCount = 0;
  const MAX_RETRIES = 60;

  while (retryCount < MAX_RETRIES) {
    await new Promise(resolve => setTimeout(resolve, 2000));
    
    operation = await ai.operations.get({ operation });
    
    // done์ด true๊ฐ€ ๋˜๋ฉด Vectorํ™” ์™„๋ฃŒ
    if (operation?.done === true) {
      return operation;
    }
    retryCount++;
  }

  throw new Error('ํŒŒ์ผ ์—…๋กœ๋“œ ํƒ€์ž„์•„์›ƒ');
}

server/services/geminiService.js - ๊ฒ€์ƒ‰:

export async function queryWithFileSearch(storeName, query) {
  const result = await ai.models.generateContent({
    model: 'gemini-2.5-flash',
    contents: query,
    config: {
      tools: [{
        fileSearch: {
          fileSearchStoreNames: [storeName]
        }
      }]
    }
  });

  return result;
}

'๐ŸŒ WEB' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

์›น ํ”„๋ก ํŠธ์—”๋“œ ์„ฑ๋Šฅ ์ตœ์ ํ™”  (0) 2026.01.26
์›น ์‚ฌ์ดํŠธ ์ตœ์ ํ™” ๋ฐฉ๋ฒ•  (0) 2026.01.19
HTTP Multipart/form-data ์ง์ ‘ ํŒŒ์„œ ๋งŒ๋“ค๋ฉฐ ์›๋ฆฌ ์ดํ•ดํ•˜๊ธฐ  (0) 2025.10.01
Node.js๋กœ ๊ณ ์„ฑ๋Šฅ ์›น์„œ๋ฒ„ ๋งŒ๋“ค๊ธฐ: Cluster์™€ Worker Threads  (0) 2025.09.28
HTTP ํŒจํ‚ท ๋ถ„์„ํ•˜๊ธฐ  (0) 2025.09.18
'๐ŸŒ WEB' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€
  • ์›น ํ”„๋ก ํŠธ์—”๋“œ ์„ฑ๋Šฅ ์ตœ์ ํ™”
  • ์›น ์‚ฌ์ดํŠธ ์ตœ์ ํ™” ๋ฐฉ๋ฒ•
  • HTTP Multipart/form-data ์ง์ ‘ ํŒŒ์„œ ๋งŒ๋“ค๋ฉฐ ์›๋ฆฌ ์ดํ•ดํ•˜๊ธฐ
  • Node.js๋กœ ๊ณ ์„ฑ๋Šฅ ์›น์„œ๋ฒ„ ๋งŒ๋“ค๊ธฐ: Cluster์™€ Worker Threads
์—ฐ์žŽ(lotus leaf)
์—ฐ์žŽ(lotus leaf)
  • ์—ฐ์žŽ(lotus leaf)
    lotus' s develog ๐Ÿƒ
    ์—ฐ์žŽ(lotus leaf)
  • ์ „์ฒด
    ์˜ค๋Š˜
    ์–ด์ œ
    • ๋ถ„๋ฅ˜ ์ „์ฒด๋ณด๊ธฐ (79)
      • โœ๏ธ ๊ฐœ๋ฐœํšŒ๊ณ ๋ก (5)
      • ๐Ÿงฎ ์•Œ๊ณ ๋ฆฌ์ฆ˜ (3)
      • ๐Ÿ’™ ํ”„๋ก ํŠธ์—”๋“œ(FE) (19)
        • HTML (0)
        • CSS (0)
        • Javascript (0)
        • React (0)
        • Next.js (0)
        • webpack & babel (0)
      • ๐Ÿ’ป ๋ฐฑ์—”๋“œ(BE) (2)
        • Nest.js (0)
        • Express.js (0)
        • MySQL (1)
      • โš™๏ธ ์ธํ”„๋ผ(Devops) (2)
      • ๐Ÿค– AI (1)
      • ๐ŸŒ WEB (8)
      • ๐Ÿ’ป CS (16)
        • ์ž๋ฃŒ๊ตฌ์กฐ (0)
        • ์ปดํ“จํ„ฐ ๋„คํŠธ์›Œํฌ (1)
        • ์šด์˜์ฒด์ œ (0)
        • ์ธ๊ณต์ง€๋Šฅ (8)
        • ์›น ๋ณด์•ˆ (1)
        • ํด๋ผ์šฐ๋“œ ์ปดํ“จํŒ… (6)
      • ๐Ÿ–‹๏ธ DevLog (1)
      • ๐Ÿฆพ ๋กœ๋ณดํ‹ฑ์Šค (4)
      • ๐Ÿ“— ๋„ค์ด๋ฒ„๋ถ€์ŠคํŠธ์บ ํ”„ ์›น ๋ชจ๋ฐ”์ผ (0)
      • ๐ŸŽฎ Unity(C#) (10)
      • ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด (4)
        • C (4)
        • C++ (0)
        • Java (0)
        • Python (0)
      • MSA (1)
  • ๋ธ”๋กœ๊ทธ ๋ฉ”๋‰ด

    • ํ™ˆ
    • ํƒœ๊ทธ
    • ๋ฐฉ๋ช…๋ก
  • ๋งํฌ

  • ๊ณต์ง€์‚ฌํ•ญ

  • ์ธ๊ธฐ ๊ธ€

  • ํƒœ๊ทธ

    ์กฐํ•ฉ
    ์ŠคํŒธ๋ฉ”์ผ๋ถ„๋ฅ˜๊ธฐ
    gaussian rbf svm
    c++
    ros bridge
    deploy-aws
    ์ŠคํŒธ๋ถ„๋ฅ˜๊ธฐ
    c์–ธ์–ด
    nav2
    ์ˆœ์—ด
    turtlebot
    ๋ฆฌ์•กํŠธ
    client-streaming
    AWS
    ํŒŒ์ผํŠธ๋ฆฌ
    advaned detail
    ์ฝ”๋”ํŒจ๋“œ
    ์ดํ™”์—ฌ์ž๋Œ€ํ•™๊ต #๋„์ „ํ•™๊ธฐ์ œ
    isaac automator
    ๊ธฐ์ดˆ์•Œ๊ณ ๋ฆฌ์ฆ˜
    ๋ฐฑ์ค€
    Devops #๋Œ€๊ทœ๋ชจํŠธ๋ž˜ํ”ฝ์ฒ˜๋ฆฌ
    ros workspace
    hard margin svm
    ์•Œ๊ณ ๋ฆฌ์ฆ˜
    auto-scaling
    soft margin svm
    next.js12
    C#
    C
  • ์ตœ๊ทผ ๋Œ“๊ธ€

  • ์ตœ๊ทผ ๊ธ€

  • hELLOยท Designed By์ •์ƒ์šฐ.v4.10.6
์—ฐ์žŽ(lotus leaf)
RAG ์—ฐ๋™ ์›น ์•ฑ
์ƒ๋‹จ์œผ๋กœ

ํ‹ฐ์Šคํ† ๋ฆฌํˆด๋ฐ”