일단 한국어가 되어야 하고(한국어 대응되는 모델 찾기 쉽지 않음...)
어느 정도 고차원이 지원되는 모델이어야 한다.
jhgan/ko-sbert-sts 너로 결정했다.
URL : https://huggingface.co/jhgan/ko-sbert-sts
dimension : 768
% uv pip install sentence_transformers
% uv pip install faiss-cpu
# GPU 사용중이면
% uv pip install faiss-gpu
from sentence_transformers import SentenceTransformer
import faiss
import numpy as np
from dotenv import load_dotenv
import os
load_dotenv()
hf_token = os.getenv("HUGGINGFACE_API_KEY")
# 1. 한글 문장
texts = [
"나는 사과를 좋아해",
"오늘 날씨가 참 좋다",
"고양이는 귀엽다",
"고양이가 좋아하는 것은 무엇일까?",
"파이썬은 재미있는 언어야",
"자바는 재미없는 언어야",
]
# 2. 임베딩 모델 (한국어 지원되는 모델 사용)
model = SentenceTransformer('jhgan/ko-sbert-sts', token=hf_token)
# 3. 문장을 벡터로 변환
embeddings = model.encode(texts, convert_to_numpy=True)
# 4. FAISS 인덱스 생성 (벡터 차원 = 768)
index = faiss.IndexFlatL2(embeddings.shape[1])
index.add(embeddings)
# 5. 원문과 FAISS 인덱스를 매핑할 리스트
text_store = texts.copy()
# 6. 검색
query = "프로그래밍"
query_vec = model.encode([query], convert_to_numpy=True)
# 7. FAISS로 유사 벡터 찾기
# 상위 2개만 찾는다.
top_k = 2
D, I = index.search(query_vec, top_k)
# 8. 출력
for rank, idx in enumerate(I[0]):
print(f"{rank+1}위: {text_store[idx]}")
이전에 랭체인으로 RAG 구성할 때 잠깐 봤는데 이런식으로 쉽게 구현이 가능하다. 벡터에 대해 좀더 심도있게 파봐야겠다.