AI 또는 풀스택 개발에 어려움을 겪고 계신가요? 맞춤형 조언, 기술 통합 등 유니티 전문가가 도와드리겠습니다. 다음 연락처로 문의하세요. [email protected].

RAG 애플리케이션을 위한 문장 변환기로 시맨틱 검색 모델 만들기

자체 시맨틱 검색 모델을 미세 조정하여 검색 증강 생성(RAG) 파이프라인을 구현하는 것은 질문 답변 시스템의 정확성과 관련성을 향상시키는 강력한 접근 방식입니다.

이 기술은 시맨틱 검색과 생성 AI의 강점을 결합하여 시스템이 사용자 질문을 더 잘 이해하고 보다 정확하고 맥락에 맞는 답변을 생성할 수 있게 해줍니다. 개발자는 문장 트랜스포머를 사용하여 시맨틱 검색 모델을 미세 조정함으로써 특정 도메인에 맞게 모델을 조정하여 RAG 파이프라인의 전반적인 성능을 향상시킬 수 있습니다.

시맨틱 검색

시맨틱 검색이란 무엇인가요?

시맨틱 검색은 기존의 키워드 기반 검색 방식을 뛰어넘는 데이터 검색 기법입니다. 자연어 처리 및 머신 러닝 알고리즘을 사용하여 검색자의 의도와 쿼리에 사용된 용어의 문맥적 의미를 고려하여 검색 결과의 정확도를 높입니다. 이 접근 방식은 단순히 키워드를 일치시키는 것이 아니라 검색 쿼리의 근본적인 의미와 웹 페이지의 콘텐츠를 이해하는 것을 목표로 합니다. 이를 통해 시맨틱 검색은 원래 쿼리에 사용된 정확한 단어가 포함되어 있지 않더라도 보다 관련성 높은 결과를 제공할 수 있습니다.

이를 위해 시맨틱 검색은 단어 의미의 모호성 해소, 개념 추출, 쿼리 확장 등 다양한 기법을 사용합니다. 또한 벡터 검색과 머신 러닝을 활용하여 사용자의 의도와 문맥에 맞는 결과를 반환합니다. 시맨틱 검색은 Google과 같은 웹 검색 엔진에서 널리 사용되며, 개체와 개체 간의 관계에 대한 구조화된 데이터를 저장하는 지식 그래프와 같은 기술을 기반으로 합니다. 이를 통해 검색 엔진은 검색 쿼리의 의미를 이해하고 보다 정확하고 의미 있는 결과를 제공할 수 있습니다.

시맨틱 검색은 기술 문서, 계약서, 제품 설명과 같은 자체 도메인 지식에 대한 질문에 답하고자 하는 기업에게 매우 유용합니다....

검색 증강 생성(RAG)이란 무엇인가요?

시맨틱 검색

검색 증강 생성(RAG)은 보다 맥락적으로 정확한 최신 정보를 제공하기 위해 외부 데이터 소스를 통합하여 대규모 언어 모델(LLM)과 같은 생성 AI 모델의 정확성과 신뢰성을 향상시키는 기술입니다. 검색 구성 요소를 생성 모델과 통합하여 시스템이 데이터베이스나 지식 기반에서 관련 정보를 검색하고 가져와 응답을 생성할 때 내부 지식을 보완할 수 있도록 합니다.

이 접근 방식은 AI 모델이 가장 최신의 신뢰할 수 있는 사실에 기반하여 답변을 제공할 수 있도록 보장하고 사용자가 모델의 답변에 사용된 정보의 출처를 확인할 수 있도록 합니다. RAG는 외부 지식 소스를 기반으로 AI 모델을 구축하여 결과의 품질을 개선하고 대규모 재교육 없이도 모델을 업데이트할 수 있는 방법을 제공합니다.

RAG는 생성형 AI 모델에서 발생할 수 있는 잠재적 착각을 완화하는 훌륭한 전략입니다. RAG는 사실에 기반한 정확성과 자연어로 생성된 인간의 응답이라는 두 가지 장점을 모두 갖춘 질문 답변 시스템을 구축하는 데 도움이 됩니다.

문장 트랜스포머 라이브러리란 무엇인가요?

문장 변환기

문장 트랜스포머 라이브러리는 최첨단 텍스트 임베딩을 위해 설계된 강력한 Python 프레임워크입니다. BERT, RoBERTa, XLM-R 등과 같은 트랜스포머 신경망을 기반으로 구축되어 의미 검색, 의역 마이닝, 의미 유사도 비교, 클러스터링 등 다양한 작업에서 최고의 성능을 발휘합니다. 이 라이브러리를 사용하면 문장 임베딩 방법을 쉽게 미세 조정할 수 있어 특정 요구에 맞는 작업별 문장 임베딩을 생성할 수 있습니다. 문장 트랜스포머 웹사이트에서 자세히 알아보기

