소개
최첨단 검색 증강 LLM ‘bge-large-en-v1.5’에 대해 궁금하신가요? 이 블로그에서 이 모델을 심층적으로 살펴보세요. 임베딩 모델의 역할과 실제 응용 사례를 알아볼 수 있습니다. 코드로 ‘bge-large-en-v1.5’를 배포하고, 미세 조정하며, LLM API와 완벽하게 통합하는 방법을 안내해 드립니다. 임베딩 모델과 LLM의 교차점에서 새로운 가능성을 열어보세요!
bge-large-en-v1.5란 무엇인가?
간단히 말해, bge-large-en-v1.5는 BAAI가 만든 오픈소스 임베딩 모델입니다.
구체적으로, ‘bge-large-en-v1.5’에서 ‘bge’는 ‘BAAI General Embedding’을 의미합니다. BAAI는 Github에서 ‘FlagEmbedding’으로도 알려져 있으며, AI 연구 및 개발에 전념하는 민간 비영리 조직입니다. BAAI는 검색 증강 대규모 언어 모델(LLM)에 중점을 두고 여러 관련 프로젝트를 시작했습니다. 여기에는 장문 맥락 LLM(Activation Beacon), LM 미세 조정(LM-Cocktail), 밀집 검색(BGE-M3, LLM Embedder, BGE Embedding), 재순위 모델(BGE Reranker), 벤치마킹(C-MTEB) 등이 포함됩니다. bge-large-en-v1.5는 BGE Embedding 모델 시리즈에 속하며, 특히 밀집 검색을 위해 개발되었습니다.

밀집 검색을 위한 임베딩 모델의 역할은 무엇인가요?

