20250620_Unreal1๊ธฐTIL_Provider

๋ณ„๋น›์—์†Œ์›์„ยท2025๋…„ 6์›” 20์ผ

TeamSparta-Unreal1๊ธฐ-TIL

๋ชฉ๋ก ๋ณด๊ธฐ
88/90
post-thumbnail

[RAG] AI ์„œ๋น„์Šค์˜ ์œ ์—ฐ์„ฑ์„ ๊ฒฐ์ •ํ•˜๋Š” ํ•ต์‹ฌ, 'Provider' ํŒŒํ—ค์น˜๊ธฐ

๐Ÿ’ก 3์ค„ ์š”์•ฝ
RAG ์•„ํ‚คํ…์ฒ˜์—์„œ 'Provider'๋Š” LLM, ์ž„๋ฒ ๋”ฉ ๋ชจ๋ธ, ๋ฒกํ„ฐ DB ๊ฐ™์€ ๊ฐ์–‘๊ฐ์ƒ‰์˜ ์ปดํฌ๋„ŒํŠธ๋ฅผ ํ‘œ์ค€ํ™”๋œ ๋ฐฉ์‹์œผ๋กœ ์—ฐ๊ฒฐํ•˜๋Š” '์–ด๋Œ‘ํ„ฐ'์ž…๋‹ˆ๋‹ค. Provider๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํŠน์ • ๊ธฐ์ˆ ์— ๋Œ€ํ•œ ์ข…์†์„ฑ์„ ๋‚ฎ์ถ”๊ณ , ์ฝ”๋“œ ๋ณ€๊ฒฝ์„ ์ตœ์†Œํ™”ํ•˜๋ฉฐ ์‹œ์Šคํ…œ์„ ์œ ์—ฐํ•˜๊ฒŒ ํ™•์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ๊ณง ์œ ์ง€๋ณด์ˆ˜ ๋น„์šฉ ๊ฐ์†Œ์™€ ๋น ๋ฅธ ์‹คํ—˜์„ ํ†ตํ•œ ์„œ๋น„์Šค ํ’ˆ์งˆ ํ–ฅ์ƒ์œผ๋กœ ์ด์–ด์ง‘๋‹ˆ๋‹ค.


๐Ÿง  ์˜ค๋Š˜ ๋ฐฐ์šด ๊ฒƒ (What I Learned)

AI๋ฅผ ํ™œ์šฉํ•œ ์„œ๋น„์Šค๋ฅผ ๊ตฌ์ƒํ•˜๋ฉฐ RAG(Retrieval-Augmented Generation) ์•„ํ‚คํ…์ฒ˜๋ฅผ ํ•™์Šตํ•˜๋˜ ์ค‘, ์‹œ์Šคํ…œ์˜ ์œ ์—ฐ์„ฑ๊ณผ ํ™•์žฅ์„ฑ์„ ์ขŒ์šฐํ•˜๋Š” ํ•ต์‹ฌ ๊ฐœ๋…์ธ 'Provider'์— ๋Œ€ํ•ด ๊นŠ๊ฒŒ ํŒŒ๊ณ ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.

์‰ฝ๊ฒŒ ๋งํ•ด Provider๋Š” RAG ํŒŒ์ดํ”„๋ผ์ธ์„ ๊ตฌ์„ฑํ•˜๋Š” ๋‹ค์–‘ํ•œ ์š”์†Œ(LLM, ์ž„๋ฒ ๋”ฉ ๋ชจ๋ธ, ๋ฒกํ„ฐ ์Šคํ† ์–ด ๋“ฑ)๋“ค์„ ๊ฐˆ์•„ ๋ผ์šธ ์ˆ˜ ์žˆ๋„๋ก ๋งŒ๋“ค์–ด์ฃผ๋Š” ํ‘œ์ค€ํ™”๋œ '๊ทœ๊ฒฉ' ๋˜๋Š” '์ธํ„ฐํŽ˜์ด์Šค'์ž…๋‹ˆ๋‹ค.

