diff --git a/notebooks/embeddings-openai.ipynb b/notebooks/embeddings-openai.ipynb new file mode 100644 index 0000000..05e0ff0 --- /dev/null +++ b/notebooks/embeddings-openai.ipynb @@ -0,0 +1,196 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 3, + "id": "902bff53", + "metadata": {}, + "outputs": [], + "source": [ + "import { load } from \"jsr:@std/dotenv\";\n", + "import OpenAI from \"jsr:@openai/openai\";\n", + "\n", + "const env = await load({\n", + " export: true,\n", + "});\n", + "\n", + "const openai = new OpenAI();" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "3b0acbc3", + "metadata": {}, + "outputs": [], + "source": [ + "import { createClient } from \"@supabase/supabase-js\";\n", + "const supabaseUrl = Deno.env.get(\"SUPABASE_URL\") || env.SUPABASE_URL;\n", + "const supabaseKey = Deno.env.get(\"SUPABASE_ANON_KEY\") || env.SUPABASE_ANON_KEY;\n", + "const supabase = createClient(supabaseUrl, supabaseKey);" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "dae842ad", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{\n", + " object: \"list\",\n", + " data: [\n", + " {\n", + " object: \"embedding\",\n", + " index: 0,\n", + " embedding: [\n", + " 0.017360063269734383, 0.022553985938429832, 0.025286488234996796,\n", + " -0.009742671623826027, -0.016438385471701622, -0.014725150540471077,\n", + " -0.020840751007199287, 0.02215278521180153, -0.02024437114596367,\n", + " 0.007834257557988167, 0.0029981620609760284, -0.04109596461057663,\n", + " 0.030165957286953926, -0.03402615711092949, 0.0008369643473997712,\n", + " 0.00044016868923790753, -0.027129843831062317, -0.04248390346765518,\n", + " -0.058683738112449646, 0.034655068069696426, 0.013738414272665977,\n", + " 0.02060219831764698, 0.016687780618667603, 0.0059637944214046,\n", + " -0.010306521318852901, 0.014898642897605896, -0.008826415985822678,\n", + " 0.042136918753385544, 0.009477011859416962, -0.03953453525900841,\n", + " -0.012198670767247677, -0.040055014193058014, -0.019409440457820892,\n", + " -0.0210576169192791, -0.0392959825694561, -0.005996324121952057,\n", + " -0.0022486215457320213, 0.05209103599190712, 0.0009325206046923995,\n", + " 0.013163721188902855, 0.0505296029150486, 0.014540815725922585,\n", + " 0.0027921402361243963, 0.03190087899565697, 0.00004917589103570208,\n", + " 0.03209605813026428, -0.038363464176654816, -0.02424553595483303,\n", + " 0.014096241444349289, 0.02559009939432144, -0.06089576333761215,\n", + " -0.011016755364835262, -0.026696112006902695, 0.050659723579883575,\n", + " 0.019561246037483215, 0.050833214074373245, 0.014529972337186337,\n", + " -0.023204581812024117, -0.014399852603673935, -0.009292676113545895,\n", + " 0.003149967873468995, 0.02007087878882885, 0.025503354147076607,\n", + " 0.0230094026774168, 0.04471761733293533, 0.01479020994156599,\n", + " -0.06692461669445038, 0.03591288626194, -0.037127330899238586,\n", + " 0.029558734968304634, -0.017576929181814194, 0.01953955926001072,\n", + " -0.027888871729373932, -0.0041095963679254055, 0.0004940461367368698,\n", + " -0.011266149580478668, -0.04200679808855057, 0.03537072241306305,\n", + " -0.0015058581484481692, -0.05551750585436821, -0.05287174880504608,\n", + " 0.016373327001929283, 0.005573437083512545, -0.01235047634691,\n", + " -0.009005329571664333, -0.034047845751047134, -0.018368486315011978,\n", + " -0.00271217105910182, 0.007731246296316385, -0.020981714129447937,\n", + " -0.040900785475969315, -0.03727913647890091, -0.059030722826719284,\n", + " -0.04536821320652962, 0.02257567271590233, 0.08579189330339432,\n", + " 0.014605875127017498, -0.030686434358358383, -0.0019084142986685038,\n", + " 0.02216362953186035,\n", + " ... 1436 more items\n", + " ]\n", + " }\n", + " ],\n", + " model: \"text-embedding-3-small\",\n", + " usage: { prompt_tokens: 13, total_tokens: 13 }\n", + "}\n", + "✅ Insertados textos con embeddings\n" + ] + } + ], + "source": [ + "const textos = [\n", + " \"Los vectores se usan con el cliente de OPENAI embeddings\",\n", + "];\n", + "\n", + "for (const contenido of textos) {\n", + " const emb = await openai.embeddings.create({\n", + " model: \"text-embedding-3-small\",\n", + " input: contenido,\n", + " });\n", + "\n", + " const embedding = emb.data[0].embedding;\n", + " console.log(emb);\n", + " \n", + "\n", + " const { error } = await supabase.from(\"documentos\").insert({\n", + " contenido,\n", + " embedding,\n", + " });\n", + "\n", + " if (error) throw error;\n", + "}\n", + "\n", + "console.log(\"✅ Insertados textos con embeddings\");" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "2d8fa9a9", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "🔎 Consulta: ¿Cómo se usan vectores?\n", + "\n", + "- Los vectores se usan con el cliente de OPENAI embeddings\n", + " Similaridad: 0.6407\n", + "\n", + "- Supabase permite almacenar vectores usando pgvector.\n", + " Similaridad: 0.5367\n", + "\n", + "- Los embeddings convierten texto en representaciones numéricas.\n", + " Similaridad: 0.4706\n", + "\n" + ] + } + ], + "source": [ + "const consulta = \"¿Cómo se usan vectores?\";\n", + "\n", + "const emb = await openai.embeddings.create({\n", + " model: \"text-embedding-3-small\",\n", + " input: consulta,\n", + "});\n", + "\n", + "const query_embedding = emb.data[0].embedding;\n", + "\n", + "const { data, error } = await supabase.rpc(\"buscar_documentos\", {\n", + " query_embedding,\n", + " match_count: 3,\n", + "});\n", + "\n", + "if (error) throw error;\n", + "\n", + "console.log(`🔎 Consulta: ${consulta}\\n`);\n", + "for (const r of data ?? []) {\n", + " console.log(`- ${r.contenido}`);\n", + " console.log(` Similaridad: ${Number(r.similarity).toFixed(4)}\\n`);\n", + "}\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "791a94d8", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Deno", + "language": "typescript", + "name": "deno" + }, + "language_info": { + "codemirror_mode": "typescript", + "file_extension": ".ts", + "mimetype": "text/x.typescript", + "name": "typescript", + "nbconvert_exporter": "script", + "pygments_lexer": "typescript", + "version": "5.9.2" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/supabase/migrations/20260212162718_crear_tablas_de_conversaciones.sql b/supabase/migrations/20260212162718_crear_tablas_de_conversaciones.sql index d4d1eb1..7eb3202 100644 --- a/supabase/migrations/20260212162718_crear_tablas_de_conversaciones.sql +++ b/supabase/migrations/20260212162718_crear_tablas_de_conversaciones.sql @@ -1,7 +1,5 @@ create type "public"."estado_conversacion" as enum ('ACTIVA', 'ARCHIVANDO', 'ARCHIVADA', 'ERROR'); -alter table "public"."planes_estudio" drop constraint "planes_estudio_conversation_id_key"; - drop view if exists "public"."plantilla_plan"; drop index if exists "public"."planes_estudio_conversation_id_key"; diff --git a/supabase/snippets/Untitled query 470.sql b/supabase/snippets/Untitled query 470.sql deleted file mode 100644 index 33c8b94..0000000 --- a/supabase/snippets/Untitled query 470.sql +++ /dev/null @@ -1 +0,0 @@ -alter publication supabase_realtime drop table asignaturas; \ No newline at end of file