ํ‹ฐ์Šคํ† ๋ฆฌ ๋ทฐ

๋ฐ˜์‘ํ˜•

๐Ÿงช RAG ํ’ˆ์งˆ์„ ‘๊ฐ’์ด ์•„๋‹ˆ๋ผ ‘์ˆซ์ž’๋กœ ํŒ๋‹จํ•˜๋Š” ๋ฒ•

– A/B ํ…Œ์ŠคํŠธ๋กœ ๋ฌธ์„œ ๊ตฌ์กฐ·ํ”„๋กฌํ”„ํŠธ·๋ชจ๋ธ์„ ๋น„๊ตํ•˜๋Š” ์‹ค์ „ ์šด์˜๊ธฐ
(NestJS + Vector DB + ์‹ค์ œ SaaS์—์„œ ๊ตด๋ ค๋ณธ ๋ฐฉ์‹ ๊ทธ๋Œ€๋กœ)


RAG ์šด์˜์„ ํ•˜๋‹ค ๋ณด๋ฉด ๊ผญ ์ด ๋Œ€ํ™”๊ฐ€ ๋‚˜์˜ต๋‹ˆ๋‹ค.

“์ด๋ฒˆ์— ์ข€ ์ข‹์•„์ง„ ๊ฒƒ ๊ฐ™์ง€ ์•Š์•„?”
“์Œ… ๊ทธ๋Ÿฐ ๊ฒƒ ๊ฐ™๊ธฐ๋„ ํ•˜๊ณ …”

์ด ์ƒํƒœ๊ฐ€ ์ œ์ผ ์œ„ํ—˜ํ•ด์š”.
๊ฐ์œผ๋กœ ํŠœ๋‹ํ•˜๊ธฐ ์‹œ์ž‘ํ•˜๋ฉด, RAG๋Š” ๋์—†์ด ํ”๋“ค๋ฆฝ๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ ์–ด๋А ์ˆœ๊ฐ„๋ถ€ํ„ฐ ์ €๋Š” ์ด๋ ‡๊ฒŒ ๋ฐ”๊ฟจ์Šต๋‹ˆ๋‹ค.

“๋А๋‚Œ ์–˜๊ธฐ ๋ง๊ณ , ์ˆซ์ž ๋ณด์ž.”

์ด๋ฒˆ ๊ธ€์€
RAG์— A/B ํ…Œ์ŠคํŠธ๋ฅผ ๋ถ™์—ฌ์„œ ํ’ˆ์งˆ์„ ‘์ •๋Ÿ‰ํ™”’ํ•˜๋Š” ๋ฐฉ๋ฒ•์„
์‹ค์ œ ์„œ๋น„์Šค์— ์ ์šฉํ•œ ๋ฐฉ์‹ ๊ทธ๋Œ€๋กœ ์ •๋ฆฌํ•ฉ๋‹ˆ๋‹ค.


๐Ÿงญ ์ด ๊ธ€์˜ ๋ชฉํ‘œ

  • RAG ํ’ˆ์งˆ์„ ์ˆ˜์น˜๋กœ ๋น„๊ตํ•˜๋Š” ๊ธฐ์ค€ ๋งŒ๋“ค๊ธฐ
  • ๋ฌธ์„œ ๊ตฌ์กฐ / ํ”„๋กฌํ”„ํŠธ / ๋ชจ๋ธ์„ A/B ํ…Œ์ŠคํŠธํ•˜๋Š” ๋ฐฉ๋ฒ•
  • “์ด๋ฒˆ ๋ณ€๊ฒฝ์ด ์ง„์งœ ์ข‹์•„์กŒ๋Š”์ง€” ํŒ๋‹จํ•˜๋Š” ์ง€ํ‘œ
  • ์šด์˜ ๋‹จ๊ณ„์—์„œ ์จ๋จน๋Š” ์‹ค์ „ ์ฒดํฌ๋ฆฌ์ŠคํŠธ

1๏ธโƒฃ RAG์—์„œ A/B ํ…Œ์ŠคํŠธ๊ฐ€ ํ•„์š”ํ•œ ์ด์œ 

RAG๋Š” ๋ณ€์ˆ˜๊ฐ€ ๋„ˆ๋ฌด ๋งŽ์Šต๋‹ˆ๋‹ค.

  • ๋ฌธ์„œ chunk ํฌ๊ธฐ
  • ์š”์•ฝ ์œ ๋ฌด
  • Vector DB ํ•„ํ„ฐ
  • ๊ฒ€์ƒ‰ limit
  • ํ”„๋กฌํ”„ํŠธ ๋ฌธ์žฅ ํ•œ ์ค„
  • LLM ๋ชจ๋ธ

