Retrieval-Text Embeddings는 텍스트를 숫자로 변환하여 문장 간의 유사성을 비교할 수 있도록 합니다.
대부분의 경우 대용량의 말뭉치를 통해 사전학습된 모델을 통해 쉽게 임베딩합니다.
사전학습 임베딩 모델에는 대표적으로 OpenAI에서 제공하는 ada모델과, HuggingFace의 모델들이 있습니다. 사용목적과 요구사항에 따라 적절한 임베딩을 고르는 것은 RAG의 가장 중요한 부분입니다.
실습
OpenAIEmbeddings - ada-002
from langchain.embeddings import OpenAIEmbeddings
embeddings_model = OpenAIEmbeddings(openai_api_key=)
embeddings = embeddings_model.embed_documents(
[
"안녕하세요",
"제 이름은 홍길동입니다.",
"이름이 무엇인가요?",
"랭체인은 유용합니다.",
"Hello World!"
]
)
len(embeddings), len(embeddings[0])
embedded_query_q = embeddings_model.embed_query("이 대화에서 언급된 이름은 무엇입니까?")
embedded_query_a = embeddings_model.embed_query("이 대화에서 언급된 이름은 홍길동입니다.")
print(len(embedded_query_q), len(embedded_query_a))
from numpy import dot
from numpy.linalg import norm
import numpy as np
def cos_sim(A, B):
return dot(A, B)/(norm(A)*norm(B))
print(cos_sim(embedded_query_q, embedded_query_a))
print(cos_sim(embedded_query_q, embeddings[1]))
print(cos_sim(embedded_query_q, embeddings[3]))
"""
0.9014128168326816
0.8500134046737886
0.7753276243070567
"""
Huggingface Embedding
# !pip install sentence_transformers
from langchain.embeddings import HuggingFaceBgeEmbeddings
model_name = "BAAI/bge-small-en"
model_kwargs = {'device': 'cpu'}
encode_kwargs = {'normalize_embeddings': True}
hf = HuggingFaceBgeEmbeddings(
model_name=model_name,
model_kwargs=model_kwargs,
encode_kwargs=encode_kwargs
)
embeddings = hf.embed_documents(
[
"today is monday",
"weather is nice today",
"what's the problem?",
"langhcain in useful",
"Hello World!",
"my name is morris"
]
)
BGE_query_q = hf.embed_query("Hello? who is this?")
BGE_query_a = hf.embed_query("hi this is harrison")
print(cos_sim(BGE_query_q, BGE_query_a))
print(cos_sim(BGE_query_q, embeddings[1]))
print(cos_sim(BGE_query_q, embeddings[5]))
"""
0.8522539963959582
0.7469068258795019
0.792870413704442
"""
한국어 사전학습 모델 임베딩 - ko-sbert-nli
from langchain.embeddings import HuggingFaceEmbeddings
model_name = "jhgan/ko-sbert-nli"
model_kwargs = {'device': 'cpu'}
encode_kwargs = {'normalize_embeddings': True}
ko = HuggingFaceEmbeddings(
model_name=model_name,
model_kwargs=model_kwargs,
encode_kwargs=encode_kwargs
)
sentences = [
"안녕하세요",
"제 이름은 홍길동입니다.",
"이름이 무엇인가요?",
"랭체인은 유용합니다.",
"홍길동 아버지의 이름은 홍상직입니다."
]
ko_embeddings = ko.embed_documents(sentences)
q = "홍길동은 아버지를 아버지라 부르지 못하였습니다. 홍길동 아버지의 이름은 무엇입니까?"
a = "홍길동의 아버지는 엄했습니다."
ko_query_q = ko.embed_query(q)
ko_query_a = ko.embed_query(a)
print("질문: {} \\n".format(q), "-"*100)
print("{} \\t\\t 문장 유사도: ".format(a), round(cos_sim(ko_query_q, ko_query_a),2))
print("{}\\t\\t\\t 문장 유사도: ".format(sentences[1]), round(cos_sim(ko_query_q, ko_embeddings[1]),2))
print("{}\\t\\t\\t 문장 유사도: ".format(sentences[3]), round(cos_sim(ko_query_q, ko_embeddings[3]),2))
print("{}\\t 문장 유사도: ".format(sentences[4]), round(cos_sim(ko_query_q, ko_embeddings[4]),2))
"""
질문: 홍길동은 아버지를 아버지라 부르지 못하였습니다. 홍길동 아버지의 이름은 무엇입니까?
----------------------------------------------------------------------------------------------------
홍길동의 아버지는 엄했습니다. 문장 유사도: 0.47
제 이름은 홍길동입니다. 문장 유사도: 0.54
랭체인은 유용합니다. 문장 유사도: 0.03
홍길동 아버지의 이름은 홍상직입니다. 문장 유사도: 0.61
"""
'LLM > LLM 공부' 카테고리의 다른 글
Retriever (0) | 2025.03.07 |
---|---|
Retrieval - Vectorstores (0) | 2025.03.07 |
Retrieval - Text Splitters (0) | 2025.03.07 |
Retrieval - Document Loaders (0) | 2025.03.07 |
PromptTemplate에 대해 (0) | 2025.03.07 |