[Python ์˜ˆ์ œ ์ฝ”๋“œ] Retrieval-Augmented Generation(RAG)์˜ ๋‹จ๊ณ„๋ณ„ ์ฝ”๋“œ ๊ตฌํ˜„ ๊ฐ€์ด๋“œ์™€ ๋ฐ์ดํ„ฐ์˜ ์ค‘์š”์„ฑ

Posted by

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 ๋ชจ๋ธ์„ ๋”์šฑ ๋ฐœ์ „์‹œํ‚ค๊ณ  ์‘์šฉ ๋ถ„์•ผ๋ฅผ ํ™•๋Œ€ํ•ด ๋‚˜๊ฐ€๋ฉด์„œ, ๋ณด๋‹ค ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์ด ์ด ๊ธฐ์ˆ ์˜ ํ˜œํƒ์„ ๋ˆ„๋ฆด ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ๊ธฐ๋Œ€ํ•œ๋‹ค.

Leave a Reply

์ด๋ฉ”์ผ ์ฃผ์†Œ๋Š” ๊ณต๊ฐœ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ•„์ˆ˜ ํ•„๋“œ๋Š” *๋กœ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค