Python 矢量数据库和矢量索引:构建 LLM 应用程序
推荐:使用NSDT场景编辑器助你快速搭建可二次编辑的3D应用场景
由于使用其硬件创建的生成式AI应用程序,Nvidia经历了显着的增长。另一项软件创新,矢量数据库,也正在乘着生成式人工智能的浪潮。
开发人员正在向量数据库上用Python构建AI驱动的应用程序。通过将数据编码为向量,他们可以利用向量空间的数学特性在非常大的数据集中实现快速相似性搜索。
让我们从基础开始!
矢量数据库基础知识
矢量数据库将数据作为数字矢量存储在坐标空间中。这允许通过余弦相似性等操作计算向量之间的相似性。
最接近的向量表示最相似的数据点。与标量数据库不同,矢量数据库针对相似性搜索进行了优化,而不是复杂的查询或事务。
检索类似的向量只需几毫秒而不是几分钟,甚至跨越数十亿个数据点也是如此。
矢量数据库构建索引以按邻近度有效地查询矢量。这有点类似于文本搜索引擎如何索引文档以进行快速全文搜索。
与传统数据库相比,矢量搜索对开发人员的好处
对于开发人员,矢量数据库提供:
- 快速相似性搜索 - 在毫秒内找到相似向量
- 支持动态数据 - 使用新数据不断更新向量
- 可扩展性 - 跨多台计算机扩展矢量搜索
- 灵活的架构 - Vector 可以存储在本地、云对象存储或托管数据库中
- 高维数 - 为每个向量索引数千维
- API - 如果您选择托管矢量数据库,它通常带有干净的查询 API 以及与一些现有数据科学工具包或平台的集成。
矢量搜索(矢量数据库的关键功能)支持的流行用例示例如下:
- 视觉搜索 - 查找相似的产品图片
- 建议 - 建议内容
- 聊天机器人 - 将查询与意图相匹配
- 搜索 - 从文本矢量显示相关文档
矢量搜索开始获得关注的用例是:
- 异常检测 - 识别异常值向量
- 药物发现 - 通过属性载体关联分子
什么是 Python 矢量数据库?
包含支持矢量数据库完整生命周期的 Python 库的矢量数据库是 Python 矢量数据库。数据库本身不需要用 Python 构建。
这些 Python 矢量数据库库应该支持什么?
对向量数据库的调用可以分为两类 - 数据相关和管理相关。好消息是它们遵循与传统数据库类似的模式。
库应支持的数据相关功能
库应支持的标准管理相关功能
现在让我们继续一个更高级的概念,我们讨论在这些数据库之上构建LLM应用程序
构建 LLM 应用程序
在我们深入研究矢量搜索驱动的LLM应用程序的架构之前,让我们从工作流程的角度了解所涉及的内容。
典型的工作流程包括:
- 扩充或清理数据。这是一个轻量级数据转换步骤,可帮助提高数据质量和一致的内容格式。这也是可能需要丰富数据的地方。
- 通过模型将数据编码为向量。这些模型包括一些转换器(例如句子转换器)
- 将向量插入向量数据库或向量索引(我们将很快解释)
- 通过 Python API 公开搜索
- 文档编排工作流
- 在应用和 UI(例如聊天 UI)中测试和可视化结果
现在让我们看看如何使用不同的架构组件启用此工作流的不同部分。
对于 1) 您可能需要开始从其他源系统(包括关系数据库或内容管理系统)获取元数据。
对于上面的步骤 2),预训练模型几乎总是首选。OpenAI 模型是通过托管产品提供的最受欢迎的模型。出于隐私和安全原因,可以托管本地模型。
对于 3),如果需要执行大型相似性搜索(例如在具有超过 <> 亿条记录的数据集中),则需要矢量数据库或矢量索引。从企业的角度来看,在执行“搜索”之前,您通常有更多的上下文。
对于上面的4),好消息是公开的搜索通常遵循类似的模式。类似于以下代码的内容:
从 松果
index = pinecone.Index("example-index")
index.upsert([
("A", [0.1, 0.1, 0.1, 0.1], {"genre": "comedy", "year": 2020}),
)
index.query(
vector=[0.1, 0.1, 0.1, 0.1],
filter={
"genre": {"$eq": "documentary"},
"year": 2019
},
top_k=1,
)
这里有一句有趣的台词是这样的:
filter={
"genre": {"$eq": "documentary"},
"year": 2019
},
它确实将结果过滤到“流派”和“年份”附近的向量。您还可以按概念或主题过滤矢量。
现在的挑战是,在企业环境中,它包括其他业务过滤器。解决来自数据源的数据缺乏建模的问题非常重要(想想表结构和元数据)。通过减少与结构化数据相矛盾的错误表达式来提高文本保真度非常重要。.在这种情况下,需要“数据流水线”策略,而企业的“内容匹配”开始变得重要。
对于 5) 除了扩展摄取的常见挑战之外,不断变化的语料库也有其自身的挑战。新文档可能需要对整个语料库进行重新编码和重新索引,以保持载体的相关性。
对于6)这是一个全新的领域,除了测试相似性水平之外,还需要一种人工在环方法,以确保整个搜索范围的质量。
自动搜索评分以及不同类型的上下文评分并非易事。
Python Vector Index:现有数据库的更简单的矢量搜索替代方案。
矢量数据库是一个复杂的系统,支持上下文搜索,如上例所示,以及所有其他数据库功能(创建、插入、更新、删除、管理等)。
病媒数据库的例子包括Weaviate和Pinecone。这两者都公开了Python API。
有时,更简单的设置就足够了。作为更轻的替代方案,您可以使用已经使用的任何存储,并基于它添加矢量索引。此矢量索引用于仅检索具有上下文的搜索查询,例如,用于生成 AI 用途。
在矢量索引设置中,您有:
- 您通常的数据存储(例如PostgreSQL或包含文件的磁盘目录)提供了您需要的基本操作:创建,插入,更新,删除。
- 您的矢量索引,可以对您的数据进行基于上下文的快速搜索。
为你实现向量索引的独立Python库包括FAISS,Pathway LLM,Annoy。
好消息是,矢量数据库和矢量索引的LLM应用程序工作流程是相同的。主要区别在于,除了 Python 矢量索引库之外,您还可以继续使用现有数据库进行“正常”数据操作和数据管理。例如,如果您使用的是PostgreSQL,这可能是Psycogg,或者如果您将数据存储在文件中,则可以使用标准的Python“fs”模块。
矢量指数的支持者关注以下优点:
- 数据隐私:确保原始数据安全不受干扰,最大限度地降低数据暴露风险。
- 成本效益:降低与额外存储、计算能力和许可相关的成本。
- 可扩展性:通过减少要管理的组件数量来简化扩展。
何时使用矢量数据库与矢量索引?
当满足以下一项或多项条件时,矢量数据库非常有用
- 您有大规模处理矢量数据的特殊需求
- 您正在为矢量创建一个独立的专用应用程序
- 您不希望在其他类型的应用程序中对存储的数据进行其他类型的使用。
当满足以下一项或多项条件时,矢量索引很有用
- 您不想信任用于数据存储的新技术
- 您现有的存储很容易从 Python 访问。
- 相似性搜索只是其他大型企业 BI 和数据库需求中的一种功能
- 您需要能够将向量附加到现有标量记录
- 您需要一种统一的方式来处理数据工程团队的管道
- 您需要对数据进行索引和图形结构,以帮助完成LLM应用程序或任务
- 您需要来自其他来源的增强输出或增强上下文
- 您希望从语料库创建可应用于事务数据的规则
企业矢量搜索的未来
矢量搜索为开发人员解锁了改变游戏规则的功能。随着模型和技术的改进,预计矢量数据库或矢量索引将成为应用程序堆栈不可或缺的一部分。
我希望这个概述为探索 Python 中的矢量数据库和矢量索引提供一个坚实的起点。如果您对最近开发的矢量索引感到好奇,请查看此开源项目。