探索向量数据库:数据存储与检索的新前沿

探索向量数据库:数据存储与检索的新前沿

随着各种大型语言模型 (LLM)的开源, 开发人员也意识到向量数据库越来越重要,因为它可以进一步增强这些模型。像 GPT 这种LLM大模型,通常使用大规模的嵌入向量来表示文本数据,而 Vector DB 提供了高效存储和检索向量数据的能力,使得在应用中存储和访问这些向量变得更加高效和快速。

向量数据库

向量数据库可以索引、存储结构化或非结构化数据(例如文本或图像)及其向量嵌入(数据的数字表示)并提供对它们的访问。它允许用户在生产环境中快速大规模地查找和检索相似的对象。由于其高效的搜索功能,向量数据库有时也称为向量搜索引擎。

向量嵌入

现实生活中的数据有结构化的数据,如电子表格这种组织整齐的数据,也有非结构化的数据如文档、图像、音视频等,且绝大多数都是非结构化数据。这类数据很难以有组织的方式存储它们,以便我们可以轻松的找到所需的内容。如何对这些数据进行量化存储,并能够快速查找出来呢?

向量嵌入是一种将非结构化数据转换为数学向量的方法,使得数据可以被量化存储并且可以进行快速查找。通过向量嵌入,非结构化数据(如文档、图像、音视频等)被映射到一个多维的向量空间中,每个数据项都用一个向量来表示。这些向量通常被设计成能够捕捉数据的语义信息,使得相似的数据在向量空间中距离较近,不相似的数据在向量空间中距离较远。

www.zeeklog.com  - 探索向量数据库:数据存储与检索的新前沿

现代机器学习模型可以经过训练将原始数据转换为嵌入,表示为固定维度的浮点数数组(或向量)。向量数据库便是用于存储这些嵌入向量的专用数据库

向量搜索

使用向量嵌入,我们可以在向量空间中搜索彼此接近的对象,以找到并检索相似的对象。这种搜索方式被称为向量搜索、相似性搜索或语义搜索。

具体向量搜索是如何进行的,举个例子来讲:我们基于[人格五因素测试]对多人进行性格测试,在5个维度上收集了他们的评分,并将这些评分作为向量嵌入;

为方便在平面坐标系中展示向量之间的关系,我们先只取2个维度的数据,将评分范围调到 -1 ~ 1,并将这些点表示为从坐标原点到它们的向量:

www.zeeklog.com  - 探索向量数据库:数据存储与检索的新前沿

如果Jay被车撞了,我们需要通过向量搜索找到一个与其性格相似的人去代替,那么上图中哪个人与Jay相似? 机器如何识别呢?这时向量的表示法就可以让我们通过数学方式计算向量的相似性,来找到了性格相似的人。

向量的相似性通常通过计算两个向量之间的距离来确定。计算相似度分数的常用方法是 [余弦相似度], 其数学定义与公式如下:

给定两个 n 维属性向量 AB,它们的余弦相似度 cos(θ) 通过使用[向量点积]和[向量长度]表示为:

www.zeeklog.com  - 探索向量数据库:数据存储与检索的新前沿

其中,AiBi 分别是向量 AB 的第 i 个分量。

按照数学公式我们可以计算出Person #1Jay相似度最高,两个向量的夹角也最小,因此他们更相似:

www.zeeklog.com  - 探索向量数据库:数据存储与检索的新前沿

实际上两个维度的特征,不足以判断人格是否相似,因此我们需要用到5个维度的数据:

www.zeeklog.com  - 探索向量数据库:数据存储与检索的新前沿

虽然数据维度升高,但这种比较向量相似度的方法,适用于任意维度的向量空间:

www.zeeklog.com  - 探索向量数据库:数据存储与检索的新前沿

向量索引

向量索引是一种用于在大规模数据集中快速搜索相似向量的技术。通俗地说,就像我们在一堆杂乱的图片中找到与给定图片相似的图片一样。构建向量索引就像是给大量的照片贴上标签并整理成相册一样。

