En un artículo anterior vimos cómo usar OpenAI Embeddings para añadir información contextual a los métodos de chat de OpenAI.
Ahora veremos cómo usar el componente TsgcOpenAIEmbeddings del paquete sgcWebSockets para construir aplicaciones de IA usando nuestros propios datos.
En un artículo anterior sobre Delphi Voice ChatBot, usamos el componente TsgcAIOpenAIChatBot para construir un ChatBot manejado por voz; ahora ampliaremos el ChatBot usando no solo los datos de openAI entrenados hasta 2021, sino que añadiremos nuestros datos personalizados construyendo un sistema de Preguntas y Respuestas con los datos obtenidos del fichero de ayuda y las interfaces del paquete.
Convertir tus propios datos en vectores
El primer paso es coger el manual pdf de sgcWebSockets y convertirlo a texto. Usaremos este fichero para crear embeddings con información útil sobre cómo configurar el paquete, usar los componentes... y esta información se utilizará al preguntar a OpenAI.
Una vez tengamos el manual pdf en formato texto, podemos usar el componente TsgcAIOpenAIEmbeddings para obtener de OpenAI los vectores de cada sección del fichero y, en este caso, almacenarlos en un fichero de texto (en producción, puedes usar una base de datos vectorial como Pinecone).
procedure ConvertFileToVector;
var
oDialog: TOpenDialog;
oEmbeddings: TsgcAIOpenAIEmbeddings;
oFile: TsgcAIDatabaseVectorFile;
begin
oDialog := TOpenDialog.Create(nil);
Try
oDialog.Filter := 'TXT Files|*.txt';
if oDialog.Execute then
begin
oEmbeddings := TsgcAIOpenAIEmbeddings.Create(nil);
Try
oFile := TsgcAIDatabaseVectorFile.Create(nil);
Try
oEmbeddings.Database := oFile;
oEmbeddings.OpenAIOptions.ApiKey := '<your api key>';
oEmbeddings.CreateEmbeddingsFromFile(oDialog.FileName);
Finally
oFile.Free;
End;
Finally
oEmbeddings.Free;
End;
end;
Finally
FreeAndNil(oDialog);
End;
end;
ChatBot y embeddings
Una vez convertidos todos nuestros datos a vectores, podemos empezar a construir nuestro propio modelo; la idea es muy sencilla: cada vez que preguntamos al bot, primero convertimos la pregunta en un vector, después buscamos en nuestra base de datos qué vector es más similar a la pregunta, y finalmente usamos los datos más similares a la pregunta y los añadimos como contexto.
procedure AskToChatGPT(const aQuestion: string);
var
oChatBot: TsgcAIOpenAIChatBot;
oEmbeddings: TsgcAIOpenAIEmbeddings;
oFile: TsgcAIDatabaseVectorFile;
vContext: string;
begin
oChatBot := TsgcAIOpenAIChatBot.Create(nil);
Try
oChatBot.OpenAIOptions.ApiKey := '<your api key>';
oEmbeddings := TsgcAIOpenAIEmbeddings.Create(nil);
Try
oChatBot.Embeddings := oEmbeddings;
oFile := TsgcAIDatabaseVectorFile.Create(nil);
Try
oEmbeddings.Database := oFile;
vContext := oChatBot.GetEmbedding(aQuestion);
oChatBot.ChatAsUser('Answer the question based on the context below.\n\nContext:\n' +
vContext + '\nQuestion:' + aQuestion + '\nAnswer:');
Finally
oFile.Free;
End;
Finally
oEmbeddings.Free;
End;
Finally
FreeAndNil(oDialog);
End;
end;
Demo para Delphi en Windows
A continuación tienes un ejemplo para Delphi que usa el paquete AI de sgcWebSockets y muestra cómo construir una aplicación de Preguntas y Respuestas con datos personalizados. La demo contiene 2 proyectos:
1. sgcCreateEmbeddings: este proyecto carga un fichero de texto, lo divide en fragmentos, convierte cada fragmento en un vector y lo almacena en un fichero de base de datos. La demo ya incluye la base de datos vectorial en formato de texto para facilitar su uso.
2. sgcQuestionsAnswers: usando los registros previos de la base de datos, cada vez que el usuario hace una pregunta al chatbot, la aplicación busca primero en la base de datos cuál es el contexto más similar a la pregunta y lo añade como información contextual para ayudar al ChatBot a ofrecer respuestas más precisas.
