使用GPT根据文档建立聊天机器人的详细教程

使用GPT根据文档建立聊天机器人的详细教程

与ChatGPT聊天很有趣,而且信息量很大–过去一段时间我一直在与它闲聊,探索一些新的想法,学习。但这些都是比较随意的用例,新奇感很快就会减弱,特别是当你意识到它能产生幻觉的时候。

我们可能如何以更有成效的方式来使用它?随着OpenAI最近发布的GPT 3.5系列API,我们可以做的事情远不止是闲聊。对于企业和你的个人使用来说,一个非常有成效的使用案例是QA(问题回答)–你用自然语言向机器人询问你自己的文件/数据,它可以通过从文件中检索信息并生成回应来快速回答你[1]。你可以把它用于客户支持、综合用户研究、你的个人知识管理,等等

AI生成图片

向机器人询问与文件有关的问题,用稳定扩散法生成的图像。

在这篇文章中,我将探讨如何根据自己的数据建立自己的问答聊天机器人,包括为什么有些方法行不通,以及如何利用llama-index和GPT API以高效的方式建立文档问答聊天机器人的步骤指南。

(如果你只想知道如何建立问答聊天机器人,你可以直接跳到 “逐步建立文档问答聊天机器人” 部分)

探索不同的方法

我的日常工作是产品经理–阅读客户反馈和内部文件占据了我生活的很大一部分时间。当ChatGPT出来的时候,我立刻想到了把它作为一个助手,帮助我综合客户的反馈,或者找到关于我正在做的功能的相关旧产品文档。

我首先想到的是用我自己的数据对GPT模型进行微调来实现这个目标。但是,微调需要花费相当多的钱,而且需要一个有实例的大数据集。也不可能在文件有变化时每次都进行微调。更关键的一点是,微调根本不可能让模型 “知道 “文档中的所有信息,而是要教给模型一种新的技能。因此,对于(多)文档质量保证来说,微调并不是一个好办法。

我想到的第二个方法是通过在prompt中提供上下文来进行prompt工程。例如,我可以在实际问题之前附加原始文档内容,而不是直接问问题。但是GPT模型的注意力是有限的–它只能接受prompt中的几千字(大约4000个标记或3000字)。只要我们有成千上万的客户反馈邮件和数百个产品文档,就不可能给它prompt中的所有背景。如果你向API传递一个长的上下文,也是很昂贵的,因为定价是基于你使用的代币的数量。

I will ask you questions based on the following context:— Start of Context —YOUR DOCUMENT CONTENT— End of Context—My question is: “What features do users want to see in the app?”

