Python 矢量数据库和矢量索引:构建 LLM 应用程序

news2025/1/25 4:35:35

 

Python 矢量数据库和矢量索引:构建 LLM 应用程序

 

推荐:使用 NSDT场景编辑器 助你快速搭建可二次编辑的3D应用场景

由于使用其硬件创建的生成式AI应用程序,Nvidia经历了显着的增长。另一项软件创新,矢量数据库,也正在乘着生成式人工智能的浪潮。

开发人员正在向量数据库上用Python构建AI驱动的应用程序。通过将数据编码为向量,他们可以利用向量空间的数学特性在非常大的数据集中实现快速相似性搜索。

让我们从基础开始!

矢量数据库基础知识

矢量数据库将数据作为数字矢量存储在坐标空间中。这允许通过余弦相似性等操作计算向量之间的相似性。

最接近的向量表示最相似的数据点。与标量数据库不同,矢量数据库针对相似性搜索进行了优化,而不是复杂的查询或事务。

检索类似的向量只需几毫秒而不是几分钟,甚至跨越数十亿个数据点也是如此。

矢量数据库构建索引以按邻近度有效地查询矢量。这有点类似于文本搜索引擎如何索引文档以进行快速全文搜索。

与传统数据库相比,矢量搜索对开发人员的好处

对于开发人员,矢量数据库提供:

  • 快速相似性搜索 - 在毫秒内找到相似向量
  • 支持动态数据 - 使用新数据不断更新向量
  • 可扩展性 - 跨多台计算机扩展矢量搜索
  • 灵活的架构 - Vector 可以存储在本地、云对象存储或托管数据库中
  • 高维数 - 为每个向量索引数千维
  • API - 如果您选择托管矢量数据库,它通常带有干净的查询 API 以及与一些现有数据科学工具包或平台的集成。

矢量搜索(矢量数据库的关键功能)支持的流行用例示例如下:

  • 视觉搜索 - 查找相似的产品图片
  • 建议 - 建议内容
  • 聊天机器人 - 将查询与意图相匹配
  • 搜索 - 从文本矢量显示相关文档

矢量搜索开始获得关注的用例是:

  • 异常检测 - 识别异常值向量
  • 药物发现 - 通过属性载体关联分子

什么是 Python 矢量数据库?

包含支持矢量数据库完整生命周期的 Python 库的矢量数据库是 Python 矢量数据库。数据库本身不需要用 Python 构建。

这些 Python 矢量数据库库应该支持什么?

对向量数据库的调用可以分为两类 - 数据相关和管理相关。好消息是它们遵循与传统数据库类似的模式。

库应支持的数据相关功能

Python 矢量数据库和矢量索引:构建 LLM 应用程序

库应支持的标准管理相关功能

Python 矢量数据库和矢量索引:构建 LLM 应用程序

现在让我们继续一个更高级的概念,我们讨论在这些数据库之上构建LLM应用程序

构建 LLM 应用程序

在我们深入研究矢量搜索驱动的LLM应用程序的架构之前,让我们从工作流程的角度了解所涉及的内容。

典型的工作流程包括:

  1. 扩充或清理数据。这是一个轻量级数据转换步骤,可帮助提高数据质量和一致的内容格式。这也是可能需要丰富数据的地方。
  2. 通过模型将数据编码为向量。这些模型包括一些转换器(例如句子转换器)
  3. 将向量插入向量数据库或向量索引(我们将很快解释)
  4. 通过 Python API 公开搜索
  5. 文档编排工作流
  6. 在应用和 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 中的矢量数据库和矢量索引提供一个坚实的起点。如果您对最近开发的矢量索引感到好奇,请查看此开源项目。

原文链接:Python 矢量数据库和矢量索引:构建 LLM 应用程序 (mvrlink.com)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/894581.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

LocalDate,LocalDateTime,LocalTime开发中基本用法

