Files
agent-ai-mcp-server/source/process_vector_products.py
2025-05-14 08:31:50 -03:00

82 lines
2.2 KiB
Python

import oracledb
import os
from sentence_transformers import SentenceTransformer
import numpy as np
# === CONFIGURAÇÃO ORACLE COM WALLET ===
WALLET_PATH = "/WALLET_PATH/Wallet_oradb23ai"
DB_ALIAS = "oradb23ai_high"
USERNAME = "USER"
PASSWORD = "Password"
os.environ["TNS_ADMIN"] = WALLET_PATH
# === CONECTANDO USANDO oracledb (modo thin) ===
connection = oracledb.connect(
user=USERNAME,
password=PASSWORD,
dsn=DB_ALIAS,
config_dir=WALLET_PATH,
wallet_location=WALLET_PATH,
wallet_password=PASSWORD
)
cursor = connection.cursor()
# === CONSULTA A TABELA DE PRODUTOS ===
cursor.execute("SELECT id, codigo, descricao FROM produtos")
rows = cursor.fetchall()
ids = []
descricoes = []
for row in rows:
ids.append((row[0], row[1], row[2]))
descricoes.append(row[2])
# === GERAÇÃO DOS EMBEDDINGS ===
model = SentenceTransformer('all-MiniLM-L6-v2')
embeddings = model.encode(descricoes, convert_to_numpy=True)
# === CRIAÇÃO DA TABELA DE EMBEDDINGS (caso não exista) ===
cursor.execute("""
BEGIN
EXECUTE IMMEDIATE '
CREATE TABLE embeddings_produtos (
id NUMBER PRIMARY KEY,
codigo VARCHAR2(100),
descricao VARCHAR2(4000),
vetor BLOB
)';
EXCEPTION
WHEN OTHERS THEN
IF SQLCODE != -955 THEN
RAISE;
END IF;
END;
""")
# === INSERÇÃO OU ATUALIZAÇÃO DOS DADOS ===
for (id_, codigo, descricao), vetor in zip(ids, embeddings):
vetor_bytes = vetor.astype(np.float32).tobytes()
cursor.execute("""
MERGE INTO embeddings_produtos tgt
USING (SELECT :id AS id FROM dual) src
ON (tgt.id = src.id)
WHEN MATCHED THEN
UPDATE SET codigo = :codigo, descricao = :descricao, vetor = :vetor
WHEN NOT MATCHED THEN
INSERT (id, codigo, descricao, vetor)
VALUES (:id, :codigo, :descricao, :vetor)
""", {
"id": id_,
"codigo": codigo,
"descricao": descricao,
"vetor": vetor_bytes
})
connection.commit()
cursor.close()
connection.close()
print("✅ Vetores gravados com sucesso no banco Oracle.")