์ด ์ค‘ ํ•˜๋‚˜๋งŒ ๋ฐ”๊ฟ”๋„ ๊ฒฐ๊ณผ๊ฐ€ ๋‹ฌ๋ผ์ง‘๋‹ˆ๋‹ค.

๋ฌธ์ œ๋Š” ์ด๊ฑฐ์ฃ .

๋ฐ”๋€ ๊ฒฐ๊ณผ๊ฐ€ ์ข‹์•„์ง„ ๊ฑด์ง€, ๊ทธ๋ƒฅ ๋‹ฌ๋ผ์ง„ ๊ฑด์ง€ ๋ชจ๋ฅธ๋‹ค.

๊ทธ๋ž˜์„œ A/B ํ…Œ์ŠคํŠธ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.


2๏ธโƒฃ RAG A/B ํ…Œ์ŠคํŠธ์˜ ๊ธฐ๋ณธ ์›์น™

๋ฐ˜์‘ํ˜•

โŒ ํ”ํ•œ ์‹ค์ˆ˜

  • ์‚ฌ์šฉ์ž๋งˆ๋‹ค ๋‹ค๋ฅธ ์„ค์ •
  • ํ…Œ์ŠคํŠธ ๊ธฐ์ค€ ์—†๋Š” ๋น„๊ต
  • “๊ดœ์ฐฎ์•„ ๋ณด์ด๋Š”๋ฐ?”๋กœ ๊ฒฐ๋ก 

โœ… ์šด์˜์—์„œ ์ง€ํ‚จ ์›์น™

  1. ๋™์ผํ•œ ์งˆ๋ฌธ ์„ธํŠธ
  2. ๋™์ผํ•œ ์‚ฌ์šฉ์ž ์กฐ๊ฑด
  3. ๋™์ผํ•œ ๋ฌธ์„œ ํ’€
  4. ํ•œ ๋ฒˆ์— ํ•˜๋‚˜๋งŒ ๋ณ€๊ฒฝ
  5. ๊ฒฐ๊ณผ๋Š” ๋กœ๊ทธ๋กœ ์ €์žฅ

์ด ๋‹ค์„ฏ ๊ฐœ ์•ˆ ์ง€ํ‚ค๋ฉด
A/B ํ…Œ์ŠคํŠธ ์˜๋ฏธ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.


3๏ธโƒฃ ๊ฐ€์žฅ ๋จผ์ € ์ค€๋น„ํ•  ๊ฒƒ: ๊ธฐ์ค€ ์งˆ๋ฌธ ์„ธํŠธ

์ด๊ฒŒ ์ œ์ผ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.

๊ธฐ์ค€ ์งˆ๋ฌธ์€ ์ด๋ ‡๊ฒŒ ๋งŒ๋“ ๋‹ค

  • ์‹ค์ œ ์‚ฌ์šฉ์ž ์งˆ๋ฌธ
  • ์• ๋งคํ•œ ์งˆ๋ฌธ ํฌํ•จ
  • ์‰ฌ์šด ์งˆ๋ฌธ + ๊นŒ๋‹ค๋กœ์šด ์งˆ๋ฌธ ์„ž๊ธฐ
  • ์ตœ์†Œ 10๊ฐœ, ๊ฐ€๋Šฅํ•˜๋ฉด 20๊ฐœ
const benchmarkQueries = [
  "๊ฒฐ์ œ ์‹คํŒจํ•˜๋ฉด ์–ด๋–ป๊ฒŒ ํ•˜๋‚˜์š”?",
  "๊ตฌ๋… ํ•ด์ง€๋Š” ์–ด๋””์„œ ํ•˜๋‚˜์š”?",
  "ํ™˜๋ถˆ์€ ์–ธ์ œ ๋˜๋‚˜์š”?",
  "AI ์‚ฌ์šฉ๋Ÿ‰์€ ์–ธ์ œ ์ดˆ๊ธฐํ™”๋˜๋‚˜์š”?",
  "์š”๊ธˆ์ œ ๋ณ€๊ฒฝํ•˜๋ฉด ๋ฐ”๋กœ ์ ์šฉ๋˜๋‚˜์š”?"
];

๐Ÿ‘‰ ์ด ์งˆ๋ฌธ ์„ธํŠธ๋Š” ์ ˆ๋Œ€ ๋ฐ”๊พธ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.


