> 백엔드 개발 > 파이썬 튜토리얼 > 무료 LLM 모델 및 기술 자료를 사용하여 자신만의 RAG를 만드는 방법

무료 LLM 모델 및 기술 자료를 사용하여 자신만의 RAG를 만드는 방법

DDD
풀어 주다: 2024-12-28 08:49:11
원래의
260명이 탐색했습니다.

이 기사에서는 최신 변환기 기반 모델을 결합한 간단하면서도 효과적인 질문 답변 시스템의 구현을 살펴봅니다. 시스템은 답변 생성을 위해 T5(Text-to-Text Transfer Transformer)를 사용하고 의미 유사성 일치를 위해 Sentence Transformer를 사용합니다.

이전 기사에서는 무료 기본 LLM 모델을 사용하여 웹 인터페이스로 간단한 번역 API를 만드는 방법을 설명했습니다. 이번에는 무료 변환기 기반 LLM 모델과 지식 기반을 사용하여 검색 증강 생성(RAG) 시스템을 구축하는 방법을 살펴보겠습니다.

RAG(Retrieval-Augmented Generation)는 두 가지 핵심 구성 요소를 결합한 기술입니다.

검색: 먼저 지식 기반(예: 문서, 데이터베이스 등)을 검색하여 특정 쿼리에 대한 관련 정보를 찾습니다. 여기에는 일반적으로 다음이 포함됩니다.

  • 텍스트를 임베딩(의미를 나타내는 숫자 벡터)으로 변환
  • 유사성 척도(예: 코사인 유사성)를 사용하여 유사한 콘텐츠 찾기
  • 가장 관련성이 높은 정보 선택

세대: 그런 다음 언어 모델(예: 코드의 T5)을 사용하여 다음을 통해 응답을 생성합니다.

검색된 정보를 원래 질문과 결합

이 맥락을 기반으로 자연어 응답 생성

코드:

  • SentenceTransformer는 임베딩을 생성하여 검색 부분을 처리합니다
  • T5 모델은 답변을 생성하여 세대 부분을 담당합니다

RAG의 장점:

  • 특정 지식을 바탕으로 답변하므로 더욱 정확한 답변
  • 순수 LLM 응답에 비해 환각 감소
  • 최신 정보 또는 도메인별 정보에 액세스하는 기능
  • 순수 세대보다 더 통제 가능하고 투명합니다

시스템 아키텍처 개요

How to Create Your Own RAG with Free LLM Models and a Knowledge Base

구현은 두 가지 주요 구성요소를 조정하는 SimpleQASystem 클래스로 구성됩니다.

  • 문장변환기를 이용한 의미검색 시스템
  • T5를 이용한 답변 생성 시스템

여기에서 최신 버전의 소스 코드를 다운로드할 수 있습니다: https://github.com/alexander-uspenskiy/rag_project

시스템 다이어그램

How to Create Your Own RAG with Free LLM Models and a Knowledge Base

RAG 프로젝트 설정 가이드

이 가이드는 macOS와 Windows 모두에서 RAG(Retrieval-Augmented Generation) 프로젝트를 설정하는 데 도움이 됩니다.

전제 조건

macOS의 경우:

Homebrew 설치(아직 설치하지 않은 경우):
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
Homebrew를 사용하여 Python 3.8 설치
양조 설치 python@3.10
Windows의 경우:
python.org에서 Python 3.8을 다운로드하여 설치하세요
설치 중에 "PATH에 Python 추가"를 확인하세요

프로젝트 설정

1단계: 프로젝트 디렉터리 생성

macOS:

mkdir RAG_project
cd RAG_프로젝트
창:

mkdir RAG_project
cd RAG_프로젝트

2단계: 가상 환경 설정

macOS:

python3 -m venv venv
소스 venv/bin/활성화

Windows:

python -m venv venv
venvScripts활성화

**핵심 구성요소

  1. 초기화**
def __init__(self):
    self.model_name = 't5-small'
    self.tokenizer = T5Tokenizer.from_pretrained(self.model_name)
    self.model = T5ForConditionalGeneration.from_pretrained(self.model_name)
    self.encoder = SentenceTransformer('paraphrase-MiniLM-L6-v2')
로그인 후 복사
로그인 후 복사

시스템은 두 가지 기본 모델로 초기화됩니다.

T5-small: 답변 생성을 위한 T5 모델의 소형 버전
paraphrase-MiniLM-L6-v2: 텍스트를 의미 있는 벡터로 인코딩하기 위한 문장 변환기 모델

2. 데이터세트 준비

def prepare_dataset(self, data: List[Dict[str, str]]):
    self.answers = [item['answer'] for item in data]
    self.answer_embeddings = []
    for answer in self.answers:
        embedding = self.encoder.encode(answer, convert_to_tensor=True)
        self.answer_embeddings.append(embedding)
로그인 후 복사
로그인 후 복사

데이터세트 준비 단계:

  • 입력 데이터에서 답변을 추출합니다
  • 문장 변환기를 사용하여 각 답변에 대한 임베딩을 생성합니다
  • 빠른 검색을 위해 답변과 임베딩을 모두 저장합니다

시스템 작동 방식

1. 질문 처리

사용자가 질문을 제출하면 시스템은 다음 단계를 따릅니다.

