Key Takeaways
- RAG = ๋ฌธ์ ์ ๋ก๋ + ๊ฒ์ + ๋ก์ปฌ LLM ๋ต๋ณ ์์ฑ. ํ๋ จ ๋ถํ์.
- 5๋จ๊ณ: (1) ๋ฌธ์ ๋ก๋, (2) 500~1000 ํ ํฐ ๋จ์๋ก ์ฒญํน, (3) ์๋ฒ ๋ฉ ์์ฑ, (4) ๋ฒกํฐ DB์ ์ ์ฅ, (5) ์ฟผ๋ฆฌ ์ ๊ฒ์.
- ์ต์ ์ ์๋ฒ ๋ฉ ๋ชจ๋ธ: nomic-embed-text (137M, ๋ก์ปฌ ์คํ, 768์ฐจ์ ๋ฒกํฐ).
- ์ต์ ์ ๋ฒกํฐ DB: 100๋ง ๊ฑด ๋ฏธ๋ง ๋ฌธ์์๋ Chroma (๊ฐ๋จ, ๋ด์ฅํ), ํ๋ก๋์ ํ๊ฒฝ์๋ Qdrant (๋ถ์ฐํ).
- 2026๋ 4์ ํ์ฌ, ๋ก์ปฌ RAG๋ ํด๋ผ์ฐ๋ API๋ณด๋ค ๋น ๋ฅด๊ณ ์ ๋ ดํฉ๋๋ค. ํ์ง์ ๊ฒ์ ์ ํ๋์ ํ๋กฌํํธ ์์ง๋์ด๋ง์ ๋ฌ๋ ค ์์ต๋๋ค.
RAG๋ ๋จ๊ณ๋ณ๋ก ์ด๋ป๊ฒ ์๋ํฉ๋๊น?
- 1๋ฌธ์ ์์ง: PDF, ํ ์คํธ ํ์ผ ๋๋ ์น ํ์ด์ง๋ฅผ ๋ก๋ํฉ๋๋ค.
- 2์ฒญํน: ๋ฌธ์๋ฅผ 500~1000 ํ ํฐ ์ฒญํฌ๋ก ๋ถํ ํฉ๋๋ค (๋ฌธ๋งฅ ๋จ์ ๋ฐฉ์ง๋ฅผ ์ํด 20% ์ค๋ฒ๋ฉ ์ ์ฉ).
- 3์๋ฒ ๋ฉ: ๋ก์ปฌ ์๋ฒ ๋ฉ ๋ชจ๋ธ์ ์ฌ์ฉํ์ฌ ๊ฐ ์ฒญํฌ๋ฅผ ๋ฒกํฐ (768~1536 ์ฐจ์)๋ก ๋ณํํฉ๋๋ค.
- 4์ ์ฅ: ๋ฒกํฐ๋ฅผ ๋ฉํ๋ฐ์ดํฐ (๋ฌธ์๋ช , ํ์ด์ง, ํ์์คํฌํ)์ ํจ๊ป ๋ฒกํฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค (Chroma, Qdrant, Milvus)์ ์ ์ฅํฉ๋๋ค.
- 5์ฟผ๋ฆฌ ์: ์ฌ์ฉ์ ์ง๋ฌธ์ ์๋ฒ ๋ฉ์ผ๋ก ๋ณํํ๊ณ , ๋ฒกํฐ DB์์ ๊ฐ์ฅ ์ ์ฌํ ์์ K๊ฐ ์ฒญํฌ๋ฅผ ๊ฒ์ํฉ๋๋ค (k=5~10).
- 6์ปจํ ์คํธ ์กฐํฉ: ๊ฒ์๋ ์ฒญํฌ๋ฅผ ๋ก์ปฌ LLM์ ์ํ ์ง์์ฌํญ์ด ํฌํจ๋ ํ๋กฌํํธ๋ก ๊ฒฐํฉํฉ๋๋ค.
- 7์์ฑ: ๋ก์ปฌ LLM์ด ๊ฒ์๋ ์ปจํ ์คํธ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๋ต๋ณ์ ์์ฑํฉ๋๋ค.
- 8๊ท์ ํ์: ๋ต๋ณ์ด ์ด๋ ๋ฌธ์์์ ๋์๋์ง ๋ฐํํฉ๋๋ค.
์ต์ ์ ์ฒญํน ์ ๋ต์ ๋ฌด์์ ๋๊น?
์ฒญํน ์ ๋ต์ด ๊ฒ์ ํ์ง์ ๊ฒฐ์ ํฉ๋๋ค. ์๋ชป๋ ์ฒญํน = ๊ด๋ จ ์ ๋ณด๊ฐ ์ฒญํฌ ์ฌ์ด์ ๋ถ์ฐ๋์ด ๊ฒ์ ์คํจ.
์๋ฏธ๋ก ์ ์ฒญํน (๊ถ์ฅ): ์๋ฏธ๋ฅผ ๋ณด์กดํ๋ฉด์ ๋ฌธ์ฅ์ด๋ ๋จ๋ฝ ๋จ์๋ก ๋ถํ ํฉ๋๋ค. ์: ๊ฐ ๋จ๋ฝ = ์ฒญํฌ 1๊ฐ.
๊ณ ์ ํฌ๊ธฐ ์ฒญํน: ์ฒญํฌ๋น 500 ํ ํฐ, 20% ์ค๋ฒ๋ฉ. ๋จ์ํ์ง๋ง ๋ฌธ์ฅ์ด ๋ถํ ๋ ์ ์์ต๋๋ค.
์ฌ๊ท์ ์ฒญํน: ๋จผ์ ๋จ๋ฝ์ผ๋ก ๋ถํ ํ๊ณ , ๋๋ฌด ํฌ๋ฉด ๋ฌธ์ฅ์ผ๋ก ๋ถํ ํฉ๋๋ค. ๊ณ์ธต ๊ตฌ์กฐ๋ฅผ ๋ณด์กดํฉ๋๋ค.
2026๋ 4์ ํ์ฌ, 20% ์ค๋ฒ๋ฉ์ด ์ ์ฉ๋ 500~1000 ํ ํฐ ์ฒญํฌ์ ์๋ฏธ๋ก ์ ์ฒญํน์ด ๋๋ถ๋ถ์ ์ฌ์ฉ ์ฌ๋ก์ ์ต์ ์ ๋๋ค.
# Python: semantic chunking example
from langchain.text_splitter import RecursiveCharacterTextSplitter
splitter = RecursiveCharacterTextSplitter(
chunk_size=1000,
chunk_overlap=200, # 20% overlap
separators=["\n\n", "\n", ".", " "] # Split on paragraph, then sentence
)
chunks = splitter.split_documents(documents)
print(f"Created {len(chunks)} chunks")์ด๋ค ๋ฒกํฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์ฌ์ฉํด์ผ ํฉ๋๊น?
| Database | ์ ํ | ์ฉ๋ | ์ค์ ๋์ด๋ | ์ต์ ์ฌ์ฉ ์ฌ๋ก |
|---|---|---|---|---|
| Chroma | โ | โ | โ | โ |
| Qdrant | โ | โ | โ | โ |
| Milvus | โ | โ | โ | โ |
| Weaviate | โ | โ | โ | โ |
| Pinecone (ํด๋ผ์ฐ๋) | โ | โ | โ | โ |
์ด๋ค ์๋ฒ ๋ฉ ๋ชจ๋ธ์ ์ ํํด์ผ ํฉ๋๊น?
| ๋ชจ๋ธ | ๋ฒกํฐ ์ฐจ์ | ์๋ | ํ์ง | ๊ถ์ฅ ์ฌํญ |
|---|---|---|---|---|
| โ | โ | โ | โ | โ |
| โ | โ | โ | โ | โ |
| โ | โ | โ | โ | โ |
| โ | โ | โ | โ | โ |
๊ฒ์ ํ์ง์ ์ด๋ป๊ฒ ์ต์ ํํฉ๋๊น?
๊ฒ์ ํ์ง์ด RAG ์ฑ๊ณต์ ๊ฒฐ์ ํฉ๋๋ค. ์ข์ ๊ฒ์ = ์ข์ ๋ต๋ณ. ๋์ ๊ฒ์ = ํ๊ฐ ํ์.
- Top K ์ ํ: k=5~10๊ฐ ์ฒญํฌ๋ฅผ ๊ฒ์ํฉ๋๋ค. K๊ฐ ๋์์๋ก ๋ ๋ง์ ์ปจํ ์คํธ (๋๋ฆผ), K๊ฐ ๋ฎ์์๋ก ๋ถํ์ํ ์ ๋ณด ๊ฐ์.
- ์ ์ฌ๋ ์๊ณ๊ฐ: ์ต์ ์ ์ฌ๋ ์ ์ (์: 0.75 ์ด์)๋ก ๊ฒฐ๊ณผ๋ฅผ ํํฐ๋งํฉ๋๋ค. ๋ฎ์ ๊ด๋ จ์ฑ์ ์ฒญํฌ๋ฅผ ๋ฐฉ์งํฉ๋๋ค.
- ๋ฆฌ๋ญํน: ๋ฆฌ๋ญ์ปค (cross-encoder)๋ฅผ ์ฌ์ฉํ์ฌ ๊ฒ์๋ ์ฒญํฌ๋ฅผ ๊ด๋ จ์ฑ ๊ธฐ์ค์ผ๋ก ์ฌ์ ๋ ฌํฉ๋๋ค. ์ํญ ์ ํ๋ ํฅ์.
- ํ์ด๋ธ๋ฆฌ๋ ๊ฒ์: ์๋ฏธ๋ก ์ ๊ฒ์ (์๋ฒ ๋ฉ)๊ณผ BM25 ํค์๋ ๊ฒ์์ ๊ฒฐํฉํฉ๋๋ค. ์ ํํ ํค์๋๊ฐ ํฌํจ๋ ๋ฌธ์๋ฅผ ํฌ์ฐฉํฉ๋๋ค.
- ์ฟผ๋ฆฌ ํ์ฅ: ๋์์ด๋ ๊ด๋ จ ์ฉ์ด๋ก ์ฌ์ฉ์ ์ฟผ๋ฆฌ๋ฅผ ํ์ฅํฉ๋๋ค. ์ฌํ์จ์ ํฅ์์ํต๋๋ค.
RAG ํ์ง์ ์ด๋ป๊ฒ ํ๊ฐํฉ๋๊น?
RAG ํ์ง์๋ ๋ ๊ฐ์ง ์ฐจ์์ด ์์ต๋๋ค: (1) ๊ฒ์ ํ์ง (๊ด๋ จ ์ฒญํฌ๋ฅผ ๊ฐ์ ธ์๋๊ฐ?), (2) ์์ฑ ํ์ง (LLM์ด ์ ๋ต๋ณํ๋๊ฐ?).
๊ฒ์ ํ๊ฐ: ์ ๋ต ๋ฌธ์๊ฐ ์๋ ค์ง ํ ์คํธ ์ฟผ๋ฆฌ๋ฅผ ์์ฑํฉ๋๋ค. ์ ๋ฐ๋ (๊ฒ์๋ ํญ๋ชฉ ์ค ๊ด๋ จ ํญ๋ชฉ์ ๋น์จ์?)์ ์ฌํ์จ (๋ชจ๋ ๊ด๋ จ ๋ฌธ์๋ฅผ ๊ฐ์ ธ์๋๊ฐ?)์ ์ธก์ ํฉ๋๋ค.
์์ฑ ํ๊ฐ: ๊ฒ์๋ ์ฒญํฌ๋ก LLM์ ์คํํ๊ณ , ๋ต๋ณ์ ์ ํ๋์ ์์ ์ฑ์ ์๋์ผ๋ก ์ ์ํํฉ๋๋ค (0~5์ ์ฒ๋).
2026๋ 4์ ํ์ฌ, Ragas์ ๊ฐ์ ์๋ํ๋ ํ๊ฐ ๋๊ตฌ๊ฐ ๊ฒ์ ๋ฐ ์์ฑ ์งํ๋ฅผ ์๋์ผ๋ก ์ธก์ ํ ์ ์์ต๋๋ค.
ํ๋ก๋์ RAG ํจํด
ํ๋ก๋์ ์๋น์ค๋ฅผ ์ํด ๋ค์ ํจํด์ ์ฌ์ฉํ์ญ์์ค:
- ์บ์ฑ: ์์ฃผ ์กฐํ๋๋ ๋ฌธ์์ ์๋ฒ ๋ฉ์ ์บ์ํ์ฌ ์ฌ๊ณ์ฐ์ ๋ฐฉ์งํฉ๋๋ค.
- ์ฆ๋ถ ์ธ๋ฑ์ฑ: ์ ์ฒด ์ฌ์ธ๋ฑ์ฑ ์์ด ์ ๋ฌธ์๋ฅผ ์ถ๊ฐํฉ๋๋ค. Qdrant์ Milvus๊ฐ ์ด๋ฅผ ์ง์ํฉ๋๋ค.
- ๋ชจ๋ํฐ๋ง: ๊ฒ์ ์ง์ฐ ์๊ฐ, ์บ์ ์ ์ค๋ฅ , ๋ต๋ณ ํ์ง์ ๋ํ ์ฌ์ฉ์ ํผ๋๋ฐฑ์ ์ถ์ ํฉ๋๋ค.
- ํด๋ฐฑ: ๊ฒ์ ์คํจ ์ (๊ด๋ จ ์ฒญํฌ ์์), ํ๊ฐ ๋์ "ํด๋น ์ ๋ณด๋ฅผ ๋ณด์ ํ๊ณ ์์ง ์์ต๋๋ค"๋ผ๊ณ ์๋ตํฉ๋๋ค.
- ๋ฒ์ ๊ด๋ฆฌ: ๊ฐ์ฌ ์ถ์ ์ ์ํด ๋ฌธ์ ๋ฒ์ ์ ์ ์งํฉ๋๋ค. ๊ฐ ๋ต๋ณ์ ์ฌ์ฉ๋ ๋ฒ์ ์ ์ ์ฅํฉ๋๋ค.
๋ก์ปฌ RAG ๊ตฌํ ์ ํํ ์ค์๋ค
- ๋ฌธ์ ์ฒญํน ์ค๋ฅ. ๋๋ฌด ์์ ์ฒญํฌ๊ฐ ๋ง์ผ๋ฉด = ๊ฒ์ ๋ ธ์ด์ฆ. ๋๋ฌด ํฐ ์ฒญํฌ๊ฐ ์ ์ผ๋ฉด = ์ ๋ณด ๋ถ์ฐ. ์ฒญํฌ ํฌ๊ธฐ๋ฅผ ์คํ์ ์ผ๋ก ํ ์คํธํ์ญ์์ค.
- ๊ฒ์ ํ๊ฐ ๋ฏธ์ค์. ๊ฒ์์ด ์๋ํ๋์ง ํ ์คํธํ์ง ์๊ณ RAG๋ฅผ ๊ตฌ์ถํ๋ ๊ฒ์ ์์ง์ ํ ์คํธํ์ง ์๊ณ ์๋์ฐจ๋ฅผ ๋ง๋๋ ๊ฒ๊ณผ ๊ฐ์ต๋๋ค. ํญ์ ์ ๋ฐ๋/์ฌํ์จ์ ์ธก์ ํ์ญ์์ค.
- ๋๋ฉ์ธ ํนํ ๋ฌธ์์ ์ผ๋ฐ ์๋ฒ ๋ฉ ์ฌ์ฉ. ๋ฒ๋ฅ , ์๋ฃ ๋๋ ๊ธฐ์ ๋ฌธ์๋ ํ์ธํ๋๋ ์๋ฒ ๋ฉ์ด ํ์ํ ์ ์์ต๋๋ค. ๋๋ฉ์ธ ํนํ ๋ชจ๋ธ์ ๊ณ ๋ คํ์ญ์์ค.
- ์ ๋ฐ์ดํธ ๋น๋ ๊ฐ๊ณผ. ๋ฌธ์๊ฐ ๋งค์ฃผ ๋ณ๊ฒฝ๋๋ค๋ฉด ๋ฒกํฐ DB๊ฐ ์ค๋๋ฉ๋๋ค. ์ฌ์๋ฒ ๋ฉ ๋ฐ ์ ๋ฐ์ดํธ ํ์ดํ๋ผ์ธ์ ๊ตฌ์ถํ์ญ์์ค.
- RAG๊ฐ ํ์ธํ๋์ ๋์ฒดํ ๊ฒ์ผ๋ก ๊ธฐ๋. RAG๋ ์ปจํ ์คํธ ์ฃผ์ ์ ๋๋ค. ํ์ธํ๋์ ๋ชจ๋ธ ์ ์์ ๋๋ค. ์ต์ ์ ๊ฒฐ๊ณผ๋ฅผ ์ํด ๋ ๊ฐ์ง๋ฅผ ๊ฒฐํฉํ์ญ์์ค.
๋ก์ปฌ RAG์ ๊ดํ ์์ฃผ ๋ฌป๋ ์ง๋ฌธ
๋ก์ปฌ RAG๋ ๋ช ๊ฐ์ ๋ฌธ์๋ฅผ ์ฒ๋ฆฌํ ์ ์์ต๋๊น?
Chroma๋ ์ผ๋ฐ ์๋น์์ฉ ํ๋์จ์ด์์ 10๋ง~100๋ง ๊ฑด์ ๋ฌธ์๋ฅผ ์ฒ๋ฆฌํฉ๋๋ค. Qdrant๋ ๋ถ์ฐ ์ค์ ์ผ๋ก ์์ญ์ต ๊ฑด๊น์ง ํ์ฅ๋ฉ๋๋ค. 100๋ง ๊ฑด์ ์ด๊ณผํ๋ ๊ฒฝ์ฐ Qdrant ๋๋ Milvus๋ฅผ ์ฌ์ฉํ์ญ์์ค.
์์ ์ง์ฐ ์๊ฐ์ ์ด๋ ์ ๋์ ๋๊น?
์๋ฒ ๋ฉ ์ฟผ๋ฆฌ (CPU์ nomic-embed-text): 50~200ms. ๊ฒ์ (๋์คํฌ์ Chroma): 10~50ms. LLM ์์ฑ: 2~10์ด (๋ชจ๋ธ ํฌ๊ธฐ์ ๋ฐ๋ผ ๋ค๋ฆ). ์ดํฉ: ์ฟผ๋ฆฌ๋น 2~10์ด.
RAG๋ ์ค์๊ฐ ๋ฌธ์ ์ ๋ฐ์ดํธ๋ฅผ ์ฒ๋ฆฌํ ์ ์์ต๋๊น?
์. ๋ฒกํฐ DB์ ์ ๋ฌธ์๋ฅผ ๋์ ์ผ๋ก ์ถ๊ฐํ ์ ์์ต๋๋ค. ์ธ๋ฑ์ฑ ์ง์ฐ ์๊ฐ์ ๋ฌธ์๋น 100~500ms์ด๋ฏ๋ก ์ค์๊ฐ ์ ๋ฐ์ดํธ๊ฐ ์ค์ฉ์ ์ ๋๋ค.
๋ก์ปฌ RAG๋ ํด๋ผ์ฐ๋ API๋ณด๋ค ์ ๋ ดํฉ๋๊น?
์. ํ ํฐ๋น ๋น์ฉ์ด ์๊ณ ์ธ๋ถ ์๋น์ค์ ๋ํ API ํธ์ถ๋ ์์ต๋๋ค. ์๋ฒ ๋ฉ์ ํ ๋ฒ ์ค์ ํ๋ฉด ์ดํ ์ฟผ๋ฆฌ๋ ๋ฌด๋ฃ์ ๋๋ค.
ํด๋ผ์ฐ๋ ์๋ฒ ๋ฉ์ ๋ก์ปฌ LLM๊ณผ ํจ๊ป ์ฌ์ฉํ ์ ์์ต๋๊น?
์. ์ธ๋ฑ์ฑ์๋ OpenAI, Cohere ๋๋ ๋ค๋ฅธ ํด๋ผ์ฐ๋ ์๋ฒ ๋ฉ์ ์ฌ์ฉํ๊ณ , ์์ฑ์๋ ๋ก์ปฌ LLM์ ์ฌ์ฉํ ์ ์์ต๋๋ค. ํ์ด๋ธ๋ฆฌ๋ ๋ฐฉ์์ ๋๋ค.
์ถ์ฒ
- LlamaIndex Documentation -- docs.llamaindex.ai
- LangChain RAG Guide -- python.langchain.com/docs/use_cases/question_answering
- Chroma Documentation -- docs.trychroma.com
- Qdrant Vector Search Engine -- qdrant.tech
- RAG Paper (Lewis et al.) -- arxiv.org/abs/2005.11401