4๏ธโƒฃ A/B ํ…Œ์ŠคํŠธ ๊ตฌ์กฐ ์„ค๊ณ„

์ œ๊ฐ€ ์“ฐ๋Š” ๊ตฌ์กฐ๋Š” ๋‹จ์ˆœํ•ฉ๋‹ˆ๋‹ค.

Request
 โ”œโ”€ Variant A (๊ธฐ์กด)
 โ””โ”€ Variant B (๋ณ€๊ฒฝ)
        ↓
   ๊ฒฐ๊ณผ ์ €์žฅ
        ↓
   ์ ์ˆ˜ ๊ณ„์‚ฐ

Variant ์˜ˆ์‹œ

  • A: chunk 500์ž / summary ์žˆ์Œ
  • B: chunk 300์ž / summary ์žˆ์Œ

๋˜๋Š”

  • A: prompt v1
  • B: prompt v2

5๏ธโƒฃ NestJS์—์„œ A/B ํ…Œ์ŠคํŠธ ๋ถ„๊ธฐ ๊ตฌํ˜„

1) ์‹คํ—˜ ์„ค์ • ํ…Œ์ด๋ธ” (๊ฐ„๋‹จ ๋ฒ„์ „)

type RagVariant = 'A' | 'B';

interface RagExperiment {
  variant: RagVariant;
  chunkSize: number;
  useSummary: boolean;
  promptVersion: number;
}

2) ์‹คํ—˜ ๋ถ„๊ธฐ ๋กœ์ง

function pickVariant(userId: number): RagVariant {
  // ์‚ฌ์šฉ์ž ๊ธฐ์ค€์œผ๋กœ ํ•ญ์ƒ ๋™์ผํ•œ variant
  return userId % 2 === 0 ? 'A' : 'B';
}

๐Ÿ‘‰ ์ค‘์š”

  • ํ•œ ์‚ฌ์šฉ์ž๋Š” ํ•ญ์ƒ ๊ฐ™์€ Variant
  • ํ…Œ์ŠคํŠธ ๊ธฐ๊ฐ„ ๋™์•ˆ ์ ˆ๋Œ€ ๋ฐ”๋€Œ๋ฉด ์•ˆ ๋จ

3) Variant๋ณ„ RAG ์‹คํ–‰

const variant = pickVariant(user.id);

const config =
  variant === 'A'
    ? { chunkSize: 500, prompt: promptV1 }
    : { chunkSize: 300, prompt: promptV2 };

const result = await ragService.answer({
  query,
  config
});

6๏ธโƒฃ ๊ฒฐ๊ณผ๋ฅผ ์–ด๋–ป๊ฒŒ ์ €์žฅํ• ๊นŒ (์ด๊ฒŒ ํ•ต์‹ฌ)

RAG A/B ํ…Œ์ŠคํŠธ์—์„œ ๊ฒฐ๊ณผ ๋กœ๊ทธ๊ฐ€ ์ „๋ถ€์ž…๋‹ˆ๋‹ค.

์ตœ์†Œ ์ €์žฅ ํ•ญ๋ชฉ

{
  query: "๊ฒฐ์ œ ์‹คํŒจํ•˜๋ฉด ์–ด๋–ป๊ฒŒ ํ•˜๋‚˜์š”?",
  variant: "B",
  retrievedDocs: 4,
  responseTimeMs: 2100,
  tokenUsage: 480,
  answer: "...",
  createdAt: new Date()
}

์ด ๋ฐ์ดํ„ฐ๊ฐ€ ์žˆ์–ด์•ผ
“์™œ B๊ฐ€ ๋” ์ข‹์€์ง€”๋ฅผ ์„ค๋ช…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


7๏ธโƒฃ RAG ํ’ˆ์งˆ์„ ์ˆ˜์น˜๋กœ ํ‰๊ฐ€ํ•˜๋Š” ์ง€ํ‘œ

์—ฌ๊ธฐ์„œ ๋‹ค๋“ค ๋ง‰ํž™๋‹ˆ๋‹ค.

“AI ๋‹ต๋ณ€์„ ์–ด๋–ป๊ฒŒ ์ ์ˆ˜๋กœ ๋งค๊ธฐ์ฃ ?”

์ •๋‹ต์€ ์ด๊ฒ๋‹ˆ๋‹ค.

์™„๋ฒฝํ•  ํ•„์š” ์—†๋‹ค.
๋น„๊ต๋งŒ ๊ฐ€๋Šฅํ•˜๋ฉด ๋œ๋‹ค.


