ํฐ์คํ ๋ฆฌ ๋ทฐ
๐ธ RAG ๋น์ฉ ์ต์ ํ ์ค์ ํธ
– “AI ์ฐ๋ค ๋งํ๋ค” ์๋ฆฌ ์ ๋ฃ๊ณ , ๋ ์ ์๊ฒ ์๋น์ค ์ด์ํ๋ ๋ฒ
(OpenAI · Vector DB · NestJS ๊ธฐ์ค, ์ค์ ์ด์์์ ํจ๊ณผ ์์๋ ๊ฒ๋ง)
์ด์ ๋ค์ด๊ฐ๋ฉด ์ด๋ฐ ์๊ฐ ์ต๋๋ค.
“์ฌ์ฉ์๋ ๋์๋๋ฐ…
AI ๋น์ฉ์ด ์ด์ํ๊ฒ ๋ ๋นจ๋ฆฌ ๋์ด๋๋ค?”
์ด๋ ๋๋ถ๋ถ ์ด๋ ๊ฒ ๋์ํฉ๋๋ค.
- ๋ชจ๋ธ์ ๋ฐ๊พผ๋ค โ
- ํธ์ถ ํ์๋ฅผ ๋ง๋๋ค โ
- ๊ทธ๋ฅ ๋น์ฉ ๊ฐ์ํ๋ค โ
๊ทผ๋ฐ์,
RAG ๋น์ฉ ๋ฌธ์ ๋ ๋๋ถ๋ถ ๊ตฌ์กฐ ๋ฌธ์ ์
๋๋ค.
์ด๋ฒ ๊ธ์ ์ ๊ฐ ์ค์ ๋ก ๋น์ฉ์ ํ ์ค์๋ ๋ฐฉ๋ฒ๋ค๋ง ์ ๋ฆฌํฉ๋๋ค.
(์ด๋ก ๋ง๊ณ , ์ด์์์ ๋จนํ ๊ฒ๋ง)
๐งญ ์ด ๊ธ์ ๋ชฉํ
- RAG ๋น์ฉ์ด ์ด๋์ ์๋์ง ์ ํํ ๋ถํด
- “์ ์จ๋ ๋๋ ํ ํฐ” ์์ ๋ ๋ฐฉ๋ฒ
- ์บ์/์๊ธ์ /์ฟผํฐ๋ฅผ ๊ตฌ์กฐ๋ก ์ค๊ณํ๋ ๋ฒ
- PM·๋ํ·ํ์ ์์์ ์ซ์๋ก ์ค๋ช ๊ฐ๋ฅํ ์ด์ ๋ง๋ค๊ธฐ
1๏ธโฃ RAG ๋น์ฉ์ ์ด๋์ ํฐ์ง๊น? (์ ํํ ๋ณด์)
RAG ๋น์ฉ์ ๋ณดํต ์ด 3๊ณณ์์ ํฐ์ง๋๋ค.
1. ์๋ฒ ๋ฉ ์์ฑ ๋น์ฉ
2. LLM ์๋ต ํ ํฐ ๋น์ฉ
3. ์ค๋ณต·๋ถํ์ ์์ฒญ
๐ ์ด ์ค 1๋ฒ๊ณผ 3๋ฒ์
๊ตฌ์กฐ๋ง ์ ์ก์๋ 50% ์ด์ ์ค์ผ ์ ์์ต๋๋ค.
2๏ธโฃ ์ฒซ ๋ฒ์งธ ์ ๊ฐ ํฌ์ธํธ: “์๋ฒ ๋ฉ์ ๋งค๋ฒ ๋ง๋ค์ง ๋ง ๊ฒ”
์ด๊ฑด ์ง์ง ๋ง์ด๋ค ๋์นฉ๋๋ค.
๊ฐ์ ์ง๋ฌธ
๊ฐ์ ๋ฌธ์ฅ
๊ฐ์ ์ฌ์ฉ์
๊ทผ๋ฐ ๋งค๋ฒ ์๋ฒ ๋ฉ ์์ฑ?
์ด๊ฑด ๊ทธ๋ฅ ๋ ํ์ฐ๋ ๊ตฌ์กฐ์์.
โ ๋น์ฉ ์๋ ๊ตฌ์กฐ
const embedding = await openai.embeddings.create({
model: "text-embedding-3-small",
input: query,
});
→ ์ด ์ฝ๋,
์์ฒญ ์ฌ ๋๋ง๋ค ์คํ๋๊ณ ์๋ค๋ฉด ์ด๋ฏธ ๊ณผ๊ธ ์ง์ฅ์
๋๋ค.
โ ํด๊ฒฐ: ์๋ฒ ๋ฉ ์บ์ (Redis ๊ธฐ์ค)
const key = `embed:${query}`;
const cached = await redis.get(key);
if (cached) {
return JSON.parse(cached);
}
const embedding = await openai.embeddings.create({
model: "text-embedding-3-small",
input: query,
});
await redis.set(key, JSON.stringify(embedding), 'EX', 60 * 60 * 24);
return embedding;
๐ ์ฒด๊ฐ ๊ฒฐ๊ณผ
- ์๋ฒ ๋ฉ ๋น์ฉ 60~70% ๊ฐ์
- ์๋ต ์๋๋ ๊ฐ์ด ๊ฐ์
๐ ์๋ฒ ๋ฉ ์บ์๋ ์ ํ์ด ์๋๋ผ ํ์
3๏ธโฃ ๋ ๋ฒ์งธ ์ ๊ฐ ํฌ์ธํธ: “LLM์ ๋ณด๋ด๋ ์ปจํ ์คํธ ์ค์ด๊ธฐ”
RAG ๋น์ฉ์ ์ ๋ฐ์ ์ฌ๊ธฐ์ ๋๊ฐ๋๋ค.
“์ ํํ๊ฒ ํ๋ ค๋ฉด
๋ฌธ๋งฅ์ ๋ง์ด ์ค์ผ์ง!”
โ ํ๋ ธ์ต๋๋ค.
๋ง์ด ์ฃผ๋ฉด ๋น์ธ๊ณ , ์คํ๋ ค ํ์ง๋ ํ๋ค๋ฆฝ๋๋ค.
โ ํํ ์ค์
const context = docs.map(d => d.content).join("\n");
- ์๋ฌธ ํต์งธ๋ก
- ๊ธธ๊ณ
- ์ค๋ณต ๋ง์
โ ์ค์ ๊ธฐ์ค
- summary๋ง ์ฌ์ฉ
- ๊ธธ์ด ์ ํ
- 3~5๊ฐ ๋ฌธ์๊น์ง๋ง
const context = docs
.slice(0, 4)
.map(d => `- ${d.summary}`)
.join("\n");
๐ ์ฒด๊ฐ ๊ฒฐ๊ณผ
- ํ ํฐ ์ฌ์ฉ๋ 30~40% ๊ฐ์
- hallucination๋ ๊ฐ์ด ์ค์ด๋ฆ
4๏ธโฃ ์ธ ๋ฒ์งธ ์ ๊ฐ ํฌ์ธํธ: “๋ชจ๋ ์ง๋ฌธ์ RAG ์ฐ์ง ๋ง ๊ฒ”
์ด๊ฑด ์ ๋ง ์ค์ํฉ๋๋ค.
๋ชจ๋ ์ง๋ฌธ์ด RAG์ผ ํ์๋ ์์ต๋๋ค.
์ค์ ์ด์์์ ๋๋ ์ง๋ฌธ ์ ํ
์ ํ์ฒ๋ฆฌ ๋ฐฉ์
| ๋จ์ ์ค๋ช | LLM only |
| ์ ์ ์ง๋ฌธ | ์บ์ ์๋ต |
| FAQ | DB ์กฐํ |
| ๋ฌธ์ ๊ธฐ๋ฐ ์ง๋ฌธ | RAG |
| ๋ฐ๋ณต ์ง๋ฌธ | ์บ์ |
๊ฐ๋จํ ๋ถ๊ธฐ ์์
function routeQuery(query: string) {
if (isSimple(query)) return 'LLM_ONLY';
if (isFaq(query)) return 'FAQ';
return 'RAG';
}
๐ ์ด ๋ถ๊ธฐ ํ๋๋ก
RAG ํธ์ถ ์์ฒด๋ฅผ 20~30% ์ค์ผ ์ ์์ต๋๋ค.
5๏ธโฃ ๋ค ๋ฒ์งธ ์ ๊ฐ ํฌ์ธํธ: “์๊ธ์ ๋ณ ๋ชจ๋ธ ์ ๋ต”
์ด๊ฑด ๋น์ฉ ๊ตฌ์กฐ๋ฅผ ์์ ํ ๋ฐ๊ฟ๋๋ค.
โ ์ด๋ฐ ๊ตฌ์กฐ
model: "gpt-4"
→ ๋ชจ๋ ์ฌ์ฉ์ ๋์ผ
→ ๋น์ฉ ์์ธก ๋ถ๊ฐ
โ ์ค์ ์๊ธ์ ์ ๋ต
ํ๋๋ชจ๋ธ
| Free | gpt-3.5 |
| Pro | gpt-4o-mini |
| Enterprise | ์์ ๋ชจ๋ธ |
const model =
user.plan === 'FREE'
? 'gpt-3.5-turbo'
: 'gpt-4o-mini';
๐ ํฌ์ธํธ
- ์ฌ์ฉ์๋ ์ฒด๊ฐ ๊ฑฐ์ ์์
- ๋น์ฉ ์ฐจ์ด๋ ํผ
6๏ธโฃ ๋ค์ฏ ๋ฒ์งธ ์ ๊ฐ ํฌ์ธํธ: “์๋ต ์บ์ (์ด๊ฑฐ ์ ํ๋ฉด ์ํด)”
๋๋๊ฒ๋,
๊ฐ์ ์ง๋ฌธ์ ํ๋ ์ฌ์ฉ์๋ ์ ๋ง ๋ง์ต๋๋ค.
์๋ต ์บ์ ๊ตฌ์กฐ
const key = `answer:${hash(query)}`;
const cached = await redis.get(key);
if (cached) return cached;
const answer = await rag(query);
await redis.set(key, answer, 'EX', 60 * 10);
return answer;
๐ ์ ์ฉ ํ
- AI ํธ์ถ ํ์ ๋์ ๋๊ฒ ๊ฐ์
- ํนํ FAQ ์์ญ์์ ํจ๊ณผ ํผ
7๏ธโฃ ์ฌ์ฏ ๋ฒ์งธ ์ ๊ฐ ํฌ์ธํธ: “์ฌ์ฉ๋์ ๋์ ๋ณด์ด๊ฒ ๋ง๋ค ๊ฒ”
๋น์ฉ ์ต์ ํ์ ์์์
“๋ณด๋ ๊ฒ” ์
๋๋ค.
์ต์ํ ์ด๊ฑด ๊ผญ ๊ธฐ๋กํ์ธ์
{
userId,
model,
tokenUsage,
responseTime,
costEstimate
}
๊ทธ๋ฆฌ๊ณ ์ด๋ฐ ์ง๋ฌธ์ ๋ตํ ์ ์์ด์ผ ํฉ๋๋ค.
- ์ด๋ค ํ๋์ด ๊ฐ์ฅ ๋น์ฉ์ด ๋ง์ด ๋๋๊ฐ?
- ์ด๋ค ์ง๋ฌธ ์ ํ์ด ๋์ ํ์ฐ๋๊ฐ?
- ์บ์๋ก ๋ง์ ์ ์๋ ์์ฒญ์?
๐ ์ด๊ฑธ ๋ชจ๋ฅด๋ฉด, ์ต์ ํ๋ ๊ฐ์ผ๋ก ํ ์๋ฐ์ ์์ต๋๋ค.
8๏ธโฃ ์ค์ ๋ก ์ค์ด๋ ๋น์ฉ (์ด์ ๊ธฐ์ค)
ํญ๋ชฉ์ ํ
| ์๋ฒ ๋ฉ ๋น์ฉ | ๊ธฐ์ค | -65% |
| LLM ํ ํฐ ๋น์ฉ | ๊ธฐ์ค | -35% |
| RAG ํธ์ถ ์ | ๊ธฐ์ค | -28% |
| ์ด AI ๋น์ฉ | ๊ธฐ์ค | -42% |
๐ ๋ชจ๋ธ ๋ฐ๊พผ ๊ฑฐ ์์
๐ ๊ธฐ๋ฅ ์ค์ธ ๊ฑฐ ์์
๐ ๊ตฌ์กฐ๋ง ๋ฐ๊ฟ
9๏ธโฃ ์ง์ง ์ค์ํ ํ ๋ฌธ์ฅ
์ด๊ฑด ๊ผญ ๊ธฐ์ตํ์ธ์.
AI ๋น์ฉ์
“์ผ๋ง ์ฐ๋๋”๊ฐ ์๋๋ผ
“์ด๋์ ์ฐ๋๋”์ ๋ฌธ์ ๋ค.
RAG๋น์ฉ์ต์ ํ, AI๋น์ฉ๊ด๋ฆฌ, OpenAI์ด์, AI์๋น์ค์ด์, NestJS, RAG๊ตฌ์กฐ, ๋ฒกํฐDB, SaaS์ด์, AI๋ฐฑ์๋
'study > ๋ฐฑ์๋' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| ๐งญ AI ๊ธฐ๋ฅ์ โ์ ํํ ๊ธฐ๋ฅโ์ผ๋ก ์ค๊ณํ๋ UXยท๊ธฐํ ์ ๋ต (0) | 2026.01.12 |
|---|---|
| ๐จ AI ๋ชจ๋ธ ์ฅ์ ๋์ ์ ๋ต (0) | 2026.01.07 |
| ๐งช RAG ํ์ง์ โ๊ฐโ์ด ์๋๋ผ โ์ซ์โ๋ก ํ๋จํ๋ ๋ฒ (0) | 2026.01.05 |
| ๐ RAG ๋ฌธ์ ์์งยท์ ์ ํ์ดํ๋ผ์ธ ์๋ํ (0) | 2026.01.02 |
| ๐ RAG ํ์ง์ด ๋ฌด๋์ง ๋ ์ง์ง ์์ธ ์ฐพ๊ธฐ (0) | 2025.12.31 |
- Total
- Today
- Yesterday
- JAX
- ์ฟ ๋ฒ๋คํฐ์ค
- flax
- ์น๊ฐ๋ฐ
- Express
- fastapi
- ๊ฐ๋ฐ๋ธ๋ก๊ทธ
- node.js
- CI/CD
- Redis
- Docker
- ๋ฐฑ์๋๊ฐ๋ฐ
- SEO์ต์ ํ
- llm
- kotlin
- ๋ฅ๋ฌ๋
- JWT
- seo ์ต์ ํ 10๊ฐ
- PostgreSQL
- ์๋ฐ๋ฉด์
- ai์ฒ ํ
- NestJS
- REACT
- Prisma
- ํ๋ก ํธ์๋๊ฐ๋ฐ
- rag
- Next.js
- DevOps
- nextJS
- Python
| ์ผ | ์ | ํ | ์ | ๋ชฉ | ๊ธ | ํ |
|---|---|---|---|---|---|---|
| 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 |

