
๐ก 3์ค ์์ฝ
RAG ์ํคํ ์ฒ์์ 'Provider'๋ LLM, ์๋ฒ ๋ฉ ๋ชจ๋ธ, ๋ฒกํฐ DB ๊ฐ์ ๊ฐ์๊ฐ์์ ์ปดํฌ๋ํธ๋ฅผ ํ์คํ๋ ๋ฐฉ์์ผ๋ก ์ฐ๊ฒฐํ๋ '์ด๋ํฐ'์ ๋๋ค. Provider๋ฅผ ์ฌ์ฉํ๋ฉด ํน์ ๊ธฐ์ ์ ๋ํ ์ข ์์ฑ์ ๋ฎ์ถ๊ณ , ์ฝ๋ ๋ณ๊ฒฝ์ ์ต์ํํ๋ฉฐ ์์คํ ์ ์ ์ฐํ๊ฒ ํ์ฅํ ์ ์์ต๋๋ค. ์ด๋ ๊ณง ์ ์ง๋ณด์ ๋น์ฉ ๊ฐ์์ ๋น ๋ฅธ ์คํ์ ํตํ ์๋น์ค ํ์ง ํฅ์์ผ๋ก ์ด์ด์ง๋๋ค.
AI๋ฅผ ํ์ฉํ ์๋น์ค๋ฅผ ๊ตฌ์ํ๋ฉฐ RAG(Retrieval-Augmented Generation) ์ํคํ ์ฒ๋ฅผ ํ์ตํ๋ ์ค, ์์คํ ์ ์ ์ฐ์ฑ๊ณผ ํ์ฅ์ฑ์ ์ข์ฐํ๋ ํต์ฌ ๊ฐ๋ ์ธ 'Provider'์ ๋ํด ๊น๊ฒ ํ๊ณ ๋ค์์ต๋๋ค.
์ฝ๊ฒ ๋งํด Provider๋ RAG ํ์ดํ๋ผ์ธ์ ๊ตฌ์ฑํ๋ ๋ค์ํ ์์(LLM, ์๋ฒ ๋ฉ ๋ชจ๋ธ, ๋ฒกํฐ ์คํ ์ด ๋ฑ)๋ค์ ๊ฐ์ ๋ผ์ธ ์ ์๋๋ก ๋ง๋ค์ด์ฃผ๋ ํ์คํ๋ '๊ท๊ฒฉ' ๋๋ '์ธํฐํ์ด์ค'์ ๋๋ค.
๋ง์น ์ฐ๋ฆฌ๊ฐ ํด์ธ์ฌํ ๊ฐ ๋ ๋ฉํฐ ์ด๋ํฐ ํ๋๋ง ์ฑ๊ธฐ๋ฉด ์ด๋ ๋๋ผ ์ฝ์ผํธ๋ ์ฌ์ฉํ ์ ์๋ ๊ฒ์ฒ๋ผ, Provider๊ฐ ์์ผ๋ฉด ์ด๋ค LLM(OpenAI, Anthropic, Ollama...)์ด๋ ๋ฒกํฐ DB(Chroma, FAISS, Pinecone...)๋ ์์ฝ๊ฒ ๊ต์ฒดํ๋ฉฐ ์ต์ ์ ์กฐํฉ์ ์ฐพ์ ์ ์์ต๋๋ค.
์ฒ์ RAG๋ฅผ ๊ตฌํํ ๋๋ ๋จ์ํ ํน์ ๋ชจ๋ธ(์: OpenAI)๊ณผ ํน์ ๋ฒกํฐ DB(์: ChromaDB)๋ฅผ ์ง์ ์ฐ๊ฒฐํ๋ ์ฝ๋๋ฅผ ์์ฑํ์ต๋๋ค. ๊ทธ๋ฐ๋ฐ ๊ณง๋ฐ๋ก ๋ฌธ์ ๊ฐ ๋ณด์์ต๋๋ค.
"๋ง์ฝ OpenAI API ๋น์ฉ์ด ๋ถ๋ด๋ผ์ ๋ก์ปฌ
Ollama๋ชจ๋ธ๋ก ๋ฐ๊พธ๋ ค๋ฉด?"
"์ฑ๋ฅ ์ข์ ์๋ก์ด ์๋ฒ ๋ฉ ๋ชจ๋ธ์ด ๋์๋๋ฐ, ๊ทธ๊ฑธ ์ ์ฉํ๋ ค๋ฉด?"
"๋ฐ์ดํฐ๊ฐ ๋ง์์ ธ์ChromaDB์์ ๊ณ ์ฑ๋ฅPinecone์ผ๋ก ๋ง์ด๊ทธ๋ ์ด์ ํด์ผ ํ๋ค๋ฉด?"
์ด ๋ชจ๋ ์๋๋ฆฌ์ค์์ ๊ด๋ จ ์ฝ๋๋ฅผ ์ฒ์๋ถํฐ ๋ค์ ์์ฑํด์ผ ํ๋ 'ํ๋์ฝ๋ฉ์ ๋ช'์ ๋น ์ง๊ฒ ๋ ๊ฒ์ด ๋ปํ์ต๋๋ค. ๊ฐ ์๋น์ค๋ ์์ ๋ง์ ๊ณ ์ ํ API์ ๋ฐ์ดํฐ ํ์์ ๊ฐ์ง๊ณ ์๊ธฐ ๋๋ฌธ์ด์ฃ . ์ด๊ฑด "AI๋ฅผ ์ ๊ทน ํ์ฉํ ์ ์ฐํ ํ๋ก์ ํธ"๋ผ๋ ์ ์ ๋ชฉํ์๋ ์ ๋ฐ๋์ ๊ธธ์ด์์ต๋๋ค.
์ด๋ฌํ ๋ฌธ์ ์์์ ์์ฐ์ค๋ฝ๊ฒ "์ด๋ป๊ฒ ํ๋ฉด ๊ฐ ์ปดํฌ๋ํธ๋ฅผ ๋ ๋ฆฝ์ ์ผ๋ก ๊ด๋ฆฌํ๊ณ , ํ์ํ ๋๋ง๋ค ์ฝ๊ฒ ๊ต์ฒดํ ์ ์์๊น?"๋ผ๋ ๊ณ ๋ฏผ์ผ๋ก ์ด์ด์ก์ต๋๋ค. ๊ทธ ํด๋ต์ด ๋ฐ๋ก 'Provider' ๋ชจ๋ธ์ด์์ต๋๋ค. ํน์ ๊ธฐ์ ์ ์ข ์๋์ง ์๊ณ , ์ง์ ๊ฐ๋ฅํ AI ์๋น์ค๋ฅผ ๋ง๋ค๊ธฐ ์ํด Provider ํจํด์ ํ์ต์ ์ ํ์ด ์๋ ํ์์์ต๋๋ค.
๊ฐ๋ ์ ์ดํดํ๋ ๊ฒ๊ณผ ์ฝ๋๋ก ๊ตฌํํ๋ ๊ฒ์ ๋ค๋ฆ ๋๋ค. ์ค์ LlamaIndex ํ๋ ์์ํฌ๋ฅผ ์ฌ์ฉํ์ฌ Provider ํจํด์ ๊ฐ๋ ฅํจ์ ์ฒด๊ฐํด ๋ณด์์ต๋๋ค.
# ๊ฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ ์ง์ ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ ์ฐ๊ฒฐํ๋ ๋ฐฉ์
from openai import OpenAI
from chromadb import Client
# 1. OpenAI ํด๋ผ์ด์ธํธ ์ค์ (OpenAI์ ์ข
์์ )
openai_client = OpenAI(api_key="sk-...")
# 2. ChromaDB ํด๋ผ์ด์ธํธ ์ค์ (ChromaDB์ ์ข
์์ )
chroma_client = Client()
collection = chroma_client.get_or_create_collection("my_documents")
# 3. ์๋ฒ ๋ฉ ์์ฑ ๋ฐ ์ ์ฅ ๋ก์ง (๋ชจ๋ ์๋์ผ๋ก ๊ตฌํ)
def get_embedding(text):
response = openai_client.embeddings.create(
input=text,
model="text-embedding-ada-002"
)
return response.data[0].embedding
# ... ๋ฐ์ดํฐ๋ฅผ ๋ฒกํฐ DB์ ์ ์ฅํ๊ณ ๊ฒ์ํ๋ ๋ชจ๋ ๊ณผ์ ์ ์ง์ ๊ตฌํ ...
# ๋ง์ฝ ๋ชจ๋ธ์ด๋ DB๋ฅผ ๋ฐ๊พธ๋ ค๋ฉด ์ด ๋ชจ๋ ์ฝ๋๋ฅผ ์์ ํด์ผ ํจ
์ ์ฝ๋๋ OpenAI์ ChromaDB์ ๊ฐํ๊ฒ ๊ฒฐํฉ๋์ด ์์ด, ๋ค๋ฅธ ๊ธฐ์ ๋ก ๋ฐ๊พธ๋ ค๋ฉด ์ฝ๋์ ์๋น ๋ถ๋ถ์ ์์ ํด์ผ๋ง ํฉ๋๋ค.
โ
์ ์ฉ ํ (After): Provider ํจํด ํ์ฉ
LlamaIndex์ ServiceContext (์ต์ ๋ฒ์ ์์ Settings)๋ฅผ ํ์ฉํ์ฌ Provider ํจํด์ ์ ์ฉํ์ต๋๋ค.
# LlamaIndex์ Provider(Settings)๋ฅผ ํ์ฉํ ์ ์ฐํ ๋ฐฉ์
from llama_index.core import Settings
from llama_index.llms.openai import OpenAI
from llama_index.embeddings.huggingface import HuggingFaceEmbedding
from llama_index.vector_stores.chroma import ChromaVectorStore
from llama_index.core import VectorStoreIndex, SimpleDirectoryReader
import chromadb
# 1. ์ฌ์ฉํ Provider๋ค์ ๊ฐ๊ฐ ์ ์
# LLM Provider: ๋ง์ฝ Ollama๋ก ๋ฐ๊พธ๊ณ ์ถ๋ค๋ฉด ์ด ๋ถ๋ถ๋ง ์์ ํ๋ฉด ๋!
# from llama_index.llms.ollama import Ollama
# Settings.llm = Ollama(model="llama3", request_timeout=60.0)
Settings.llm = OpenAI(model="gpt-4o", temperature=0.1)
# Embedding Model Provider: HuggingFace์ ๋ค๋ฅธ ๋ชจ๋ธ๋ก ๊ต์ฒด๋ ๊ฐํธ!
Settings.embed_model = HuggingFaceEmbedding(
model_name="BAAI/bge-small-en-v1.5"
)
# 2. Vector Store Provider ์ค์
chroma_client = chromadb.EphemeralClient()
chroma_collection = chroma_client.create_collection("my_docs")
vector_store = ChromaVectorStore(chroma_collection=chroma_collection)
# 3. Provider๊ฐ ์ค์ ๋ Settings๋ฅผ ๊ธฐ๋ฐ์ผ๋ก Index ๊ตฌ์ถ
# ๋ด๋ถ์ ์ผ๋ก Settings์ ์ ์๋ Provider๋ค์ ์์์ ๊ฐ์ ธ์ ์ฌ์ฉํจ
documents = SimpleDirectoryReader("./data").load_data()
index = VectorStoreIndex.from_documents(
documents,
)
query_engine = index.as_query_engine()
response = query_engine.query("What is the main topic?")
print(response)
Settings์ ์ํ๋ LLM, ์๋ฒ ๋ฉ ๋ชจ๋ธ์ '๋ฑ๋ก'๋ง ํด์ฃผ๋ฉด ๋ฉ๋๋ค. ๋ง์ฝ OpenAI๋ฅผ ๋ก์ปฌ Ollama ๋ชจ๋ธ๋ก ๋ฐ๊พธ๊ณ ์ถ๋ค๋ฉด, Settings.llm์ ์ ์ํ๋ ๋จ ํ ์ค๋ง ์์ ํ๋ฉด ๋ชจ๋ ๊ฒ์ด ํด๊ฒฐ๋ฉ๋๋ค. ํ๋์ฝ๋ฉ ๋ฐฉ์๊ณผ ๋น๊ตํ์ ๋ ์ ์ฐ์ฑ๊ณผ ํ์ฅ์ฑ ์ธก๋ฉด์์ ์๋์ ์ธ ์ฐจ์ด๋ฅผ ๋ณด์ฌ์ค๋๋ค.
Provider ํจํด์ ์ ์ฉํ๋ฉฐ OpenAI Provider๋ฅผ ์ค์ ํ๋ ๊ณผ์ ์์ ๊ณ์ AuthenticationError๊ฐ ๋ฐ์ํ์ต๋๋ค. ์ฝ๋ ์์ผ๋ก๋ API ํค๋ฅผ ์ ์์ ์ผ๋ก ์ ๋ฌํ๋ ๊ฒ์ฒ๋ผ ๋ณด์๊ณ , ํฐ๋ฏธ๋์์ ํ๊ฒฝ ๋ณ์๋ฅผ ํ์ธํ์ ๋๋ ๋ฌธ์ ๊ฐ ์์ด ๋ณด์์ต๋๋ค.
๋จ์ํ ์คํ๋ ์ค์ ๋ฌธ์ ์ผ ๊ฑฐ๋ผ ์๊ฐํ๊ณ ๋ค์ํ ์๋๋ฅผ ํ์ต๋๋ค.
๋๋ฒ๊น ๊ณผ์ ํผ์ณ๋ณด๊ธฐ...python-dotenv ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํด .env ํ์ผ์์ ํ๊ฒฝ ๋ณ์๋ฅผ ๋ก๋ํ๊ณ ์์์ต๋๋ค. print(os.getenv("OPENAI_API_KEY"))๋ฅผ ์ฝ๋ ์๋จ์ ์ถ๊ฐํ์ฌ ์ค์ ๋ก ๊ฐ์ด ์ ๋๋ก ๋ก๋๋๋์ง ํ์ธํ์ต๋๋ค. ๊ฒฐ๊ณผ๋ None์ด์์ต๋๋ค..env ํ์ผ ์์น ๋ฐ ๋ด์ฉ ์ฌํ์ธ: .env ํ์ผ์ด ํ์ด์ฌ ์คํฌ๋ฆฝํธ ์คํ ์์น์ ๋์ผํ ๋๋ ํ ๋ฆฌ์ ์๋์ง, ํ์ผ ๋ด์ OPENAI_API_KEY='sk-...' ํ์์ด ์ฌ๋ฐ๋ฅธ์ง ์์ฐจ๋ก ํ์ธํ์ง๋ง ์ด์์ด ์์์ต๋๋ค.OPENAI_API_KEY๋ผ๋ ํ๊ฒฝ ๋ณ์๋ฅผ ์๋์ผ๋ก ์ฐพ์ ์ฌ์ฉํ๋๋ฐ, ์ ๊ฐ .env ํ์ผ์ ๋ณ์๋ช
์ OPEN_AI_API_KEY๋ผ๊ณ _๋ฅผ ํ๋ ๋ ๋ฃ๋ ์ฌ์ํ ์คํ๋ฅผ ๋ธ ๊ฒ์ ๋ฐ๊ฒฌํ์ต๋๋ค.์ต์ข
์ ์ผ๋ก .env ํ์ผ์ ๋ณ์๋ช
์ OPEN_AI_API_KEY์์ OPENAI_API_KEY๋ก ์์ ํ์ฌ ๊ฐ๋จํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ์ต๋๋ค. ์ด ๊ฒฝํ์ ํตํด ํ๋ ์์ํฌ๋ฅผ ์ฌ์ฉํ ๋๋ ๊ณต์ ๋ฌธ์์์ ๊ถ์ฅํ๋ ํ๊ฒฝ ๋ณ์ ๋ช
๋ช
๊ท์น๊น์ง ๊ผผ๊ผผํ ํ์ธํด์ผ ํ๋ค๋ ๊ธฐ๋ณธ์ ์ธ ๊ตํ์ ์ป์์ต๋๋ค. ์ฌ์ํ ์ค์๊ฐ ํ๋ก์ ํธ ์ ์ฒด๋ฅผ ๋ง์ ์ ์๋ค๋ ๊ฒ์ ์ฒด๊ฐํ ์๊ฐ์ด์์ต๋๋ค.
โจ ๋๋ ์ ๊ณผ ๊ฐ์ ํฌ์ธํธ (Reflection & Next Step)
๊นจ๋ฌ์ ์ : 'Provider'๋ ๋จ์ํ ์ฝ๋ ๋ช ์ค์ ์ค์ฌ์ฃผ๋ ํธ์ ๊ธฐ๋ฅ์ด ์๋์์ต๋๋ค. ์ํํธ์จ์ด ๊ณตํ์ DIP(์์กด๊ด๊ณ ์ญ์ ์์น)๊ฐ AI ์ํคํ
์ฒ์ ์ด๋ป๊ฒ ์ ์ฉ๋๋์ง๋ฅผ ๋ณด์ฌ์ฃผ๋ ํ๋ฅญํ ์์์์ต๋๋ค. ์ ์ค๊ณ๋ ์ถ์ํ ๊ณ์ธต ํ๋๊ฐ ์ ์ฒด ์์คํ
์ ์๋ช
์ฃผ๊ธฐ๋ฅผ ์ผ๋ง๋ ๊ฑด๊ฐํ๊ฒ ๋ง๋๋์ง ๊นจ๋ฌ์์ต๋๋ค.
๊นจ๋ฌ์ ์ : 'Provider'๋ ๋จ์ํ ์ฝ๋ ๋ช ์ค์ ์ค์ฌ์ฃผ๋ ํธ์ ๊ธฐ๋ฅ์ด ์๋์์ต๋๋ค. ์ํํธ์จ์ด ๊ณตํ์ DIP(์์กด๊ด๊ณ ์ญ์ ์์น)๊ฐ AI ์ํคํ ์ฒ์ ์ด๋ป๊ฒ ์ ์ฉ๋๋์ง๋ฅผ ๋ณด์ฌ์ฃผ๋ ํ๋ฅญํ ์์์์ต๋๋ค. ์ ์ค๊ณ๋ ์ถ์ํ ๊ณ์ธต ํ๋๊ฐ ์ ์ฒด ์์คํ ์ ์๋ช ์ฃผ๊ธฐ๋ฅผ ์ผ๋ง๋ ๊ฑด๊ฐํ๊ฒ ๋ง๋๋์ง ๊นจ๋ฌ์์ต๋๋ค.
BaseReader๋ฅผ ์์๋ฐ์ ์ ํฌ ํ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ง๋ '์ปค์คํ
๋ฐ์ดํฐ ๋ฆฌ๋ Provider'๋ฅผ ์ง์ ๋ง๋ค์ด๋ณผ ๊ณํ์
๋๋ค. ์ด๋ฅผ ํตํด ์ด๋ค ๋ฐ์ดํฐ ์์ค๋ RAG ํ์ดํ๋ผ์ธ์ ์ ์ฐํ๊ฒ ํตํฉํ๋ ๊ฒฝํ์ ์๊ณ ์ถ์ต๋๋ค.์ด ๊ฒฝํ์ ๋จ์ํ RAG ๊ธฐ์ ์ ์๋ ๊ฒ์ ๋์ด, ์ด๋ป๊ฒ ํ๋ฉด '์ง์ ๊ฐ๋ฅํ๊ณ ํ์ฅ์ฑ ์๋' AI ์๋น์ค๋ฅผ ๋ง๋ค ์ ์์์ง์ ๋ํ ์ค๋ฌด์ ์ธ ๊ณ ๋ฏผ์ ํ๊ฒ ๋ ์ค์ํ ๋ณ๊ณก์ ์ด์์ต๋๋ค.