想象一下,你有一个非常大的图像库,每张图片都表示为一个向量。现在,你希望找到与给定图片相似的图片。这时,向量索引就派上了用场。可以根据给定图片的向量,在多维数据空间中快速定位相册,然后快速定位那些与给定图片在向量空间中距离较近的图片,而不必一个一个地比较每张图片。

常见的构建索引的算法:

  • 基于聚类的索引 (如,)
  • 基于邻近图的索引 (如,)
  • 基于树的索引 (如,)
  • 基于哈希的索引 (如,)
  • 基于压缩的索引 (如, 或 )

向量索引在实际中有许多应用,比如图像搜索、语义搜索、推荐系统等。它能够帮助我们快速地处理和检索大规模的向量数据,从而在很多领域提高效率和性能。

工作流程

向量数据库的常见的工作管道:

www.zeeklog.com  - 探索向量数据库:数据存储与检索的新前沿
  1. 索引:对嵌入的向量是通索引算法对其进行索引并将向量数据和构建好的索引结构存储到数据库中。
  2. 查询:向量数据库会根据查询向量在向量索引中进行搜索,并返回与查询向量最相似的向量结果。
  3. 后期处理:在某些情况下,向量数据库从数据集中检索出一组与查询向量最相似的向量,并对它们进行后期处理,以返回最终的结果。这个步骤可能包括使用不同的相似度度量重新对查询到的相似向量进行排序。换句话说,就像在购物网站上找到了一些可能的商品,然后根据不同的标准重新排序,以便更好地满足用户的需求。

Chroma示例

[Chroma DB]是一个开源矢量存储,用于存储和检索矢量嵌入。它的主要用途是保存嵌入以及元数据,交由LLM模型使用。此外,它还可以用于文本数据的语义搜索引擎。

工作流程:

  1. 创建collection(类似关系型数据库中的表)
  2. 使用元数据和唯一的ID将文本添加到集合中。
  3. 通过文本或嵌入查询集合。也可以通过元数据过滤结果。

测试数据

employee_info = """
James Smith, a 32-year-old software engineer with 8 years of experience,
is a member of the development and hiking clubs who enjoys cooking, photography, and playing guitar
in his free time. He aspires to lead a tech team after gaining more expertise in his field
at XYZ Corporation.
"""

department_info = """
The development department at XYZ Corporation is responsible for designing, implementing,
and maintaining the software products of the company. It consists of skilled professionals
ranging from software engineers to UX designers, working collaboratively to innovate
and deliver high-quality solutions to clients' needs.
"""

company_info = """
XYZ Corporation, established in 2005 in Silicon Valley, is a leading software development company
specializing in creating cutting-edge solutions for various industries. With over 1000 employees
and offices in multiple countries, XYZ Corp is known for its commitment to excellence and innovation
in the tech sector.
"""

默认情况下Chroma使用all-MiniLM-L6-v2模型将文字转换为向量:

import chromadb
chroma_client = chromadb.Client()
# 创建集合
collection = chroma_client.create_collection(name="employee")

# 添加到集合
collection.add(documents=[employee_info, department_info, company_info],
               metadatas=[{"source": "employee info"}, {"source": "department info"}, {"source": "company info"}],
               ids=["id1", "id2", "id3"]
               )

添加数据到集合时便会自动下载all-MiniLM-L6-v2模型,并将文本转为嵌入到simple_employee_info集合中。

from chromadb.utils import embedding_functions
def_efn = embedding_functions.DefaultEmbeddingFunction()
embedding_text = def_efn(['早上','好'])
# [[-0.045326605439186096, 0.004748976789414883, 0.02001281827688217, 0.007265775464475155, -0.0672430619597435, ...]]

查询:相似性搜索

# 相似性搜索
results = collection.query(
    query_texts=["What is the employee's name?"],
    n_results=2
)
# 输出两个相似的结果
# {
#   "ids": [["id1", "id2"]],
#   "distances": [[1.6440917253494263, 1.6728706359863281]],
#   "metadatas": [[{"source": "department info"}, {"source": "employee info"}]],
#   "embeddings": None,
#   "documents": [
#     [
#       "The development department at XYZ Corporation is responsible for designing, implementing...."
#       "James Smith, a 32-year-old software engineer with 8 years of experience.......",
#     ]
#   ],
#   "uris": None,
#   "data": None
# }