라이브러리에서는 50개 이상의 언어에 대해 사전 학습된 다양한 문장 트랜스포머 모델을 허깅 페이스 플랫폼에서 사용할 수 있습니다. 또한 사용자는 라이브러리를 사용하여 자체 모델을 훈련하거나 미세 조정할 수 있으므로 고유한 사용 사례에 맞는 맞춤형 모델을 만들 수 있는 유연성을 제공합니다. 센텐스 트랜스포머 팀은 최근 이 라이브러리의 기능, 특히 미세 조정 기능을 대폭 개선한 새로운 주요 버전(v3)을 출시했습니다.

문장 트랜스포머 라이브러리는 빠르고 포괄적이며 유지 관리가 잘 되어 있기 때문에 이 튜토리얼에서 이 라이브러리를 사용하고 있습니다.

나만의 시맨틱 검색 모델 만들기

자신만의 시맨틱 검색 모델을 만드는 것은 매우 짧은 지연 시간을 보장하면서 정확한 결과를 얻을 수 있는 좋은 방법입니다. GPU에 자체 시맨틱 검색 모델을 배포하는 경우에는 더욱 그렇습니다.

먼저, 데이터가 포함된 작은 데이터 집합을 만들어 보겠습니다. HP 프린터에 대한 다음 기술 문서가 포함된 1열 CSV 파일("dataset.csv")을 만듭니다(실제 시나리오에서는 물론 더 많은 예제를 포함해야 할 것입니다):

"HP® LaserJets have unmatched printing speed, performance and reliability that you can trust. Enjoy Low Prices and Free Shipping when you buy now online."
"Every HP LaserJet comes with a one-year HP commercial warranty (or HP Limited Warranty)."
"HP LaserJet ; Lowest cost per page on mono laser printing. · $319.99 ; Wireless options available. · $109.00 ; Essential management features. · $209.00."

각 행에는 최대 512개의 토큰(대략 400단어에 해당)을 포함할 수 있으며, 정확도를 극대화하려면 128개의 토큰(대략 100단어에 해당) 이하로 유지하는 것이 좋습니다. 이제 데이터 세트에 3개의 문서가 생겼으므로 Sentence Transformers로 모델을 사용하여 데이터를 인코딩할 수 있습니다. 다음을 사용하여 Python 스크립트를 만듭니다(PyTorch와 Sentence Transformers가 설치되어 있는지 확인).

from sentence_transformers import SentenceTransformer
import csv
import torch

model_name = 'paraphrase-multilingual-mpnet-base-v2'
encoded_model_path = 'semantic_search_model.pt'
dataset_path = 'dataset.csv'

bi_encoder = SentenceTransformer(model_name)

passages = []
with open(dataset_path) as csv_file:
    csv_reader = csv.reader(csv_file)
    for row in csv_reader:
        passages.append(row[0])
        
corpus_embeddings = bi_encoder.encode(
    passages, batch_size=32, convert_to_tensor=True, show_progress_bar=True)

torch.save(corpus_embeddings, encoded_model_path)

이 스크립트는 paraphrase-multilingual-mpnet-base-v2를 다운로드하여 기본 모델로 사용하고 이를 사용하여 데이터를 인코딩합니다. 요구 사항(모델 크기, 사용 사례, 지원 언어 등)에 따라 사용 가능한 여러 사전 학습된 모델 중에서 선택할 수 있습니다. 하드웨어에 따라 인코딩 프로세스 속도를 높이기 위해 "batch_size" 매개변수를 조정할 수 있습니다.

모델을 생성한 후에는 다음 Python 스크립트를 사용하여 추론에 사용할 수 있습니다:

import csv
from sentence_transformers import SentenceTransformer, util
import torch

bi_encoder = SentenceTransformer('paraphrase-multilingual-mpnet-base-v2')
semantic_search_model = torch.load('semantic_search_model.pt')

passages = []
with open('app/custom_model/dataset.csv') as csv_file:
    csv_reader = csv.reader(csv_file)
    for row in csv_reader:
        passages.append(row[0])

question_embedding = bi_encoder.encode(
    "How long is the warranty on the HP Color LaserJet Pro?", convert_to_tensor=True)
hits = util.semantic_search(
    question_embedding, semantic_search_model, top_k=3)
hits = hits[0]

result = {"search_results": [
    {"score": hit['score'], "text": passages[hit['corpus_id']]} for hit in hits]}

