[컴][머신러닝] E5-large-v2 로 블로그글에 대한 답변 얻기

E5-large-v2 로 블로그글에 대한 답변 얻기

Disclaimer

이글은 필자의 이해를 바탕으로 재작성했다. 틀린 부분이 있을 수 있다.

overview

보통 우리의 검색은 indexing 된 정보를 가져다 준다. 그래서 A라는 키워드를 넣으면, 그에 맞는 값들을 던져준다. 이것을 chatgpt 에게 대신할 수 있다. 다만 chatgpt 는 blog 의 모든 글을 읽고 그것을 재구성해서 우리에게 던져줄 수 있다.

이 e5-large-v2 모델은 질문을 던지면, 가지고 있는 답변 문장중에 가장 근접한 것을 던져준다.

Contrastive Learning

ML(machine learning)방법중 Contrastive Learning(대조적 학습)이 있다. self-supervised learning의 일종이다.

이 학습은 positive pair(양성쌍), negative pair(음성쌍)의 data 를 만들고, 이러한 쌍들을 이용해서 모델을 학습시키는 방법이다.

이 data pair 는 사람이 labeling 해서 줄 수도 있고, AI 가 특정 알고리즘을 이용해서 스스로 할 수 도 있다. 이렇게 얻어진 data 로 model 을 학습하게 되면, 이를 통해 이 model 은 데이터 간의 비슷한점(similarity)과 차이점(difference)을 이해하고 패턴을 학습하게 된다.

E5-large-v2 model

E5-large-v2 model 은 질문(query)과 그에 맞는 답변(passage)를 가지고 학습한 model이다.(query, passage 의 pair) 그래서 질문을 던지는 경우, 그 질문을 embdding 하고, 그 값을 현재 저장된 embedding 에서 similarity 가 높은 것들을 가져온다.

query 에 대한 embedding 을 뽑고, 이것을 저장된 embedding 인 blog-paragraphs 에서 찾아 본다. 그러면 유사한 query 를 찾아낼 수 있다. 그러면 그 query 에 딸려있는 passage 를 결과로 주면 된다.

llm similar blog-paragraphs -c 'query: what is LLM?'

HuggingFace Inference API

https://huggingface.co/intfloat/e5-large-v2 에서 ‘Inference API’ 로 테스트를 해보면 이 모델이 질문을 던질때 어떤 답변을 줄지 확인해 볼 수 있다.

  • Source Sentence 에는 내가 model 에 input 으로 넣고 싶은 값
  • Sentences to compare to 에는 input texts, 즉 내가 model 에게 줄 context

값을 넣으면 된다.

llm

pip install llm
llm install llm-sentence-transformers

자신이 쓰려는 model 을 local 에 설치한다.

llm sentence-transformers register intfloat/e5-large-v2 -a lv2

sentence transformer

embedding들을 위한 python framework 이다. 기술적인 문장(state-of-the-art sentence), 문서, 이미지에 대해 embedding 을 해준다. 원하는 model 을 선택하고, 그 model 을 기준으로 한 embedding 을 얻을 수 있다.

여기서 사용하는 pretrained model 은 HuggingFace 같은 곳에서 serve 하는 model들이다.

SentenceTransformer는 아래 예시를 보면 이해가 될 것이다.

#
# source from : [Usage](https://www.sbert.net/#usage)
#
from sentence_transformers import SentenceTransformer
model = SentenceTransformer('all-MiniLM-L6-v2')

#Our sentences we like to encode
sentences = ['This framework generates embeddings for each input sentence',
    'Sentences are passed as a list of string.',
    'The quick brown fox jumps over the lazy dog.']

#Sentences are encoded by calling model.encode()
embeddings = model.encode(sentences)

#Print the embeddings
for sentence, embedding in zip(sentences, embeddings):
    print("Sentence:", sentence)
    print("Embedding:", embedding)
    print("")

intfloat/e5-large-v2 · Hugging Face

from sentence_transformers import SentenceTransformer
model = SentenceTransformer('intfloat/e5-large-v2')
input_texts = [
    'query: how much protein should a female eat',
    'query: summit define',
    "passage: As a general guideline, the CDC's average requirement of protein for women ages 19 to 70 is 46 grams per day. But, as you can see from this chart, you'll need to increase that if you're expecting or training for a marathon. Check out the chart below to see how much protein you should be eating each day.",
    "passage: Definition of summit for English Language Learners. : 1  the highest point of a mountain : the top of a mountain. : 2  the highest level. : 3  a meeting or series of meetings between the leaders of two or more governments."
]
embeddings = model.encode(input_texts, normalize_embeddings=True)

local 의 model 사용

local 의 model 을 이용하려면 local 에 model 을 다운로드 하고, local path 를 적어주면 된다. (참고: How to load huggingface model/resource from local disk? - Stack Overflow)

huggingface 를 git clone 하면, model file들이 download 된다. 이것을 SentenceTransformer에서 사용하면 된다.

Reference

  1. Embedding paragraphs from my blog with E5-large-v2 | Simon Willison’s TILs

댓글 없음:

댓글 쓰기