查询过滤器

 # 在匹配的元数据中查找
results = collection.query(
    query_texts=["What is the employee's name?"],
    n_results=2,
    where={"source":{"$in":["employee info","company info"]}} 
)
# 依据文档的内容进行过滤
# results = collection.query(
#     query_texts=["What is the employee's name?"],
#     n_results=2,
#     where_document={"$contains":"engineer"} 
# )

也可以不使用默认的嵌入模型:

from chromadb.utils import embedding_functions

ollama_ef = embedding_functions.OllamaEmbeddingFunction(
    url="http://localhost:11434/api/embeddings",
    model_name="llama3",
)
employees_embeddings = ollama_ef([employee_info, department_info, company_info])

# 嵌入的向量
# [[0.9733191728591919, -2.4074814319610596, -1.0328993797302246, -0.11499451100826263, 
#   2.668761730194092, 0.3950701355934143, 0.8115649223327637, -0.058548394590616226, 
#   -3.9989635944366455, -2.2536189556121826, -0.9562288522720337, 2.3301892280578613,...]]

collection2 = chroma_client.get_or_create_collection(name="other_employee",
                                                     embedding_function=ollama_ef)

#添加嵌入的向量
collection2.add(embeddings=employees_embeddings,
                documents=[employee_info, department_info, company_info],
                metadatas=[{"source": "employee info"}, {"source": "department info"}, {"source": "company info"}],
                ids=["id1", "id2", "id3"]
                )
result2 = collection2.query(query_texts=["What is the employee's name?"],
                            n_results=2)
# 查询输出
# {
#   "ids": [["id1", "id3"]],
#   "distances": [[27612.076171875, 29216.796875]],
#   "metadatas": [[{"source": "employee info"}, {"source": "company info"}]],
#   "embeddings": None,
#   "documents": [
#     [
#       "James Smith, a 32-year-old software engineer with 8 years of experience, ....",
#       "XYZ Corporation, established in 2005 in Silicon Valley, is a leading software development company specializing...."
#     ]
#   ],
#   "uris": None,
#   "data": None
# }

和默认的词嵌入模型不同的是,相似度匹配到了employee_infocompany_info。不同的词嵌入模型执行查询时会有不一样的效果。

更新数据

# 更新
collection.update(ids=["id1"],
                  documents=["Bob, a 28-year-old test engineer with 4 years of experience"],
                  metadatas=[{"source":"employee info"}],
                  )

# 相似性搜索
results = collection.query(
    query_texts=["What is the employee's name?"],
    n_results=2
)

# 输出的员工信息变为了 `Bob`
# {
#   "ids": [["id1", "id2"]],
#   "distances": [[1.4391101598739624, 1.6440917253494263]],
#   "metadatas": [[{"source": "employee info"}, {"source": "department info"}]],
#   "embeddings": None,
#   "documents": [
#     [
#       "Bob, a 28-year-old test engineer with 4 years of experience",
#       "The development department at XYZ Corporation is responsible for designing, implementing,\nand maintaining the software products of the company. It consists of skilled professionals\nranging from software engineers to UX designers, working collaboratively to innovate\nand deliver high-quality solutions to clients' needs.\n"
#     ]
#   ],
#   "uris": None,
#   "data": None
# }

删除数据

print(f"删除前集合有 {collection.count()} 条记录") #删除前集合有 3 条记录
collection.delete(ids=["id1"])
print(f"删除后集合有 {collection.count()} 条记录")#删除后集合有 2 条记录

www.zeeklog.com  - 探索向量数据库:数据存储与检索的新前沿

大模型&AI产品经理如何学习

求大家的点赞和收藏,我花2万买的大模型学习资料免费共享给你们,来看看有哪些东西。

1.学习路线图