๋งˆ์น˜ ์šฐ๋ฆฌ๊ฐ€ ํ•ด์™ธ์—ฌํ–‰ ๊ฐˆ ๋•Œ ๋ฉ€ํ‹ฐ ์–ด๋Œ‘ํ„ฐ ํ•˜๋‚˜๋งŒ ์ฑ™๊ธฐ๋ฉด ์–ด๋А ๋‚˜๋ผ ์ฝ˜์„ผํŠธ๋“  ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ, Provider๊ฐ€ ์žˆ์œผ๋ฉด ์–ด๋–ค LLM(OpenAI, Anthropic, Ollama...)์ด๋‚˜ ๋ฒกํ„ฐ DB(Chroma, FAISS, Pinecone...)๋“  ์†์‰ฝ๊ฒŒ ๊ต์ฒดํ•˜๋ฉฐ ์ตœ์ ์˜ ์กฐํ•ฉ์„ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


๐Ÿค” ์™œ ์ด๊ฑธ ๋ฐฐ์› ๋Š”๊ฐ€? (Why I Learned It)

๋ฌธ์ œ ์ธ์‹: "์ด๋Ÿฌ๋‹ค๊ฐ„ ๋ฐฐ๋ณด๋‹ค ๋ฐฐ๊ผฝ์ด ๋” ์ปค์ง€๊ฒ ๋Š”๋ฐ?"

์ฒ˜์Œ RAG๋ฅผ ๊ตฌํ˜„ํ•  ๋•Œ๋Š” ๋‹จ์ˆœํžˆ ํŠน์ • ๋ชจ๋ธ(์˜ˆ: OpenAI)๊ณผ ํŠน์ • ๋ฒกํ„ฐ DB(์˜ˆ: ChromaDB)๋ฅผ ์ง์ ‘ ์—ฐ๊ฒฐํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ๊ณง๋ฐ”๋กœ ๋ฌธ์ œ๊ฐ€ ๋ณด์˜€์Šต๋‹ˆ๋‹ค.

"๋งŒ์•ฝ OpenAI API ๋น„์šฉ์ด ๋ถ€๋‹ด๋ผ์„œ ๋กœ์ปฌ Ollama ๋ชจ๋ธ๋กœ ๋ฐ”๊พธ๋ ค๋ฉด?"
"์„ฑ๋Šฅ ์ข‹์€ ์ƒˆ๋กœ์šด ์ž„๋ฒ ๋”ฉ ๋ชจ๋ธ์ด ๋‚˜์™”๋Š”๋ฐ, ๊ทธ๊ฑธ ์ ์šฉํ•˜๋ ค๋ฉด?"
"๋ฐ์ดํ„ฐ๊ฐ€ ๋งŽ์•„์ ธ์„œ ChromaDB์—์„œ ๊ณ ์„ฑ๋Šฅ Pinecone์œผ๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ํ•ด์•ผ ํ•œ๋‹ค๋ฉด?"

์ด ๋ชจ๋“  ์‹œ๋‚˜๋ฆฌ์˜ค์—์„œ ๊ด€๋ จ ์ฝ”๋“œ๋ฅผ ์ฒ˜์Œ๋ถ€ํ„ฐ ๋‹ค์‹œ ์ž‘์„ฑํ•ด์•ผ ํ•˜๋Š” 'ํ•˜๋“œ์ฝ”๋”ฉ์˜ ๋Šช'์— ๋น ์ง€๊ฒŒ ๋  ๊ฒƒ์ด ๋ป”ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ฐ ์„œ๋น„์Šค๋Š” ์ž์‹ ๋งŒ์˜ ๊ณ ์œ ํ•œ API์™€ ๋ฐ์ดํ„ฐ ํ˜•์‹์„ ๊ฐ€์ง€๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด์ฃ . ์ด๊ฑด "AI๋ฅผ ์ ๊ทน ํ™œ์šฉํ•œ ์œ ์—ฐํ•œ ํ”„๋กœ์ ํŠธ"๋ผ๋Š” ์ €์˜ ๋ชฉํ‘œ์™€๋Š” ์ •๋ฐ˜๋Œ€์˜ ๊ธธ์ด์—ˆ์Šต๋‹ˆ๋‹ค.

ํ•™์Šต ๋™๊ธฐ: ์œ ์—ฐํ•˜๊ณ  ํ™•์žฅ ๊ฐ€๋Šฅํ•œ AI ์•„ํ‚คํ…์ฒ˜๋ฅผ ์œ„ํ•˜์—ฌ

