오픈소스 LLM으로 RAG 시스템 만드는 방법
RAG (Retrieval-Augmented Generation) 시스템은 최신 언어 모델(LLM, Large Language Model)과 검색 기술을 결합하여 질문에 대한 더 정확하고 맥락에 맞는 답변을 제공하는 강력한 도구입니다. 이번 글에서는 오픈소스 LLM과 도구를 사용하여 RAG 시스템을 구축하는 방법을 단계별로 설명하겠습니다.
RAG 시스템 개요
RAG 시스템은 크게 두 가지 구성 요소로 나뉩니다:
- 검색(Retrieval): 사용자의 질문에 대한 관련 정보를 외부 데이터 소스에서 검색합니다.
- 생성(Generation): 검색된 정보를 바탕으로 언어 모델이 답변을 생성합니다.
필요 도구 및 라이브러리
- Hugging Face Transformers: 언어 모델을 위해 사용됩니다.
- FAISS: Facebook AI가 개발한 벡터 검색 라이브러리로, 빠른 유사도 검색을 지원합니다.
- Elasticsearch: 강력한 검색 엔진으로, 대규모 데이터셋에서의 검색에 사용됩니다.
- PyTorch 또는 TensorFlow: 언어 모델 훈련 및 추론을 위해 사용됩니다.
단계별 구현 방법
1단계: 환경 설정
필요한 라이브러리를 설치합니다:
pip install transformers faiss-cpu elasticsearch torch
2단계: 데이터 준비
먼저, 검색할 데이터셋을 준비합니다. 예를 들어, 위키피디아 문서나 자체 문서들을 사용할 수 있습니다.
from transformers import AutoTokenizer, AutoModel # LLM과 토크나이저 로드 tokenizer = AutoTokenizer.from_pretrained("bert-base-uncased") model = AutoModel.from_pretrained("bert-base-uncased") # 예시 데이터셋 documents = [ "Machine learning is a field of artificial intelligence.", "Natural language processing enables computers to understand human language.", # 더 많은 문서 추가... ] # 문서 임베딩 생성 embeddings = [] for doc in documents: inputs = tokenizer(doc, return_tensors="pt") outputs = model(**inputs) embeddings.append(outputs.last_hidden_state.mean(dim=1).squeeze().detach().numpy()) import faiss # FAISS 인덱스 생성 및 문서 추가 index = faiss.IndexFlatL2(768) # 벡터 차원 수 index.add(np.array(embeddings)) # Elasticsearch 설정 및 데이터 인덱싱 from elasticsearch import Elasticsearch from elasticsearch.helpers import bulk es = Elasticsearch() def create_index(index_name): if es.indices.exists(index=index_name): es.indices.delete(index=index_name) es.indices.create(index=index_name) def index_documents(index_name, docs): bulk(es, [{"_index": index_name, "_source": doc} for doc in docs]) index_name = "documents" create_index(index_name) index_documents(index_name, documents)
3단계: 검색(Retrieval) 구현
사용자의 질문에 대한 관련 문서를 검색합니다.
def retrieve(query, top_k=5): inputs = tokenizer(query, return_tensors="pt") outputs = model(**inputs) query_embedding = outputs.last_hidden_state.mean(dim=1).squeeze().detach().numpy() distances, indices = index.search(np.array([query_embedding]), top_k) return [documents[i] for i in indices[0]] # Elasticsearch 검색 예시 def es_retrieve(query, top_k=5): response = es.search( index=index_name, body={ "query": { "match": { "content": query } }, "size": top_k } ) return [hit["_source"] for hit in response["hits"]["hits"]] query = "What is machine learning?" retrieved_docs = retrieve(query) # 또는 Elasticsearch 사용 # retrieved_docs = es_retrieve(query) print(retrieved_docs)
4단계: 생성(Generation) 구현
검색된 문서를 바탕으로 답변을 생성합니다.
def retrieve(query, top_k=5): inputs = tokenizer(query, return_tensors="pt") outputs = model(**inputs) query_embedding = outputs.last_hidden_state.mean(dim=1).squeeze().detach().numpy() distances, indices = index.search(np.array([query_embedding]), top_k) return [documents[i] for i in indices[0]] # Elasticsearch 검색 예시 def es_retrieve(query, top_k=5): response = es.search( index=index_name, body={ "query": { "match": { "content": query } }, "size": top_k } ) return [hit["_source"] for hit in response["hits"]["hits"]] query = "What is machine learning?" retrieved_docs = retrieve(query) # 또는 Elasticsearch 사용 # retrieved_docs = es_retrieve(query) print(retrieved_docs)
이 글에서는 오픈소스 LLM과 도구를 사용하여 RAG 시스템을 구축하는 방법을 단계별로 설명했습니다. RAG 시스템은 검색과 생성을 결합하여 사용자 질문에 대한 정확하고 맥락에 맞는 답변을 제공할 수 있습니다. 이를 통해 다양한 애플리케이션에서 고성능의 답변 생성 시스템을 구축할 수 있습니다.