【2024LLM应用开发】使用Chroma DB实现语义搜索的向量数据库系统

向量数据库的建立、使用方式、原理及应用:

目录

 向量数据库的建立:

 使用方式:

代码原理:

整体结构:

 为什么使用向量数据库:

 相关应用:

 原理深入解析:


 向量数据库的建立:

向量数据库的核心是将文本或其他类型的数据转换为高维向量。这个过程通常包括:

a) 文本嵌入:使用预训练的语言模型(如BERT、GPT等)将文本转换为dense vector(稠密向量)。
b) 索引构建:使用高效的索引算法(如HNSW、IVF等)来组织这些向量,以便快速检索。

在本例中,Chroma DB负责了这些底层操作,使得用户可以专注于数据的添加和查询。

 使用方式:

a) 添加数据:将文档和相关元数据添加到数据库中。

b) 查询:提供查询文本,数据库返回最相似的文档。
c) 过滤:可以基于元数据进行过滤,如本例中的章节过滤。 

举例说明:

  • 下面这段代码使用了向量数据库(Vector Database)的概念。向量数据库将文本转换为高维向量,并使用这些向量进行相似度搜索。
  • HNSW(Hierarchical Navigable Small World)是用于快速最近邻搜索的算法。
  • 余弦相似度用于衡量向量之间的相似程度。
  • 导入相关的库
import json
from IPython.display import JSONfrom unstructured_client import UnstructuredClient
from unstructured_client.models import shared
from unstructured_client.models.errors import SDKErrorfrom unstructured.chunking.basic import chunk_elements
from unstructured.chunking.title import chunk_by_title
from unstructured.staging.base import dict_to_elementsimport chromadb
  • 创建和重置向量数据库客户端:
client = chromadb.PersistentClient(path="chroma_tmp", settings=chromadb.Settings(allow_reset=True))
client.reset()

这里使用Chroma DB创建了一个持久化的客户端,数据存储在"chroma_tmp"目录下。allow_reset=True允许重置数据库。client.reset()重置了数据库,清除所有现有数据。

  • 创建集合:
collection = client.create_collection(name="winter_sports",metadata={"hnsw:space": "cosine"}
)

在数据库中创建了一个名为"winter_sports"的新集合。metadata={"hnsw:space": "cosine"}指定使用余弦相似度作为向量空间的度量方式。

  • 添加文档:
for element in resp.elements:parent_id = element["metadata"].get("parent_id")chapter = chapter_ids.get(parent_id, "")collection.add(documents=[element["text"]],ids=[element["element_id"]],metadatas=[{"chapter": chapter}])

这个循环遍历resp.elements中的每个元素,将其添加到集合中。每个文档都有一个唯一的ID和相关的元数据(这里是章节信息)。

  • 查看集合内容:
results = collection.peek()
print(results["documents"])

peek()方法返回集合中的一些样本文档。这里打印出这些文档的内容。

  • 查询集合:
result = collection.query(query_texts=["How many players are on a team?"],n_results=2,where={"chapter": "ICE-HOCKEY"},
)
print(json.dumps(result, indent=2))

这里执行了一个查询,搜索与"How many players are on a team?"最相关的2个结果,并且只在"ICE-HOCKEY"章节中搜索。结果以JSON格式打印出来。

这种结构允许灵活地管理和查询大量文本数据,特别适合需要语义理解的应用场景。

 为什么使用向量数据库:

a) 语义搜索:传统的关键词搜索无法捕捉语义相似性,而向量搜索可以。

b) 高效性:对于大规模数据,向量搜索比全文搜索更快。
c) 灵活性:可以搜索任何可以表示为向量的数据,不限于文本。
d) 多模态:可以结合文本、图像等多种类型的数据。

 相关应用:

a) 智能问答系统

b) 推荐系统
c) 图像搜索
d) 相似文档检测
e) 异常检测
f) 聊天机器人知识库

 原理深入解析:

