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

news2024/7/4 3:19:48

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

目录

 向量数据库的建立:

 使用方式:

代码原理:

整体结构:

 为什么使用向量数据库:

 相关应用:

 原理深入解析:


 向量数据库的建立:

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

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 JSON

from unstructured_client import UnstructuredClient
from unstructured_client.models import shared
from unstructured_client.models.errors import SDKError

from unstructured.chunking.basic import chunk_elements
from unstructured.chunking.title import chunk_by_title
from unstructured.staging.base import dict_to_elements

import 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.coloradmin.cn/o/1886489.html

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

相关文章

干货分享|如何将前端代理服务器(BFF)接入身份认证(2)

续集2 前篇文章在前面发布,同学们可以自行找一下。 本篇文章将继续通过实例来详细讲解如何将前端代理服务器(BFF)接入身份认证。我们将使用一个示例应用来演示 BFF 与身份认证的集成过程。 1)在 Keycloak 中新建一个安全领域 …

红队工具Finger 安装具体以步骤-示例centos

1.git clone https://github.com/EASY233/Finger.git 如果没有 yum install git 2.pip3 install -r requirements.txt 找到finger所在的文件夹 可以用find -name "Finger"进入文件中配置命令 前提要安装python yum install python-pip33.python3 Finger.py -h

中国AI产业迎来标准化大跃进,程序员们准备好了吗

中国AI产业迎来标准化大跃进,程序员们准备好了吗? 程序员们,你们是否已经感受到了人工智能技术的浪潮?现在,中国工信部联合其他部门发布了《国家人工智能产业综合标准化体系建设指南(2024版)》&…

龙迅LT8641UXE HDMI四进一出切换开关,支持标准HDMI 2.0内置MCU

龙迅LT8641UXE描述: Lontium LT8641UX HDMI2.0开关具有符合HDMI2.0/1.4规范的4:1开关,最大6Gbps高速数据速率,自适应均衡RX输入和预先强调的TX输出支持长电缆应用,没有XTAL板上节省BOM成本。LT8641UX HDMI2.0开关自动…

如何获取音频伴奏

如何获取音频伴奏 在今天的互联网上,有许多好听的音乐.面对这些音乐,我们有时需要伴奏音频,许多音频在网站上可以查找到,但有些不行,今天,我们要通过audacity软件截取音频伴奏. 下载audacity软件 audacity-64.exe 访问密码:8221 或官方网站(访问较慢) 选择简体…

LLM指令微调Prompt的最佳实践(二):Prompt迭代优化

文章目录 1. 前言2. Prompt定义3. 迭代优化——以产品说明书举例3.1 产品说明书3.2 初始Prompt3.3 优化1: 添加长度限制3.4 优化2: 细节纠错3.5 优化3: 添加表格 4. 总结5. 参考 1. 前言 前情提要: 《LLM指令微调Prompt的最佳实践(一)&#…

时序约束(二): input delay约束和output delay约束

一、input delay约束 在千兆以太网数据收发项目中,RGMII的数据输入方式为DDR,源同步输入方式,可以用之前提到的分析模型进行约束。 在时序约束原理中我们提到,input delay约束的就是发射沿lunch到数据有效的延时,根据…

本地项目推送到gitlab仓库的保姆级教程

目录 1、安装git (1)Windows系统 (2)Linux系统 2、gitlab创建空白项目 3、创建密钥 4、将密钥添加到gitlab中 5、远程配置 (1)配置全局的用户和邮箱 (2)本地文件夹初始化 …

Rust: polars行遍历,从dataframe到struct及Bar设计比较

pandas提供了iterrows()、itertuples()、apply等行遍历的方式,还是比较方便的。 polars的列操作功能非常强大,这个在其官网上有详细的介绍。由于polars底层的arrow是列存储模式,行操作效率低下,官方也不推荐以行方式进行数据操作。…

序号不足两位前面补0

预期目标 原始效果 代码实现 {${(index 1).toString().padStart(2, 0)}. ${item.sentence}}要实现自动编号并确保显示为两位数的格式,可以在 {index 1} 的地方进行格式化。在 JavaScript 中,可以使用 String.prototype.padStart() 方法来补足数字到指定…

Webpack: Loader开发 (1)

概述 如何扩展 Webpack?有两种主流方式,一是 Loader —— 主要负责将资源内容翻译成 Webpack 能够理解、处理的 JavaScript 代码;二是 Plugin —— 深度介入 Webpack 构建过程,重塑 构建逻辑。 相对而言,Loader 的职责…

三个方法教大家学会RAR文件转换为ZIP格式

在日常工作当中,RAR和ZIP是两种常见的压缩文件格式。有时候,大家可能会遇到将RAR文件转换为ZIP格式的情况,这通常是为了方便在特定情况下打开或使用文件。下面给大家分享几个RAR文件转换为ZIP格式的方法,下面随小编一起来看看吧~ …

如何通过指纹浏览器使用代理IP?

1.指纹浏览器定义 指纹浏览器是 一种浏览器技术,它根据用户设备的硬件、软件和配置等特征生成唯一标识符(称为“指纹”)。此指纹用于识别和追踪用户身份,即使用户更改其 IP 地址或清除浏览器数据(如缓存和 Cookie&…

美国抗攻击服务器有哪些可靠的解决方案

美国抗攻击服务器在面对日益严重的网络安全威胁时,需要采取一系列可靠的解决方案来确保服务器的稳定运行和数据安全。以下是一些科普性质的抗攻击服务器解决方案: 一、流量清洗与过滤 流量清洗是美国抗攻击服务器应对DDoS攻击的重要措施。当检测到异常流…

助力构建新型电力系统自主可控实时底座

近日,2024亚洲新型电力系统及储能展览会&亚洲新型电力及储能论坛会在广州广交会展馆圆满落下帷幕!科东软件携多款电力产品亮相展会,并在2024亚洲新型电力及储能论坛发表《“鸿道Intewell操作系统助力构建新型电力系统自主可控实时底座”》的主…

机器学习-EM算法

目录 一:最大似然估计 二:EM算法 加入隐变量 EM算法推导 1.Jensen不等式 点个赞呗!!! 一:最大似然估计 举个栗子:一个袋子里有很多个球,每次放回的取一个球,取了十次,其中有六次白球,4次黑球。那么就认为袋子里面取到白球的概率为6/10,黑球的概率为4/10。…

C++——list类用法指南

一、list的介绍 1、list是可以在常数范围内在任意位置进行插入和删除的序列式容器,并且该容器可以前后双向迭代 2、list的底层是双向链表结构,双向链表中每个元素存储在互不相关的独立节点中,在节点中通过指针指向其前一个元素和后一个元素 …

51单片机外部中断(按键识别)

欢迎入群共同学习交流 时间记录:2024/7/2 一、电路原理图 51单片机包含INT0、INT1两个外部中断接口 二、知识点介绍 1.中断寄存器位介绍 (1)TCON定时控制寄存器,位0(IT0)中断INT0请求信号选择位&#x…

性能调优 性能监控

1.影响性能考虑点包括: 数据库、应用程序、中间件(tomcat、nginx)、网络和操作系统等方面。 首先考虑自己的应用属于 CPU密集型 还是 IO密集型 cpu密集型 计算,排序,分组查询,各种算法 IO密集型 网络传输,磁盘读…

聊聊 golang 的 map

1、哈希表 哈希表是一个很常见的数据结构,用来存储无序的 key/value 对,给定的 key 可以在 O(1) 时间复杂度内查找、更新或删除对应的 value。 设计一个好的哈希表,需要着重关注两个关键点:哈希函数、冲突处理。 1.1 哈希函数 …