GPT 很擅长回答内容,但话题仅限于它从训练数据中记忆的内容。
怎样让 GPT 回答它不熟悉的话题?比如:
- 2021 年 9 月后发生的时事
- 你的非公开文档
- 过往对话的信息
- 等等...
这篇文章展示了通过以下两个步骤来让 GPT 能根据文本库回答问题。
- 搜索:搜索文本库中的相关内容章节
- 提问:把取回的数据插入到发送给 GPT 的消息中并就此提问
为什么搜索优于 fine-tuning
GPT 有两种途径学习知识:
- 通过模型权重学习(比如通过训练集对模型进行 fine-tuning)
- 通过模型输入(比如插入知识到输入消息中)
即使 fine-tuning 看起来是更符合直觉的选择 -- GPT 已经习得的所有知识都来自于数据训练,但我们仍不推荐通过这种方式为模型输入知识。Fine-tuning 更适用于特定任务形式和风格的教学,但用于回忆事实内容不太可靠。
打个比方,模型权重更像是长期记忆。对模型 fine-tuning 就像是在考前若干天复习一样。真正到考试的时候模型很容易忘记细节或者记混。
相比之下消息输入更像是短期记忆。在消息中插入知识就像是带着笔记开卷考。笔记在手,模型就更容易找到正确答案。
文本搜索相对于 fine-tuning 的有一个缺点在于它会受限于模型的最大输入文本量:
| 模型 | 最大文本量 |
|---|---|
| gpt-3.5-turbo | 4,096 tokens(约 5 页) |
| gpt-4 | 8,192 tokens(约 10 页) |
| gpt-4-32k | 32,768 tokens(约 40 页) |
你可以认为对这样一个学生来说,即使架子上全是教科书,它一次最多也只能看进去几页内容。
因此我们建议使用基于搜索的方式来实现构建一个能运用庞大文本资料来进行回答的系统。
搜索
有很多种方法可以搜索文本,比如:
- 关键词搜索
- 图搜索
- 嵌入搜索
本文选用的就是嵌入搜索。嵌入(Embeddings)实现简单并且尤其适合用于提问,因为问题很多时候不会包含对应答案的关键词。
你可以把只运用嵌入技术搭建初版搜索系统。更优秀的搜索系统还会结合多种不同的搜索方法,以及流行度、最新性、用户历史记录、与先前搜索结果的冗余性、点击率数据等特征。Q&A 检索性能还可以通过类似 HyDE 之类的技术来优化,即将问题先转换为假设的回答再用于嵌入搜索。同样,GPT也有可能通过自动将问题转化为一组关键词或搜索术语来改善搜索结果。
完整流程
具体来说本文的演示包含这几个步骤:
- 准备搜索数据(每个文档各一次)
- 收集:下载几百个有关 2022 年奥运会的百科词条
- 分块:将文本分成短小的、基本和上下文独立的章节用于嵌入
- 嵌入:使用 OpenAI API 嵌入各个章节
- 储存:保存嵌入的结果(对于大型数据集请使用向量数据库)
- 搜索(每次问答时)
- 给出用户的提问,并使用 OpenAI API 生成对应的 embedding 数据
- 使用 embedding 找到和用户问题关联性最强的文本章节
- 提问(每次问答时)
- 将问题和最相关的章节插入到发给 GPT 的消息里
- 返回 GPT 的答案
开销
由于 GPT 的费用远高于 embedding 搜索,常见规模的搜索系统其成本主要取决于第三步:
- 对于
gpt-3.5-turbo每次查询使用约 1,000 tokens,即每次花费约 $0.002,或者说约每 500 次查询花费一美元(2023 年 4 月)。 - 对于
gpt-4如果每次查询同样是使用约 1,000 tokens,即每次花费约 $0.03,或者说约每 30 次查询花费一美元(2023 年 4 月)。