a) 文本嵌入:

  • 使用如Word2Vec、BERT等模型将词或句子映射到高维空间。
  • 在这个空间中,语义相似的文本会更接近。

b) 相似度计算:

  • 常用余弦相似度、欧氏距离等度量方法。
  • 余弦相似度计算两个向量的夹角余弦值,值越大表示越相似。

c) 索引算法:

  • HNSW(Hierarchical Navigable Small World):
    构建一个多层图结构,在搜索时可以快速缩小范围。
  • IVF(Inverted File Index):
    将向量空间分割成多个单元,搜索时只需检查部分单元。

d) 近似最近邻搜索:

  • 为了提高效率,通常使用近似算法而非精确搜索。
  • 牺牲一定的精度来获得显著的速度提升。

e) 维度诅咒及其解决:

  • 高维空间中,点与点之间的距离会变得不那么有区分度。
  • 通过降维技术(如PCA)或特殊的索引结构来缓解这个问题。

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

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

相关文章

高阶面试-netty部分

介绍下netty Netty 是一个基于 Java 的异步事件驱动的网络应用框架,提供了用于快速开发高性能、高可扩展性的协议服务器和客户端的工具 BIO、NIO、AIO 的区别是什么 BIO blocking io,同步阻塞IO,比较简单,为每个请求分配一个线…

VSCode中常用的快捷键

通用操作快捷键 显示命令面板:Ctrl Shift P or F1,用于快速访问VSCode的各种命令。 快速打开:Ctrl P,可以快速打开文件、跳转到某个行号或搜索项目内容。 新建窗口/实例:Ctrl Shift N,用于打开一个新的…

三维家:SaaS的IT规模化降本之道|OceanBase 《DB大咖说》(十一)

OceanBase《DB大咖说》第 11 期,我们邀请到了三维家的技术总监庄建超,来分享他对数据库技术的理解,以及典型 SaaS 场景在数据库如何实现规模化降本的经验与体会。 庄建超,身为三维家的技术总监,独挑大梁,负…

grpc学习golang版( 八、双向流示例 )

系列文章目录 第一章 grpc基本概念与安装 第二章 grpc入门示例 第三章 proto文件数据类型 第四章 多服务示例 第五章 多proto文件示例 第六章 服务器流式传输 第七章 客户端流式传输 第八章 双向流示例 文章目录 一、前言二、定义proto文件三、编写server服务端四、编写client客…

实现高性能、可扩展的实时数据采集系统:go-zero的应用与实践

随着互联网技术的高速发展,数据采集也越来越受到重视,成为企业获取商业价值的重要手段。在实际应用中,我们往往面临着数据量大、并发高、系统响应速度要求高、压力测试等挑战。如何实现高性能、可扩展的实时数据采集系统?本文将介…

中霖教育:环评工程师好考吗?

【中霖教育好吗】【中霖教育怎么样】 在专业领域,环评工程师资格认证考试是一项具有挑战性的考试,考试科目为:《环境影响评价相关法律法规》 《环境影响评价技术导则与标准》《环境影响评价案例分析》《环境影响评价技术方法》。 四个科目…

【Linux】—VMware安装Centos7步骤

文章目录 前言一、虚拟机准备二、CentOS7操作系统安装 前言 本文介绍VMware安装Centos7步骤。 软件准备 软件:VMware Workstation Pro,直接官网安装。镜像:CentOS7,镜像官网下载链接:https://vault.centos.org/&#x…

[C++]——同步异步日志系统(1)

同步异步日志系统 一、项⽬介绍二、开发环境三、核心技术四、环境搭建五、日志系统介绍5.1 为什么需要日志系统5.2 日志系统技术实现5.2.1 同步写日志5.2.2 异步写日志 日志系统: 日志:程序在运行过程中,用来记录程序运行状态信息。 作用&…

Leetcode 538:把二叉搜索树转化为累加树