๋‚ด๊ฐ€ ์‹ค์ œ๋กœ ์“ฐ๋Š” ์ง€ํ‘œ 5๊ฐœ

1๏ธโƒฃ ์‘๋‹ต ์‹œ๊ฐ„ (Response Time)

  • ๋น ๋ฅผ์ˆ˜๋ก ์ข‹์Œ
  • UX์— ์ง๊ฒฐ

2๏ธโƒฃ ํ† ํฐ ์‚ฌ์šฉ๋Ÿ‰

  • ๋น„์šฉ ์ง€ํ‘œ
  • context ๊ณผ๋‹ค ์—ฌ๋ถ€ ํŒ๋‹จ

3๏ธโƒฃ ๊ฒ€์ƒ‰ ๋ฌธ์„œ ์ˆ˜

  • ๋„ˆ๋ฌด ๋งŽ์œผ๋ฉด ์žก์Œ
  • ๋„ˆ๋ฌด ์ ์œผ๋ฉด ์ •๋ณด ๋ถ€์กฑ

4๏ธโƒฃ “๋ฌธ์„œ ๊ธฐ๋ฐ˜ ์‘๋‹ต ๋น„์œจ”

  • ๋‹ต๋ณ€์— ๋ฌธ์„œ ๋‚ด์šฉ์ด ์‹ค์ œ๋กœ ๋ฐ˜์˜๋๋Š”์ง€
  • ๋‹จ์ˆœ ์ƒ์„ฑ vs ๊ทผ๊ฑฐ ๊ธฐ๋ฐ˜

5๏ธโƒฃ ์‚ฌ์šฉ์ž ํ”ผ๋“œ๋ฐฑ (๊ฐ€๋Šฅํ•˜๋ฉด)

  • ๐Ÿ‘ / ๐Ÿ‘Ž
  • ์ด๊ฑฐ ํ•˜๋‚˜๋ฉด ๋๋‚˜๊ธฐ๋„ ํ•จ

8๏ธโƒฃ ์ž๋™ ์ ์ˆ˜ ๊ณ„์‚ฐ ์˜ˆ์‹œ (๊ฐ„๋‹จ ๋ฒ„์ „)

function score(result) {
  let score = 0;

  if (result.responseTimeMs < 3000) score += 1;
  if (result.tokenUsage < 600) score += 1;
  if (result.retrievedDocs >= 3 && result.retrievedDocs <= 5) score += 1;

  return score; // 0 ~ 3
}

๐Ÿ‘‰ ์ค‘์š”ํ•œ ๊ฑด
A์™€ B๋ฅผ ๊ฐ™์€ ๊ธฐ์ค€์œผ๋กœ ์žฌ๋Š” ๊ฒƒ


9๏ธโƒฃ ์‹ค์ œ๋กœ ๊ฐ€์žฅ ํšจ๊ณผ ์žˆ์—ˆ๋˜ A/B ํ…Œ์ŠคํŠธ๋“ค

โœ… 1์œ„: summary ์‚ฌ์šฉ vs ๋ฏธ์‚ฌ์šฉ

  • summary ์žˆ์Œ → ์••๋„์  ์Šน
  • hallucination ๊ฐ์†Œ
  • ํ† ํฐ ์‚ฌ์šฉ๋Ÿ‰ ๊ฐ์†Œ

โœ… 2์œ„: chunk ํฌ๊ธฐ 500 vs 300

  • 300์ž ์ชฝ์ด ์ผ๊ด€์„ฑ ๋” ์ข‹์Œ
  • ๋‹จ, ๋ฌธ์„œ ๊ตฌ์กฐ ์ž˜ ๋ผ ์žˆ์„ ๋•Œ๋งŒ

โŒ ํšจ๊ณผ ์—†์—ˆ๋˜ ๊ฒƒ

  • LLM ๋ชจ๋ธ ๋ฏธ์„ธ ๋ณ€๊ฒฝ
  • temperature 0.1 ์ฐจ์ด

๐Ÿ‘‰ ๋ฌธ์„œ ๊ตฌ์กฐ > ํ”„๋กฌํ”„ํŠธ > ๋ชจ๋ธ

์ด ์ˆœ์„œ๊ฐ€ ๊ฑฐ์˜ ๊ณ ์ •์ž…๋‹ˆ๋‹ค.


10๏ธโƒฃ A/B ํ…Œ์ŠคํŠธ ์šด์˜ ์ฒดํฌ๋ฆฌ์ŠคํŠธ

