Vector Databases & Embeddings

向量数据库和嵌入是当前 AI 中的热门话题。

向量数据库公司 Pinecone 刚刚以约 1b 的估值筹集了 1 亿美元。

Shopify、Brex、Hubspot 和其他公司将它们用于他们的 AI 应用程序

但它们是什么，它们如何工作以及为什么它们在 AI 中如此重要？

首先，什么是向量嵌入？
简单的解释是：

嵌入只是数字的 N 维向量。它们可以代表任何东西，文本、音乐、视频等。我们将专注于文本。

创建嵌入的过程很简单。它涉及一个嵌入模型（例如：来自 Openai 的 Ada）。

将文本发送到模型，它会为您创建该数据的矢量表示，可以存储并在以后使用。

向量数据库很重要的原因是，它们赋予了我们语义搜索的能力，也就是通过相似性进行搜索。就像通过文本的含义。

在这个例子中，我们可以在向量平面上建模一个男人、国王、女人和皇后，并非常容易地看到他们彼此之间的关系。

这是一个更直接的例子： 想象你是一个孩子，手里拿着一大盒玩具。现在您想找到类似的玩具，例如玩具车和玩具巴士。 它们都是车辆，所以它们很相似。

这就是所谓的 “语义相似性”。 - 当事物具有相似的含义 / 想法时。

现在假设有两个相关但不相同的玩具。就像玩具车和玩具路。它们不一样，但确实属于同一类，因为汽车通常在路上行驶。

那么，为什么它们如此重要？嗯，这是因为 LLM 的上下文限制。

在理想情况下，我们可以将无限数量的单词放入 LLM 提示中。但我们做不到。现在它限制在～4096 - 32k Token。

由于 LLM 的 “记忆”，也就是我们可以在其 Token 限制中容纳多少单词，因此我们严格限制了如何与 LLM 进行交互。

这就是为什么不能将 PDF 复制粘贴到 chatGPT 并要求它对其进行总结。 （也许你现在可以使用 gpt4-32k）

现在这一切最终是如何拼凑起来的？我们可以利用向量嵌入来将相关文本注入到 LLM 上下文窗口中。 让我们看一个例子：

假设您有一个巨大的 PDF，也许是国会听证会之一（呵呵） 而且你很懒惰，所以你不想阅读整篇文章，而且你无法粘贴整篇文章，因为它有十亿页长。

你首先获取 PDF，创建矢量嵌入 (vector embedding)，并将其存储在数据库中。 现在你问一个问题，“他们对 xyz 说了什么” 。首先：创建一个你问题的 embedding：“他们对 xyz 说了什么”

现在我们有两个向量：你的问题 [1,2,3] 和 pdf [1,2,3,34] 然后我们使用相似性搜索将问题向量与我们的巨型 PDF 向量进行比较。 openai 推荐的是余弦相似度。

现在我们有： 3 个最相关的 Embedding 和文本。我们现在可以使用 3 的输出，并通过一些 prompt Engineering 将其喂给 LLM。

最常见的是：根据上下文，如实回答用户问题。如果做不到，那就说 “我无法回答这个问题”，就是这样！LLM 从 PDF 中提取相关文本块并尝试如实回答问题。

这是对 Embedding 和 LLM 如何为任何形式的数据提供类似聊天功能的基本解释。这也是所有那些 “chat with your site/pdf/blah blah” 的工作方式！这并不是微调，只是一个营销术语。

Embedding 是数据的 n 纬向量表示，无论是文本、图片、音频、视频都可以做 Embedding。

chatfile 类产品主要用的是文本 Embedding

做法：

1）把 PDF 切分成小的文本片段，通过 OpenAI 的 Ada 模型创建 Embedding 放到本地或远程向量数据库。

2）把用户的提问也创建成 Embedding，用它和之前创建的 PDF 向量比对，通过语义相似性搜索（余弦算法），找到最相关的文本片段。比关键词搜索好的一点是不要求关键词包含，也能发现文本相关性，比如汽车和公路。

3）把用户提问和相似文本片段发给 OpenAI，写 Prompt 要求 ChatGPT 基于给定的内容生成回答，如果没有相似文本或关联度不高，回答不知道。

为避免 ChatGPT 乱发挥，一般 Temperture 会设置的很低甚至为 0

注意：这种方法实用性仍然比较有限，质量也不好，虽有一定调优空间（文本切片，问答对）

现在这么做也是不得已，因为 ChatGPT 的上下文记忆 token 有限（32k 会好一些），不能直接丢超长文档让它分析。