# ============================================================
# [실습] FAISS 벡터 검색 — OpenAI 임베딩 + FAISS
#
# 08 에서는 numpy 로 직접 코사인 유사도를 구했다. 문서가 많아지면 FAISS 인덱스로 빠르게 검색한다.
# 코사인 유사도 = '정규화한 벡터의 내적' → normalize_L2 + IndexFlatIP 를 쓰면 결과값이 곧 코사인 유사도.
#
# 아래 항목을 직접 구현해 완성하세요:
#  1) 문서/질문 벡터를 normalize_L2 로 정규화하고 IndexFlatIP 인덱스로 상위 k개를 검색해 출력한다.
# ============================================================

import numpy as np
import faiss
from dotenv import load_dotenv
from openai import OpenAI

load_dotenv()
client = OpenAI()


def get_embedding(text):
    response = client.embeddings.create(input=text, model="text-embedding-ada-002")
    return np.array(response.data[0].embedding, dtype=np.float32)


documents = [
    "Python은 강력한 프로그래밍 언어입니다.",
    "OpenAI는 AI 연구를 선도하는 기업입니다.",
    "FAISS는 벡터 검색을 위한 라이브러리입니다.",
]
doc_embeddings = np.array([get_embedding(doc) for doc in documents], dtype=np.float32)

query = "검색 라이브러리가 뭐야?"

# 1) 여기에 코드를 작성하세요
#    - doc_embeddings 를 normalize_L2 정규화 → IndexFlatIP 인덱스에 add
#    - query 임베딩도 정규화 → index.search(query_vec, k=2)
#    - 상위 문서/유사도 출력
