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

发布于:2024-07-03 ⋅ 阅读:(15) ⋅ 点赞:(0)

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

目录

 向量数据库的建立:

 使用方式:

代码原理:

整体结构:

 为什么使用向量数据库:

 相关应用:

 原理深入解析:


 向量数据库的建立:

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

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)或特殊的索引结构来缓解这个问题。