오픈소스 LLM으로 RAG 시스템 만드는 방법

  • Post author:
  • Post category:IT
  • Post comments:0 Comments

A modern and sleek thumbnail illustration for a blog post titled '오픈소스 LLM으로 RAG 시스템 만드는 방법'. The image features icons representing large language models, retrieval systems, and data generation, interconnected with nodes and lines. The background has a tech-themed digital grid design in shades of blue and green, symbolizing technology and AI. The overall design is clean and professional, suitable for a tech blog.

오픈소스 LLM으로 RAG 시스템 만드는 방법

 

RAG (Retrieval-Augmented Generation) 시스템은 최신 언어 모델(LLM, Large Language Model)과 검색 기술을 결합하여 질문에 대한 더 정확하고 맥락에 맞는 답변을 제공하는 강력한 도구입니다. 이번 글에서는 오픈소스 LLM과 도구를 사용하여 RAG 시스템을 구축하는 방법을 단계별로 설명하겠습니다.

RAG 시스템 개요

RAG 시스템은 크게 두 가지 구성 요소로 나뉩니다:

  1. 검색(Retrieval): 사용자의 질문에 대한 관련 정보를 외부 데이터 소스에서 검색합니다.
  2. 생성(Generation): 검색된 정보를 바탕으로 언어 모델이 답변을 생성합니다.

필요 도구 및 라이브러리

  1. Hugging Face Transformers: 언어 모델을 위해 사용됩니다.
  2. FAISS: Facebook AI가 개발한 벡터 검색 라이브러리로, 빠른 유사도 검색을 지원합니다.
  3. Elasticsearch: 강력한 검색 엔진으로, 대규모 데이터셋에서의 검색에 사용됩니다.
  4. 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 시스템은 검색과 생성을 결합하여 사용자 질문에 대한 정확하고 맥락에 맞는 답변을 제공할 수 있습니다. 이를 통해 다양한 애플리케이션에서 고성능의 답변 생성 시스템을 구축할 수 있습니다.

답글 남기기