# ============================================================
# [실습] 유사도 검색 — OpenAI 임베딩 + 코사인 유사도
#
# 아래 항목을 직접 구현해 완성하세요:
#  1) cosine_similarity(a, b): 내적 / (두 벡터 크기의 곱) 으로 코사인 유사도(-1~1)를 반환한다.
#  2) top_k_search(query_vec, doc_vecs, k): 모든 문서와의 유사도를 구해 상위 k개의 (인덱스, 점수)를 반환한다.
# ============================================================

import numpy as np
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)


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


def cosine_similarity(a, b):
    # 1) 여기에 코드를 작성하세요
    pass


def top_k_search(query_vec, doc_vecs, k=2):
    # 2) 여기에 코드를 작성하세요
    pass


query = "검색 라이브러리가 뭐야?"
query_vec = get_embedding(query)
results = top_k_search(query_vec, doc_embeddings, k=2)
for idx, score in results:
    print(f"문서 {idx}: 유사도 {score:.4f} -> {documents[idx]}")