LocalDate,LocalDateTime,LocalTime开发中基本用法 一 简要说明 package java.time; LocalDate 在ISO-8601日历系统中没有时区的日期&#xff0c;例如 2023-08-19。它是一个表示日期的不可变日期时间对象&#xff0c;常被视为年-月-日。其他日期字段&#xff0c;如年月日&…

UE4/5Niagara粒子特效之拖尾渐变

目录 开始操作 发射器一的制作 添加新的模块 ​编辑 让粒子长久存在 添加颜色 发射器二的制作 第三人称模板添加Niagara 效果 添加颜色 效果 隐藏第一个发射器 开始操作 首先创建一个粒子系统&#xff0c;用Fountain这个模板&#xff1a; 发射器一的制作 将不需要的…

vue上传图片并修改png图片颜色

场景 当涉及到在 Vue 中上传图片并修改 PNG 图片的颜色时&#xff0c;这个任务涵盖了文件上传、图像处理、Canvas 操作等多个方面 在现代 Web 开发中&#xff0c;图片的处理是常见的需求之一。本文将带您深入探讨如何使用 Vue.js 来实现图片上传&#xff0c;并在客户端使用 Can…

奖金丰厚 等你来拿!第六届开源创新大赛飞桨赛道下半场来啦

最近想要充个电&#x1f50b; 飞桨邀你开启开源贡献之旅 寻找那个最“会”的你 顶级开源项目、资深研发指导 高阶开发者合作交流 Buff 叠满&#xff01; 技能提升、丰富简历、高额奖金 你还不心动&#xff1f; 赛事简介 中国软件开源创新大赛已成功举办五届&#xff…

国企数字化办公实践: 泛微助力中国港湾用OA实现营销数字化管理

中国港湾工程有限责任公司(CHEC)成立于上世纪80年代&#xff0c;是世界500强企业中国交通建设股份有限公司(CCCC)的子公司&#xff0c;代表中国交建开拓海外市场。 目前&#xff0c;中国港湾在世界各地设有90多个分(子)公司和办事处&#xff0c;业务涵盖100多个国家和地区&…

网络游戏同步:状态同步核心原理剖析

状态同步是做网络游戏必然要掌握的一种服务端/客户端同步技术。什么是状态同步&#xff0c;具体到游戏中是如何实现的&#xff0c;带着这些问题本文将会从以下3个方面給大家详细的剖析状态同步。 对啦&#xff01;这里有个游戏开发交流小组里面聚集了一帮热爱学习游戏的零基础小…

【正点原子STM32连载】第十三章 按键输入实验 摘自【正点原子】APM32F407最小系统板使用指南

1&#xff09;实验平台&#xff1a;正点原子stm32f103战舰开发板V4 2&#xff09;平台购买地址&#xff1a;https://detail.tmall.com/item.htm?id609294757420 3&#xff09;全套实验源码手册视频下载地址&#xff1a; http://www.openedv.com/thread-340252-1-1.html# 第十…

高忆管理:低位缩量上涨说明什么?

在股票商场中&#xff0c;股票价格在低位缩量上涨是一种常见的走势。那么&#xff0c;低位缩量上涨究竟阐明了什么&#xff1f;本篇文章将从多个角度剖析&#xff0c;并给出全文摘要和3个关键词。 一、什么是低位缩量上涨&#xff1f; 低位缩量上涨是指股票价格在前期低点的邻…

jenkins同一jar包部署到多台服务器

文章目录 安装插件配置ssh服务构建完成后执行 没有部署过可以跟这个下面的步骤先部署一遍&#xff0c;我这篇主要讲jenkins同一jar包部署到多台服务器 【Jenkins】部署Springboot项目https://blog.csdn.net/qq_39017153/article/details/131901613 安装插件 Publish Over SSH 这…

angular中如何定义一个全局组件?

需求&#xff0c;我们需要新建一个navBreadcrumb的全局组件。这是一个面包屑导航&#xff0c;在不同的页面引入时传入一个路由数组即可。 第一步&#xff1a;我们新建这个组件&#xff1a; ng g c navBreadcrumb ng g m navBreadcrumb----------nav-breadcrumb.module-------…