์ด๋Ÿฌํ•œ ๋ฌธ์ œ์˜์‹์€ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ "์–ด๋–ป๊ฒŒ ํ•˜๋ฉด ๊ฐ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋…๋ฆฝ์ ์œผ๋กœ ๊ด€๋ฆฌํ•˜๊ณ , ํ•„์š”ํ•  ๋•Œ๋งˆ๋‹ค ์‰ฝ๊ฒŒ ๊ต์ฒดํ•  ์ˆ˜ ์žˆ์„๊นŒ?"๋ผ๋Š” ๊ณ ๋ฏผ์œผ๋กœ ์ด์–ด์กŒ์Šต๋‹ˆ๋‹ค. ๊ทธ ํ•ด๋‹ต์ด ๋ฐ”๋กœ 'Provider' ๋ชจ๋ธ์ด์—ˆ์Šต๋‹ˆ๋‹ค. ํŠน์ • ๊ธฐ์ˆ ์— ์ข…์†๋˜์ง€ ์•Š๊ณ , ์ง€์† ๊ฐ€๋Šฅํ•œ AI ์„œ๋น„์Šค๋ฅผ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด Provider ํŒจํ„ด์˜ ํ•™์Šต์€ ์„ ํƒ์ด ์•„๋‹Œ ํ•„์ˆ˜์˜€์Šต๋‹ˆ๋‹ค.


๐Ÿ’ป ์–ด๋–ป๊ฒŒ ์ ์šฉํ–ˆ๋Š”๊ฐ€? (How I Applied It)

๊ฐœ๋…์„ ์ดํ•ดํ•˜๋Š” ๊ฒƒ๊ณผ ์ฝ”๋“œ๋กœ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์€ ๋‹ค๋ฆ…๋‹ˆ๋‹ค. ์‹ค์ œ LlamaIndex ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Provider ํŒจํ„ด์˜ ๊ฐ•๋ ฅํ•จ์„ ์ฒด๊ฐํ•ด ๋ณด์•˜์Šต๋‹ˆ๋‹ค.

โŒ ์ ์šฉ ์ „ (Before): ํ•˜๋“œ์ฝ”๋”ฉ ๋ฐฉ์‹

# ๊ฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ ์ง์ ‘ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์—ฐ๊ฒฐํ•˜๋Š” ๋ฐฉ์‹
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,
)

4. ์ฟผ๋ฆฌ ์—”์ง„ ์ƒ์„ฑ ๋ฐ ์‹คํ–‰

query_engine = index.as_query_engine()
response = query_engine.query("What is the main topic?")
print(response)

Settings์— ์›ํ•˜๋Š” LLM, ์ž„๋ฒ ๋”ฉ ๋ชจ๋ธ์„ '๋“ฑ๋ก'๋งŒ ํ•ด์ฃผ๋ฉด ๋ฉ๋‹ˆ๋‹ค. ๋งŒ์•ฝ OpenAI๋ฅผ ๋กœ์ปฌ Ollama ๋ชจ๋ธ๋กœ ๋ฐ”๊พธ๊ณ  ์‹ถ๋‹ค๋ฉด, Settings.llm์„ ์ •์˜ํ•˜๋Š” ๋‹จ ํ•œ ์ค„๋งŒ ์ˆ˜์ •ํ•˜๋ฉด ๋ชจ๋“  ๊ฒƒ์ด ํ•ด๊ฒฐ๋ฉ๋‹ˆ๋‹ค. ํ•˜๋“œ์ฝ”๋”ฉ ๋ฐฉ์‹๊ณผ ๋น„๊ตํ–ˆ์„ ๋•Œ ์œ ์—ฐ์„ฑ๊ณผ ํ™•์žฅ์„ฑ ์ธก๋ฉด์—์„œ ์••๋„์ ์ธ ์ฐจ์ด๋ฅผ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

๐Ÿ› ๏ธ ๊ฒช์€ ๋ฌธ์ œ์™€ ํ•ด๊ฒฐ ๊ณผ์ • (Troubleshooting)

์ง๋ฉดํ•œ ๋ฌธ์ œ: "๋ถ„๋ช… ์ฝ”๋“œ๋Š” ๋งž๋Š”๋ฐ, ์™œ ์ธ์ฆ ์—๋Ÿฌ๊ฐ€...?"

