-
파이썬으로 RAG 만들기: AI가 진짜 정보를 찾아 답하는 비밀 레시피! 🤖✨AI 활용 사례 2025. 4. 25. 15:15반응형
요즘 AI가 똑똑해졌다고는 하지만, 가끔 “헛소리”를 할 때가 있죠? 😅
이럴 때 등장하는 게 바로 RAG(Retrieval-Augmented Generation)!
오늘은 여러분이 직접 파이썬으로 RAG 시스템을 만들어보고,
실제로 어떻게 동작하는지, 그리고 중간에 막히면 어떻게 해결할 수 있는지
알기 쉽게 설명해드릴게요.
(코딩 초보도 따라할 수 있도록 최대한 쉽게 썼어요! 🐣)RAG란? AI가 진짜 정보를 찾아 답하는 마법! 🧙♂️
RAG는 Retrieval-Augmented Generation의 약자예요.
- Retrieval(검색): AI가 질문을 받으면, 먼저 데이터베이스에서 관련 정보를 찾아와요.
- Augmented(보강): 찾은 정보를 바탕으로,
- Generation(생성): 더 정확하고 신뢰도 높은 답변을 만들어내죠!
이렇게 하면 AI가 ‘지어내는’ 답변(환각, hallucination)도 줄어들어요.
즉, AI가 “아는 척”하지 않고, 진짜 근거를 찾아 답하는 거죠! 🔍RAG 시스템, 어떻게 만들까? 준비물부터 체크! 🛠️
1. 필수 파이썬 라이브러리 설치
pip install transformers faiss-cpu pip install langchain langchain-openai langchain-community pip install beautifulsoup4 python-dotenv
2. API 키 준비 (.env 파일에 저장)
- OpenAI, Pinecone 등 필요한 API 키를 환경변수로 관리해 주세요.
OPENAI_API_KEY=여기에_키_입력 PINECONE_API_KEY=여기에_키_입력 INDEX_NAME=여기에_인덱스_이름
RAG의 핵심 단계! 한눈에 보기 👀
- 문서 수집: 텍스트 파일, 웹페이지 등에서 정보를 가져와요.
- 텍스트 분할: 긴 문서는 AI가 이해하기 쉽게 잘게 나눠요.
- 임베딩 생성: 문서와 질문을 숫자 벡터로 변환해요.
- 벡터 검색: 질문과 가장 비슷한 문서를 찾아요.
- 답변 생성: 찾은 정보를 바탕으로 AI가 답을 만듭니다!
따라해보는 RAG 샘플 코드 🚀
아래 코드는 정말 ‘최소한’의 예시예요.
실제로 돌려보면, AI가 문서를 찾아보고 답을 만들어줍니다!import faiss from transformers import BertTokenizer, BertModel, GPT2LMHeadModel, GPT2Tokenizer import numpy as np # 1. 문서 준비 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." ] # 2. 임베딩 생성 함수 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() # 3. BERT로 임베딩 tokenizer = BertTokenizer.from_pretrained('bert-base-uncased') model = BertModel.from_pretrained('bert-base-uncased') doc_embeddings = get_embeddings(documents, model, tokenizer) # 4. FAISS로 벡터 검색 dimension = doc_embeddings.shape[1] index = faiss.IndexFlatL2(dimension) index.add(doc_embeddings) def search(query, top_k=2): query_embedding = get_embeddings([query], model, tokenizer) D, I = index.search(query_embedding, top_k) return [documents[i] for i in I[0]] # 5. GPT-2로 답변 생성 gpt2_tokenizer = GPT2Tokenizer.from_pretrained('gpt2') gpt2_tokenizer.pad_token = gpt2_tokenizer.eos_token gpt2_model = GPT2LMHeadModel.from_pretrained('gpt2') def generate_answer(query, retrieved_docs): context = " ".join(retrieved_docs) prompt = f"Context: {context}\n\nQuestion: {query}\n\nAnswer:" inputs = gpt2_tokenizer(prompt, return_tensors="pt") output = gpt2_model.generate(inputs.input_ids, max_length=200, num_return_sequences=1, temperature=0.7) return gpt2_tokenizer.decode(output[0], skip_special_tokens=True) # 6. RAG 파이프라인 실행 def rag_pipeline(query): retrieved_docs = search(query) print(f"🔎 검색된 문서: {retrieved_docs}") answer = generate_answer(query, retrieved_docs) return answer # 7. 테스트! query = "What can I see in Paris?" result = rag_pipeline(query) print(f"❓ 질문: {query}") print(f"💡 답변: {result}")
실전에서 만날 수 있는 문제 & 디버깅 꿀팁 🐞
- 검색 결과가 엉뚱하다면?
- 문서 청크 크기를 조절하거나, 임베딩 모델을 바꿔보세요.
- 답변이 이상하다면?
- 프롬프트(질문 방식)를 개선하거나, 더 강력한 LLM을 써보세요.
- 문서가 잘 안 불러와진다면?
- 인코딩 문제, 파일 경로, 문서 형식 등을 꼼꼼히 확인하세요.
LangSmith 같은 툴을 쓰면, 각 단계별로 AI가 무슨 생각을 했는지 추적할 수 있어요!
(코드에os.environ["LANGCHAIN_TRACING_V2"] = "true"
등으로 설정)RAG의 성능을 높이는 비법! 🌟
- 데이터를 잘 정리하세요: 문서가 깔끔할수록 검색도, 답변도 좋아집니다.
- 하이브리드 검색: 키워드+벡터 검색을 같이 쓰면 더 똑똑해져요.
- 청킹 전략: 의미 단위로 문서를 나누면, AI가 더 잘 이해합니다.
마치며: AI와 함께 진짜 정보를 찾아 떠나보자! 🚀
RAG는 단순한 챗봇을 넘어,
“진짜 근거”를 찾아내는 신뢰성 높은 AI를 만드는 핵심 기술이에요.함께 더 똑똑한 AI 세상을 만들어봐요! 😎👍
#RAG #파이썬 #AI #챗봇 #LangChain #OpenAI #벡터DB #LLM
반응형