Uso de Embeddings para Crear un Asistente Virtual
Contexto
El documento explora cómo utilizar embeddings con OpenAI para crear un asistente virtual. Los embeddings son representaciones numéricas que capturan relaciones complejas y semánticas entre datos, convirtiéndolos en vectores densos que son más adecuados para aplicaciones de aprendizaje automático y procesamiento de datos.
¿Cómo funcionan los embeddings?
Los embeddings se crean a través de redes neuronales. Capturan relaciones complejas y semánticas en vectores densos que son ideales para aplicaciones de procesamiento de datos. Estos vectores se proyectan en un espacio de alta dimensión, conocido como base de datos vectorial.
Modelos de Embeddings
Los embeddings de OpenAI ofrecen funcionalidades avanzadas como:
- Búsqueda avanzada
- Agrupamiento
- Modelado de temas
- Clasificación
Precios de Modelos
Modelo | Precio estándar | Precio con Batch API* |
---|---|---|
text-embedding-3-small | $0.020 / 1M tokens | $0.010 / 1M tokens |
text-embedding-3-large | $0.130 / 1M tokens | $0.065 / 1M tokens |
ada v2 | $0.100 / 1M tokens | $0.050 / 1M tokens |
Nota: La Batch API permite enviar peticiones en lotes con un descuento del 50%, retornando las respuestas en 24 horas.
¿Qué es LangChain?
LangChain es un marco de trabajo de código abierto para crear aplicaciones basadas en Modelos de Lenguaje de Gran Tamaño (LLM). Ofrece herramientas y abstracciones para mejorar la personalización, precisión y relevancia de la información generada por estos modelos.
Funcionalidades
LangChain permite:
- Crear nuevas cadenas de peticiones.
- Personalizar plantillas existentes.
- Acceder a nuevos conjuntos de datos sin reentrenamiento.
Ejemplo: Etiquetado de Partes del Discurso (Part-of-Speech Tagging)
const langchain = require("langchain");
const sentence = "LangChain is an amazing tool.";
const posTags = langchain.posTag(sentence);
console.log(posTags);
// Resultado: [{"word": "LangChain", "tag": "NNP"}, {"word": "is", "tag": "VBZ"}, ...]
Ejemplo: Asistente Virtual con Embeddings, Node.js y MongoDB
Este ejemplo demuestra cómo crear un asistente virtual utilizando embeddings de OpenAI y una base de datos MongoDB.
Requisitos
Instala las dependencias necesarias:
npm install openai dotenv mongodb
Código
require("dotenv").config();
const { Configuration, OpenAIApi } = require("openai");
const { MongoClient } = require("mongodb");
const fs = require("fs");
const pdfParse = require("pdf-parse");
// Configuración de OpenAI
const openai = new OpenAIApi(
new Configuration({
apiKey: process.env.OPENAI_API_KEY,
})
);
// Configuración de MongoDB
const uri = "mongodb://localhost:27017";
const client = new MongoClient(uri);
async function generateEmbedding(text) {
const response = await openai.createEmbedding({
model: "text-embedding-ada-002",
input: text,
});
return response.data.data[0].embedding;
}
async function saveToDatabase(question, answer, embedding) {
try {
await client.connect();
const db = client.db("assistantDB");
const collection = db.collection("knowledgeBase");
await collection.insertOne({ question, answer, embedding });
console.log("Dato guardado en MongoDB.");
} finally {
await client.close();
}
}
async function extractTextFromPDF(filePath) {
const dataBuffer = fs.readFileSync(filePath);
const pdfData = await pdfParse(dataBuffer);
return pdfData.text;
}
async function processPDF(filePath) {
const text = await extractTextFromPDF(filePath);
const sentences = text
.split(".")
.map((s) => s.trim())
.filter((s) => s.length > 0);
for (const sentence of sentences) {
const embedding = await generateEmbedding(sentence);
await saveToDatabase(sentence, "Respuesta automática", embedding);
}
console.log("PDF procesado y datos guardados.");
}
// Ejemplo: Procesar un archivo PDF
(async () => {
const pdfPath = "ruta/al/archivo.pdf"; // Cambia esta ruta por la del archivo PDF
await processPDF(pdfPath);
})();
Ejemplo: Uso de PGVector para Consultas con Embeddings
Este ejemplo utiliza PGVector para almacenar y consultar embeddings generados por OpenAI en una base de datos PostgreSQL.
Requisitos
Instala las dependencias necesarias:
npm install openai pg
Código
const { Configuration, OpenAIApi } = require("openai");
const { Client } = require("pg");
// Configuración de OpenAI
const configuration = new Configuration({
apiKey: process.env.OPENAI_API_KEY,
});
const openai = new OpenAIApi(configuration);
const client = new Client({
user: "your_username",
host: "your_host",
database: "your_database_name",
password: "your_password",
port: 5432,
});
client.connect();
async function generateEmbedding(text) {
const response = await openai.createEmbedding({
model: "text-embedding-ada-002",
input: text,
});
return response.data.data[0].embedding;
}
async function insertEmbeddings(texts, embeddings) {
for (let i = 0; i < texts.length; i++) {
await client.query(
"INSERT INTO embeddings (text, embedding) VALUES ($1, $2)",
[texts[i], embeddings[i]]
);
}
console.log("Embeddings guardados en PostgreSQL.");
}
async function queryEmbeddings(queryText) {
const queryEmbedding = await generateEmbedding(queryText);
const res = await client.query(
"SELECT text, embedding <-> $1 AS distance FROM embeddings ORDER BY distance LIMIT 5",
[queryEmbedding]
);
return res.rows;
}
(async () => {
const texts = [
"Hola mundo",
"El aprendizaje automático es fascinante",
"PGVector es una gran extensión para PostgreSQL",
];
const embeddings = await Promise.all(
texts.map((text) => generateEmbedding(text))
);
await insertEmbeddings(texts, embeddings);
const results = await queryEmbeddings(
"El aprendizaje automático es increíble"
);
results.forEach((result) => {
console.log(`Texto: ${result.text}, Distancia: ${result.distance}`);
});
client.end();
})();
Conclusión
El uso de embeddings con OpenAI y bases de datos como MongoDB y PostgreSQL permite crear asistentes virtuales altamente personalizables y eficientes. Herramientas como LangChain y PGVector complementan estas soluciones con capacidades avanzadas de búsqueda y procesamiento de datos vectoriales. Este enfoque abre las puertas a aplicaciones prácticas en atención al cliente, búsqueda semántica, y más.