카테고리 없음

RAG 구현

BangPro 2024. 3. 17. 01:45
728x90

구현

RAG 모델이 Knowledge source에서 정보를 참조하게 하려면 vector db를 구축해야한다. 질문이 들어오면 word embedding을 통해 vector화 한후 vector db의 질문과 비교해야한다. 이때 검색 엔진으로는 elastic search를 사용하고 vector db로는 추후 선택 을 사용한다. 이때 embedding model은 Word2Vec, FastText, BERT 중에서 선택하는데 정확도는 BERT가 가장 정확하지만 그만큼 오래걸리기 때문에 (처음에 문장 벡터화 할때 같은 임베딩 모델을 사용해야한다) 해당 오버헤드를 고려해서 선택해야한다.

문장 벡터화

우선 LLM이 참조할 데이터베이스를 구축해야한다. 이를 위해 BERT를 이용해서 문장들을 벡터화하고 vectorDB를 구축한다. 이때, 한국어에 특화된 BERT 모델들을 사용한다.

한국어 BERT 모델 사용

한국어에 특화된 BERT 모델들은 다음과 같은 것들이 있습니다:

  1. KoBERT: 한국어 자연어 처리를 위해 특별히 사전 학습된 모델입니다. SKT에서 제공하는 KoBERT는 한국어 특성에 맞게 최적화되어 있습니다.
  2. KoELECTRA: ELECTRA 모델을 기반으로 하며, 한국어 데이터로 사전 학습되었습니다. ELECTRA는 BERT와 유사한 구조를 가지고 있지만, 더 효율적인 학습 방법을 사용합니다.
  3. Multilingual BERT: Google에서 제공하는 Multilingual BERT는 100개 이상의 언어로 학습된 모델로, 한국어도 포함되어 있습니다. 이 모델은 여러 언어를 지원하지만, 특정 언어에 특화된 모델보다는 성능이 다소 낮을 수 있습니다.

사용 예시

한국어 BERT 모델을 사용하는 예시는 다음과 같습니다. 여기서는 Hugging Face의 transformers 라이브러리를 이용하여 KoBERT 모델을 불러오고, 한국어 문장의 임베딩을 생성합니다.

pythonCopy code
from transformers import BertModel, BertTokenizer
import torch

# KoBERT 모델과 토크나이저 로드
model_name = 'monologg/kobert'
tokenizer = BertTokenizer.from_pretrained(model_name)
model = BertModel.from_pretrained(model_name)

# 임베딩할 한국어 문장
sentence = "한국어 문장을 임베딩하기 위한 예시입니다."

# 토크나이징과 텐서 변환
inputs = tokenizer(sentence, return_tensors="pt")

# 임베딩 생성
with torch.no_grad():
    outputs = model(**inputs)

# 임베딩 결과
embedding = outputs.last_hidden_state.mean(dim=1).numpy()

주의사항

  • 한국어와 같은 언어는 그 특성상 복잡한 형태소 구조를 가지고 있기 때문에, 언어의 특징을 잘 이해하고 학습된 모델을 사용하는 것이 중요합니다.
  • 특히 한국어는 조사, 어미 변화 등으로 인해 모델의 선택 및 토크나이징 방법에 더욱 신중해야 합니다.
  • 한국어에 최적화된 BERT 모델을 사용할 때는 해당 모델의 문서를 잘 읽고, 올바르게 사용하는 방법을 숙지하는 것이 중요합니다.

검색 엔진

Elastic Search

벡터 데이터베이스를 구축하기 위해서는 벡터 저장 및 검색을 위한 데이터베이스 관리 시스템을 선택하고, 해당 시스템에 문장 임베딩을 저장하고 검색할 수 있는 코드를 작성해야 합니다. 여기서는 Elasticsearch와 함께 Python을 사용하는 예시를 들어 설명하겠습니다.

단계 1: Elasticsearch 설치 및 실행

Elasticsearch는 효율적인 검색 기능과 함께 벡터 데이터를 저장하고 검색할 수 있는 기능을 제공합니다. Elasticsearch를 설치하고 실행하는 단계는 다음과 같습니다:

  1. Elasticsearch 설치: Elasticsearch는 공식 웹사이트(https://www.elastic.co/downloads/elasticsearch)에서 다운로드할 수 있습니다. 설치 지침은 운영 체제에 따라 다릅니다.
  2. Elasticsearch 실행: 설치 후, Elasticsearch 서버를 실행합니다. 기본적으로 **localhost**의 9200 포트에서 실행됩니다.

단계 2: Python 환경 설정

Python에서 Elasticsearch와 상호 작용하기 위해 elasticsearch Python 패키지를 설치해야 합니다.

bashCopy code
pip install elasticsearch

단계 3: Python 코드 예시

이제 Python에서 Elasticsearch에 데이터를 삽입하고 검색하는 예시 코드를 작성합니다.

from elasticsearch import Elasticsearch, helpers
import torch
from transformers import BertTokenizer, BertModel

# Elasticsearch 클라이언트 초기화
es = Elasticsearch()

# BERT 모델 및 토크나이저 초기화
tokenizer = BertTokenizer.from_pretrained('bert-base-uncased')
model = BertModel.from_pretrained('bert-base-uncased')

# 문장을 벡터로 변환하는 함수
def sentence_to_vector(sentence):
    inputs = tokenizer(sentence, return_tensors="pt")
    with torch.no_grad():
        outputs = model(**inputs)
    return outputs.last_hidden_state.mean(dim=1).numpy().tolist()[0]

# 샘플 데이터
documents = [
    "The quick brown fox jumps over the lazy dog",
    "Elasticsearch is a search engine based on Lucene",
    "BERT is a natural language processing model"
]

# Elasticsearch에 데이터 삽입
for i, doc in enumerate(documents):
    es.index(index="my_index", id=i, body={
        "sentence": doc,
        "embedding": sentence_to_vector(doc)
    })

# Elasticsearch에서 문장 검색
def search(query):
    query_vector = sentence_to_vector(query)
    script_query = {
        "script_score": {
            "query": {"match_all": {}},
            "script": {
                "source": "cosineSimilarity(params.query_vector, 'embedding') + 1.0",
                "params": {"query_vector": query_vector}
            }
        }
    }
    response = es.search(index="my_index", body={
        "query": script_query,
        "_source": {"includes": ["sentence"]}
    })
    return [hit["_source"]["sentence"] for hit in response["hits"]["hits"]]

# 검색 쿼리 예시
print(search("natural language processing"))

이 코드는 Elasticsearch에 간단한 문장들을 저장하고, 주어진 쿼리에 대해 가장 유사한 문장을 검색하는 과정을 보여줍니다. sentence_to_vector 함수는 BERT 모델을 사용하여 주어진 문장을 벡터로 변환합니다. 그 후, 이 벡터들이 Elasticsearch에 색인화되고, 검색 쿼리는 Elasticsearch에서 해당 벡터와 유사한 벡터를 가진 문장을 찾습니다.