์šด์˜ ์ค‘ ์ด๊ฑธ ํ•ญ์ƒ ๋ด…๋‹ˆ๋‹ค.

  • ํ•œ ๋ฒˆ์— ํ•˜๋‚˜๋งŒ ๋ฐ”๊ฟจ๋Š”๊ฐ€?
  • ๊ธฐ์ค€ ์งˆ๋ฌธ ์„ธํŠธ ๊ณ ์ •ํ–ˆ๋Š”๊ฐ€?
  • ๊ฒฐ๊ณผ ๋กœ๊ทธ๋ฅผ ๋‚จ๊ฒผ๋Š”๊ฐ€?
  • ์‚ฌ์šฉ์ž ์„ž์ด์ง€ ์•Š์•˜๋Š”๊ฐ€?
  • ์ตœ์†Œ ํ•˜๋ฃจ ์ด์ƒ ๋ฐ์ดํ„ฐ ๋ชจ์•˜๋Š”๊ฐ€?

์ด๊ฑฐ ์•ˆ ์ง€ํ‚ค๋ฉด
ํ…Œ์ŠคํŠธ ๊ฒฐ๊ณผ ๋ฏฟ์œผ๋ฉด ์•ˆ ๋ฉ๋‹ˆ๋‹ค.


11๏ธโƒฃ ์ด ๊ณผ์ •์„ ๊ฑฐ์น˜๊ณ  ๋‚˜์„œ ๋‹ฌ๋ผ์ง„ ์ 

์ด์ œ ์ด๋Ÿฐ ๋ง์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

“์ด๋ฒˆ ๋ณ€๊ฒฝ์€
์‘๋‹ต ์‹œ๊ฐ„ 22% ๊ฐ์†Œํ–ˆ๊ณ ,
ํ† ํฐ ์‚ฌ์šฉ๋Ÿ‰ 18% ์ค„์—ˆ๊ณ ,
์‚ฌ์šฉ์ž ๐Ÿ‘ ๋น„์œจ์ด 12% ์˜ฌ๋ž์–ด์š”.”

์ด ํ•œ ๋ฌธ์žฅ์œผ๋กœ
ํšŒ์˜๊ฐ€ ๋๋‚ฉ๋‹ˆ๋‹ค.


๋งˆ๋ฌด๋ฆฌํ•˜๋ฉด์„œ (์ง„์งœ ํ•˜๊ณ  ์‹ถ์€ ๋ง)

RAG๋Š” ๊ฐ๊ฐ์ ์ธ ์˜์—ญ ๊ฐ™์ง€๋งŒ,
์šด์˜ ๋‹จ๊ณ„์—์„  ์™„์ „ํžˆ ๊ณตํ•™์ ์ธ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.

  • ๊ฐ์œผ๋กœ ํŠœ๋‹ โŒ
  • ๋กœ๊ทธ์™€ ์ง€ํ‘œ๋กœ ํŒ๋‹จ โญ•

์ด ์ฐจ์ด๊ฐ€
“๋ฐ๋ชจ AI”์™€
“์‹ค์„œ๋น„์Šค AI”๋ฅผ ๊ฐ€๋ฆ…๋‹ˆ๋‹ค.

 


 

RAGABํ…Œ์ŠคํŠธ, AIํ’ˆ์งˆ๊ด€๋ฆฌ, ๋ฒกํ„ฐDB์šด์˜, Qdrant, NestJS, AI์„œ๋น„์Šค์šด์˜, RAGํŠœ๋‹, AI์‹ค๋ฌด

โ€ป ์ด ํฌ์ŠคํŒ…์€ ์ฟ ํŒก ํŒŒํŠธ๋„ˆ์Šค ํ™œ๋™์˜ ์ผํ™˜์œผ๋กœ, ์ด์— ๋”ฐ๋ฅธ ์ผ์ •์•ก์˜ ์ˆ˜์ˆ˜๋ฃŒ๋ฅผ ์ œ๊ณต๋ฐ›์Šต๋‹ˆ๋‹ค.
๊ณต์ง€์‚ฌํ•ญ
์ตœ๊ทผ์— ์˜ฌ๋ผ์˜จ ๊ธ€
์ตœ๊ทผ์— ๋‹ฌ๋ฆฐ ๋Œ“๊ธ€
Total
Today
Yesterday
๋งํฌ
ยซ   2026/01   ยป
์ผ ์›” ํ™” ์ˆ˜ ๋ชฉ ๊ธˆ ํ† 
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
๊ธ€ ๋ณด๊ด€ํ•จ
๋ฐ˜์‘ํ˜•