在上一篇文章中,我们了解了如何使用 OpenAI 嵌入向量为 OpenAI 聊天方法添加上下文信息。
现在,我们将学习如何使用 sgcWebSockets 包中的 TsgcOpenAIEmbeddings 组件构建基于自有数据的 AI 应用程序。
在之前关于 Delphi 语音聊天机器人的文章中,我们使用 TsgcAIOpenAIChatBot 组件构建了一个由语音控制的聊天机器人。现在,我们将扩展该聊天机器人的功能,不仅使用 OpenAI 截至 2021 年的训练数据,还将添加自定义数据,基于帮助文档和包接口的数据构建一个问答系统。
将自有数据转换为向量
第一步是获取 sgcWebSockets PDF 手册并将其转换为文本格式。我们将使用此文件为文件的每个章节创建嵌入向量,这些信息将在向 OpenAI 提问时使用。
将 PDF 手册转换为文本格式后,我们可以使用 TsgcAIOpenAIEmbeddings 组件从 OpenAI 获取文件每个部分的向量,在本例中,我们将其存储到文本文件中(在生产环境中,您可以使用 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;
聊天机器人与嵌入向量
将所有数据转换为向量后,我们就可以开始构建自己的模型。其背后的思路非常简单:每次向机器人提问时,首先将问题转换为向量,然后在数据库中搜索哪个向量与问题最相似,最后将与问题最相似的数据作为上下文信息添加到提示中。
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;
Delphi Windows 演示
以下是使用 sgcWebSockets AI 包的 Delphi 示例,展示了如何使用自定义数据构建问答应用程序。该演示包含两个项目:
1. sgcCreateEmbeddings:该项目加载一个文本文件,将其分割成块,并将每个块转换为向量后存储到数据库文件中。演示已包含文本文件格式的向量数据库,方便使用。
2. sgcQuestionsAnswers:利用之前生成的数据库记录,每次用户向聊天机器人提问时,应用程序首先在数据库中搜索与问题最相似的上下文,然后将其作为上下文信息添加,以帮助聊天机器人提供更准确的回答。