밀집 검색을 위한 임베딩 모델은 텍스트 데이터를 입력의 의미와 맥락을 포착하는 밀집된 의미 표현으로 변환합니다. 이러한 밀집 표현은 밀집 검색기(dense retriever)가 관련 정보를 효율적으로 검색하는 데 사용됩니다. 작동 방식과 몇 가지 예는 다음과 같습니다.
텍스트를 밀집 표현으로 변환
임베딩 모델은 문장, 단락 또는 전체 문서를 입력으로 받아 고정 길이 벡터(임베딩)로 변환합니다. 이러한 벡터는 텍스트에 대한 의미 정보를 인코딩하여 단순한 키워드 매칭을 넘어 더 세부적인 이해를 가능하게 합니다.
LLM은 종종 아키텍처의 일부로 임베딩 모델을 통합합니다. 예를 들어 BERT는 트랜스포머 계층을 통해 처리하기 전에 단어와 입력 시퀀스를 표현하기 위해 임베딩 기술을 사용합니다. LLM은 임베딩 모델을 활용하여 의미 관계와 맥락적 뉘앙스를 포착하는 능력을 활용하며, 이는 대화 생성이나 기계 번역과 같은 작업에서 일관되고 맥락에 맞는 응답을 생성하는 데 중요합니다.
밀집 검색기의 역할
밀집 검색기는 이러한 임베딩을 활용하여 검색 작업을 수행합니다. 정확한 키워드 일치나 인덱스에 의존하는 전통적인 희소 검색 방법과 달리, 밀집 검색기는 쿼리 임베딩과 문서 임베딩 간의 유사도 점수를 직접 계산합니다. 이 접근 방식은 짧은 문장에서 긴 문서에 이르기까지 다양한 길이의 텍스트 입력에 대해 더 정확한 검색을 가능하게 합니다.
응용 예시
검색 엔진이나 질문 응답 시스템과 같은 정보 검색 작업에서 이러한 밀집 표현은 관련 문서나 구절을 효율적이고 정확하게 검색할 수 있게 합니다.
예를 들어, "COVID-19의 증상은 무엇인가요?"와 같은 쿼리는 임베딩 벡터로 변환될 수 있습니다. 마찬가지로 COVID-19 증상을 논의하는 문서도 임베딩으로 변환됩니다. 쿼리 임베딩과 문서 임베딩 간의 유사성(코사인 유사도 같은 기법 사용)을 비교함으로써 가장 관련성 높은 문서를 빠르게 식별하고 순위를 매길 수 있습니다.
또 다른 예는 추천 시스템입니다. 이 경우 임베딩은 사용자 선호도와 콘텐츠 유사성을 이해하여 제품, 기사 또는 동영상을 추천하는 데 도움을 줍니다.
전반적으로 밀집 검색을 위한 임베딩 모델은 밀집 검색기와 결합하여 텍스트를 의미 있는 표현으로 변환하고 의미 유사성에 기반한 관련 정보를 효율적으로 검색함으로써 현대 AI 애플리케이션에서 중요한 역할을 합니다.
코드에서 bge-large-en-v1.5를 어떻게 사용하나요?
Langchain과 함께 bge-large-en-v1.5 사용하기
Langchain에서 bge를 다음과 같이 사용할 수 있습니다.
from langchain.embeddings import HuggingFaceBgeEmbeddings
model_name = "BAAI/bge-large-en-v1.5"
model_kwargs = {'device': 'cuda'}
encode_kwargs = {'normalize_embeddings': True} # set True to compute cosine similarity
model = HuggingFaceBgeEmbeddings(
model_name=model_name,
model_kwargs=model_kwargs,
encode_kwargs=encode_kwargs,
query_instruction="Generate a representation for this sentence to be used for retrieving relevant articles:"
)
model.query_instruction = "Generate a representation for this sentence to be used for retrieving relevant articles:"
Huggingface Transformers와 함께 bge-large-en-v1.5 사용하기
transformers 패키지를 사용하면 다음과 같이 모델을 사용할 수 있습니다. 먼저 입력을 트랜스포머 모델에 통과시킨 다음, 첫 번째 토큰(즉, [CLS])의 마지막 은닉 상태를 문장 임베딩으로 선택합니다.
from transformers import AutoTokenizer, AutoModel
import torch
# Sentences we want sentence embeddings for
sentences = ["Sample Data-1", "Sample Data-2"]
# Load model from HuggingFace Hub
tokenizer = AutoTokenizer.from_pretrained('BAAI/bge-large-en-v1.5')
model = AutoModel.from_pretrained('BAAI/bge-large-en-v1.5')
model.eval()
# Tokenize sentences
encoded_input = tokenizer(sentences, padding=True, truncation=True, return_tensors='pt')
# for s2p(short query to long passage) retrieval task, add an instruction to query (not add instruction for passages)
# encoded_input = tokenizer([instruction + q for q in queries], padding=True, truncation=True, return_tensors='pt')
# Compute token embeddings
with torch.no_grad():
model_output = model(**encoded_input)
# Perform pooling. In this case, cls pooling.
sentence_embeddings = model_output[0][:, 0]
# normalize embeddings
sentence_embeddings = torch.nn.functional.normalize(sentence_embeddings, p=2, dim=1)
print("Sentence embeddings:", sentence_embeddings)
bge 모델 사용에 대한 자세한 내용은 Github의 FlagEmbedding을 방문하세요.
bge-large-en-v1.5를 어떻게 미세 조정하나요?
1단계 설치
- pip를 사용하여 설치:
pip install -U FlagEmbedding - 또는 저장소를 클론한 후 해당 디렉토리로 이동하여 소스에서 설치:
pip install . - 개발을 위해 편집 가능 설치 사용:
pip install -e .
2단계 데이터 준비
- 학습 데이터는 각 줄이
query,pos(긍정 텍스트 목록),neg(부정 텍스트 목록)를 포함하는 사전인 JSON 형식이어야 합니다. - 부정 텍스트가 없는 경우 코퍼스에서 무작위로 샘플링할 수 있습니다.
3단계 하드 네거티브 마이닝
- 스크립트를 사용하여 하드 네거티브를 마이닝하면 문장 임베딩 품질을 향상시킬 수 있습니다.
- 다음 명령어를 따라 하드 네거티브를 마이닝할 수 있습니다.
python -m FlagEmbedding.baai_general_embedding.finetune.hn_mine \
--model_name_or_path BAAI/bge-base-en-v1.5 \
--input_file toy_finetune_data.jsonl \
--output_file toy_finetune_data_minedHN.jsonl \
--range_for_sampling 2-200 \
--negative_number 15 \
--use_gpu_for_searching
- 입력 파일: 미세 조정을 위한 데이터가 포함된 JSON 파일로, 스크립트가 쿼리당 상위 k개 문서를 식별한 다음, 이미 제공된 긍정 예제를 제외하고 이 상위 k개 결과에서 무작위로 부정 예제를 선택합니다.
- 출력 파일: 새로 샘플링된 하드 네거티브로 보강된 JSON 파일이 미세 조정 프로세스에 사용되기 위해 저장될 대상 위치입니다.
- 네거티브 수: 수집할 부정 샘플 수를 지정합니다.
- 샘플링 범위: 부정 샘플을 추출할 범위를 정의합니다. 예를 들어 범위가 2–100이면 상위 2~200개 문서에서 부정 샘플을 가져옵니다. 60–300과 같이 범위를 넓히면 더 넓은 문서 세트를 고려하여 부정 샘플 선택이 덜 까다로워집니다.
- 검색 풀: 스크립트가 검색에 사용할 문서를 가져올 소스입니다. 기본적으로 입력 파일의 모든 부정 샘플 집합이며, 사전 학습 데이터와 유사한 형식입니다. 특정 검색 풀이 지정된 경우 스크립트는 이 집합을 대신 사용하여 부정 예제를 찾습니다.
- GPU 기반 검색: 부정 검색 프로세스의 효율성을 향상시키기 위해 GPU 가속 faiss-gpu를 사용할지 여부를 나타내는 옵션입니다.
4단계 학습
torchrun --nproc_per_node {number of gpus} \
-m FlagEmbedding.baai_general_embedding.finetune.run \
--output_dir {path to save model} \
--model_name_or_path BAAI/bge-large-en-v1.5 \
--train_data ./toy_finetune_data.jsonl \
--learning_rate 1e-5 \
--fp16 \
--num_train_epochs 5 \
--per_device_train_batch_size {large batch size; set 1 for toy data} \
--dataloader_drop_last True \
--normlized True \
--temperature 0.02 \
--query_max_len 64 \
--passage_max_len 256 \
--train_group_size 2 \
--negatives_cross_device \
--logging_steps 10 \
--save_steps 1000 \
--query_instruction_for_retrieval ""
- 장치당 학습 배치 크기: 각 학습 배치에서 처리되는 샘플 수입니다. 일반적으로 배치 크기가 증가하면 모델 성능이 향상됩니다. 반정밀도 학습(
--fp16), DeepSpeed 구성(--deepspeed ./df_config.json), 그래디언트 체크포인팅(--gradient_checkpointing)과 같은 옵션을 사용하여 크기를 늘릴 수 있습니다. - 학습 그룹 크기: 학습 중 각 쿼리에 사용되는 긍정 및 부정 예제의 총 수를 결정합니다. 긍정 예제가 하나 보장되므로 이 설정은 부정 예제 수(
train_group_size - 1)를 결정합니다. 이 숫자는 데이터의neg목록에 있는 사용 가능한 부정 예제 수를 초과해서는 안 됩니다. 이러한 그룹 네거티브 외에도 배치 내 다른 부정 예제도 미세 조정 프로세스에 포함됩니다. - 크로스 디바이스 네거티브 공유: 사용 가능한 모든 GPU에 부정 예제를 분산하여 학습에 사용되는 총 네거티브 수를 효과적으로 늘립니다.
- 학습률: 특정 모델에 적합한 값을 선택합니다. 대형, 기본 또는 소형 모델의 경우 1e-5, 2e-5 또는 3e-5 값이 일반적으로 권장됩니다.
- 온도: 유사도 점수 분포의 확산에 영향을 줍니다. 권장 값은 0.01에서 0.1 사이입니다.
- 최대 쿼리 길이: 쿼리 길이의 상한으로, 데이터 세트의 평균 쿼리 길이에 해당해야 합니다.
- 최대 패시지 길이: 패시지 길이의 상한으로, 데이터의 평균 패시지 길이에 따라 설정합니다.
- 검색 쿼리 명령어: 검색 목적으로 각 쿼리에 추가되는 선택적 지시문입니다. 추가 맥락이 필요하지 않은 경우 빈 문자열로 설정하여 비워둘 수 있습니다.
- 인-배치 네거티브 사용: 동일한 배치의 패시지를 학습 중 부정 예제로 간주할지 여부를 나타내는 플래그입니다. 기본값은 활성화(True)입니다.
- 체크포인트 저장 간격: 완료된 학습 단계 수를 기준으로 모델 체크포인트를 저장하는 빈도를 정의합니다.
5단계 모델 로딩
BGE 모델이 미세 조정된 후에는 이 예제에서 보여준 대로 쉽게 로드할 수 있습니다. 미세 조정 단계에서 --query_instruction_for_retrieval 하이퍼파라미터에 고유한 값을 지정한 경우, query_instruction_for_retrieval을 그에 맞게 대체해야 합니다.
6단계 모델 로딩
모델 평가를 위해 FlagEmbedding에서 제공하는 이 스크립트를 실행할 수 있습니다.
미세 조정을 통해 기본 bge 모델을 조정하면 특정 작업에 대한 성능이 향상될 수 있지만, 대상 도메인 외부에서 모델의 전반적인 효과가 현저히 저하될 수도 있습니다(예: c-mteb 작업에서 성능 저하). 해결 방법(LM-Cocktail 사용) 및 미세 조정 프로세스에 대한 자세한 내용은 Github의 "FlagEmbedding/examples/finetune"을 확인하세요.
LLM API와 bge-large-en-v1.5를 어떻게 통합하나요?
임베딩 모델을 LLM과 통합하면 AI의 자연어 처리 기능이 풍부해져 더 정교한 의미 검색, 맥락 이해, 개인화된 상호 작용이 가능해집니다. 이 통합은 콘텐츠 기반 추천, 문서 클러스터링, 이상 탐지, 교차 언어 처리, 지식 그래프 구축과 같은 작업을 향상시키는 데 특히 유용합니다. 또한 고급 텍스트 요약 및 기계 학습 모델의 기능 향상을 지원하여 감정 분석 및 주제 분류에서 더 나은 성능을 제공합니다.
1단계: 환경 설정
먼저 필요한 패키지가 설치된 Python 환경이 있는지 확인합니다.
pip install openai
# Install other necessary packages, e.g., requests, numpy, etc.
2단계: Novita AI API 클라이언트 초기화
Novita AI API 클라이언트를 초기화하는 코드를 이미 제공했습니다. 참고용으로 아래에 제시합니다.
from openai import OpenAI
client = OpenAI(
base_url="https://api.novita.ai/v3/openai",
api_key="<YOUR Novita AI API Key>", # Replace with your actual API key
)
model = "nousresearch/nous-hermes-llama2-13b"
3단계: 임베딩 모델 가져오기
bge-large-en-v1.5 모델에 액세스할 수 있다고 가정하고 로드합니다. Hugging Face 모델인 경우 transformers 라이브러리를 다음과 같이 사용할 수 있습니다.
from transformers import AutoModel, AutoTokenizer
tokenizer = AutoTokenizer.from_pretrained("BAAI/bge-large-en-v1.5")
model = AutoModel.from_pretrained("BAAI/bge-large-en-v1.5")
4단계: 임베딩을 얻는 함수 정의
bge-large-en-v1.5 모델에서 임베딩을 얻는 함수를 만듭니다.
def get_embeddings(text):
inputs = tokenizer(text, return_tensors="pt")
with torch.no_grad():
embeddings = model(**inputs)[0].mean(dim=1)
return embeddings.numpy()
5단계: Novita AI LLM API와 통합
이제 임베딩 모델을 LLM API와 통합하여 API의 응답을 향상시키거나 의미 검색과 같은 작업을 수행합니다.
def enhanced_llm_response(prompt):
# Get initial response from LLM
response = client.completions.create(
model=model,
prompt=prompt,
stream=True,
max_tokens=512,
)
# Process the response (e.g., extract text)
# This is a placeholder for the actual response processing
response_text = next(response)['choices'][0]['text'].content
# Get embeddings for the response
response_embeddings = get_embeddings(response_text)
# Here, you can use the embeddings for various purposes,
# such as semantic search, filtering, etc.
return response_text, response_embeddings
6단계: 향상된 함수 사용
이제 enhanced_llm_response 함수를 사용하여 LLM에서 응답을 받고 임베딩 모델로 처리할 수 있습니다.
prompt = "A chat between a curious user and an artificial intelligence assistant"
response, embeddings = enhanced_llm_response(prompt)
print(response)
# Do something with the embeddings, e.g., store them, search for similar texts, etc.
7단계: 오류 처리 및 로깅
API 한도, 요청 실패 및 기타 잠재적 문제를 관리하기 위해 코드에 오류 처리 및 로깅을 추가합니다.
8단계: 테스트 및 반복
통합을 철저히 테스트하고 결과에 따라 반복합니다. 매개변수를 조정하거나, 더 많은 에지 케이스를 처리하거나, 성능을 최적화해야 할 수 있습니다.
실제 구현 세부 사항은 Novita AI LLM API 및 bge-large-en-v1.5 모델의 특정 기능과 요구 사항에 따라 달라질 수 있습니다. 기술 지원을 위해 Novita AI 팀에 문의하세요: support@novita.ai.
결론
요약하면, ‘bge-large-en-v1.5’에 대한 탐구를 통해 밀집 검색 작업에서의 핵심 역할을 강조하고, 그 기능, 응용 프로그램 및 실제 구현을 심층적으로 살펴보았습니다. 모델 소개 및 임베딩 영역에서의 중요성부터 코드 내 사용 및 미세 조정 프로세스 시연까지 포괄적인 가이드를 제공했습니다. 또한 Novita AI LLM API와의 통합은 모델이 LLM의 의미 이해 및 검색 정확도를 향상시킬 수 있는 잠재력을 보여줍니다.
LLM에 대한 더 많은 업데이트를 기대해 주세요!
자주 묻는 질문
1. BGE Reranker는 어떻게 작동하나요?
Reranker에 쿼리와 패시지를 입력하면 관련성 점수를 얻을 수 있습니다. 이 점수는 시그모이드 함수를 사용하여 [0, 1] 범위의 부동 소수점 값으로 변환할 수 있습니다. 이 프로세스는 상위 순위 결과가 더 관련성이 높고 품질이 우수하도록 하여 전반적인 시스템 성능을 향상시키는 것을 목표로 합니다.
2. BGE의 컨텍스트 길이는 얼마인가요?
최신 모델 bge-m3의 컨텍스트 길이는 8kb입니다.
3. bge m3 임베딩의 크기는 얼마인가요?
최대 8192개의 토큰을 포함하는 짧은 문장부터 긴 문서까지 다양한 길이의 입력을 처리할 수 있습니다.
Novita AI는 AI 야망을 실현하는 올인원 클라우드 플랫폼입니다. 원활하게 통합된 API, 서버리스 컴퓨팅, GPU 가속을 통해 AI 기반 비즈니스를 빠르게 구축하고 확장하는 데 필요한 비용 효율적인 도구를 제공합니다. 인프라 관련 문제를 해결하고 무료로 시작하세요 — Novita AI가 여러분의 AI 꿈을 현실로 만듭니다.
추천 자료
