ํฐ์คํ ๋ฆฌ ๋ทฐ
๐ RAG ๋ฌธ์ ์์ง·์ ์ ํ์ดํ๋ผ์ธ ์๋ํ
– ์ฌ๋์ด ์๋์ง ์์๋ “ํ์ง์ด ์ ์ง๋๋ AI ๊ฒ์ ์์คํ
” ๋ง๋๋ ๋ฒ
(NestJS + Vector DB + ์ด์ ๋จ๊ณ์์ ์ง์ง ํ์ํ ๊ตฌ์กฐ)
์์ ๊ธ์์ ์ด๋ฐ ์๊ธฐ๋ฅผ ํ์์ฃ .
RAG ํ์ง์ ๋ชจ๋ธ๋ณด๋ค
๋ฐ์ดํฐ์ ๊ตฌ์กฐ์์ ๋ฌด๋์ง๋ค.
๊ทธ๋ฆฌ๊ณ ์ค์ ์ด์์ ๋ค์ด๊ฐ๋ฉด,
๊ทธ ๋ง์ด ๋ผ์ ๋ฆฌ๊ฒ ๋๊ปด์ง๋๋ค.
์ฒ์์ ๋ฌธ์ 20๊ฐ๋ผ์
“์, ์ด ์ ๋๋ฉด ๊ด์ฐฎ๋ค” ์ถ๋ค๊ฐ
ํ ๋ฌ, ๋ ๋ฌ ์ง๋๋ฉด ์ด๋ฐ ์ํฉ์ด ์ต๋๋ค.
- ๋ฌธ์๋ ๊ณ์ ๋์ด๋๊ณ
- ๋๊ฐ ์ธ์ ๋ญ ๋ฃ์๋์ง ๋ชจ๋ฅด๊ฒ ๊ณ
- ์์ ์ ์ ๋ง๋ ์ง๋ฌธ์ด ๊ฐ์๊ธฐ ํ๋ฆฌ๊ณ
- “์ด ๋ฌธ์, ์ ๋ค์ด๊ฐ ์์ง?” ์ถ์ ๊ฒ ํ์ด๋์ค๊ณ
์ด๋ ๋๋ถ๋ถ์ ์๋น์ค๋ ์ด๋ ๊ฒ ๋ฉ๋๋ค.
“์ผ๋จ ์ง๊ธ์ ๋๋์…”
→ ๊ทธ๋ฆฌ๊ณ RAG ํ์ง์ ์์ํ ์ฃฝ์ด๊ฐ
์ด๋ฒ ๊ธ์
์ด ์ํ๋ก ์ ๊ฐ๊ธฐ ์ํด
๋ฌธ์ ์์ง → ์ ์ → ์๋ฒ ๋ฉ → ๊ฒ์ฆ → ๋ฐฐํฌ
์ ๊ณผ์ ์ ์๋ํ ํ์ดํ๋ผ์ธ์ผ๋ก ๋ง๋๋ ์ด์ผ๊ธฐ์
๋๋ค.
๐งญ ์ด ๊ธ์ ๋ชฉํ
- RAG ๋ฌธ์๊ฐ ์ด๋์๋ถํฐ ๋ง๊ฐ์ง๋์ง ๋ช ํํ ์๊ธฐ
- ์ด์ ๋จ๊ณ์์ ํ์ํ ๋ฌธ์ ํ์ดํ๋ผ์ธ ๊ตฌ์กฐ
- ์ฌ๋์ด ๊ฐ์ ํ์ง ์์๋ ํ์ง์ ์ ์งํ๋ ๋ฐฉ๋ฒ
- “์, ์ด ์ฌ๋์ ์ด์๊น์ง ํด๋ดค๊ตฌ๋” ์๋ฆฌ ๋ฃ๋ ํฌ์ธํธ
1๏ธโฃ RAG ๋ฌธ์ ํ์ดํ๋ผ์ธ, ์ ํ์ํ๊ฐ
์ฒ์์ ๋ณดํต ์ด๋ ๊ฒ ์์ํฉ๋๋ค.
1. ๋ฌธ์ ํ๋ ์๊น
2. ๋ณต์ฌํด์ ์๋ฒ ๋ฉ
3. Vector DB์ ๋ฃ์
๋ฌธ์ ๋ ์ด๊ฒ 100๋ฒ, 1,000๋ฒ ๋ฐ๋ณต๋ ๋์ ๋๋ค.
์ค์ ๋ก ํฐ์ง๋ ๋ฌธ์ ๋ค
- ๊ฐ์ ๋ด์ฉ์ด ์กฐ๊ธ์ฉ ๋ค๋ฅธ ๋ฌธ์๋ก ์ฌ๋ฌ ๋ฒ ๋ค์ด๊ฐ
- HTML/ํธํฐ/๋ฉ๋ด ๊ฐ์ ์ฐ๋ ๊ธฐ ํ ์คํธ ํฌํจ
- ๋๋ฌด ๊ธด ๋ฌธ์๊ฐ ๊ทธ๋๋ก ๋ค์ด๊ฐ
- ์ ๋ชฉ ์๋ chunk๊ฐ ์๊น
- ์์ฝ ์๋ ๋ฌธ์๊ฐ ์์
๐ ์ด๊ฒ ์์ด๋ฉด
RAG๋ ๋ฐ๋์ ํ์ง์ด ๋จ์ด์ง๋๋ค.
๊ทธ๋์ ํ์ํ ๊ฒ
“๋ฌธ์ ํ์ดํ๋ผ์ธ” ์
๋๋ค.
2๏ธโฃ ์ ์ฒด ๋ฌธ์ ํ์ดํ๋ผ์ธ ๊ตฌ์กฐ (์ด์ ๊ธฐ์ค)
์ด์์์ ๋ด๊ฐ ์ ์ฐฉ์ํจ ํ๋ฆ์ ์ด๊ฒ๋๋ค.
[์๋ณธ ๋ฌธ์]
↓
1. ์์ง (Crawler / API / ์
๋ก๋)
↓
2. ์ ์ (๋ถํ์ํ ํ
์คํธ ์ ๊ฑฐ)
↓
3. ๋ถํ (Chunking)
↓
4. ๋ฉํ๋ฐ์ดํฐ ๋ถ์ฌ
↓
5. ์์ฝ ์์ฑ
↓
6. ์๋ฒ ๋ฉ ์์ฑ
↓
7. Vector DB ์ ์ฅ
↓
8. ๊ฒ์ฆ & ์ํ ํ
์คํธ
๐ ์ค์ํ ๊ฑด “์ค๊ฐ ๋จ๊ณ”๊ฐ ๋ง๋ค๋ ๊ฒ
์ด ๋จ๊ณ๋ค์ด ์์ผ๋ฉด, ํ์ง์ ๋ฌด์กฐ๊ฑด ๋ฌด๋์ง๋๋ค.
3๏ธโฃ 1๋จ๊ณ: ๋ฌธ์ ์์ง (์ฌ๊ธฐ์๋ถํฐ ๊ธฐ์ค์ ์ธ์์ผ ํจ)
๋ฌธ์ ์์ง์ ํฌ๊ฒ 3๊ฐ์ง๋ก ๋๋ฉ๋๋ค.
1) ๋ด๋ถ ๋ฌธ์
- ๊ด๋ฆฌ์ ํ์ด์ง ์์ฑ
- Notion / Google Docs
- DB ๊ธฐ๋ฐ ์ฝํ ์ธ
2) ์ธ๋ถ ๋ฌธ์
- ์น ํ์ด์ง
- ๊ณ ๊ฐ FAQ
3) ์ฌ์ฉ์ ์์ฑ ์ฝํ ์ธ
- ๊ฒ์๊ธ
- ๋๊ธ
- ๋ฌธ์ ๋ด์ญ
โ ์ฌ๊ธฐ์ ์ค์ํ ์์น
“๋ชจ๋ ๋ฌธ์๋ฅผ ๋ค ๋ฃ์ง ์๋๋ค”
์ด๋ฐ์ ๋ค๋ค ์ด ์ค์๋ฅผ ํฉ๋๋ค.
“๋ง์์๋ก ์ข๊ฒ ์ง?”
โ ์๋๋๋ค.
RAG๋ ‘์ ๋ณ’์ด ํต์ฌ์
๋๋ค.
์์ง ๊ธฐ์ค ์์
- ์ต์ ๊ธ์ ์: 200์ ์ด์
- ๊ด๊ณ /ํ๋ณด ๋ฌธ์ ์ ์ธ
- ์ค๋๋ ๊ณต์ง ์๋ ์ ์ธ
- ์นดํ ๊ณ ๋ฆฌ ๋ช ํํ ๋ฌธ์๋ง ํ์ฉ
์ด ๊ธฐ์ค์ ์ฝ๋๋ก ๋ฐ์๋ฌ์ผ ํฉ๋๋ค.
4๏ธโฃ 2๋จ๊ณ: ๋ฌธ์ ์ ์ (์ด ๋จ๊ณ ์ ํ๋ฉด 100% ๋งํจ)
๋ฌธ์ ์ ์ ๋
RAG ํ์ง์ ๊ฐ์ฅ ํฐ ์ํฅ์ ์ค๋๋ค.
์ ๊ฑฐํด์ผ ํ ๊ฒ๋ค
- HTML ํ๊ทธ
- ๋ฉ๋ด/ํธํฐ/์ฌ์ด๋๋ฐ ํ ์คํธ
- “๊ด๋ จ ๊ธ ๋ณด๊ธฐ”
- ๋ฒํผ ํ ์คํธ
- ์ค๋ณต ๊ณต์ง ๋ฌธ๊ตฌ
์ค์ ์ ์ ์ฝ๋ ์์
function cleanText(raw: string): string {
return raw
.replace(/<[^>]*>/g, '') // HTML ์ ๊ฑฐ
.replace(/\s+/g, ' ') // ๊ณต๋ฐฑ ์ ๋ฆฌ
.replace(/๊ด๋ จ ๊ธ ๋ณด๊ธฐ.*/g, '') // ๋ถํ์ ๋ฌธ๊ตฌ ์ ๊ฑฐ
.trim();
}
๐ ์ด ์ฝ๋ ํ๋๋ก
๊ฒ์ ๊ฒฐ๊ณผ ๊ด๋ จ๋๊ฐ ๋์ ๋๊ฒ ์ฌ๋ผ๊ฐ๋๋ค.
5๏ธโฃ 3๋จ๊ณ: ๋ฌธ์ ๋ถํ (Chunking ๊ธฐ์ค ์ก๊ธฐ)
์ด ๋จ๊ณ์์
RAG์ “์ฑ๊ฒฉ”์ด ๊ฒฐ์ ๋ฉ๋๋ค.
๋ด๊ฐ ์ต์ข ์ ์ผ๋ก ์ ์ฐฉํ ๊ธฐ์ค
ํญ๋ชฉ๊ธฐ์ค
| ๊ธธ์ด | 300 ~ 700์ |
| ๋จ์ | ๋ฌธ๋จ ๊ธฐ์ค |
| ์ ๋ชฉ | ๋ฐ๋์ ํฌํจ |
| ์ฃผ์ | ํ๋๋ง |
โ ์คํจํ๋ ์
- 2,000์ ํต์งธ๋ก ํ๋์ chunk
- ๋ฌธ๋จ ๋๋์ง ์๊ณ ์ค๋ฐ๊ฟ๋ง ์๋ ํ ์คํธ
- ์ ๋ชฉ ์๋ ๋ณธ๋ฌธ๋ง chunk
Chunk ์์ ๊ตฌ์กฐ
{
"title": "๊ฒฐ์ ์คํจ ์ ์ฒ๋ฆฌ ๋ฐฉ๋ฒ",
"content": "๊ฒฐ์ ์คํจ๊ฐ ๋ฐ์ํ๋ฉด...",
"category": "billing",
"source": "help-center"
}
๐ ์ ๋ชฉ์
LLM์๊ฒ ๋ฌธ๋งฅ ๋ฐฉํฅ์ ์ก์์ฃผ๋ ์ต์ปค ์ญํ ์ ํฉ๋๋ค.
6๏ธโฃ 4๋จ๊ณ: ๋ฉํ๋ฐ์ดํฐ ์ค๊ณ (๋์ค์ ์ด๋ ค์ค๋ค)
์ด ๋จ๊ณ,
์ฒ์์ ๋ค๋ค ๊ท์ฐฎ์์ ๋์ถฉ ํฉ๋๋ค.
๊ทผ๋ฐ ๋์ค์ 100% ํํํฉ๋๋ค.
์ต์ ๋ฉํ๋ฐ์ดํฐ ์ธํธ
{
"type": "guide",
"category": "billing",
"source": "admin",
"createdAt": "2025-01-10",
"version": "v2"
}
์ด๊ฒ ์์ด์ผ ๊ฐ๋ฅํ ๊ฒ๋ค:
- ํน์ ์นดํ ๊ณ ๋ฆฌ๋ง ๊ฒ์
- ์ค๋๋ ๋ฌธ์ ์ ์ธ
- ์คํ์ฉ ๋ฌธ์ ๋ถ๋ฆฌ
- A/B ํ ์คํธ
๐ ๋ฉํ๋ฐ์ดํฐ ์๋ RAG๋ ํ์ฅ ๋ถ๊ฐ
7๏ธโฃ 5๋จ๊ณ: ์์ฝ ์๋ ์์ฑ (ํ์ง ์ ์ง์ ํต์ฌ)
์ด๊ฑด ์ ๋ง ๊ฐ๋ ฅํฉ๋๋ค.
“์์ฝ ์๋ RAG๋ ๋ฐ์ชฝ์ง๋ฆฌ๋ค”
์ ์์ฝ์ด ํ์ํ๊ฐ
- LLM์ ๊ธด ์๋ฌธ์ ๊ทธ๋๋ก ์ฃผ์ง ์๊ธฐ ์ํด
- ํต์ฌ๋ง ์ปจํ ์คํธ๋ก ์ฐ๊ธฐ ์ํด
- hallucination ์ค์ด๊ธฐ ์ํด
์์ฝ ์์ฑ ์์
const summary = await openai.chat.completions.create({
model: 'gpt-3.5-turbo',
messages: [
{ role: 'system', content: '์๋ ๋ฌธ์๋ฅผ ํ ๋ฌธ๋จ์ผ๋ก ์์ฝํด.' },
{ role: 'user', content: chunk.content }
]
});
๊ทธ๋ฆฌ๊ณ Vector DB์๋ ์ด๋ ๊ฒ ์ ์ฅํฉ๋๋ค.
{
"content": "...์๋ฌธ...",
"summary": "...์์ฝ๋ณธ..."
}
๐ ๊ฒ์ ํ LLM์๋
summary ์์ฃผ๋ก ์ ๋ฌ
8๏ธโฃ 6๋จ๊ณ: ์๋ฒ ๋ฉ & Vector DB ์ ์ฅ
์ด ๋จ๊ณ๋ ์ด๋ฏธ ์ต์ํ ๊ฒ๋๋ค.
์ค์ํ ๊ฑด ์ ๋จ๊ณ๋ฅผ ํต๊ณผํ ๋ฌธ์๋ง ์ฌ๊ธฐ๋ก ์จ๋ค๋ ์ .
await qdrant.upsert("documents", {
points: [
{
id,
vector: embedding,
payload: {
title,
summary,
category,
source
}
}
]
});
9๏ธโฃ 7๋จ๊ณ: ์๋ ๊ฒ์ฆ (์ด๊ฑฐ ์ ํ๋ฉด ๊ฒฐ๊ตญ ํฐ์ง)
์ด์ ๋จ๊ณ์์ ์ง์ง ์ค์ํ ๋จ๊ณ์ ๋๋ค.
๋ด๊ฐ ์ฐ๋ ๊ฐ๋จํ ๊ฒ์ฆ ๋ฐฉ์
- ์ํ ์ง๋ฌธ 10๊ฐ ๊ณ ์
- ๋ฌธ์ ์ถ๊ฐ ํ ์๋ ๊ฒ์
- ๊ฒฐ๊ณผ ๋ก๊ทธ ๋น๊ต
const testQueries = [
"๊ฒฐ์ ์คํจํ๋ฉด ์ด๋ป๊ฒ ๋๋์?",
"๊ตฌ๋
ํด์ง๋ ์ด๋์ ํ๋์?"
];
๐ ๊ฒฐ๊ณผ๊ฐ ๊ฐ์๊ธฐ ๋ฐ๋๋ฉด
๋ฐ๋ก ์ ์ ์์ด์ผ ํฉ๋๋ค.
10๏ธโฃ ์ด ํ์ดํ๋ผ์ธ์ ์ง์ง ์๋ฏธ
์ด ๊ตฌ์กฐ๋ฅผ ๋ง๋ค๊ณ ๋์ ๋๋ ์ ์ ์ด๊ฑฐ์์ต๋๋ค.
RAG๋ “AI ๊ธฐ๋ฅ”์ด ์๋๋ผ
**“๋ฐ์ดํฐ ํ์ดํ๋ผ์ธ ๋ฌธ์ ”**๋ค.
- ๋ฌธ์๊ฐ ๋์ด๋๋
- ์ฌ๋์ด ๋ฐ๋์ด๋
- ์๊ฐ์ด ์ง๋๋
ํ์ง์ด ์ ์ง๋๋ ๊ตฌ์กฐ
์ด๊ฒ ์ง์ง ์ด์์
๋๋ค.
RAGํ์ดํ๋ผ์ธ, ๋ฌธ์์ ์ , ๋ฒกํฐDB์ด์, AI์๋น์ค์ด์, Qdrant, NestJS, AI๋ฐฑ์๋, RAG์๋ํ, AIํ์ง๊ด๋ฆฌ
'study > ๋ฐฑ์๋' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| ๐ธ RAG ๋น์ฉ ์ต์ ํ ์ค์ ํธ (0) | 2026.01.06 |
|---|---|
| ๐งช RAG ํ์ง์ โ๊ฐโ์ด ์๋๋ผ โ์ซ์โ๋ก ํ๋จํ๋ ๋ฒ (0) | 2026.01.05 |
| ๐ RAG ํ์ง์ด ๋ฌด๋์ง ๋ ์ง์ง ์์ธ ์ฐพ๊ธฐ (0) | 2025.12.31 |
| โก RAG ๊ฒ์ ์ฑ๋ฅ ํ๋ ์ค์ ๊ธฐ (0) | 2025.12.30 |
| ๐ ์ด๋ ฅ์ & ํฌํธํด๋ฆฌ์ค์ ์ด ํ๋ก์ ํธ๋ฅผ โ์ต๊ณ ํจ์จ๋กโ ๋ฃ๋ ๋ฒ (2) | 2025.12.15 |
- Total
- Today
- Yesterday
- Prisma
- ์ฟ ๋ฒ๋คํฐ์ค
- seo ์ต์ ํ 10๊ฐ
- ์น๊ฐ๋ฐ
- CI/CD
- PostgreSQL
- Redis
- Next.js
- ๋ฅ๋ฌ๋
- llm
- rag
- Express
- kotlin
- Python
- DevOps
- JAX
- nextJS
- ํ๋ก ํธ์๋๊ฐ๋ฐ
- ๋ฐฑ์๋๊ฐ๋ฐ
- REACT
- fastapi
- ai์ฒ ํ
- NestJS
- Docker
- node.js
- JWT
- flax
- ์๋ฐ๋ฉด์
- SEO์ต์ ํ
- ๊ฐ๋ฐ๋ธ๋ก๊ทธ
| ์ผ | ์ | ํ | ์ | ๋ชฉ | ๊ธ | ํ |
|---|---|---|---|---|---|---|
| 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 |