Provider ํŒจํ„ด์„ ์ ์šฉํ•˜๋ฉฐ OpenAI Provider๋ฅผ ์„ค์ •ํ•˜๋Š” ๊ณผ์ •์—์„œ ๊ณ„์† AuthenticationError๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค. ์ฝ”๋“œ ์ƒ์œผ๋กœ๋Š” API ํ‚ค๋ฅผ ์ •์ƒ์ ์œผ๋กœ ์ „๋‹ฌํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์˜€๊ณ , ํ„ฐ๋ฏธ๋„์—์„œ ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ํ™•์ธํ–ˆ์„ ๋•Œ๋„ ๋ฌธ์ œ๊ฐ€ ์—†์–ด ๋ณด์˜€์Šต๋‹ˆ๋‹ค.

๋ฌธ์ œ ํ•ด๊ฒฐ ๋…ธ๋ ฅ ๋ฐ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•

๋‹จ์ˆœํ•œ ์˜คํƒ€๋‚˜ ์„ค์ • ๋ฌธ์ œ์ผ ๊ฑฐ๋ผ ์ƒ๊ฐํ•˜๊ณ  ๋‹ค์–‘ํ•œ ์‹œ๋„๋ฅผ ํ–ˆ์Šต๋‹ˆ๋‹ค.

๋””๋ฒ„๊น… ๊ณผ์ • ํŽผ์ณ๋ณด๊ธฐ...
  1. API ํ‚ค ์ง์ ‘ ์ฃผ์ž…: ์ฝ”๋“œ์— API ํ‚ค๋ฅผ ํ•˜๋“œ์ฝ”๋”ฉํ•ด์„œ ๋„ฃ์–ด๋ณด๋‹ˆ ์ •์ƒ์ ์œผ๋กœ ์ž‘๋™ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ํ‚ค ์ž์ฒด์˜ ๋ฌธ์ œ๊ฐ€ ์•„๋‹ˆ๋ผ, ํ‚ค๋ฅผ ๋ถˆ๋Ÿฌ์˜ค๋Š” ๊ณผ์ •์˜ ๋ฌธ์ œ์ž„์„ ์‹œ์‚ฌํ–ˆ์Šต๋‹ˆ๋‹ค.
  2. ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ๋กœ๋”ฉ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํ™•์ธ: python-dotenv ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•ด .env ํŒŒ์ผ์—์„œ ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ๋กœ๋“œํ•˜๊ณ  ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. print(os.getenv("OPENAI_API_KEY"))๋ฅผ ์ฝ”๋“œ ์ƒ๋‹จ์— ์ถ”๊ฐ€ํ•˜์—ฌ ์‹ค์ œ๋กœ ๊ฐ’์ด ์ œ๋Œ€๋กœ ๋กœ๋“œ๋˜๋Š”์ง€ ํ™•์ธํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ฒฐ๊ณผ๋Š” None์ด์—ˆ์Šต๋‹ˆ๋‹ค.
  3. .env ํŒŒ์ผ ์œ„์น˜ ๋ฐ ๋‚ด์šฉ ์žฌํ™•์ธ: .env ํŒŒ์ผ์ด ํŒŒ์ด์ฌ ์Šคํฌ๋ฆฝํŠธ ์‹คํ–‰ ์œ„์น˜์™€ ๋™์ผํ•œ ๋””๋ ‰ํ† ๋ฆฌ์— ์žˆ๋Š”์ง€, ํŒŒ์ผ ๋‚ด์— OPENAI_API_KEY='sk-...' ํ˜•์‹์ด ์˜ฌ๋ฐ”๋ฅธ์ง€ ์ˆ˜์ฐจ๋ก€ ํ™•์ธํ–ˆ์ง€๋งŒ ์ด์ƒ์ด ์—†์—ˆ์Šต๋‹ˆ๋‹ค.
  4. (Aha!) LlamaIndex ๊ณต์‹ ๋ฌธ์„œ ์žฌํƒ์ƒ‰: ํ˜น์‹œ LlamaIndex๊ฐ€ ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ๋กœ๋“œํ•˜๋Š” ํŠน๋ณ„ํ•œ ๋ฐฉ์‹์ด ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ๊ณต์‹ ๋ฌธ์„œ๋ฅผ ๋‹ค์‹œ ์ •๋…ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ฒฐ์ •์ ์ธ ๋‹จ์„œ๋ฅผ ๋ฐœ๊ฒฌํ–ˆ์Šต๋‹ˆ๋‹ค. LlamaIndex๋Š” ๋‚ด๋ถ€์ ์œผ๋กœ OPENAI_API_KEY๋ผ๋Š” ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ์ž๋™์œผ๋กœ ์ฐพ์•„ ์‚ฌ์šฉํ•˜๋Š”๋ฐ, ์ œ๊ฐ€ .env ํŒŒ์ผ์— ๋ณ€์ˆ˜๋ช…์„ OPEN_AI_API_KEY๋ผ๊ณ  _๋ฅผ ํ•˜๋‚˜ ๋” ๋„ฃ๋Š” ์‚ฌ์†Œํ•œ ์˜คํƒ€๋ฅผ ๋‚ธ ๊ฒƒ์„ ๋ฐœ๊ฒฌํ–ˆ์Šต๋‹ˆ๋‹ค.