(如果你想了解更多关于GPT的微调和promp工程,你可以阅读这篇文章:https://medium.com/design-bootcamp/3-ways-to-tailor-foundation-language-models-like-gpt-for-your-business-e68530a763bd)

由于prompt对输入标记的数量有限制,我想出了这样一个主意:首先使用一种算法来搜索文档并挑选出相关的摘录,然后只将这些相关的语境与我的问题一起传递给GPT模型。在我研究这个想法的时候,我发现了一个叫做gpt-index(现在改名为LlamaIndex)的库,它正是我想做的事情,而且使用起来很简单[2]。

自动聊天机器人工作流

从文件中提取相关部分,然后将其反馈给prompt。图标来自https://www.flaticon.com/

在下一节中,我将给出一个使用LlamaIndex和GPT在你自己的数据上建立一个问答聊天机器人的分步教程。

逐步建立文档问答聊天机器人

在这一节中,我们将用LlamaIndex和GPT(text-davinci-003)在现有文档的基础上建立一个问答聊天机器人,这样你就可以用自然语言提出关于文档的问题,并从聊天机器人那里得到答案。

前提条件

在开始本教程之前,我们需要准备一些东西:

  • 你的OpenAI API密钥,可以在https://platform.openai.com/account/api-keys
  • 一个你的文档数据库。LlamaIndex支持许多不同的数据源,如Notion、Google Docs、Asana等[3]。在本教程中,我们只使用一个简单的文本文件进行演示。
  • 一个本地的Python环境或一个在线的Google Colab笔记本

工作流程

工作流程简单明了,只需要几个步骤:

  1. 用LlamaIndex为你的文档数据建立一个索引
  2. 用自然语言查询该索引
  3. LlamaIndex将检索相关部分并将其传递给GPT prompt。
  4. 向GPT询问相关的上下文并构建一个回应

LlamaIndex所做的是将你的原始文档数据转换成一个矢量的索引,这对查询来说是非常有效的。它将使用这个索引,根据查询和数据的相似性,找到最相关的部分。然后,它将把检索到的内容插入到它将发送给GPT的prompt中,这样GPT就有了回答你问题的背景。

设置

我们需要先安装这些库。只需在你的终端或谷歌Colab笔记本上运行以下命令。这些命令将同时安装LlamaIndex和OpenAI。

!pip install llama-index!pip install openai

接下来,我们将在python中导入这些库,并在一个新的.py文件中设置你的OpenAI API密钥。

# Import necessary packagesfrom llama_index import GPTSimpleVectorIndex, Document, SimpleDirectoryReaderimport osos.environ['OPENAI_API_KEY'] = 'sk-YOUR-API-KEY'

构建索引并保存它

在我们安装了所需的库并将其导入后,我们将需要构建一个你的文档的索引。

为了加载你的文档,你可以使用LllamaIndex提供的SimpleDirectoryReader方法,或者你可以从字符串中加载它。

# Loading from a directorydocuments = SimpleDirectoryReader('your_directory').load_data()# Loading from strings, assuming you saved your data to strings text1, text2, ...text_list = [text1, text2, ...]documents = [Document(t) for t in text_list]

LlamaIndex还提供各种数据连接器,包括Notion、Asana、Google Drive、Obsidian等。你可以在https://llamahub.ai/找到可用的数据连接器。

加载完文档后,我们就可以用以下方法简单地构建索引了:

# Construct a simple vector indexindex = GPTSimpleVectorIndex(documents)

如果你想保存索引并加载它以便将来使用,你可以使用以下方法:

# Save your index to a index.json fileindex.save_to_disk('index.json')# Load the index from your saved index.json fileindex = GPTSimpleVectorIndex.load_from_disk('index.json')

查询索引并获得响应

查询索引很简单

# Querying the indexresponse = index.query("What features do users want to see in the app?")print(response)

查询索引响应示例

一个响应的例子。

然后就可以了!你会得到你的答案。在引擎盖下,LlamaIndex将接受你的prompt,在索引中搜索相关的块,并将你的prompt和相关块传递给GPT。

一些关于高级用法的说明

上面的步骤只展示了使用LlamaIndex和GPT回答问题的一个非常简单的入门用法。但你可以做的远不止这些。事实上,你可以配置LlamaIndex来使用不同的大型语言模型(LLM),为不同的任务使用不同类型的索引,用一个新的索引来更新现有的索引,等等。如果你有兴趣,你可以在https://gpt-index.readthedocs.io/en/latest/index.html,阅读他们的文档。

小结

在这篇文章中,我们看到了如何将GPT与LlamaIndex结合起来使用,建立一个文档问题回答的聊天机器人。虽然GPT(和其他LLM)本身就很强大,但如果我们把它与其他工具、数据或流程结合起来,它的力量就会被大大放大。

你会用一个文件问题回答聊天机器人做什么?

References:

[1] What Is Question Answering? — Hugging Face. 5 Dec. 2022, https://huggingface.co/tasks/question-answering.

[2] Liu, Jerry. LlamaIndex. Nov. 2022. GitHub, https://github.com/jerryjliu/gpt_index.

via uxdesign.cc 闪电博编译(原文有删减)

评论留言