임베딩 생성: 질문은 답변에 사용된 것과 동일한 문장 변환기 모델을 사용하여 벡터 표현으로 변환됩니다.

의미 검색: 시스템은 다음을 통해 가장 관련성이 높은 저장된 답변을 찾습니다.

  • 질문 임베딩과 모든 답변 임베딩 간의 코사인 유사성 계산
  • 유사도 점수가 가장 높은 답변 선택 컨텍스트 형성: 선택된 답변은 T5가 최종 응답을 생성하는 컨텍스트가 됩니다.

2. 답변생성

def get_answer(self, question: str) -> str:
    # ... semantic search logic ...
    input_text = f"Given the context, what is the answer to the question: {question} Context: {context}"
    input_ids = self.tokenizer(input_text, max_length=512, truncation=True, 
                             padding='max_length', return_tensors='pt').input_ids
    outputs = self.model.generate(input_ids, max_length=50, num_beams=4, 
                                early_stopping=True, no_repeat_ngram_size=2
로그인 후 복사
로그인 후 복사

답변 생성 과정:

  • 질문과 맥락을 결합하여 T5에 대한 프롬프트로 만듭니다
  • 최대 512개의 토큰 길이로 입력 텍스트를 토큰화합니다
  • 다음 매개변수를 사용하여 빔 검색을 사용하여 답변을 생성합니다.
  • max_length=50: 답변 길이 제한
  • num_beams=4: 4개의 빔으로 빔 검색을 사용합니다
  • early_stopping=True: 모든 빔이 종료 토큰에 도달하면 생성을 중지합니다
  • no_repeat_ngram_size=2: 바이그램 반복 방지

3. 답변 청소

def __init__(self):
    self.model_name = 't5-small'
    self.tokenizer = T5Tokenizer.from_pretrained(self.model_name)
    self.model = T5ForConditionalGeneration.from_pretrained(self.model_name)
    self.encoder = SentenceTransformer('paraphrase-MiniLM-L6-v2')
로그인 후 복사
로그인 후 복사
  • 중복된 ​​연속 단어 제거(대소문자 구분)
  • 답변의 첫 글자를 대문자로 합니다
  • 추가 공백 제거

전체 소스 코드

여기에서 최신 버전의 소스 코드를 다운로드할 수 있습니다: https://github.com/alexander-uspenskiy/rag_project

def prepare_dataset(self, data: List[Dict[str, str]]):
    self.answers = [item['answer'] for item in data]
    self.answer_embeddings = []
    for answer in self.answers:
        embedding = self.encoder.encode(answer, convert_to_tensor=True)
        self.answer_embeddings.append(embedding)
로그인 후 복사
로그인 후 복사

메모리 관리:

시스템은 메모리 문제를 피하기 위해 CPU를 명시적으로 사용합니다
필요한 경우 임베딩이 CPU 텐서로 변환됩니다
입력 길이는 토큰 512개로 제한됩니다

오류 처리:

  • 코드 전체에 걸친 포괄적인 try-제외 블록
  • 디버깅을 위한 의미 있는 오류 메시지
  • 초기화되지 않은 구성 요소에 대한 유효성 검사

사용예

def get_answer(self, question: str) -> str:
    # ... semantic search logic ...
    input_text = f"Given the context, what is the answer to the question: {question} Context: {context}"
    input_ids = self.tokenizer(input_text, max_length=512, truncation=True, 
                             padding='max_length', return_tensors='pt').input_ids
    outputs = self.model.generate(input_ids, max_length=50, num_beams=4, 
                                early_stopping=True, no_repeat_ngram_size=2
로그인 후 복사
로그인 후 복사

터미널에서 실행

How to Create Your Own RAG with Free LLM Models and a Knowledge Base

제한 사항 및 잠재적인 개선 사항

확장성:

현재 구현에서는 모든 임베딩을 메모리에 유지합니다
대규모 응용프로그램을 위한 벡터 데이터베이스로 개선될 수 있습니다

답변 품질:

제공된 답변 데이터세트의 품질에 크게 의존합니다
T5-small
의 컨텍스트 창에 의해 제한됨 답변 확인 또는 신뢰도 점수를 통해 이점을 얻을 수 있습니다

공연:

  • 대규모 애플리케이션의 경우 CPU만 사용하면 속도가 느려질 수 있습니다
  • 일괄 처리로 최적화 가능
  • 자주 묻는 질문에 대한 캐싱 구현 가능

결론

이 구현은 의미 체계 검색과 변환기 기반 텍스트 생성의 장점을 결합하여 질문 답변 시스템을 위한 견고한 기반을 제공합니다. 보다 일관되고 안정적인 답변을 얻을 수 있는 더 나은 방법을 찾으려면 모델 매개변수(예: max_length, num_beams, early_stopping, no_repeat_ngram_size 등)를 자유롭게 사용해 보세요. 개선의 여지가 있지만 현재 구현은 복잡성과 기능 간의 적절한 균형을 제공하므로 교육 목적과 중소 규모 애플리케이션에 적합합니다.

즐거운 코딩하세요!

위 내용은 무료 LLM 모델 및 기술 자료를 사용하여 자신만의 RAG를 만드는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:dev.to
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