본문 바로가기
  • 컴공생의 공부 일기
  • 공부보단 일기에 가까운 것 같은
  • 블로그
🤖 AI/AI

🔬임베딩 모델로 데이터 의미 압축하기 : 텍스트 임베딩

by 정람지 2025. 1. 17.

LLM을 활용한 실전 AI 애플리케이션 개발

- 허정준


🧭 임베딩 모델로 데이터 의미 압축하기

지금까지 텍스트를 숫자로 표현하려던 다양한 시도들이 있었음..

 

- 원핫 인코딩 : 텍스트를 숫자로 표현하지만 의미를 담지는 못함

- 문장 임베딩 : 문장을 벡터로 표현하는 임베딩

- 하이브리드 검색 : 키워드 검색 + 의미 검색 ( 관련도 높이기)

발전~!~!

 

텍스트를 의미를 담아 더 압축적인 임베딩 벡터를 만드는 방향으로 발전해 옴

 

 

기본적으로 사용할 임베딩 모델 

: OpenAI의 text-embedding-ada-002

젤유명한듯


🗃️ 텍스트 임베딩 이해하기

텍스트 임베딩 / 문장 임베딩

 

임베딩

데이터의 의미를 압축한 숫자 배열

 

컴퓨터는 숫자만 이해할 수 있기 때문에..

 

 

밀집 임베딩 ( dense embedding )


🥞 문장 임베딩 방식의 장점

단어나 문장 사이의 "관계"를 계산할 수 있음

 

from sentence_transformers import SentenceTransformer
from sklearn.metrics.pairwise import cosine_similarity

smodel = SentenceTransformer('snunlp/KR-SBERT-V40K-klueNLI-augSTS')
dense_embeddings = smodel.encode(['학교', '공부', '운동'])
cosine_similarity(dense_embeddings) # 코사인 유사도
# array([[1.0000001 , 0.5950744 , 0.32537547],
#       [0.5950744 , 1.0000002 , 0.54595673],
#       [0.32537547, 0.54595673, 0.99999976]], dtype=float32)

유클리드 함수나 코사인 유사도를 이용해서 거리(관련도) 계산하기

 


🥞 원핫 인코딩 / one-hot encoding

  • "샤인머스켓" → 1
  • "망고스틴" → 2
  • "블루베리" → 3

샤인머스켓이 블루베리보다 더 작아? (?)

 

단어와 단어 사이에 아무런 관계를 표현하지 않고 나타내기

import numpy as np
from sklearn.metrics.pairwise import cosine_similarity

word_dict = {"school": np.array([[1, 0, 0]]),
"study": np.array([[0, 1, 0]]),
"workout": np.array([[0, 0, 1]])
}

# 두 단어 사이의 코사인 유사도 계산하기
cosine_school_study = cosine_similarity(word_dict["school"], word_dict['study']) # 0
cosine_school_workout = cosine_similarity(word_dict['school'], word_dict['workout']) # 0

 

  • "샤인머스켓" → [1, 0, 0]
  • "망고스틴" → [0, 1, 0]
  • "블루베리" → [0, 0, 1]

 

근데 과일끼리의 연관성도 살릴 수 없음..


🥞 백오브워즈 / bag-of words

"비슷한 단어가 많이 나오면 비슷한 문장 또는 문서이다"

=> 해당 단어에 등장한 단어와 그 등장 횟수 집계

 

단어의 빈도를 이용해서 카테고리화

훌륭히 작동..

 

- 하지만 조사 같은 건 어디에서나 많이 나옴

- AI 같은 핫한 키워드는 카테고리를 가리지 않고 많이 나옴

=> 단어의 빈도만으로 해석할 수 없는 문서의 의미 존재 문제


🥞 TF-IDE / term Frequency-Inverse Document Frequency

백오브워즈의 "어느 문서에나 나오는 단어" 문제를 해결

=> 많은 문서에 등장하는 단어의 중요도를 작게 설정

 

TF-IDF(w) = TF(w) : 특정 문서에서 특정 단어 w가 등장한 횟수 * log(N : 전체 문서의 수 / DF(w) :특정 단어 w가 등장한 문서 개수)

위의 텍스트 임베딩 방법은 문서에 등장하는 단어 수만큼 차원이 커지는 단점이 있음

대부분의 값이 0인 벡터들(희소sparse 벡터)이 많음

=> 벡터 사이의 관계를 표현하기 어려움

 

의미를 압축해서 담고 있는 "밀집 임베딩 dense embedding"

 


🥞 워드투백

단어가 함께 등장하는 빈도 정보를 활용해 단어의 의미를 압축하여 임베딩

 

AI는 ML과, 한강은 라면과 함께 많이 등장함

 

인공신경망을 이용해 단어의 의미를 압축하기

: 특정 단어 주변에 있는 단어들을 예측하는 모델을 만들자

 

1) CROW

주변 단어로 가운데 있는 단어를 예측하기

 

2) 스킵그램

가운데 있는 단어로 주변 단어 예측하기

 

=> 단어와 단어 사이에 관계를 계산할 수 있음

=> 관계(거리)에도 의미를 담을 수 있음

 

 

 


 

재미있는 리눅스 명령어 9가지

리눅스 터미널이 지루하다는 통념을 버려라. 리눅스는 재미있는 OS다. 여기 재미있는 리눅스 명령어들을 ...

blog.naver.com

ㅎㅎ.. 터미널에 브랜치 보이게 하려고 커스텀하다가

그만..

rarafire / cowsay 문자열
toliet 문자열 / cmatrix
sl (-eFsh)