위의 추론 스크립트는 다음과 같은 결과를 반환합니다:

{
"search_results": [
    {
        "score": 0.99,
        "text": "Every HP LaserJet comes with a one-year HP commercial warranty (or HP Limited Warranty)."
    },
    {
        "score": 0.74,
        "text": "All consumer PCs and printers come with a standard one-year warranty. Care packs provide an enhanced level of support and/or an extended period of coverage for your HP hardware. All commercial PCs and printers come with either a one-year or three-year warranty."
    },
    {
        "score": 0.68,
        "text": "In-warranty plan · Available in 2-, 3-, or 4-year extension plans · Includes remote problem diagnosis support and Next Business Day Exchange Service."
    },
    ]
}

추론 스크립트에서 "top_k" 매개변수는 반환할 결과의 수를 결정합니다. 결과에는 데이터 세트에서 일치하는 텍스트가 신뢰도 점수와 함께 표시됩니다. 이 점수는 응답을 수락할지 여부를 결정하는 데 도움이 되므로 중요합니다.

생성적 AI로 자연어로 응답 생성하기

보시다시피, 시맨틱 검색의 가장 큰 한계는 모델이 질문에 직접 답하지 않고 데이터 세트의 원시 텍스트를 반환한다는 것입니다. 따라서 이제 자연어로 초기 질문에 답하기 위해 이를 생성형 AI 모델에 컨텍스트로 제공하고자 합니다.

OpenAI의 GPT-4나 NLP Cloud의 LLaMA 3 및 ChatDolphin과 같은 고급 LLM을 활용하면 이를 쉽게 달성할 수 있습니다. 시맨틱 검색 모델에서 가장 좋은 결과를 유지하여 이를 컨텍스트로 LLM에 전달하거나 여러 결과를 유지하도록 결정할 수 있습니다. 다음은 최상의 결과만 사용하는 프롬프트 예제입니다:

Context: Every HP LaserJet comes with a one-year HP commercial warranty (or HP Limited Warranty).
Based on the above context, answer the following question: How long is the warranty on the HP Color LaserJet Pro?

이 요청은 이와 같은 내용을 반환합니다:

The warranty on the HP Color LasertJet Pro lasts at least 1 year.

인코딩된 데이터를 사용한 시맨틱 검색 모델과 벡터 데이터베이스에 임베딩 저장하기

검색 증강 생성(RAG) 시스템에서 로컬 인코딩 데이터로 시맨틱 검색 모델을 만들거나 벡터 데이터베이스를 사용하는 것은 두 가지 흥미로운 옵션입니다.

자체 데이터를 인코딩할 때는 데이터를 텐서로 변환한 다음 GPU에 데이터를 로드합니다. 반면에 벡터 데이터베이스는 이러한 고차원 벡터를 효율적으로 저장, 인덱싱 및 쿼리하도록 설계된 특수 데이터베이스입니다.

매우 짧은 지연 시간을 달성하고자 하는 비즈니스의 경우, 계산 시간을 개선하기 위해 자체 데이터를 인코딩하고 GPU에 데이터를 로드하는 것이 좋습니다. 하지만 데이터 세트가 변경될 때마다 데이터를 다시 인코딩해야 하므로 유연성이 저하될 수 있습니다. 기본 데이터가 매우 자주 변경되는 경우 임베딩을 추출하여 벡터 데이터베이스(예: PG Vector)에 점진적으로 저장하는 것이 더 간단할 수 있습니다.

결론

검색 증강 생성은 기술 문서, 계약서 등과 같은 특정 데이터에 대한 질문에 답하고자 하는 비즈니스에서 결과의 정확성을 크게 높여주기 때문에 매우 중요합니다. 예를 들어 RAG는 지원 챗봇의 핵심 구성 요소입니다.

센텐스 트랜스포머는 자체 데이터를 기반으로 자신만의 시맨틱 검색 모델을 만드는 데 사용할 수 있는 훌륭한 라이브러리입니다. 이러한 모델을 GPU에 배포하고 고급 생성 AI 모델과 결합하면 매우 강력한 성능을 발휘합니다.

문장 변환기를 기반으로 하는 시맨틱 검색 모델을 직접 만들고 배포하는 데 관심이 없다면, NLP Cloud에서 클릭 한 번으로 쉽게 할 수 있습니다. 지금 NLP Cloud에서 시맨틱 검색을 사용해 보세요!

RAG, 시맨틱 검색, 문장 변환기에 대해 궁금한 점이 있으시면 언제든지 문의해 주세요!

Julien
NLP 클라우드의 CTO