Python向量数据库和向量索引:LLM应用程序的架构
Python向量数据库和向量索引:LLM应用程序架构
由于使用他们的硬件创建的生成式AI应用程序,Nvidia取得了显著增长。另一项软件创新——向量数据库,也正在乘坐生成式AI的浪潮。
开发人员正在使用Python构建基于向量数据库的AI应用程序。通过将数据编码为向量,他们可以利用向量空间的数学特性,在非常大的数据集上实现快速相似性搜索。
让我们从基础知识开始!
向量数据库基础知识
向量数据库将数据存储为坐标空间中的数值向量。这使得可以通过余弦相似性等操作计算向量之间的相似性。
最接近的向量表示最相似的数据点。与标量数据库不同,向量数据库优化了相似性搜索,而不是复杂的查询或事务。
检索相似向量只需几毫秒,即使在数十亿个数据点之间也是如此。
向量数据库构建索引以高效地查询接近的向量。这在某种程度上类似于文本搜索引擎为快速全文搜索索引文档。
向量搜索相对于传统数据库对开发人员的优势
对于开发人员来说,向量数据库提供以下优势:
- 快速相似性搜索 – 在几毫秒内找到相似的向量
- 支持动态数据 – 不断更新包含新数据的向量
- 可扩展性 – 在多台计算机上扩展向量搜索
- 灵活的架构 – 向量可以存储在本地、云对象存储或托管数据库中
- 高维度 – 每个向量可以索引数千个维度
- API – 如果选择托管的向量数据库,通常会提供清晰的查询API和与某些现有数据科学工具包或平台的集成。
向量搜索提供的关键功能(向量数据库的关键功能)支持的流行用例示例如下:
- 视觉搜索 – 查找相似的产品图像
- 推荐 – 推荐内容
- 聊天机器人 – 将查询与意图匹配
- 搜索 – 从文本向量中找到相关文档
向量搜索开始引起关注的用例包括:
- 异常检测 – 识别异常向量
- 药物研发 – 通过属性向量关联分子
什么是Python向量数据库?
Python向量数据库是指包含支持向量数据库完整生命周期的Python库的向量数据库。数据库本身不需要用Python构建。
这些Python向量数据库库应该支持什么?
对向量数据库的调用可以分为两类——数据相关和管理相关。好消息是,它们与传统数据库遵循类似的模式。
库应该支持的数据相关函数
库应该支持的标准管理相关函数
现在让我们进一步讨论在这些数据库之上构建LLM应用程序的体系结构之前,先了解涉及的工作流程。
构建LLM应用程序
在深入讨论基于向量搜索的LLM应用程序的架构之前,让我们从工作流程角度了解所涉及的内容。
典型的工作流程包括:
- 丰富或清理数据。这是一个轻量级的数据转换步骤,用于改善数据质量和一致的内容格式。这也是数据可能需要丰富的地方。
- 通过模型将数据编码为向量。模型中包含了一些转换器(例如句子转换器)
- 将向量插入向量数据库或向量索引(我们稍后会解释)
- 通过Python API公开搜索功能
- 文档编排工作流程
- 在应用程序和用户界面(例如聊天界面)中进行测试和可视化结果
现在让我们看看如何使用不同的架构组件来启用工作流的不同部分。
对于1),您可能需要从其他源系统(包括关系数据库或内容管理系统)开始获取元数据。
对于2),几乎总是首选预训练模型。OpenAI模型是通过托管服务提供的最受欢迎的模型。出于隐私和安全原因,您可能会托管本地模型。
对于3),如果您需要执行大型相似性搜索(例如在拥有十亿条记录的数据集中),则需要一个向量数据库或向量索引。从企业的角度来看,在进行“搜索”之前,您通常会有更多的上下文。
对于上述的4),好消息是,暴露的搜索通常遵循类似的模式。大致如下代码:
From Pinecone
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
},
它真正地将结果过滤到与“genre”和“year”接近的向量。您还可以通过概念或主题来过滤向量。
现在,在企业环境中的挑战是它包括其他业务过滤器。解决来自数据源的数据建模不足问题非常重要(考虑表结构和元数据)。在这种情况下,需要采用“数据管道”策略,并开始关注企业“内容匹配”。
对于5),除了扩展数据摄取的常规挑战外,不断变化的语料库还具有自己的挑战。新文档可能需要重新编码和重新索引整个语料库,以保持向量的相关性。
对于6),这是一个全新的领域,需要人工参与以测试相似性水平,以确保在搜索的各个方面都有质量。
自动化搜索评分以及不同类型的上下文评分并不是一项容易完成的任务。
Python向量索引:一个更简单的向量搜索替代方案,适用于您现有的数据库。
向量数据库是一种复杂的系统,可以实现上述示例中的上下文搜索以及所有其他附加的数据库功能(创建、插入、更新、删除、管理等)。
向量数据库的示例包括Weaviate和Pinecone。这两者都提供了Python API。
有时,一个更简单的设置就足够了。作为一个更轻量级的选择,您可以使用您已经在使用的存储,并在其基础上添加一个基于向量的索引。此向量索引用于仅检索具有上下文的搜索查询,例如用于生成式人工智能。
在向量索引设置中,您有:
- 您通常的数据存储(例如PostgreSQL或磁盘目录中的文件)提供所需的基本操作:创建、插入、更新、删除。
- 您的向量索引使您能够对数据进行快速的基于上下文的搜索。
为您实现向量索引的独立Python库包括FAISS、Pathway LLM和Annoy。
好消息是,向量数据库和向量索引的LLM应用工作流程是相同的。主要区别在于,除了使用Python向量索引库外,您还继续使用现有的数据库进行“正常”数据操作和数据管理。例如,如果您使用PostgreSQL,则可以使用Psycopg,如果您将数据存储在文件中,则可以使用标准的Python“fs”模块。
向量索引的支持者关注以下优势:
- 数据隐私:保持原始数据安全且不受干扰,最大程度减少数据暴露风险。
- 成本效益:降低与额外存储、计算能力和许可相关的成本。
- 可伸缩性:通过减少要管理的组件数量简化扩展。
何时使用向量数据库而不是向量索引?
当以下情况之一为真时,向量数据库非常有用:
- 您需要在大规模上处理向量数据
- 您正在为向量创建一个独立的特定用途的应用程序
- 您不希望在其他类型的应用程序中使用存储的数据
当以下情况之一为真时,向量索引非常有用:
- 您不希望将新技术用于数据存储
- 您现有的存储可以轻松从Python访问
- 您的相似性搜索只是更大型企业BI和数据库需求中的一个功能
- 您需要能够将向量附加到现有的标量记录上
- 您需要一种统一的方法来处理数据工程团队的管道
- 您需要在数据上具有索引和图结构,以帮助您的LLM应用程序或任务
- 您需要来自其他来源的增强输出或增强上下文
- 您希望从语料库中创建适用于事务数据的规则
企业向量搜索的未来
向量搜索为开发人员提供了具有重大影响的功能。随着模型和技术的改进,预计向量数据库或向量索引将成为应用程序堆栈的重要组成部分。
我希望这个概述为在Python中探索向量数据库和向量索引提供了一个坚实的起点。如果您对最近开发的向量索引感兴趣,请查看这个开源项目。Anup Surendran是一位产品和产品营销副总裁,专注于将AI产品推向市场。他曾与两家成功退出的初创公司(SAP和Kroll)合作,并乐于教授他人如何利用AI产品提高组织的生产力。