์ตœ์ข…์ ์œผ๋กœ .env ํŒŒ์ผ์˜ ๋ณ€์ˆ˜๋ช…์„ OPEN_AI_API_KEY์—์„œ OPENAI_API_KEY๋กœ ์ˆ˜์ •ํ•˜์—ฌ ๊ฐ„๋‹จํžˆ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ฒฝํ—˜์„ ํ†ตํ•ด ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ๋Š” ๊ณต์‹ ๋ฌธ์„œ์—์„œ ๊ถŒ์žฅํ•˜๋Š” ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ๋ช…๋ช… ๊ทœ์น™๊นŒ์ง€ ๊ผผ๊ผผํžˆ ํ™•์ธํ•ด์•ผ ํ•œ๋‹ค๋Š” ๊ธฐ๋ณธ์ ์ธ ๊ตํ›ˆ์„ ์–ป์—ˆ์Šต๋‹ˆ๋‹ค. ์‚ฌ์†Œํ•œ ์‹ค์ˆ˜๊ฐ€ ํ”„๋กœ์ ํŠธ ์ „์ฒด๋ฅผ ๋ง‰์„ ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์ฒด๊ฐํ•œ ์ˆœ๊ฐ„์ด์—ˆ์Šต๋‹ˆ๋‹ค.

โœจ ๋А๋‚€ ์ ๊ณผ ๊ฐœ์„  ํฌ์ธํŠธ (Reflection & Next Step)
๊นจ๋‹ฌ์€ ์ : 'Provider'๋Š” ๋‹จ์ˆœํžˆ ์ฝ”๋“œ ๋ช‡ ์ค„์„ ์ค„์—ฌ์ฃผ๋Š” ํŽธ์˜ ๊ธฐ๋Šฅ์ด ์•„๋‹ˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์†Œํ”„ํŠธ์›จ์–ด ๊ณตํ•™์˜ DIP(์˜์กด๊ด€๊ณ„ ์—ญ์ „ ์›์น™)๊ฐ€ AI ์•„ํ‚คํ…์ฒ˜์— ์–ด๋–ป๊ฒŒ ์ ์šฉ๋˜๋Š”์ง€๋ฅผ ๋ณด์—ฌ์ฃผ๋Š” ํ›Œ๋ฅญํ•œ ์˜ˆ์‹œ์˜€์Šต๋‹ˆ๋‹ค. ์ž˜ ์„ค๊ณ„๋œ ์ถ”์ƒํ™” ๊ณ„์ธต ํ•˜๋‚˜๊ฐ€ ์ „์ฒด ์‹œ์Šคํ…œ์˜ ์ƒ๋ช… ์ฃผ๊ธฐ๋ฅผ ์–ผ๋งˆ๋‚˜ ๊ฑด๊ฐ•ํ•˜๊ฒŒ ๋งŒ๋“œ๋Š”์ง€ ๊นจ๋‹ฌ์•˜์Šต๋‹ˆ๋‹ค.

โœจ ๋А๋‚€ ์ ๊ณผ ๊ฐœ์„  ํฌ์ธํŠธ (Reflection & Next Step)

