跟随资金流向...
随着利率上升,风险投资在过去一年里已经下降。随着“免费资金”的时代似乎已经结束,了解“明智的资金”投资的方向是始终对你最有利的。
**Pinecone: **“2,800万美元将搜索引入AI时代” —2022年3月29日
LangChain: “宣布由Benchmark领导的1,000万美元种子轮” — 2023年4月4日
Chroma: “Chroma获得1,800万美元的种子轮融资” — 2023年4月6日
数据库的演变——从关系型到向量型
数据管理的演变已经从关系型(SQL)数据库转向了NoSQL数据库,后者专为处理非结构化或半结构化数据提供更大的灵活性。向量数据库代表了这种演变的下一步,提供了一种优化的解决方案,用于管理和查询高维向量数据(即向量嵌入),这种数据通常由机器学习和人工智能应用程序生成。
高维空间
向量嵌入是对象(如单词、图像或其他数据点)的数值表示,位于高维空间中。
高维空间是一个数学概念,表示一个具有许多维度的空间,其中每个维度都是数据的单独轴或特征。在实际应用中,高维空间是描述具有许多特征或属性的数据的一种方式。
它们是使用机器学习模型或预训练的神经网络生成的。这些嵌入捕捉对象之间的关系和相似之处,使计算机更容易理解和处理数据。
向量、嵌入和维度的简化
假设你有一组单词,并且想要以计算机可以理解和处理的方式表示它们。一种方法是使用称为“嵌入”的东西。
将嵌入视为将单词转换为地图上的点的一种方法。每个单词在地图上都有自己的位置,相似的单词彼此靠近,而不同的单词则相距很远。这个“地图”类似于网格,但不仅仅有两个方向(上/下和左/右)。
这个“地图”上的“方向”称为维度。每个维度就像单词的不同特征或特点。例如,一个维度可能表示单词的“快乐程度”,而另一个维度可能表示它是否是动物。我们拥有的维度越多,我们就能捕捉每个单词的特征越多。
“向量”类似于一组说明,告诉你如何到达单词在地图上的位置。它包含每个维度的数字,帮助你找到单词的确切位置。当我们谈论“向量嵌入”时,我们谈论的是这些表示单词在多维地图上位置的一组数字。
因此,简而言之,嵌入是将单词转换为具有许多方向(维度)的地图上的点的一种方法,向量是帮助我们在该地图上找到每个单词位置的数字集。
向量数据库
向量数据库,也称为相似性搜索数据库或最近邻搜索数据库,是专为高效存储和查询向量嵌入而设计的专业数据库。它们使你能够执行操作,例如查找与给定向量最相似的项目或搜索满足特定相似性条件的项目。
传统数据库没有针对这些任务进行优化,这就是向量数据库变得越来越受欢迎的原因。
如何使用Python集成向量数据库
现在我们已经定义了一些理论,让我们过渡到使用Pinecone、Chroma和LangChain的向量数据库的实际应用——所有这些都使用OpenAI向量嵌入。
PINECONE API
这段代码演示了如何使用Pinecone和OpenAI使用来自OpenAI的嵌入在一组文档上执行相似性搜索。
- 安装必要的库:pinecone-client和openai。
- 设置Pinecone和OpenAI API密钥以及Pinecone环境。
- 初始化Pinecone客户端并设置OpenAI API密钥。
- 定义一个名为
create_pinecone_index
的函数,以创建Pinecone索引(如果不存在)。 - 定义一个名为
complete
的函数,以生成给定提示的GPT-3.5-turbo模型的响应。 - 定义一个名为
get_ada_embedding
的函数,以使用OpenAI的“text-embedding-ada-002”模型获取输入文本的嵌入。 - 定义一个名为
upsert_to_index
的函数,以添加或更新给定文本的Pinecone向量。 - 定义一个名为
query_index
的函数,以在Pinecone索引上执行相似性搜索。 - 定义一个名为
print_results
的函数,以打印相似性搜索结果。 - 定义
main
函数,以执行主要操作:a. 创建Pinecone索引。b. 创建Pinecone索引的实例。c. (可选)定义文本并将其添加到Pinecone索引中。d. 定义查询文本并执行相似性搜索。e. 打印搜索结果。 - 执行
main
函数。 - 定义一个名为
fetch_vector
的函数,以从Pinecone索引中获取特定向量。 - 创建Pinecone索引的实例并(可选)打印获取的向量。
- 描述索引统计信息。
- (可选)从Pinecone索引中删除特定向量。
总之,这段代码演示了如何使用Pinecone和OpenAI在一组文档上执行相似性搜索,使用OpenAI的“text-embedding-ada-002”模型获取嵌入并使用Pinecone存储和查询这些嵌入。## CHROMA — 短暂存储选项
这段代码演示了如何使用ChromaDB和OpenAI对一组文档执行相似度搜索。
- 安装必要的库:chromadb和openai。
- 设置OpenAI API密钥。
- 创建ChromaDB客户端实例。
- 定义一个名为“complete”的函数,用于根据提示从GPT-3.5-turbo模型生成响应。
- 定义一个名为“get_ada_embedding”的函数,使用OpenAI的“text-embedding-ada-002”模型获取输入文本的嵌入。
- 设置ChromaDB表名。
- 从chromadb库中导入必要的实用程序。
- 使用OpenAI API密钥和“text-embedding-ada-002”模型创建一个OpenAI嵌入函数对象。
- 使用指定的表名和嵌入函数创建一个ChromaDB集合。
- 定义一个文本列表作为要索引和搜索的文档。
- 遍历文本,使用“get_ada_embedding”函数获取嵌入,并将其与元数据(文本内容)和唯一标识符一起添加到ChromaDB集合中。
- 定义相似度搜索的查询文本。
- 使用从查询文本获取的嵌入在ChromaDB集合上执行相似度搜索,并检索前3个最相似的结果。
- 以格式化的JSON表示打印搜索结果。
- 删除ChromaDB集合。
总之,这段代码演示了如何使用ChromaDB和OpenAI对一组文档执行相似度搜索,使用OpenAI的“text-embedding-ada-002”模型获取嵌入,并使用ChromaDB存储和查询这些嵌入。
LANGCHAIN VectorStore
这段代码安装了必要的库,并演示了如何使用两个不同的向量存储(Chroma和Pinecone)使用OpenAI的嵌入在一组文档上执行相似度搜索。
- 安装必要的库:pinecone-client、chromadb、openai、langchain和tiktoken。
- 设置Pinecone API密钥、Pinecone环境和OpenAI API密钥。
- 定义一个名为“get_ada_embedding”的函数,使用OpenAI的“text-embedding-ada-002”模型获取输入文本的嵌入。
- 创建一个文本列表,作为要索引和搜索的文档。
- 从langchain库中导入必要的类和模块。
- 使用OpenAI API密钥实例化“OpenAIEmbeddings”类。
- 定义相似度搜索的查询文本。
- 使用文本和OpenAI嵌入创建一个Chroma实例,使用查询执行相似度搜索,并打印结果。
- 使用Pinecone API密钥和环境初始化Pinecone。
- (已注释)从文本和OpenAI嵌入创建一个Pinecone实例,使用查询执行相似度搜索,并打印结果。
- 相反,从现有的Pinecone索引和OpenAI嵌入创建一个Pinecone实例,使用查询执行相似度搜索,并打印结果。
总之,该代码演示了如何使用LangChain库使用OpenAI嵌入在一组文档上执行相似度搜索,使用两个不同的向量存储:Chroma和Pinecone。
距离与相似度
虽然没有一种优选的方法来衡量由OpenAI创建的向量之间的相似度或距离,但余弦相似度是一种常见且广泛使用的方法,用于比较由语言模型如GPT-4生成的嵌入。
余弦相似度关注两个向量之间的角度而不是它们的大小,使其对嵌入的大小不太敏感。当比较来自语言模型的嵌入时,这种属性特别有用,因为它捕捉到高维空间中向量的相对方向,这通常表示单词或文本样本之间的语义关系。
然而,相似度或距离度量的选择最终取决于具体的任务和要求。在某些情况下,其他相似度度量,如欧几里得距离或基于相关性的度量,可能更合适。重要的是尝试不同的度量方法并评估它们在给定问题上的性能,以选择最合适的方法。
Pinecone与Chroma的比较& Pinecone/Chroma与LangChain的比较
存储位置的备选方案
Chroma提供本地短暂存储选项,这意味着向量数据存储在你的本地计算机或运行应用程序的计算机上。它不需要任何外部服务或数据库来存储数据。由于Chroma已经被开源,你也可以选择托管自己的实例。
Pinecone是一个托管的数据库持久性服务,这意味着向量数据存储在由Pinecone管理的远程基于云的数据库中。你的应用程序通过API与Pinecone服务交互,以存储和检索向量数据。## 数据持久化方案
Chroma 提供了短暂的选项,Chroma 中存储的数据仅在应用程序运行期间存在,一旦应用程序停止或机器重启,数据就会丢失。这个选项使 Chroma 适合于测试、实验或临时存储等用途。
Pinecone 提供了数据持久化功能,这意味着存储在 Pinecone 数据库中的向量数据即使在应用程序停止或机器重启后也会被保留。这使得 Pinecone(以及 Chroma 的自托管选项)适合长期存储和生产使用。
可扩展性方案
Chroma 的本地存储受本地机器资源(如内存和存储)的限制。随着数据的增长,你可能需要扩展机器的资源以处理增加的数据量。
作为托管服务,Pinecone 为你处理可扩展性方面的问题。随着数据的增长,Pinecone 会扩展基础架构以适应增加的数据。Pinecone 被设计为能够高效处理大规模向量数据的存储和检索,适用于生产使用。
直接库 vs. 抽象
Chroma/Pinecone Python 库: 这些库专门为各自的向量数据库服务而设计。它们提供直接访问 Chroma 和 Pinecone 的功能和特性,允许开发人员以更直观和服务特定的方式与底层向量数据库进行交互。
使用这些库,开发人员可以直接使用 Chroma 或 Pinecone 服务执行插入、获取和删除向量嵌入,以及直接执行相似性搜索等操作。
这些库专为那些想要专门使用 Chroma 或 Pinecone 并利用它们独特的功能和能力的开发人员量身定制。
LangChain 库: LangChain 是一个更通用的库,它抽象了不同的向量数据库的底层细节,包括 Chroma 和 Pinecone,为开发人员提供了一个统一的接口来处理各种向量数据库。
使用 LangChain 的主要优点是它简化了将不同的向量数据库集成到应用程序中的过程。开发人员可以在不必学习和实现每个服务的单独库的情况下在不同的数据库之间切换或使用多个数据库。
LangChain 适用于那些希望以更灵活、适应性强的方式处理向量数据库,而不是致力于特定服务或受其特定实现限制的开发人员。
结论
生成式智能体记忆
在《生成式智能体:交互式人类行为模拟》一文中,描述了一个近未来的场景,即生成式智能体通过使用大型语言模型存储经验、规划和反思,模拟人类行为并在交互式应用程序中使用向量数据库存储和检索记忆。
随着基于大型语言模型的应用程序开发朝着创建具有记忆的自主人工智能代理(例如 BabyAGI、AutoGPT 等)的方向发展,向量数据库的需求预计将显著增长。
资源
译自:https://medium.com/sopmac-ai/vector-databases-as-memory-for-your-ai-agents-986288530443
评论(0)