# 搭建基于知识库内容的机器人

如果你仅想要直接实践，可以看最后一部分实践，以及倒数第二部分限制与注意的地方。

### 简介[​](https://learningprompt.wiki/docs/chatGPT/tutorial-extras/Build-AI-bots-based-on-knowledge-base-content#%E7%AE%80%E4%BB%8B) <a href="#jian-jie" id="jian-jie"></a>

这个想法，来源于我的个人需求，我连载了将近 100 期 newsletter，积累了很多内容，我希望将这些资料导入给 AI，然后 AI 能拿这些数据回答我的问题，甚至能给我一些写作建议等。

最早的时候，我尝试过非常笨的方法，就是在提问的时候，将我的 newsletter 文本传给 AI，它的 prompt 大概是这样的：

```
Please summarize the following sentences to make them easier to understand.

Text: """
My newsletter
"""
```

这个方法能用是能用，但目前 ChatGPT 有个非常大的限制，它限制了最大的 token 数是 4096，大约是 16000 多个字符，注意这个是请求 + 响应，实际请求总数并没那么多。换句话来说，我一次没法导入太多的内容给 ChatGPT（我的一篇 Newsletter 就有将近 5000 字），这个问题就一直卡了我很久，直到我看到了 [GPT Index](https://gpt-index.readthedocs.io/en/latest/) 的库，以及 [Lennys Newsletter](https://www.lennysnewsletter.com/p/i-built-a-lenny-chatbot-using-gpt) 的例子。

试了下，非常好用，而且步骤也很简单，即使你不懂编程也能轻易地按照步骤实现这个功能。

我稍稍优化了下例子的代码，并增加了一些原理介绍。希望大家能喜欢。

### 原理介绍[​](https://learningprompt.wiki/docs/chatGPT/tutorial-extras/Build-AI-bots-based-on-knowledge-base-content#%E5%8E%9F%E7%90%86%E4%BB%8B%E7%BB%8D) <a href="#yuan-li-jie-shao" id="yuan-li-jie-shao"></a>

其实我这个需求，在传统的机器人领域已经有现成方法，比如你应该看到不少电商客服产品，就有类似的功能，你说一句话，机器人就会回复你。

这种传统的机器人，通常是基于意图去回答人的问题。举个例子，我们构建了一个客服机器人，它的工作原理简单说来是这样的：

<img src="https://learningprompt.wiki/assets/images/KB+GPT001-0f76d6b6754ac6219d8375c5f6d0c7bd.png" alt="KB+GPT001.png" height="1416" width="3680">

当用户问「忘记密码怎么办？」时，它会去找最接近这个意图「密码」，每个意图里会有很多个样本问题，比如「忘记密码如何找回」「忘记密码怎么办」，然后这些样本问题都会有个答案「点击 A 按钮找回密码」，机器人会匹配最接近样本问题的意图，然后返回答案。

但这样有个问题，我们需要设置特别多的意图，比如「无法登录」、「忘记密码」、「登录错误」，虽然有可能都在描述一个事情，但我们需要设置三个意图、三组问题和答案。

虽然传统的机器人有不少限制，但这种传统方式，给了我们一些灵感。

我们好像可以用这个方法来解决限制 token 的问题，我们仅需要传符合某个意图的文档给 AI，然后 AI 仅用该文档来生成答案：

<img src="https://learningprompt.wiki/assets/images/KB+GPT002-f4353b4f9022ddfc120680f74928934e.png" alt="KB+GPT002.png" height="2080" width="3680">

比如还是上面的那个客服机器人的例子，当用户提问「忘记密码怎么办？」时，匹配到了「登录」相关的意图，接着匹配知识库中相同或相近意图的文档，比如「登录异常处理解决方案文档」，最后我们将这份文档传给 GPT-3，它再拿这个文档内容生成答案。

GPTIndex 这个库简单理解就是做上图左边的那个部分，它的工作原理是这这样的：

1. 创建知识库或文档索引
2. 找到最相关的索引
3. 最后将对应索引的内容给 GPT-3

### 限制与注意的地方[​](https://learningprompt.wiki/docs/chatGPT/tutorial-extras/Build-AI-bots-based-on-knowledge-base-content#%E9%99%90%E5%88%B6%E4%B8%8E%E6%B3%A8%E6%84%8F%E7%9A%84%E5%9C%B0%E6%96%B9) <a href="#xian-zhi-yu-zhu-yi-de-di-fang" id="xian-zhi-yu-zhu-yi-de-di-fang"></a>

虽然这个方法解决了 token 限制的问题，但也有不少限制：

1. 当用户提一些比较模糊的问题时，匹配有可能错误，导致 GPT-3 拿到了错误的内容，最终生成了非常离谱的答案。
2. 当用户提问一些没有多少上下文的信息时，机器人有时会生成虚假信息。

所以如果你想用这个技术做客服机器人，建议你：

1. 通过一些引导问题来先明确用户的意图，就是类似传统客服机器人那样，搞几个按钮，先让用户点击（比如无法登录）。
2. 如果相似度太低，建议增加兜底的回答「很抱歉，我无法回答你的问题，你需要转为人工客服吗？」

### 实践[​](https://learningprompt.wiki/docs/chatGPT/tutorial-extras/Build-AI-bots-based-on-knowledge-base-content#%E5%AE%9E%E8%B7%B5) <a href="#shi-jian" id="shi-jian"></a>

为了让大家更方便使用，我将代码放在了 Google Colab，你无需安装任何环境，只需要用浏览器打开这个： [代码文件](https://colab.research.google.com/drive/1Fr1hxYOG5lss9vbvZlaw-11wM2U6N7cQ)

BTW 你可以将其复制保存到自己的 Google Drive。

信息

收到不少朋友的反馈，说下面的按钮没法点击。下面只是截图，你需要打开这个[代码文件](https://colab.research.google.com/drive/1Fr1hxYOG5lss9vbvZlaw-11wM2U6N7cQ)进行操作。 另外，关于答案不符合预期的问题，主要还是向量匹配的问题，暂时没有解决方案。

#### 第一步：导入数据[​](https://learningprompt.wiki/docs/chatGPT/tutorial-extras/Build-AI-bots-based-on-knowledge-base-content#%E7%AC%AC%E4%B8%80%E6%AD%A5%E5%AF%BC%E5%85%A5%E6%95%B0%E6%8D%AE) <a href="#di-yi-bu-dao-ru-shu-ju" id="di-yi-bu-dao-ru-shu-ju"></a>

导入的方法有两种，第一种是导入在线数据。

导入 GitHub 数据是个相对简单的方式。如果你是第一次使用，我建议你先用这个方法试试。点击下方代码前的播放按钮，就会运行这段代码。

<img src="https://learningprompt.wiki/assets/images/runcode-fad97031789f0869e2f97c81a2ff759b.png" alt="runcode.png" height="80" width="1334">

运行完成后，会导入我写的几份 newsletter。如果你也想像我那样导入数据，只需要修改 clone 后面的链接地址即可。

第二种方法是导入离线数据。点击左侧的文件夹按钮（如果你没有登录，这一步会让你登录），然后点击下图标识 2 的上传按钮，上传文件即可。如果你要传多个文件，建议你先建一个文件夹，然后将文件都上传到该文件夹内。

<img src="https://learningprompt.wiki/assets/images/Cola001-2544299da6f9f4133c32414afb84cd48.png" alt="Cola001.png" height="2604" width="3056">

#### 第二 & 三步：安装依赖库[​](https://learningprompt.wiki/docs/chatGPT/tutorial-extras/Build-AI-bots-based-on-knowledge-base-content#%E7%AC%AC%E4%BA%8C--%E4%B8%89%E6%AD%A5%E5%AE%89%E8%A3%85%E4%BE%9D%E8%B5%96%E5%BA%93) <a href="#di-er-san-bu-an-zhuang-yi-lai-ku" id="di-er-san-bu-an-zhuang-yi-lai-ku"></a>

直接点击播放按钮即可。

不过第三步里，你可以尝试改下参数，你可以改：

1. **num\_ouputs ：**&#x8FD9;个是设置最大的输出 token 数，越大，回答问题的时候，机器能回答的字就越多。
2. **Temperature：** 这个主要是控制模型生成结果的随机性。简而言之，温度越低，结果越确定，但也会越平凡或无趣。如果你想要得到一些出人意料的回答，不妨将这个参数调高一些。但如果你的场景是基于事实的场景，比如数据提取、FAQ 场景，此参数就最好调成 0。

其他参数不去管它就好，问题不大。

#### 第四步：设置 OpenAI API Key[​](https://learningprompt.wiki/docs/chatGPT/tutorial-extras/Build-AI-bots-based-on-knowledge-base-content#%E7%AC%AC%E5%9B%9B%E6%AD%A5%E8%AE%BE%E7%BD%AE-openai-api-key) <a href="#di-si-bu-she-zhi-openaiapikey" id="di-si-bu-she-zhi-openaiapikey"></a>

这个需要你登录 OpenAI（注意是 OpenAI 不是 ChatGPT），点击右上角的头像，点击 View API Keys，或者你[点击这个链接](https://platform.openai.com/account/api-keys)也可以直接访问。然后点击「Create New Secret Key」，然后复制那个 Key 并粘贴到文档里即可。

<img src="https://learningprompt.wiki/assets/images/OpenAIAPI-b39810d072586f12a261d551248169dd.png" alt="OpenAIAPI.png" height="2248" width="2854">

#### 第五步：构建索引[​](https://learningprompt.wiki/docs/chatGPT/tutorial-extras/Build-AI-bots-based-on-knowledge-base-content#%E7%AC%AC%E4%BA%94%E6%AD%A5%E6%9E%84%E5%BB%BA%E7%B4%A2%E5%BC%95) <a href="#di-wu-bu-gou-jian-suo-yin" id="di-wu-bu-gou-jian-suo-yin"></a>

这一步程序会将第一步导入的数据都跑一遍，并使用 OpenAI 的 embedings API。如果第一步你上传了自己的数据，只需要将 ' ' 里的 Jimmy-Newsletter-Corpus 修改为你上传的文件夹名称即可。

**注意：**

* 这一步会耗费你的 OpenAI 的 Credit，1000 个 token 的价格是 $0.02，运行以下代码前需要注意你的账号里是否还有钱。
* 如果你用的 OpenAI 账号是个免费账号，你有可能会遇到频率警告，此时可以等一等再运行下方代码（另外你的导入的知识库数据太多，也会触发）。解除这个限制，最好的方式是在你的 OpenAI 账号的 Billing 页面里绑定信用卡。如何绑卡，需要各位自行搜索。

#### 第六步：提问[​](https://learningprompt.wiki/docs/chatGPT/tutorial-extras/Build-AI-bots-based-on-knowledge-base-content#%E7%AC%AC%E5%85%AD%E6%AD%A5%E6%8F%90%E9%97%AE) <a href="#di-liu-bu-ti-wen" id="di-liu-bu-ti-wen"></a>

这一步你就可以试试提问了，如果你在第一步导入的是我预设的数据，你可以试试问以下问题：

* Issue 90 主要讲了什么什么内容？
* 推荐一本跟 Issue 90 里提到的书类似的书

如果你导入的是自己的资料，也可以问以下几个类型的问题：

* 总结
* 提问
* 信息提取


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://wiki.aig123.com/chatgpt-tutorial/gao-ji-pian/da-jian-ji-yu-zhi-shi-ku-nei-rong-de-ji-qi-ren.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