๊นจ๋‹ฌ์€ ์ : 'Provider'๋Š” ๋‹จ์ˆœํžˆ ์ฝ”๋“œ ๋ช‡ ์ค„์„ ์ค„์—ฌ์ฃผ๋Š” ํŽธ์˜ ๊ธฐ๋Šฅ์ด ์•„๋‹ˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์†Œํ”„ํŠธ์›จ์–ด ๊ณตํ•™์˜ DIP(์˜์กด๊ด€๊ณ„ ์—ญ์ „ ์›์น™)๊ฐ€ AI ์•„ํ‚คํ…์ฒ˜์— ์–ด๋–ป๊ฒŒ ์ ์šฉ๋˜๋Š”์ง€๋ฅผ ๋ณด์—ฌ์ฃผ๋Š” ํ›Œ๋ฅญํ•œ ์˜ˆ์‹œ์˜€์Šต๋‹ˆ๋‹ค. ์ž˜ ์„ค๊ณ„๋œ ์ถ”์ƒํ™” ๊ณ„์ธต ํ•˜๋‚˜๊ฐ€ ์ „์ฒด ์‹œ์Šคํ…œ์˜ ์ƒ๋ช… ์ฃผ๊ธฐ๋ฅผ ์–ผ๋งˆ๋‚˜ ๊ฑด๊ฐ•ํ•˜๊ฒŒ ๋งŒ๋“œ๋Š”์ง€ ๊นจ๋‹ฌ์•˜์Šต๋‹ˆ๋‹ค.

๐Ÿ”ฅ ํ–ฅํ›„ ๊ฐœ์„  ๋ฐฉํ–ฅ

  • Custom Provider ์ œ์ž‘: ํ˜„์žฌ ํ”„๋กœ์ ํŠธ์—์„œ๋Š” ์‚ฌ๋‚ด DB์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์™€์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ ์Šคํ…์œผ๋กœ๋Š” LlamaIndex์˜ BaseReader๋ฅผ ์ƒ์†๋ฐ›์•„ ์ €ํฌ ํŒ€์˜ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ๋งž๋Š” '์ปค์Šคํ…€ ๋ฐ์ดํ„ฐ ๋ฆฌ๋” Provider'๋ฅผ ์ง์ ‘ ๋งŒ๋“ค์–ด๋ณผ ๊ณ„ํš์ž…๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ์–ด๋–ค ๋ฐ์ดํ„ฐ ์†Œ์Šค๋“  RAG ํŒŒ์ดํ”„๋ผ์ธ์— ์œ ์—ฐํ•˜๊ฒŒ ํ†ตํ•ฉํ•˜๋Š” ๊ฒฝํ—˜์„ ์Œ“๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.
  • ๋น„์šฉ ๋ฐ ์„ฑ๋Šฅ ์ตœ์ ํ™”: ๋‹ค์–‘ํ•œ LLM, ์ž„๋ฒ ๋”ฉ ๋ชจ๋ธ Provider๋ฅผ ์‹ค์‹œ๊ฐ„์œผ๋กœ ๊ต์ฒดํ•˜๋ฉฐ ๋น„์šฉ๊ณผ ์„ฑ๋Šฅ ์‚ฌ์ด์˜ ์ตœ์ ์ ์„ ์ฐพ๋Š” ์‹คํ—˜ ํŒŒ์ดํ”„๋ผ์ธ์„ ๊ตฌ์ถ•ํ•˜์—ฌ, ์‹ค์ œ ์„œ๋น„์Šค ์šด์˜ ์‹œ๋‚˜๋ฆฌ์˜ค์— ๋Œ€๋น„ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

์ด ๊ฒฝํ—˜์€ ๋‹จ์ˆœํžˆ RAG ๊ธฐ์ˆ ์„ ์•„๋Š” ๊ฒƒ์„ ๋„˜์–ด, ์–ด๋–ป๊ฒŒ ํ•˜๋ฉด '์ง€์† ๊ฐ€๋Šฅํ•˜๊ณ  ํ™•์žฅ์„ฑ ์žˆ๋Š”' AI ์„œ๋น„์Šค๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์„์ง€์— ๋Œ€ํ•œ ์‹ค๋ฌด์ ์ธ ๊ณ ๋ฏผ์„ ํ•˜๊ฒŒ ๋œ ์ค‘์š”ํ•œ ๋ณ€๊ณก์ ์ด์—ˆ์Šต๋‹ˆ๋‹ค.


๐Ÿ“š ์ฐธ๊ณ  ์ž๋ฃŒ

profile
์ทจ๋ฏธ๋กœ ๊ฒŒ์ž„ํ•˜๋Š”์‚ฌ๋žŒ

0๊ฐœ์˜ ๋Œ“๊ธ€