使用自有数据定制 OpenAI(2 / 2)

· 功能

上一篇文章中,我们了解了如何使用 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:利用之前生成的数据库记录,每次用户向聊天机器人提问时,应用程序首先在数据库中搜索与问题最相似的上下文,然后将其作为上下文信息添加,以帮助聊天机器人提供更准确的回答。