文件和目录的基础操作

cat命令 concatenate(连接)的缩写&#xff0c;即 combine pieces together 1&#xff09;把碎片组合在一起&#xff08;意味着可以使用cat创建一个小文件&#xff09; 2&#xff09;显示文件 ──(root㉿kali)-[~] └─# cat /etc/resolv.conf # Generated by NetworkManager…

数字孪生和SCADA有哪些区别?

虽然SCADA和数字孪生用于工业领域&#xff0c;但它们有不同的用途。SCADA专注于工业过程的实时监测和控制&#xff0c;而数字孪生用于模拟和分析系统的性能。接下来&#xff0c;让我们详细讨论SCADA和数字孪生&#xff08;SCADA与数字孪生&#xff09;之间的区别。 SCADA与数字…

Python Opencv实践 - 图像仿射变换

import cv2 as cv import numpy as np import matplotlib.pyplot as pltimg cv.imread("../SampleImages/pomeranian.png", cv.IMREAD_COLOR) rows,cols img.shape[:2] print(img.shape[:2])#使用getAffineTransform来获得仿射变换的矩阵M #cv.getAffineTransform(…

Java项目-苍穹外卖-Day04

公共字段自动填充 这些字段在每张表基本都有&#xff0c;手动进行填充效率低&#xff0c;且后期维护更改繁琐 使用到注解AOP主要 先答应一个AutoFill注解 再定义一个切面类进行通知 对应代码 用到了枚举类和反射 package com.sky.aspect; /*** 自定义切面类&#xff0c…

信创办公–基于WPS的EXCEL最佳实践系列 (公式和函数)

信创办公–基于WPS的EXCEL最佳实践系列 &#xff08;公式和函数&#xff09; 目录 应用背景相关知识操作步骤1、认识基本的初级函数2、相对引用&#xff0c;绝对引用&#xff0c;混合引用3、统计函数4、文本函数 应用背景 熟练掌握Excel的函数工具能让我们在日常的使用中更加方…

8.深浅拷贝和异常处理

开发中我们经常需要复制一个对象。如果直接用赋值会有下面问题: 8.1 浅拷贝 首先浅拷贝和深拷贝只针对引用类型 浅拷贝&#xff1a;拷贝的是地址 常见方法: 1.拷贝对象&#xff1a;Object.assgin() / 展开运算符{…obj} 拷贝对象 2.拷贝数组&#xff1a;Array.prototype.con…

【小胡同志】我的创作纪念日——暨加入CSDN128天留念!

2023年4月12日&#xff0c;我首次加入CSDN这个创作大集体&#xff0c;大家庭&#xff01;实属荣幸&#xff0c;倍感荣耀&#xff01;在此之前&#xff0c;就曾听说&#xff0c;CSDN是中国开发者的摇篮&#xff0c;今日之悟&#xff0c;确有名之所属之感&#xff01; 机缘 128天…

完美解决微信小程序使用复选框van-checkbox无法选中

由于小程序使用了vant-ui框架&#xff0c;导致checkbox点击无法选中问题 <van-checkbox value"{{ checked }}" shape"square"><view class"check-content"><view class"checktext">我已阅读并同意>《用户协议》…

中文医学知识语言模型:BenTsao

介绍 BenTsao&#xff1a;[原名&#xff1a;华驼(HuaTuo)]: 基于中文医学知识的大语言模型指令微调 本项目开源了经过中文医学指令精调/指令微调(Instruction-tuning) 的大语言模型集&#xff0c;包括LLaMA、Alpaca-Chinese、Bloom、活字模型等。 我们基于医学知识图谱以及医…

从其他地方复制的内容无法粘贴到idea中

问题描述 提示&#xff1a;这里描述项目中遇到的问题&#xff1a; 使用 idea 开发的时候&#xff0c;从其他地方复制的内容无法粘贴到 idea中&#xff0c;idea的版本是 2023.2 解决方案&#xff1a; 提示&#xff1a;这里填写该问题的具体解决方案&#xff1a; 网上查找资料…