RAG์ ๊ทธ๋ํRAG: ๊ฐ๋ฐ์๊ฐ โ๊ทผ๊ฑฐ ์๋ ๋ต๋ณโ์ ๋ง๋ค๊ธฐ ์ํ ๋ ๊ฐ์ง ์ ๊ทผ
RAG์ ๊ทธ๋ํRAG: ๊ฐ๋ฐ์๊ฐ โ๊ทผ๊ฑฐ ์๋ ๋ต๋ณโ์ ๋ง๋ค๊ธฐ ์ํ ๋ ๊ฐ์ง ์ ๊ทผ LLM(๋๊ท๋ชจ ์ธ์ด ๋ชจ๋ธ)์ ๋๋ํ์ง๋ง, ๋ชจ๋ฅด๋ ๊ฑด ๋ชจ๋ฅธ๋ค...
RAG์ ๊ทธ๋ํRAG: ๊ฐ๋ฐ์๊ฐ โ๊ทผ๊ฑฐ ์๋ ๋ต๋ณโ์ ๋ง๋ค๊ธฐ ์ํ ๋ ๊ฐ์ง ์ ๊ทผ
LLM(๋๊ท๋ชจ ์ธ์ด ๋ชจ๋ธ)์ ๋๋ํ์ง๋ง, ๋ชจ๋ฅด๋ ๊ฑด ๋ชจ๋ฅธ๋ค๊ธฐ๋ณด๋ค ๊ทธ๋ด๋ฏํ๊ฒ ๋ง๋ค์ด๋ด๋ ์ชฝ์ผ๋ก ํ๋ฌ๊ฐ๊ธฐ ์ฝ์ต๋๋ค. ๊ฐ๋ฐ ํ์ฅ์์๋ ์ด๊ฒ ์น๋ช ์ ์ด์ฃ . ๋ฌธ์์ ์ฝ๋, ์ ์ฑ , ์ฅ์ ๋ฆฌํฌํธ์ฒ๋ผ โ์ ๋ต์ด ์๋ ์ง์โ์ ๊ธฐ๋ฐ์ผ๋ก ๋ตํด์ผ ํ๋๊น์. ์ด๋ ๋ง์ด ์ฐ๋ ๋ฐฉ์์ด RAG(Retrieval-Augmented Generation)์ด๊ณ , ์ต๊ทผ์ ๊ด๊ณ๋ฅผ ๋ ์ ๋ค๋ฃจ๊ธฐ ์ํด ๊ทธ๋ํRAG(Graph RAG)๊ฐ ์ฃผ๋ชฉ๋ฐ๊ณ ์์ต๋๋ค.
RAG๋ ๋ฌด์์ธ๊ฐ
RAG๋ ํ๋ง๋๋ก ์ธ๋ถ ์ง์(๋ฌธ์)์ ๊ฒ์ํด ๊ทผ๊ฑฐ๋ฅผ ๋ถ์ธ ๋ค ๋ต๋ณ์ ์์ฑํ๋ ํจํด์ ๋๋ค.
๋์ ํ๋ฆ(๊ฐ๋ฐ ๊ด์ )
- ๋ฌธ์๋ฅผ ์กฐ๊ฐ(chunk)์ผ๋ก ๋๋
- ๊ฐ ์กฐ๊ฐ์ ์๋ฒ ๋ฉ ๋ฒกํฐ๋ก ๋ง๋ค์ด ์ ์ฅ(๋ฒกํฐ DB ๋ฑ)
- ์ฌ์ฉ์์ ์ง๋ฌธ์ ์๋ฒ ๋ฉ ํ, ์ ์ฌํ ์กฐ๊ฐ์ ๊ฒ์
- ๊ฒ์๋ ์กฐ๊ฐ์ ํ๋กฌํํธ์ ๋ฃ๊ณ LLM์ด ๋ต๋ณ ์์ฑ
RAG๊ฐ ํนํ ์ํ๋ ๊ฒ
- ์ฌ๋ด ์ํค/์ ์ฑ /๋งค๋ด์ผ ๊ธฐ๋ฐ Q&A
- ๋ฆด๋ฆฌ์ฆ ๋ ธํธ๋ ์ฅ์ ๋ณด๊ณ ์์์ ๊ทผ๊ฑฐ๋ฅผ ๋์ด์ ์์ฝ
- ์ต์ ๋ฌธ์๋ฅผ ๋ฐ์ํ ๋ต๋ณ(๋ชจ๋ธ ์ฌํ์ต ์์ด)
RAG์ ํ๊ณ(์ค๋ฌด์์ ์์ฃผ ๋ถ๋ชํ)
- ๋ฌธ์ ๊ฐ ๊ด๊ณ(์์ธ-๊ฒฐ๊ณผ, ์์กด์ฑ, ์ฌ์ฉ์-๊ถํ ๊ตฌ์กฐ)๋ฅผ ๊น๊ฒ ์ถ๋ก ํ๊ธฐ ์ด๋ ต๋ค
- โA๋ B์ ํ์์ด๊ณ , B๋ C์ ์ฐ๊ฒฐ๋๊ณ โฆโ ๊ฐ์ ๋ค์ค ํ ์ง์์์ ๊ฒ์์ด ๋น๋๊ฐ ์ ์๋ค
- ๊ด๋ จ ์กฐ๊ฐ์ด ํฉ์ด์ ธ ์์ผ๋ฉด, ํ๋ ๊ฐ chunk๋ง์ผ๋ก๋ ๋งฅ๋ฝ์ด ๋ถ์กฑํด์ง๋ค
๊ทธ๋ํRAG๋ ๋ฌด์์ธ๊ฐ
๊ทธ๋ํRAG๋ RAG์ โ๊ฒ์โ์ ๊ทธ๋ํ ๊ธฐ๋ฐ ํ์์ผ๋ก ๊ฐํํ๋ ์ ๊ทผ์ ๋๋ค. ๋ฌธ์์์ ์ํฐํฐ(์๋น์ค, ํ ์ด๋ธ, API, ๋ด๋น์ ๋ฑ)์ ๊ด๊ณ(ํธ์ถ, ์์ , ์์กด, ํฌํจ ๋ฑ)๋ฅผ ๋ฝ์ ์ง์ ๊ทธ๋ํ๋ฅผ ๋ง๋ค๊ณ , ์ง๋ฌธ์ ๋ฐ๋ผ ๊ทธ๋ํ๋ฅผ ํ๊ณ ํ์ํ ๊ทผ๊ฑฐ๋ฅผ ๋ชจ์๋๋ค.
์ธ์ ๊ทธ๋ํRAG๊ฐ ๋น๋๋๊ฐ
- ๋ง์ดํฌ๋ก์๋น์ค ์์กด์ฑ: โ์ฅ์ ๊ฐ ๋ฌ์ ๋ ์ด๋๋ถํฐ ์ํฅ์ด ํผ์ง๋?โ
- ๋ฐ์ดํฐ ๊ณ๋ณด(Lineage): โ์ด ๋์๋ณด๋์ ์์น๊ฐ ์ด๋ค ETL๊ณผ ํ ์ด๋ธ์ ๊ฑฐ์น๋?โ
- ๊ถํ/์ญํ ๊ด๊ณ: โ์ด ๊ธฐ๋ฅ์ ๋๊ฐ ์น์ธํด์ผ ํ๊ณ ์ด๋ค ์ ์ฑ ์ ๋ฐ๋ผ์ผ ํ๋?โ
- ์ด์ ์์ธ ๋ถ์: โ์ต๊ทผ ๋ฐฐํฌ์ ์ฐ๊ด๋ ๋ณ๊ฒฝ ํ์ผ/๋ชจ๋์ด ๋ญ์์ง?โ
RAG vs ๊ทธ๋ํRAG, ๊ฐ์ผ๋ก ์ก๋ ๋น๊ต
- RAG: ๊ฐ๊น์ด ๋ฌธ์ ์กฐ๊ฐ์ ์ ์ฐพ๋ ๋ฐ ๊ฐํจ
- ๊ทธ๋ํRAG: ๊ด๊ณ๊ฐ ๋ง์ ์ง์์ ๊ธธ๊ฒ ์ฐ๊ฒฐํด ์ถ๋ก ํ๋ ๋ฐ ๊ฐํจ
๊ฐ๋จํ ์ฌ๋ก๋ก ์ดํดํ๊ธฐ
์ํฉ: ๊ฒฐ์ ์คํจ ์ฅ์ ๋ฌธ์
- ์ง๋ฌธ: โ์ด์ ๋ถํฐ ๊ฒฐ์ ์คํจ๊ฐ ๋์๋๋ฐ, ์์ธ์ด ๋ญ ๊ฐ๋ฅ์ฑ์ด ์ปค?โ RAG๋ โ๊ฒฐ์ ์คํจโ, โ์๋ฌ ์ฝ๋โ, โ์ด์ โ ๊ฐ์ ํค์๋์ ๊ฐ๊น์ด ์ฅ์ ๋ฆฌํฌํธ ์กฐ๊ฐ์ ์ฐพ์ ์์ฝํ๋ ๋ฐ๋ ์ข์ต๋๋ค. ํ์ง๋ง ์์ธ์ด ๊ฒฐ์ API โ ์ธ์ฆ ์๋น์ค โ ์ธ๋ถ PG๋ก ์ด์ด์ง๋ ์ฐ์ ์์กด ๋ฌธ์ ๋ผ๋ฉด, ๊ด๋ จ ์ ๋ณด๊ฐ ์ฌ๋ฌ ๋ฌธ์/๋ฆฌํฌํธ/๋ฐ๋ถ์ ํฉ์ด์ ธ ์์ ์ ์์ด์.
๊ทธ๋ํRAG๋ โ๊ฒฐ์ API๊ฐ ์์กดํ๋ ์๋น์คโ, โ์ต๊ทผ ๋ณ๊ฒฝ๋ ๋ ธ๋โ, โ์คํจ์จ์ด ์ฆ๊ฐํ ๊ฒฝ๋กโ์ฒ๋ผ ๊ด๊ณ ๊ธฐ๋ฐ์ผ๋ก ํ๋ณด๋ฅผ ์ขํ๊ณ ํ์ํ ๊ทผ๊ฑฐ๋ฅผ ๋ชจ์ ๋ต๋ณ์ ๊ตฌ์ฑํ๊ธฐ๊ฐ ์์ํฉ๋๋ค.
๊ฐ๋ฐ์๊ฐ ๋ฐ๋ก ์ ์ฉํ ์ ์๋ ๊ตฌํ ์์ด๋์ด
RAG ์ต์ ๊ตฌํ(ํ์ด์ฌ ์์)
์๋๋ โ๋ฌธ์ ์กฐ๊ฐ ๊ฒ์ โ ์์ k๊ฐ๋ฅผ ์ปจํ ์คํธ๋ก ์ฌ์ฉโํ๋ ํํ์ ๋ผ๋์ ๋๋ค. (์๋ฒ ๋ฉ/LLM ํธ์ถ๋ถ๋ ์ฌ์ฉํ๋ SDK์ ๋ง๊ฒ ๊ต์ฒดํ๋ฉด ๋ฉ๋๋ค.)
from dataclasses import dataclass
from typing import List, Tuple
import numpy as np
@dataclass
class Chunk:
id: str
text: str
vec: np.ndarray
def cosine(a: np.ndarray, b: np.ndarray) -> float:
return float(a @ b) / (np.linalg.norm(a) * np.linalg.norm(b) + 1e-9)
def retrieve(chunks: List[Chunk], query_vec: np.ndarray, k: int = 4) -> List[Tuple[float, Chunk]]:
scored = [(cosine(c.vec, query_vec), c) for c in chunks]
scored.sort(key=lambda x: x[0], reverse=True)
return scored[:k]
def build_context(topk: List[Tuple[float, Chunk]]) -> str:
return "\n\n".join([f"[{c.id}]\n{c.text}" for _, c in topk])
# query_vec = embed("์ง๋ฌธ ํ
์คํธ")
# topk = retrieve(chunks, query_vec, k=4)
๊ทธ๋ํRAG๋ โ๊ทธ๋ํ๋ฅผ ์ด๋ป๊ฒ ๋ง๋ค์งโ๊ฐ ํต์ฌ
๊ทธ๋ํRAG์์ ๋์ด๋๊ฐ ์๊ธฐ๋ ์ง์ ์ ๋ชจ๋ธ ํธ์ถ์ด ์๋๋ผ ๊ทธ๋ํ ๊ตฌ์ฑ์ ๋๋ค.
- ๋ ธ๋ ์: ์๋น์ค, API, DB ํ ์ด๋ธ, ๋ฐฐ์น ์ก, ๋ด๋น ํ, ์ ์ฑ ๋ฌธ์
- ์ฃ์ง ์: ํธ์ถํ๋ค, ์ ์ฅํ๋ค, ์์ ํ๋ค, ์์ฑํ๋ค, ์ํฅ์ ์ค๋ค ์ฒ์๋ถํฐ ์๋ฒฝํ ์ง์ ๊ทธ๋ํ๋ฅผ ๋ง๋ค๊ธฐ๋ณด๋ค, ๊ฐ์ฅ ์์ฃผ ๋ฌผ์ด๋ณด๋ ์ง๋ฌธ 20๊ฐ๋ฅผ ๊ธฐ์ค์ผ๋ก ๋ ธ๋/๊ด๊ณ๋ฅผ ์ต์๋ก ์ ์ํด ์์ํ๋ฉด ์ฑ๊ณต ํ๋ฅ ์ด ์ฌ๋ผ๊ฐ๋๋ค.
์ด๋ค ๊ฑธ ์ ํํด์ผ ํ ๊น
RAG๋ถํฐ ์ถ์ฒํ๋ ๊ฒฝ์ฐ
- ๋ฌธ์๊ฐ ์ ์ ๋ฆฌ๋์ด ์๊ณ โ์ฐพ์์ ์์ฝโ ์ฑ๊ฒฉ์ด ๊ฐํ ๋
- ๋น ๋ฅด๊ฒ MVP๋ฅผ ๋ง๋ค์ด ๋ด๋ถ์ ๋ฐฐํฌํ๊ณ ์ถ์ ๋
- ์ง์๊ฐ ๋จ๋ฐ์ฑ์ด๊ณ ๊ด๊ณ ์ถ๋ก ์๊ตฌ๊ฐ ๋ฎ์ ๋
๊ทธ๋ํRAG๋ฅผ ๊ณ ๋ คํ ์์
- โ์/์ด๋ป๊ฒโ ์ง๋ฌธ์ด ๋ง๊ณ , ๋ต์ด ์ฌ๋ฌ ์์คํ ์ ๊ฑธ์ณ ์์ ๋
- ์ด์/์ฅ์ /๋ฐ์ดํฐ ๊ณ๋ณด์ฒ๋ผ ์ฐ๊ฒฐ ๊ตฌ์กฐ ์์ฒด๊ฐ ์ง์์ธ ๋๋ฉ์ธ์ผ ๋
- ๋จ์ ์ ์ฌ๋ ๊ฒ์์ผ๋ก๋ ํญ์ ํ๋ ๋จ๊ณ์์ ๋งํ ๋
๋ง๋ฌด๋ฆฌ: ๊ฐ๋ฐ ์กฐ์ง์์ โ์ ๋ตโ๋ณด๋ค โ๊ทผ๊ฑฐโ๊ฐ ์์ฐ์ด๋ค
RAG๋ ์ง์์ ๊ฐ์ ธ์ค๋ ๋ฅ๋ ฅ์, ๊ทธ๋ํRAG๋ ์ง์์ ์ฐ๊ฒฐํ๋ ๋ฅ๋ ฅ์ ๊ฐํํฉ๋๋ค. ๊ฐ๋ฐ ํ์ฅ์์๋ ๋ ์ค ํ๋๋ง ๊ณ ์งํ๊ธฐ๋ณด๋ค, ๋จผ์ RAG๋ก ๋น ๋ฅด๊ฒ ๊ฐ์น(๊ฒ์+๋ต๋ณ)๋ฅผ ๋ง๋ค๊ณ , ๋ฐ๋ณต ์ง๋ฌธ์์ ๊ด๊ณ ์ถ๋ก ์ ํ์๊ฐ ๋๋ฌ๋ ๋ ๊ทธ๋ํ๋ฅผ ์น๋ ์ ๋ต์ด ํ์ค์ ์ ๋๋ค. ๊ฒฐ๊ตญ ๋ชฉํ๋ ํ๋์ ๋๋ค. ํ์ด ์ ๋ขฐํ ์ ์๋ ๊ทผ๊ฑฐ ๊ธฐ๋ฐ ๋ต๋ณ์ ๊พธ์คํ ์์ฐํ๋ ๊ฒ.
โฌ๏ธ ์ด ๊ธ์ด ๋์์ด ๋์ จ๋ค๋ฉด, ์๋ ๊ด๊ณ ๋ฅผ ํ ๋ฒ๋ง ํด๋ฆญํด์ฃผ์ธ์! ์ ์๊ฒ ํฐ ํ์ด ๋ฉ๋๋ค ๐โโ๏ธ โฌ๏ธ