from openai import OpenAI
import sys
import psycopg2
from dotenv import load_dotenv
load_dotenv()
STUDENT_NO = '47'
OPENAI_API_KEY = os.getenv("OPENAI_API_KEY")
client = OpenAI(api_key=OPENAI_API_KEY)
# PostgresSQL 접속정보
DB_CONFIG = {
'host': os.getenv("HOST"),
'port': 5432,
'database': 'postgres',
'user' : 'postgres',
'password' : os.getenv("PASSWORD")
}
# 임베딩 함수
def get_embedding(text: str, model: str = "text-embedding-3-small") -> list:
response = client.embeddings.create(
input=text,
model=model
)
return response.data[0].embedding
# DB에 저장
def save_to_postgres(text: str, vector: list):
conn = psycopg2.connect(**DB_CONFIG)
cur = conn.cursor()
try:
sql = """
INSERT INTO test_vector (student_no, name, embedding)
VALUES (%s, %s, %s)
"""
cur.execute(sql, (STUDENT_NO, text, vector))
conn.commit()
print("데이터 저장 완료!")
except Exception as e:
print("DB 오류:", e)
conn.rollback()
finally:
cur.close()
conn.close()
# 메인 실행
if __name__ == "__main__":
input_text = input("임베딩할 문장을 입력하세요: ")
embedding_vector = get_embedding(input_text)
save_to_postgres(input_text, embedding_vector)
insert into product_embeddings (name, embedding) values
( 'son', '[0.1,0.2,0.3]'::vector )
"text-embedding-3-small"

openai 모델로 벡터 임베딩을 했으면 수정,확인 등 작업도 같은 모델로 실시해야 한다. 예를들어 gpt+ deepseek 를 섞어서 쓰면 연산결과가 정확히 나오지 않는다. (모델이 다르기 때문에)
임베딩 공간이 다름 : OpenAI의 text-embedding-3-small 같은 모델은 1,536차원 벡터 공간을 사용함.
다른 모델(예: DeepSeek, Cohere, SentenceTransformers 등)은 차원 수, 학습 데이터, 토큰화 방식이 달라 임베딩 벡터의 분포 자체가 다름.
유사도 계산의 불일치
실무 원칙
예외적으로 가능한 경우
- 서로 다른 모델의 벡터를 같은 임베딩 공간으로 정렬(align)하는 변환 모델 을 따로 학습시키면 교차 사용이 가능.
- 하지만 기본적으로는 동일 모델 일관 사용이 안전한 방법.
#!/Users/hyunjunson/Project/green-hat/backend/ml-pipline/yes/envs/langCh-env/bin/python
import openai
import sys
import os
from dotenv import load_dotenv
from openai import OpenAI
load_dotenv()
GEMINI_API_URL = "https://generativelanguage.googleapis.com/v1beta/openai"
GEMINI_API_KEY = os.getenv("GEMINI_API_KEY")
LLM_ID = "gemini-2.0-flash-lite"
client = OpenAI(
base_url=GEMINI_API_URL,
api_key=GEMINI_API_KEY
)
def ai_chat(messages: list):
# openai api package를 통해 gemini api를 호출합니다.
# print(f"GEMINI API 호출, MODEL={LLM_ID}")
response = client.chat.completions.create(
model=LLM_ID,
messages=messages,
)
return response
if __name__ == '__main__':
messages = []
if len(sys.argv) < 2:
print(f"Usage: {sys.argv[0]} '질문내용'")
sys.exit()
# 명령줄 인자 전체를 합쳐서 질문으로 사용
question = ' '.join(sys.argv[1:])
messages.append({'role': 'user', 'content': question})
response = ai_chat(messages=messages)
print(response.choices[0].message.content)


👍 torch.Tensor와 numpy.ndarray는 비슷해 보여도 중요한 차이가 있습니다.
import torch
import numpy as np
a = np.ones((3,3))
b = torch.ones((3,3), device="cuda") # GPU에 올림
x = torch.tensor(2.0, requires_grad=True)
y = x**2
y.backward()
print(x.grad) # 4.0
n = np.array([1,2,3])
t = torch.from_numpy(n) # 메모리 공유
t[0] = 100
print(n) # [100 2 3]
NumPy → 수치 해석/과학 계산에 특화 (선형대수, 푸리에 변환 등).
PyTorch → ML/DL에 최적화 (GPU, autograd, 신경망 계층).
단순 계산/과학 연산 → NumPy
딥러닝/자동미분/GPU → PyTorch
from flask import Flask, g
app = Flask(__name__)
def get_db():
if "db" not in g:
g.db = connect_db() # DB 연결 생성
return g.db
@app.teardown_appcontext
def close_db(exception):
db = g.pop("db", None)
if db is not None:
db.close()