www.zeeklog.com  - 探索向量数据库:数据存储与检索的新前沿

第一阶段: 从大模型系统设计入手,讲解大模型的主要方法;

第二阶段: 在通过大模型提示词工程从Prompts角度入手更好发挥模型的作用;

第三阶段: 大模型平台应用开发借助阿里云PAI平台构建电商领域虚拟试衣系统;

第四阶段: 大模型知识库应用开发以LangChain框架为例,构建物流行业咨询智能问答系统;

第五阶段: 大模型微调开发借助以大健康、新零售、新媒体领域构建适合当前领域大模型;

第六阶段: 以SD多模态大模型为主,搭建了文生图小程序案例;

第七阶段: 以大模型平台应用与开发为主,通过星火大模型,文心大模型等成熟大模型构建大模型行业应用。

2.视频教程

网上虽然也有很多的学习资源,但基本上都残缺不全的,这是我自己整理的大模型视频教程,上面路线图的每一个知识点,我都有配套的视频讲解。

www.zeeklog.com  - 探索向量数据库:数据存储与检索的新前沿
www.zeeklog.com  - 探索向量数据库:数据存储与检索的新前沿

(都打包成一块的了,不能一一展开,总共300多集)

因篇幅有限,仅展示部分资料,需要点击下方图片前往获取

3.技术文档和电子书

这里主要整理了大模型相关PDF书籍、行业报告、文档,有几百本,都是目前行业最新的。

www.zeeklog.com  - 探索向量数据库:数据存储与检索的新前沿

4.LLM面试题和面经合集

这里主要整理了行业目前最新的大模型面试题和各种大厂offer面经合集。

www.zeeklog.com  - 探索向量数据库:数据存储与检索的新前沿

👉学会后的收获:👈
• 基于大模型全栈工程实现(前端、后端、产品经理、设计、数据分析等),通过这门课可获得不同能力;

• 能够利用大模型解决相关实际项目需求: 大数据时代,越来越多的企业和机构需要处理海量数据,利用大模型技术可以更好地处理这些数据,提高数据分析和决策的准确性。因此,掌握大模型应用开发技能,可以让程序员更好地应对实际项目需求;

• 基于大模型和企业数据AI应用开发,实现大模型理论、掌握GPU算力、硬件、LangChain开发框架和项目实战技能, 学会Fine-tuning垂直训练大模型(数据准备、数据蒸馏、大模型部署)一站式掌握;

• 能够完成时下热门大模型垂直领域模型训练能力,提高程序员的编码能力: 大模型应用开发需要掌握机器学习算法、深度学习框架等技术,这些技术的掌握可以提高程序员的编码能力和分析能力,让程序员更加熟练地编写高质量的代码。

www.zeeklog.com  - 探索向量数据库:数据存储与检索的新前沿
1.AI大模型学习路线图
2.100套AI大模型商业化落地方案
3.100集大模型视频教程
4.200本大模型PDF书籍
5.LLM面试题合集
6.AI产品经理资源合集

👉获取方式:
😝有需要的小伙伴,可以保存图片到wx扫描二v码免费领取【保证100%免费】🆓

www.zeeklog.com  - 探索向量数据库:数据存储与检索的新前沿

Read more

基于FPGA的北斗导航自适应抗干扰算法的设计与实现(任务书+开题报告+文献综述+代码+仿真+实物+毕业论文)

基于FPGA的北斗导航自适应抗干扰算法的设计与实现(任务书+开题报告+文献综述+代码+仿真+实物+毕业论文)

