[AI] FAISS 에 임의의 데이터를 넣고 검색 해보자.

늘 공부하는 괴짜·2025년 6월 18일
1

AI : Langchain (RAG)

목록 보기
32/38

1. 임베딩 모델 선정

일단 한국어가 되어야 하고(한국어 대응되는 모델 찾기 쉽지 않음...)
어느 정도 고차원이 지원되는 모델이어야 한다.

jhgan/ko-sbert-sts 너로 결정했다.

URL : https://huggingface.co/jhgan/ko-sbert-sts
dimension : 768

2. 필요 패키지 설치

% uv pip install sentence_transformers
% uv pip install faiss-cpu

# GPU 사용중이면
% uv pip install faiss-gpu 

3. 구현

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]}")

3-1. 검색어 : 프로그래밍

3-2. 검색어 : 동물

3-3. 검색어 : 과일

Finally

이전에 랭체인으로 RAG 구성할 때 잠깐 봤는데 이런식으로 쉽게 구현이 가능하다. 벡터에 대해 좀더 심도있게 파봐야겠다.

profile
인공지능이라는 옷을 입었습니다. 뭔가 멋지면서도 잘 맞습니다.

0개의 댓글