给出二叉 搜索 树的根节点,该树的节点值各不相同,请你将其转换为累加树(Greater Sum Tree),使每个节点 node 的新值等于原树中大于或等于 node.val 的值之和。 解题思路: 其实就是相当于反中序遍历&#…

【面试系列】机器学习工程师高频面试题及详细解答

欢迎来到我的博客,很高兴能够在这里和您见面!欢迎订阅相关专栏: ⭐️ 全网最全IT互联网公司面试宝典:收集整理全网各大IT互联网公司技术、项目、HR面试真题. ⭐️ AIGC时代的创新与未来:详细讲解AIGC的概念、核心技术、…

JSONpath语法怎么用?

JSONPath 可以看作定位目标对象位置的语言,适用于 JSON 文档。 JSONPath 与 JSON 的 关系相当于 XPath 与 XML 的关系, JSONPath 参照 XPath 的路径表达式,提供了描述 JSON 文档层次结构的表达式,通过表达式对目标…

红酒与露营:户外时光的好伴侣

在繁忙的都市生活中,人们总是渴望逃离喧嚣,寻找一处宁静的天地,与大自然亲密相拥。露营,作为一种返璞归真的户外生活方式,成为了许多人心中的理想选择。而在露营的浪漫时光里,一瓶雷盛红酒的陪伴&#xff0…

AI图生视频工具测试

环境: 即梦 pika LUMA 可灵 问题描述: AI图生视频工具测试下面是原图 解决方案: 1.即梦 效果 2.pika 生成效果 3.LUMA 生成效果还行 4.可灵 生成效果最好

nginx 只有图片等静态资源时 监听80端口 会404 NOT FOUND

解决方法 删除 /var/nginx/sites-enabled 原因:当nginx没有设置首页路径index时,sites-enabled目录中配置的优先级会高于nginx.conf 导致404 NOT FOUND sites-enabled文件中的default会将80端口索引至默认值:/var/www/html目录下&#xff…

[方法] 为Cinemachine添加碰撞器

选中场景中的Cinemachine物体,在 Inspector 面板的最下方单击 Add Extension 下拉框,选择 CinemachineCollider。 之后在添加的碰撞器组件中选择要与之碰撞的层(Collide Against)和忽略的层(Transparent Layers&#x…

crewAI实践过程中,memory规避openai的使用方法以及(windows下xinferece框架使用踩过的坑)

问题: 在使用crewAI开发项目的过程中,memory开启后报错:openai key is fake 经代码核查,其默认使用了openai的embedding模型。 解决方法 经查阅资料,可以参考其本地部署llm的方法。 本地部署模型可以使用xinference…

高薪程序员必修课-java为什么要用并发编程

目录 前言 1. 提高性能和效率 2. 更好地响应用户 3. 优化I/O操作 具体示例 示例1:提高性能和效率 示例2:更好地响应用户 示例3:优化I/O操作 总结 前言 并发编程允许多个线程在同一时间执行任务。下面我们从多个原理角度来解释为什么J…

【windows】亲测-win11系统跳过联网和微软账户登录,实现本地账户登录

问题原因:现在市面上销售的品牌笔记本和台式机基本上都预装了正版的Windows S11家族中文版操作系统,联网后系统会自动激活。在win11的版本中,隐藏了关闭跳过连接网络的按钮,默认强制需要注册微软账户登录才能正常使用。 一、跳过…

modify filename

import osdef add_prefix_to_filenames(directory, prefix):# 获取目录中的所有文件名for filename in os.listdir(directory):# 构建旧文件路径old_file_path os.path.join(directory, filename)# 检查是否是文件if os.path.isfile(old_file_path):# 构建新文件名new_filenam…

PyTorch中matmul函数的矩阵相乘原则和注意事项

PyTorch中matmul函数的矩阵相乘原则和注意事项 一、高维张量乘法规则 1. 选择乘法的维度: 选择最后两个维度进行乘 2. 维度匹配规则: 最后两个维度按照普通矩阵乘法计算 3. 广播机制:torch.matmul 函数支持广播机制,即在满足乘法…