ํฐ์คํ ๋ฆฌ ๋ทฐ
๐งช RAG ํ์ง์ ‘๊ฐ’์ด ์๋๋ผ ‘์ซ์’๋ก ํ๋จํ๋ ๋ฒ
octo54 2026. 1. 5. 09:35๐งช 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 ํ ์คํธ์ ๊ธฐ๋ณธ ์์น
โ ํํ ์ค์
- ์ฌ์ฉ์๋ง๋ค ๋ค๋ฅธ ์ค์
- ํ ์คํธ ๊ธฐ์ค ์๋ ๋น๊ต
- “๊ด์ฐฎ์ ๋ณด์ด๋๋ฐ?”๋ก ๊ฒฐ๋ก
โ ์ด์์์ ์งํจ ์์น
- ๋์ผํ ์ง๋ฌธ ์ธํธ
- ๋์ผํ ์ฌ์ฉ์ ์กฐ๊ฑด
- ๋์ผํ ๋ฌธ์ ํ
- ํ ๋ฒ์ ํ๋๋ง ๋ณ๊ฒฝ
- ๊ฒฐ๊ณผ๋ ๋ก๊ทธ๋ก ์ ์ฅ
์ด ๋ค์ฏ ๊ฐ ์ ์งํค๋ฉด
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์ค๋ฌด
'study > ๋ฐฑ์๋' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| ๐จ AI ๋ชจ๋ธ ์ฅ์ ๋์ ์ ๋ต (0) | 2026.01.07 |
|---|---|
| ๐ธ RAG ๋น์ฉ ์ต์ ํ ์ค์ ํธ (0) | 2026.01.06 |
| ๐ RAG ๋ฌธ์ ์์งยท์ ์ ํ์ดํ๋ผ์ธ ์๋ํ (0) | 2026.01.02 |
| ๐ RAG ํ์ง์ด ๋ฌด๋์ง ๋ ์ง์ง ์์ธ ์ฐพ๊ธฐ (0) | 2025.12.31 |
| โก RAG ๊ฒ์ ์ฑ๋ฅ ํ๋ ์ค์ ๊ธฐ (0) | 2025.12.30 |
- Total
- Today
- Yesterday
- ์๋ฐ๋ฉด์
- ์ฟ ๋ฒ๋คํฐ์ค
- Redis
- ์น๊ฐ๋ฐ
- Prisma
- seo ์ต์ ํ 10๊ฐ
- REACT
- SEO์ต์ ํ
- JAX
- kotlin
- rag
- PostgreSQL
- node.js
- Express
- nextJS
- Next.js
- ๋ฐฑ์๋๊ฐ๋ฐ
- ๊ฐ๋ฐ๋ธ๋ก๊ทธ
- JWT
- llm
- Python
- ai์ฒ ํ
- CI/CD
- fastapi
- NestJS
- flax
- ๋ฅ๋ฌ๋
- Docker
- ํ๋ก ํธ์๋๊ฐ๋ฐ
- DevOps
| ์ผ | ์ | ํ | ์ | ๋ชฉ | ๊ธ | ํ |
|---|---|---|---|---|---|---|
| 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 |