摘   要 如今,随着卫星导航技术的飞速发展,位置信息服务已经融入到我们的日常生活中,导航目前被称为继移动互联网后第三大产业。卫星导航在维护国家的安全中也发挥着不可替代的作用。为了使导航系统不受干扰的影响,本文以北斗导航系统为平台,研究基于阵列天线的自适应抗干扰算法。 首先,文章就自适应抗干扰算法的原理和方法进行了系统介绍,并在MATLAB中建立阵列模型,对基于功率倒置算法的空域抗干扰算法和空时联合抗干扰算法进行性能仿真。然后根据系统的指标,确定了在FPGA中实现抗干扰算法的方案,包括数字下变频、权值计算、数据加权、数字上变频等模块。根据权值计算模块实现方式的不同,本文提供了两种抗干扰算法在FPGA中实现的方案:一种是基于FPGA嵌入式软核NIOS II的抗干扰实现,将权值计算的过程放在NIOS II软核中,用C语言进行实现;另一种是基于逻辑语言的抗干扰算法的实现,即用硬件描述语言Verilog HDL进行权值的计算。权值计算涉及到浮点数运算和Hermite矩阵求逆,本文给出了各模块的设计方法和仿真结果,并与MATLAB仿真结果进行对比。最后给出了两种实现方案的实测结果,表明两种实

FPGA 工程师到底有哪些方向?每个岗位都在干什么?一篇给你讲清楚

FPGA 工程师到底有哪些方向?每个岗位都在干什么?一篇给你讲清楚

很多人说“学 FPGA 就是写 Verilog”,但真正进了行业才发现—— FPGA 工程师并不是一个岗位,而是一整个岗位族群。 不同公司、不同项目,对 FPGA 工程师的要求差异非常大。 如果方向选错,可能学了半年发现岗位根本不对口。 这篇文章就系统地给你拆一拆: 👉 FPGA 工程师到底有哪些岗位? 👉 每个岗位具体干什么? 👉 需要掌握哪些能力? 👉 适合什么样的人? 一、FPGA 工程师整体岗位划分(先给结论) 从企业招聘角度来看,FPGA 岗位大致可以分为 6 类: 岗位方向关键词偏向FPGA 逻辑设计工程师Verilog / 时序 / 接口核心开发FPGA 算法 / 加速工程师图像 / AI / DSP算法落地FPGA 底层驱动工程师DDR / PCIe / SerDes硬件接口FPGA 系统应用工程师Linux + FPGA系统集成FPGA 验证 / 测试仿真 / 验证质量保障FPGA 技术支持 / FA客户 / 项目支持应用型

OpenClaw-多飞书机器人与多Agent团队实战复盘

OpenClaw-多飞书机器人与多Agent团队实战复盘

OpenClaw 多飞书机器人与多 Agent 团队实战复盘 这篇文章完整记录一次从单机安装到多机器人协作落地的真实过程: 包括 Windows 安装报错、Gateway 连通、模型切换、Feishu 配对、多 Agent 路由、身份错位修复,以及最终形成“产品-开发-测试-评审-文档-运维”团队。 一、目标与结果 这次实践的目标很明确: 1. 在 Windows 上稳定跑通 OpenClaw 2. 接入飞书机器人 3. 做到一个机器人对应一个 Agent 角色 4. 支持多模型并行(OpenAI + Ollama) 5. 最终形成可执行的多 Agent 团队 最终落地状态(已验证): * 渠道:Feishu 多账号在线 * 路由:按 accountId

宇树 G1 机器人开发入门:有线 & 无线连接完整指南

宇树 G1 机器人开发入门:有线 & 无线连接完整指南

适用读者:机器人二次开发者、科研人员 开发环境:Ubuntu 20.04(推荐) 机器人型号:Unitree G1 EDU+ 前言 宇树 G1 是一款面向科研与商业应用的高性能人形机器人,支持丰富的二次开发接口。在正式进行算法调试与功能开发之前,首要任务是建立稳定的开发连接。本文将详细介绍两种主流连接方式:有线(网线直连) 与 无线(WiFi + SSH),并附上完整的配置流程,帮助开发者快速上手。 一、有线连接(推荐新手优先使用) 有线连接通过网线直接将开发电脑与 G1 机器人相连,具有延迟低、稳定性高、不依赖外部网络的优势,是新手入门和底层调试的首选方式。 1.1 前置条件 所需物品说明开发电脑推荐安装 Ubuntu 20.04,或在 Windows 上使用虚拟机宇树 G1 机器人确保已开机且处于正常状态网线(