콘텐츠로 이동

FAISS 사용하기

RAG를 위한 FAISS 활용절차

  • 1) 문서를 불러온다.
  • 2) 문장을 나눈다.
  • 3) 임베딩 모델로 문장을 벡터화한다 (SentenceTransformer).
  • 4) FAISS 인덱스를 구성한다.
  • 5) 사용자 질의(Query)를 벡터화해서 FAISS로 검색한다.
  • 6) 검색된 문장들을 ChatGPT에 넣기 위한 문자열로 구성한다.

실행 준비

!pip install openai
!pip install gradio
!pip install faiss-cpu sentence-transformers

1. 한글 문서 예시

import faiss
import numpy as np
from sentence_transformers import SentenceTransformer
from typing import List

document_text = """
네이버는 한국의 대표적인 인터넷 기업 중 하나입니다.
FAISS는 벡터 기반의 유사도 검색을 빠르게 수행하는 라이브러리입니다.
KR-SBERT-V40K-klueNLI-augSTS는 한국어 문장 임베딩에 적합한 경량 모델입니다.
이 모델은 문장의 의미를 잘 반영한 벡터를 생성합니다.
ChatGPT는 OpenAI에서 개발한 언어 모델로 다양한 질문에 답할 수 있습니다.
"""

2. 문장 나누기

sentences = [line.strip() for line in document_text.split('\n') if line.strip()]

3. 한글 임베딩 모델 불러오기

model = SentenceTransformer("snunlp/KR-SBERT-V40K-klueNLI-augSTS")

4. 문장 임베딩

sentence_embeddings = model.encode(sentences, convert_to_numpy=True).astype('float32')

5. FAISS 인덱스 구성

dimension = sentence_embeddings.shape[1]
index = faiss.IndexFlatL2(dimension)
index.add(sentence_embeddings)

6. 검색할 쿼리 입력

query = "한국어 문장을 벡터화하려면 어떤 모델이 좋을까?"
query_embedding = model.encode([query], convert_to_numpy=True).astype('float32')

7. 유사 문장 검색

k = 3
distances, indices = index.search(query_embedding, k)

8. 결과 문장 가져오기

retrieved_sentences = [sentences[i] for i in indices[0]]
retrieved_sentences

9. ChatGPT용 텍스트 구성

context = "\n".join(retrieved_sentences)
final_prompt = f"""다음 문맥을 참고해서 질문에 답해줘:

[문맥]
{context}

[질문]
{query}
"""

# 출력
print("📌 ChatGPT에 보낼 최종 프롬프트:\n")
print(final_prompt)

실행 결과)

📌 ChatGPT에 보낼 최종 프롬프트:

다음 문맥을 참고해서 질문에 답해줘:

[문맥]
 모델은 문장의 의미를  반영한 벡터를 생성합니다.
FAISS는 벡터 기반의 유사도 검색을 빠르게 수행하는 라이브러리입니다.
KR-SBERT-V40K-klueNLI-augSTS는 한국어 문장 임베딩에 적합한 경량 모델입니다.

[질문]
한국어 문장을 벡터화하려면 어떤 모델이 좋을까?