이 기사에서는 최신 변환기 기반 모델을 결합한 간단하면서도 효과적인 질문 답변 시스템의 구현을 살펴봅니다. 시스템은 답변 생성을 위해 T5(Text-to-Text Transfer Transformer)를 사용하고 의미 유사성 일치를 위해 Sentence Transformer를 사용합니다.
이전 기사에서는 무료 기본 LLM 모델을 사용하여 웹 인터페이스로 간단한 번역 API를 만드는 방법을 설명했습니다. 이번에는 무료 변환기 기반 LLM 모델과 지식 기반을 사용하여 검색 증강 생성(RAG) 시스템을 구축하는 방법을 살펴보겠습니다.
RAG(Retrieval-Augmented Generation)는 두 가지 핵심 구성 요소를 결합한 기술입니다.
검색: 먼저 지식 기반(예: 문서, 데이터베이스 등)을 검색하여 특정 쿼리에 대한 관련 정보를 찾습니다. 여기에는 일반적으로 다음이 포함됩니다.
세대: 그런 다음 언어 모델(예: 코드의 T5)을 사용하여 다음을 통해 응답을 생성합니다.
검색된 정보를 원래 질문과 결합
이 맥락을 기반으로 자연어 응답 생성
코드:
RAG의 장점:
구현은 두 가지 주요 구성요소를 조정하는 SimpleQASystem 클래스로 구성됩니다.
여기에서 최신 버전의 소스 코드를 다운로드할 수 있습니다: https://github.com/alexander-uspenskiy/rag_project
이 가이드는 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 추가"를 확인하세요
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활성화
**핵심 구성요소
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. 질문 처리
사용자가 질문을 제출하면 시스템은 다음 단계를 따릅니다.
임베딩 생성: 질문은 답변에 사용된 것과 동일한 문장 변환기 모델을 사용하여 벡터 표현으로 변환됩니다.
의미 검색: 시스템은 다음을 통해 가장 관련성이 높은 저장된 답변을 찾습니다.
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
답변 생성 과정:
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개로 제한됩니다
사용예
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-small
의 컨텍스트 창에 의해 제한됨
답변 확인 또는 신뢰도 점수를 통해 이점을 얻을 수 있습니다
공연:
이 구현은 의미 체계 검색과 변환기 기반 텍스트 생성의 장점을 결합하여 질문 답변 시스템을 위한 견고한 기반을 제공합니다. 보다 일관되고 안정적인 답변을 얻을 수 있는 더 나은 방법을 찾으려면 모델 매개변수(예: max_length, num_beams, early_stopping, no_repeat_ngram_size 등)를 자유롭게 사용해 보세요. 개선의 여지가 있지만 현재 구현은 복잡성과 기능 간의 적절한 균형을 제공하므로 교육 목적과 중소 규모 애플리케이션에 적합합니다.
즐거운 코딩하세요!
위 내용은 무료 LLM 모델 및 기술 자료를 사용하여 자신만의 RAG를 만드는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!