Retrieval-Augmented Generation(RAG) ๋ชจ๋ธ์ ์ ๋ณด ๊ฒ์๊ณผ ํ ์คํธ ์์ฑ์ ๊ฒฐํฉํ ํ์ ์ ์ธ AI ๊ธฐ์ ์ด๋ค. ์ด๋ฒ ํฌ์คํธ์์๋ Python์ ์ฌ์ฉํ์ฌ ๊ฐ๋จํ RAG ๋ชจ๋ธ์ ๊ตฌํํ๊ณ , ๊ทธ ๋์ ์๋ฆฌ๋ฅผ ์์๋ณด๊ณ ์ ํ๋ค.
RAG ๋ชจ๋ธ์ ๊ธฐ๋ณธ ๊ฐ๋
RAG ๋ชจ๋ธ์ ํฌ๊ฒ ๋ ๊ฐ์ง ์ฃผ์ ๊ตฌ์ฑ ์์๋ก ์ด๋ฃจ์ด์ ธ ์๋ค
๊ฒ์ ๋ชจ๋ธ(Retrieval Model)
์ฌ์ฉ์์ ์ง๋ฌธ์ ๊ธฐ๋ฐํ์ฌ ๊ด๋ จ ์ ๋ณด๋ฅผ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ๊ฒ์ํ๋ค.
์์ฑ ๋ชจ๋ธ(Generation Model)
๊ฒ์๋ ์ ๋ณด๋ฅผ ๋ฐํ์ผ๋ก ๋ต๋ณ์ ์์ฑํ๋ค.
RAG ๋ชจ๋ธ์ ๋์ ์๋ฆฌ
- โ ์ง๋ฌธ ์ ๋ ฅ: ์ฌ์ฉ์๊ฐ ์ง๋ฌธ์ ์ ๋ ฅํ๋ค.
- โก, โข ์ ๋ณด ๊ฒ์: ๊ฒ์ ๋ชจ๋ธ์ด ์ง๋ฌธ๊ณผ ๊ด๋ จ๋ ์ ๋ณด๋ฅผ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ๊ฒ์ํ๋ค.
- โฃ, โค ๋ต๋ณ ์์ฑ: ์์ฑ ๋ชจ๋ธ์ด ๊ฒ์๋ ์ ๋ณด๋ฅผ ๋ฐํ์ผ๋ก ์ง๋ฌธ์ ๋ํ ๋ต๋ณ์ ์์ฑํ๋ค.
RAG ๊ตฌํ
์ด์ Python์ ์ฌ์ฉํ์ฌ ๊ฐ๋จํ RAG ๋ชจ๋ธ์ ๊ตฌํํด๋ณด๋๋ก ํ์
ํ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ค์น
๋จผ์ ํ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ค์นํ๋ค
pip install transformers faiss-cpu
๋ฐ์ดํฐ ์ค๋น
RAG ๋ชจ๋ธ์ ํ ์คํธํ๊ธฐ ์ํด ๊ฐ๋จํ ๋ฌธ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์ค๋นํ๋ค
documents = [ "The capital of France is Paris.", "The Eiffel Tower is located in Paris.", "The Louvre Museum is the world's largest art museum.", "Paris is known for its cafe culture and landmarks." ]
๊ฒ์ ๋ชจ๋ธ ๊ตฌํ
๊ฒ์ ๋ชจ๋ธ์ ์ฌ์ฉ์์ ์ง๋ฌธ๊ณผ ๊ด๋ จ๋ ๋ฌธ์๋ฅผ ๊ฒ์ํ๋ค.
์ฌ๊ธฐ์๋ ๊ฐ๋จํ FAISS ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ์ฌ ๋ฌธ์์ ์๋ฒ ๋ฉ์ ์์ฑํ๊ณ , ์ ์ฌ๋๋ฅผ ๊ณ์ฐํ ์์ ์ด๋ค
import faiss from transformers import BertTokenizer, BertModel import numpy as np # ๋ฌธ์ ์๋ฒ ๋ฉ ์์ฑ ํจ์ def get_embeddings(texts, model, tokenizer): inputs = tokenizer(texts, return_tensors='pt', padding=True, truncation=True) outputs = model(**inputs) embeddings = outputs.last_hidden_state.mean(dim=1) return embeddings.detach().numpy() # BERT ๋ชจ๋ธ๊ณผ ํ ํฌ๋์ด์ ๋ก๋ tokenizer = BertTokenizer.from_pretrained('bert-base-uncased') model = BertModel.from_pretrained('bert-base-uncased') # ๋ฌธ์ ์๋ฒ ๋ฉ ์์ฑ doc_embeddings = get_embeddings(documents, model, tokenizer) # FAISS ์ธ๋ฑ์ค ์์ฑ index = faiss.IndexFlatL2(doc_embeddings.shape[1]) index.add(doc_embeddings) # ๊ฒ์ ํจ์ def search(query, top_k=1): query_embedding = get_embeddings([query], model, tokenizer) D, I = index.search(query_embedding, top_k) return [documents[i] for i in I[0]]
์์ฑ ๋ชจ๋ธ ๊ตฌํ
์์ฑ ๋ชจ๋ธ์ ๊ฒ์๋ ๋ฌธ์๋ฅผ ๋ฐํ์ผ๋ก ์ง๋ฌธ์ ๋ํ ๋ต๋ณ์ ์์ฑํ๋ค.
์ฌ๊ธฐ์๋ GPT-2 ๋ชจ๋ธ์ ์ฌ์ฉํ์ฌ ๋ต๋ณ์ ์์ฑํ๋๋ก ํ ์์ ์ด๋ค.
from transformers import GPT2LMHeadModel, GPT2Tokenizer # GPT-2 ๋ชจ๋ธ๊ณผ ํ ํฌ๋์ด์ ๋ก๋ gpt2_tokenizer = GPT2Tokenizer.from_pretrained('gpt2') gpt2_model = GPT2LMHeadModel.from_pretrained('gpt2') # ๋ต๋ณ ์์ฑ ํจ์ def generate_answer(query, context): input_text = f"Context: {context}\n\nQuestion: {query}\n\nAnswer:" inputs = gpt2_tokenizer.encode(input_text, return_tensors='pt') outputs = gpt2_model.generate(inputs, max_length=100, num_return_sequences=1) return gpt2_tokenizer.decode(outputs[0], skip_special_tokens=True)
RAG ๋ชจ๋ธ ์คํ
์ด์ RAG ๋ชจ๋ธ์ ์คํํ์ฌ ์ง๋ฌธ์ ๋ํ ๋ต๋ณ์ ์์ฑํด ๋ณด์.
# ์ฌ์ฉ์ ์ง๋ฌธ query = "What is the capital of France?" # ๊ด๋ จ ๋ฌธ์ ๊ฒ์ retrieved_docs = search(query, top_k=1) context = retrieved_docs[0] # ๋ต๋ณ ์์ฑ answer = generate_answer(query, context) print(f"Question: {query}") print(f"Answer: {answer}")
๊ฒฐ๊ณผ ์ถ๋ ฅ
Question: What is the capital of France? Answer: The capital of France is Paris.
RAG ๋ชจ๋ธ ๊ตฌํ์ ์กฐ์ฌํด์ผ ํ ์
RAG ๋ชจ๋ธ์ ๊ฒ์ํ ๋ฐ์ดํฐ์ ์ง๊ณผ ๋ฒ์๊ฐ ๊ฒฐ๊ณผ์ ์ ํ์ฑ์ ํฐ ์ํฅ์ ๋ฏธ์น๋ค.
์ด๋ ๊ฒ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์๋ชป๋ ์ ๋ณด๊ฐ ํฌํจ๋์์ ๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ๊ฐ๋ฅ์ฑ์ ๋์ธ๋ค.
๋ฐ์ดํฐ ์ค๋น
์ด๋ฒ์๋ ์๋ชป๋ ์ ๋ณด๋ฅผ ๊ฐ์ง๊ณ ์๋ ๋ฐ์ดํฐ๋ฅผ ์ค๋นํด ๋ณด์.
documents = [ "The capital of France is Seoul.", "The Eiffel Tower is located in Seoul.", "The Louvre Museum is the world's largest art museum.", "Seoul is known for its cafe culture and landmarks." ]
์์ ๊ฐ์ด ํ๋์ค์ ์๋๋ฅผ ์์ธ์ด๋ผ๊ณ ์๋ชป๋ ์ ๋ณด๋ฅผ ๋ฐ์ดํฐ ๋ฒ ์ด์ค๋ฅผ ์
๋ฐ์ดํธ ํ์๋ค.
์ด์ ๋ฐ๋ฅธ ๊ฒฐ๊ณผ๋ฅผ ์ถ๋ ฅํด๋ณด์.
๊ฒฐ๊ณผ ์ถ๋ ฅ
Question: What is the capital of France? Answer: The capital of France is Seoul.
์ถ๋ ฅ๋ ๊ฒฐ๊ณผ๋ฅผ ๋ณด๋ฉด RAG ๋ชจ๋ธ์ด ์๋ชป๋ ์ ๋ณด๋ฅผ ๋ฐํ์ผ๋ก ์๋ชป๋ ๋ต๋ณ์ ์์ฑํ ๊ฒ์ ์ ์ ์๋ค. ๋ฐ๋ผ์, ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ํ์ฑ๊ณผ ์ ๋ขฐ์ฑ์ด ๋งค์ฐ ์ค์ํ๋ค๋ ๊ฒ์ ๋ค์ ํ๋ฒ ํ์ธํ ์ ์๋ค
๊ฒฐ๋ก
์ด ํฌ์คํธ์์๋ Python์ ์ฌ์ฉํ์ฌ ๊ฐ๋จํ Retrieval-Augmented Generation(RAG) ๋ชจ๋ธ์ ๊ตฌํํ๊ณ , ๊ทธ ๋์ ์๋ฆฌ๋ฅผ ์์๋ณด์๋ค.
RAG ๋ชจ๋ธ ๊ตฌํ ์์๋ ๊ฒ์ํ ๋ฐ์ดํฐ์ ์ง๊ณผ ๋ฒ์๋ฅผ ์ฒ ์ ํ ๊ด๋ฆฌํ์ฌ ์ ํ์ฑ์ ๋์ด๋ ๊ฒ์ด ์ค์ํ๋ค. ์๋ชป๋ ์ ๋ณด๊ฐ ํฌํจ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ ์๋ชป๋ ๋ต๋ณ์ ์์ฑํ๊ฒ ๋์ด ์ ๋ขฐ์ฑ์ ๋จ์ด๋จ๋ฆด ์ ์๋ค. ๋ฐ๋ผ์, ์ ๋ขฐํ ์ ์๋ ๋ฐ์ดํฐ ์์ค๋ฅผ ํ๋ณดํ๊ณ , ์ง์์ ์ผ๋ก ์ ๋ฐ์ดํธํ๋ฉฐ ๊ฒ์ฆํ๋ ๊ณผ์ ์ด ํ์ํ๋ค.
RAG ๋ชจ๋ธ์ ๊ณ ๊ฐ ์ง์ ์๋ํ, ์ง์ ๊ธฐ๋ฐ ๋ฌธ์ ์์ฑ, ๊ต์ก ๋ฐ ํ์ต ๋ณด์กฐ ๋ฑ ๋ค์ํ ๋ถ์ผ์์ ํ์ฉ๋ ์ ์์ผ๋ฉฐ, ๋ฐ์ดํฐ ์ฌ์ด์ธ์ค์ ์ธ๊ณต์ง๋ฅ ๋ถ์ผ์์ ์ค์ํ ์ญํ ์ ํ ๊ฒ์ด๋ค. ์์ผ๋ก RAG ๋ชจ๋ธ์ ๋์ฑ ๋ฐ์ ์ํค๊ณ ์์ฉ ๋ถ์ผ๋ฅผ ํ๋ํด ๋๊ฐ๋ฉด์, ๋ณด๋ค ๋ง์ ์ฌ๋๋ค์ด ์ด ๊ธฐ์ ์ ํํ์ ๋๋ฆด ์ ์๊ธฐ๋ฅผ ๊ธฐ๋ํ๋ค.