{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "5131a32a",
   "metadata": {},
   "outputs": [],
   "source": [
    "import sys\n",
    "import os\n",
    "\n",
    "# Añadir la carpeta padre al sys.path\n",
    "parent_dir = os.path.abspath(os.path.join(os.getcwd(), \"..\"))\n",
    "if parent_dir not in sys.path:\n",
    "    sys.path.insert(0, parent_dir)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "0ea2a77c",
   "metadata": {},
   "outputs": [],
   "source": [
    "from backend.ApiKeys.openai_apikey import OpenAICredencial\n",
    "from backend.ApiKeys.openai_apikey_mmr import OpenAICredencialRepo  # Ajusta si está en otro módulo\n",
    "from backend.ConexionSql.Postgres_conexion import PostgresConexion\n",
    "\n",
    "# 1. Crear instancia de conexión (asegúrate de configurar bien tu conexión en Base_conexion)\n",
    "from entrypoint.init_db import db_credencial\n",
    "conexion_admin = PostgresConexion(db_credencial)\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "b3bdf88a",
   "metadata": {},
   "outputs": [],
   "source": [
    "from sqlalchemy import text\n",
    "\n",
    "def crear_tabla_textos(conexion: PostgresConexion):\n",
    "    sql = text(\"\"\"\n",
    "        CREATE EXTENSION IF NOT EXISTS vector;\n",
    "\n",
    "        CREATE TABLE IF NOT EXISTS textos (\n",
    "            id SERIAL PRIMARY KEY,\n",
    "            contenido TEXT NOT NULL,\n",
    "            embedding VECTOR(384)\n",
    "        );\n",
    "        \n",
    "        -- Crear índice opcional para mejorar la búsqueda por similitud\n",
    "        CREATE INDEX IF NOT EXISTS idx_textos_embedding\n",
    "        ON textos USING ivfflat (embedding vector_cosine_ops)\n",
    "        WITH (lists = 100);\n",
    "    \"\"\")\n",
    "    with conexion.engine.begin() as conn:\n",
    "        conn.execute(sql)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "f2622707",
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "e:\\Fitz_Studio\\.venv\\Lib\\site-packages\\tqdm\\auto.py:21: TqdmWarning: IProgress not found. Please update jupyter and ipywidgets. See https://ipywidgets.readthedocs.io/en/stable/user_install.html\n",
      "  from .autonotebook import tqdm as notebook_tqdm\n"
     ]
    }
   ],
   "source": [
    "from sentence_transformers import SentenceTransformer\n",
    "\n",
    "modelo = SentenceTransformer(\"all-MiniLM-L6-v2\")\n",
    "\n",
    "def insertar_texto(conexion: PostgresConexion, texto: str):\n",
    "    embedding = modelo.encode(texto).tolist()\n",
    "    query = text(\"INSERT INTO textos (contenido, embedding) VALUES (:contenido, :embedding)\")\n",
    "    \n",
    "    with conexion.engine.begin() as conn:\n",
    "        conn.execute(query, {\"contenido\": texto, \"embedding\": embedding})"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "id": "20497f9f",
   "metadata": {},
   "outputs": [],
   "source": [
    "def buscar_similares(conexion: PostgresConexion, texto: str, k: int = 5):\n",
    "    emb = modelo.encode(texto).tolist()\n",
    "    sql = text(\"\"\"\n",
    "        SELECT contenido, embedding <#> CAST(:embedding AS vector) AS distancia\n",
    "        FROM textos\n",
    "        ORDER BY embedding <#> CAST(:embedding AS vector)\n",
    "        LIMIT :k\n",
    "    \"\"\")\n",
    "    with conexion.engine.connect() as conn:\n",
    "        resultados = conn.execute(sql, {\"embedding\": emb, \"k\": k}).fetchall()\n",
    "        for r in resultados:\n",
    "            print(f\"Texto: {r.contenido} | Distancia coseno: {r.distancia:.4f}\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "281a9214",
   "metadata": {},
   "outputs": [],
   "source": [
    "insertar_texto(conexion_admin, \"El cambio climático representa un reto urgente para la humanidad.\")\n",
    "insertar_texto(conexion_admin, \"Las criptomonedas están alterando el panorama financiero global.\")\n",
    "insertar_texto(conexion_admin, \"Los algoritmos de recomendación influyen en nuestras decisiones diarias.\")\n",
    "insertar_texto(conexion_admin, \"La automatización está reduciendo la necesidad de mano de obra humana.\")\n",
    "insertar_texto(conexion_admin, \"El aprendizaje profundo ha mejorado el reconocimiento de voz y de imágenes.\")\n",
    "insertar_texto(conexion_admin, \"La inflación está afectando el poder adquisitivo de los consumidores.\")\n",
    "insertar_texto(conexion_admin, \"Las energías renovables son clave para un futuro sostenible.\")\n",
    "insertar_texto(conexion_admin, \"Las redes sociales impactan en la salud mental de los adolescentes.\")\n",
    "insertar_texto(conexion_admin, \"El teletrabajo se ha consolidado como una nueva forma de empleo.\")\n",
    "insertar_texto(conexion_admin, \"Los coches autónomos podrían reducir drásticamente los accidentes de tráfico.\")\n",
    "insertar_texto(conexion_admin, \"La biotecnología está revolucionando el tratamiento de enfermedades genéticas.\")\n",
    "insertar_texto(conexion_admin, \"Los drones están siendo utilizados para entregas y vigilancia.\")\n",
    "insertar_texto(conexion_admin, \"Las decisiones económicas de la Reserva Federal impactan los mercados globales.\")\n",
    "insertar_texto(conexion_admin, \"El metaverso plantea nuevas oportunidades y desafíos para las empresas tecnológicas.\")\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "id": "ddcf8f49",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Texto: Las criptomonedas están alterando el panorama financiero global. | Distancia coseno: -0.3589\n"
     ]
    }
   ],
   "source": [
    "# # 1. Crear la tabla (solo una vez)\n",
    "# crear_tabla_textos(conexion_admin)\n",
    "\n",
    "# # 2. Insertar un texto\n",
    "# insertar_texto(conexion_admin, \"La inteligencia artificial está transformando los negocios.\")\n",
    "\n",
    "# 3. Buscar textos similares\n",
    "buscar_similares(conexion_admin, \"Dinero\", k=1)"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": ".venv",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.11.11"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
