Key Takeaways
- RAG = ๋ฌธ์๋ฅผ ์ ๋ก๋ํ๊ณ ๋ชจ๋ธ์ด ์ถ์ฒ๋ฅผ ์ธ์ฉํ๋ฉฐ ์ง๋ฌธ์ ๋ต๋ณํ๋๋ก ํ๋ ๋ฐฉ์์ ๋๋ค.
- Open WebUI๋ ๊ฐ์ฅ ๊ฐํธํ ๋ด์ฅ RAG๋ฅผ ์ ๊ณตํฉ๋๋ค. PDF๋ฅผ ์ ๋ก๋ํ๊ณ ์ง๋ฌธํ๋ฉด ๋ฉ๋๋ค. 5๋ถ ์ค์น.
- LlamaIndex๋ RAG ํ์ดํ๋ผ์ธ ๊ตฌ์ถ์ ๊ฐ์ฅ ์ ์ฐํ ํ๋ ์์ํฌ์ ๋๋ค.
- LangChain์ ๊ฐ์ฅ ๋๋ฆฌ ์ฌ์ฉ๋๋ ์ ๋ฌธ๊ฐ์ฉ ํ๋ ์์ํฌ๋ก, ๋ฐฉ๋ํ ์ํ๊ณ๋ฅผ ๋ณด์ ํ๊ณ ์์ต๋๋ค.
- Chroma์ Qdrant๋ ๋ฌธ์ ์ฒญํฌ ์ ์ฅ์ ์ํ ์ฃผ์ ๋ฒกํฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋๋ค.
- 2026๋ 4์ ํ์ฌ, ๋ก์ปฌ RAG๋ ์ฑ์ํ๊ณ ํ๋ก๋์ ํ๊ฒฝ์ ์ ํฉํฉ๋๋ค.
RAG(๊ฒ์ ์ฆ๊ฐ ์์ฑ)๋ ๋ฌด์์ ๋๊น?
RAG๋ ๋ชจ๋ธ์ ํ์ธํ๋ํ์ง ์๊ณ ๋ LLM์ด ์ฌ์ฉ์ ์์ ์ ๋ฌธ์์ ๋ํ ์ง๋ฌธ์ ๋ต๋ณํ ์ ์๋๋ก ํ๋ ๊ธฐ๋ฒ์ ๋๋ค.
์ฒ๋ฆฌ ๊ณผ์ : (1) ๋ฌธ์(PDF, ํ ์คํธ ํ์ผ) ์ ๋ก๋, (2) ์ฒญํฌ๋ก ๋ถํ , (3) ์ฒญํฌ๋ฅผ ์๋ฒ ๋ฉ(์์น ๋ฒกํฐ)์ผ๋ก ๋ณํ, (4) ๋ฒกํฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์๋ฒ ๋ฉ ์ ์ฅ, (5) ์ง๋ฌธ ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ๊ด๋ จ ์ฒญํฌ ๊ฒ์, (6) ์ฒญํฌ์ ์ง๋ฌธ์ LLM์ ์ ๋ฌ, (7) LLM์ด ์ฒญํฌ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๋ต๋ณ.
RAG๋ ๋ฌธ์๊ฐ ์์ฃผ ๋ณ๊ฒฝ๋๋ ๊ฒฝ์ฐ(ํ์ธํ๋์ ์ผํ์ฑ ํ๋ จ)์ ์ถ์ฒ ํ์๊ฐ ํ์ํ ๊ฒฝ์ฐ(RAG๋ ์ฌ์ฉ๋ ๋ฌธ์๋ฅผ ํ์) ํ์ธํ๋๋ณด๋ค ์ ํธ๋ฉ๋๋ค.
2026๋ ์์ 8๊ฐ ๋ก์ปฌ RAG ๋๊ตฌ
| Tool | Type | Best For | Vector DB | Learning Curve |
|---|---|---|---|---|
| Open WebUI | ์น ์ฑ (Docker) | ์ ๋ฌธ์, ๊ฐ์ฅ ์ฌ์ด ์ค์น | ๋ด์ฅ | ์์ |
| LlamaIndex | Python ํ๋ ์์ํฌ | ์ ์ฐํ ํ์ดํ๋ผ์ธ | ๋ชจ๋ ์ง์ (Chroma, Qdrant, Pinecone) | ์ค๊ฐ |
| LangChain | Python ํ๋ ์์ํฌ | ํ๋ก๋์ ์์คํ | ๋ชจ๋ ์ง์ | ์ค๊ฐ |
| Chroma | ๋ฒกํฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค | ๊ฐ๋จํ RAG | Chroma (์๋ฒ ๋๋) | ๋ฎ์ |
| Qdrant | ๋ฒกํฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค | ํ์ฅ ๊ฐ๋ฅํ RAG | Qdrant (๋ถ์ฐํ) | ์ค๊ฐ |
| Weaviate | ๋ฒกํฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค | GraphQL ์ฟผ๋ฆฌ | Weaviate | ์ค๊ฐ |
| Milvus | ๋ฒกํฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค | ๋๊ท๋ชจ ์ฒ๋ฆฌ | Milvus | ๋์ |
| Text-Generation-WebUI RAG | ํ์ฅ ๊ธฐ๋ฅ | ๋ชจ๋ธ๊ณผ์ ํตํฉ | ๋ด์ฅ | ๋ฎ์ |
Open WebUI RAG๋ ์ด๋ป๊ฒ ์ฌ์ฉํฉ๋๊น? (๊ฐ์ฅ ์ฌ์ด ๋ฐฉ๋ฒ)
Open WebUI์๋ ๋ด์ฅ RAG ๊ธฐ๋ฅ์ด ์์ต๋๋ค. Docker ์ธ์ ๋ณ๋ ์ค์ ์ด ํ์ํ์ง ์์ต๋๋ค. ๋ฌธ์๋ฅผ ์ ๋ก๋ํ๊ณ ์ง๋ฌธํ๋ฉด ๋ฉ๋๋ค.
# 1. Run Open WebUI with Docker
docker run -d -p 3000:8080 \
-e OLLAMA_BASE_URL=http://host.docker.internal:11434 \
ghcr.io/open-webui/open-webui:latest
# 2. Open http://localhost:3000
# 3. Click "+" next to message input โ "Upload files"
# 4. Select PDFs or text files
# 5. Ask questions -- Open WebUI retrieves relevant chunks
# 6. Model answers based on documents, with citationsLlamaIndex๋ก RAG๋ฅผ ๊ตฌ์ถํ๋ ๋ฐฉ๋ฒ์ ๋ฌด์์ ๋๊น?
LlamaIndex๋ ๋ฌธ์ ๋ก๋ฉ, ์ฒญํน, ์๋ฒ ๋ฉ, ๊ฒ์์ ์ฒ๋ฆฌํ๋ ํ๋ ์์ํฌ์ ๋๋ค. ์ ์ฐํ๋ฉฐ ๋ชจ๋ ๋ฒกํฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์ง์ํฉ๋๋ค.
# 1. Install
pip install llama-index
pip install llama-index-embeddings-ollama # use local Ollama embeddings
pip install llama-index-vector-stores-chroma # use Chroma for storage
# 2. Simple RAG pipeline
from llama_index.core import SimpleDirectoryReader, VectorStoreIndex
from llama_index.embeddings.ollama import OllamaEmbedding
# Load documents
documents = SimpleDirectoryReader("./documents").load_data()
# Create index with local embeddings
embedding_model = OllamaEmbedding(model_name="nomic-embed-text")
index = VectorStoreIndex.from_documents(
documents,
embed_model=embedding_model
)
# Query
query_engine = index.as_query_engine()
response = query_engine.query("What does the document say about X?")
print(response)LangChain์ผ๋ก RAG๋ฅผ ๊ตฌ์ถํ๋ ๋ฐฉ๋ฒ์ ๋ฌด์์ ๋๊น?
LangChain์ ํ๋ก๋์ RAG ์์คํ ์์ ๊ฐ์ฅ ๋๋ฆฌ ์ฌ์ฉ๋๋ ํ๋ ์์ํฌ์ ๋๋ค. ๋ชจ๋ ๋ฒกํฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ LLM ์ ๊ณต์ ์ฒด๋ฅผ ์ง์ํฉ๋๋ค.
# pip install langchain langchain-community langchain-chroma
from langchain.document_loaders import DirectoryLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain.embeddings import OllamaEmbeddings
from langchain.vectorstores import Chroma
from langchain.chat_models import ChatOllama
from langchain.chains import RetrievalQA
# Load documents
loader = DirectoryLoader("./documents")
docs = loader.load()
# Split into chunks
splitter = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=100)
chunks = splitter.split_documents(docs)
# Create embeddings and vector store
embeddings = OllamaEmbeddings(model="nomic-embed-text")
vectorstore = Chroma.from_documents(chunks, embeddings)
# Create QA chain
llm = ChatOllama(model="llama3.2:8b")
qa = RetrievalQA.from_chain_type(
llm=llm,
chain_type="stuff",
retriever=vectorstore.as_retriever()
)
# Answer questions
result = qa.run("What does the document say about X?")
print(result)๋ก์ปฌ RAG์ ๊ฐ์ฅ ์ ํฉํ ๋ฒกํฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ ๋ฌด์์ ๋๊น?
Chroma (๊ฐ์ฅ ์ฌ์): ์ธํ๋ก์ธ์ค ๋ฒกํฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค. ์๋ฒ ์ค์ ์ด ํ์ํ์ง ์์ต๋๋ค. ์๊ท๋ชจ RAG ํ๋ก์ ํธ(๋ฌธ์ 100๋ง ๊ฐ ๋ฏธ๋ง)์ ์ ํฉํฉ๋๋ค.
Qdrant (ํ์ฅ ๊ฐ๋ฅ): ์์ฒด ํธ์คํ ๋๋ ํด๋ผ์ฐ๋. ๋๊ท๋ชจ RAG์ ๋ ์ ํฉํฉ๋๋ค. Chroma๋ณด๋ค ๋ ๋ง์ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค.
Weaviate: GraphQL ๊ธฐ๋ฐ. ์๋ฒ ๋ฉ์ ๋ํ ๋ณต์กํ ์ฟผ๋ฆฌ์ ์ ํฉํฉ๋๋ค.
Milvus: ์ํฐํ๋ผ์ด์ฆ๊ธ. ์ด๋๊ท๋ชจ RAG(๋ฌธ์ 1์ต ๊ฐ ์ด์)์ ์ ํฉํฉ๋๋ค.
๋๋ถ๋ถ์ ๋ก์ปฌ ๋ฐฐํฌ์๋ Chroma๋ก ์ถฉ๋ถํ๋ฉฐ ๊ฐ์ฅ ์ฌ์ฉํ๊ธฐ ์ฝ์ต๋๋ค.
RAG์ ํ์ธํ๋ ์ค ๋ฌด์์ ์ฌ์ฉํด์ผ ํฉ๋๊น?
๋ค์ ๊ธฐ์ค์ ์ฐธ๊ณ ํ์ญ์์ค:
- RAG๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ: ๋ฌธ์๊ฐ ์์ฃผ ๋ณ๊ฒฝ๋๊ฑฐ๋, ์ถ์ฒ ํ์๊ฐ ํ์ํ๊ฑฐ๋, ๋ชจ๋ธ ํ๋ จ ์์ด ์์ํ๊ณ ์ถ๊ฑฐ๋, ๋ฌธ์๊ฐ 10๋ง ๊ฐ ๋ฏธ๋ง์ธ ๊ฒฝ์ฐ.
- ํ์ธํ๋์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ: ์ง์ ๋ฒ ์ด์ค๊ฐ ๊ณ ์ ๋์ด ์๊ฑฐ๋, ๋ชจ๋ธ์ด ํด๋น ๋๋ฉ์ธ์ ์ง์ ์ผ๋ก "์ดํด"ํ๊ธฐ๋ฅผ ์ํ๊ฑฐ๋, ์ถ๋ก ์๋๊ฐ ํ์ํ ๊ฒฝ์ฐ(ํ์ธํ๋๋ ๋ชจ๋ธ์ด ๋ ๋น ๋ฆ).
- ๋ ๋ค ๊ฒฐํฉํ๋ ๊ฒฝ์ฐ: ๋๋ฉ์ธ์ ๋ง๊ฒ ๋ชจ๋ธ์ ํ์ธํ๋ํ ํ RAG๋ฅผ ์ถ๊ฐํ์ฌ ๋งค์ฐ ๋์ ํ์ง์ Q&A๋ฅผ ๊ตฌํํฉ๋๋ค.
๋ก์ปฌ RAG ์ฌ์ฉ ์ ํํ ์ค์
- ์๋ชป๋ ์ฒญํฌ ํฌ๊ธฐ ์ฌ์ฉ. ๋๋ฌด ์์ผ๋ฉด(100 ํ ํฐ) ์กฐ๊ฐ์ด ๋๋ฌด ๋ง์์ง๋๋ค. ๋๋ฌด ํฌ๋ฉด(2000 ํ ํฐ) ๊ตฌ์ฒด์ฑ์ด ๋ถ์กฑํฉ๋๋ค. ์ต์ ์ 500-1000 ํ ํฐ์ ๋๋ค.
- ์๋ฒ ๋ฉ์ ์ฌ์ฉํ์ง ์๋ ๊ฒฝ์ฐ. ์ฒญํฌ๋ฅผ ์๋ฒ ๋ฉ์ผ๋ก ๋ณํํ์ง ์์ผ๋ฉด RAG๋ฅผ ์ํํ ์ ์์ต๋๋ค. ์์ด์๋ `nomic-embed-text`, ๋ค๊ตญ์ด์๋ `bge-m3`๋ฅผ ์ฌ์ฉํ์ญ์์ค.
- ๊ฒ์ ํ์ง์ ํ๊ฐํ์ง ์๋ ๊ฒฝ์ฐ. RAG๊ฐ ์คํ๋๋ค๊ณ ํด์ ์ฌ๋ฐ๋ฅธ ๋ฌธ์๋ฅผ ๊ฒ์ํ๋ ๊ฒ์ ์๋๋๋ค. ์๋ ค์ง ์ง๋ฌธ์ผ๋ก ํ ์คํธํ๊ณ ๊ฒ์๋ ์ฒญํฌ๊ฐ ๊ด๋ จ์ฑ์ด ์๋์ง ํ์ธํ์ญ์์ค.
- RAG๋ฅผ ํ์ธํ๋์ ๋์ฒด์ ๋ก ์ทจ๊ธํ๋ ๊ฒฝ์ฐ. RAG๋ ๊ฒ์ + ์ธ์ปจํ ์คํธ ํ์ต์ ๋๋ค. ํ์ธํ๋์ ์ค์ ๋ชจ๋ธ ์ ์์ ๋๋ค. ๋ชฉ์ ์ด ๋ค๋ฅธ ๋๊ตฌ์ ๋๋ค.
๋ก์ปฌ RAG์ ๊ดํ ์์ฃผ ๋ฌป๋ ์ง๋ฌธ
๋ก์ปฌ RAG๋ ๋ฌธ์๋ฅผ ๋ช ๊ฐ๊น์ง ์ฒ๋ฆฌํ ์ ์์ต๋๊น?
๋ฒกํฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ฐ๋ผ ๋ค๋ฆ ๋๋ค. Chroma๋ ์๋น์์ฉ ํ๋์จ์ด์์ 10๋ง~100๋ง ๊ฐ์ ๋ฌธ์๋ฅผ ์ฝ๊ฒ ์ฒ๋ฆฌํฉ๋๋ค. 100๋ง ๊ฐ๋ฅผ ์ด๊ณผํ๋ฉด Qdrant ๋๋ Milvus๋ฅผ ์ฌ์ฉํ์ญ์์ค.
RAG๋ ์ด๋ฏธ์ง์ ํจ๊ป ์๋ํฉ๋๊น?
ํ ์คํธ๋ฅผ ๋จผ์ ์ถ์ถ(OCR)ํ ๊ฒฝ์ฐ์๋ง ๊ฐ๋ฅํฉ๋๋ค. ์ง์ ํ ์ด๋ฏธ์ง ์ดํด๋ฅผ ์ํด์๋ RAG์ ํจ๊ป Llama 3.2 Vision๊ณผ ๊ฐ์ ๋ฉํฐ๋ชจ๋ฌ ๋ชจ๋ธ์ ์ฌ์ฉํ์ญ์์ค.
RAG๋ ํ์ธํ๋๋ณด๋ค ๋๋ฆฝ๋๊น?
RAG๋ ๊ฒ์(๋ฐ๋ฆฌ์ด) + ์ปจํ ์คํธ ์ ๋ฌ(ํ๋กฌํํธ์ ํ ํฐ ์ถ๊ฐ)์ด ํ์ํฉ๋๋ค. ์ผ๋ฐ์ ์ผ๋ก ํ์ธํ๋๋ ์ถ๋ก ๋ณด๋ค ๋๋ฆฌ์ง๋ง ์ค์ ์๋๋ ํจ์ฌ ๋น ๋ฆ ๋๋ค.
๋ก์ปฌ LLM๊ณผ ํด๋ผ์ฐ๋ ์๋ฒ ๋ฉ์ ํจ๊ป ์ฌ์ฉํ ์ ์์ต๋๊น?
๊ฐ๋ฅํฉ๋๋ค. ๊ฒ์์๋ ํด๋ผ์ฐ๋ ์๋ฒ ๋ฉ(OpenAI, Cohere)์ ์ฌ์ฉํ๊ณ ๋ต๋ณ์๋ ๋ก์ปฌ LLM์ ์ฌ์ฉํ๋ ํ์ด๋ธ๋ฆฌ๋ ๋ฐฉ์์ด ์ผ๋ฐ์ ์ ๋๋ค.
์ถ์ฒ
- LlamaIndex Documentation -- docs.llamaindex.ai
- LangChain Documentation -- python.langchain.com
- Chroma Documentation -- docs.trychroma.com
- Qdrant Documentation -- qdrant.tech/documentation
- RAG Paper -- arxiv.org/abs/2005.11401