当前位置:   article > 正文

向量数据库检索原理_chromadb.persistentclient

chromadb.persistentclient

ChromaDB向量数据库简介

Chroma是一个新的AI原生开源嵌入式数据库,非常轻量和易用。Chroma是开源嵌入式数据库,它使知识、事实和技能可插入,从而轻松构建LLM应用程序。它可以运行在内存中(可保存在磁盘中),也可做为数据库服务器来使用(这和传统数据库类似)

安装

pip install chromadb   # 0.4.3  
// pip install chromadb -U 升级
//python3.11版无法安装!
  • 1
  • 2
  • 3

基本使用

# 创建客户端
# client = chromadb.Client() 内存模式
client = chromadb.PersistentClient(path="./cache")  # 数据保存在磁盘
# chroma_client = chromadb.HttpClient(host="localhost", port=8000) docker客户端模式
# 遍历集合
client.list_collections()
# 创建新集合
collection = client.create_collection("testname")
# 获取集合
collection = client.get_collection("testname")
# 创建或获取集合
collection = client.get_or_create_collection("testname")
# 删除集合
client.delete_collection("testname")
# 创建或获取集合
collection = client.get_or_create_collection(name="my_collection2")
# collection = client.create_collection(name="my_collection2")
# collection = client.create_collection(name="my_collection", embedding_function=emb_fn)
# collection = client.get_collection(name="my_collection", embedding_function=emb_fn)
# Chroma集合创建时带有一个名称和一个可选的嵌入函数。如果提供了嵌入函数,则每次获取集合时都必须提供。
# 获取集合中最新的5条数据
collection.peek()
# 添加数据
collection.add(
    documents=["2022年2月2号,美国国防部宣布:将向欧洲增派部队,应对俄乌边境地区的紧张局势.", " 2月17号,乌克兰军方称:东部民间武装向政府军控制区发动炮击,而东部民间武装则指责乌政府军先动用了重型武器发动袭击,乌东地区紧张局势持续升级"],
    metadatas=[{"source": "my_source"}, {"source": "my_source"}],
    ids=["id1", "id2"]
)
# 如果 Chroma 收到一个文档列表,它会自动标记并使用集合的嵌入函数嵌入这些文档(如果在创建集合时没有提供嵌入函数,则使用默认值)。Chroma也会存储文档本身。如果文档过大,无法使用所选的嵌入函数嵌入,则会出现异常。
# 每个文档必须有一个唯一的相关ID。尝试.添加相同的ID两次将导致错误。可以为每个文档提供一个可选的元数据字典列表,以存储附加信息并进行过滤。
# 或者,您也可以直接提供文档相关嵌入的列表,Chroma将存储相关文档,而不会自行嵌入。
# collection.add(
#     embeddings=[[1.2, 2.3, 4.5], [6.7, 8.2, 9.2]],
#     documents=["This is a document", "This is another document"],
#     metadatas=[{"source": "my_source"}, {"source": "my_source"}],
#     ids=["id1", "id2"]
# )
# 改数据
# 更新所提供 id 的嵌入、元数据或文档。
def update(ids: OneOrMany[ID],
           embeddings: Optional[OneOrMany[Embedding]] = None,
           metadatas: Optional[OneOrMany[Metadata]] = None,
           documents: Optional[OneOrMany[Document]] = None) -> None
# 更新所提供 id 的嵌入、元数据或文档,如果不存在,则创建它们。
def upsert(ids: OneOrMany[ID],
        embeddings: Optional[OneOrMany[Embedding]] = None,
        metadatas: Optional[OneOrMany[Metadata]] = None,
        documents: Optional[OneOrMany[Document]] = None) -> None          
# 删除数据
# 根据 ID 和/或 where 过滤器删除嵌入数据
def delete(ids: Optional[IDs] = None,
           where: Optional[Where] = None,
           where_document: Optional[WhereDocument] = None) -> None
# collection.delete(ids=["3", "4", "5"])
# 查询数据
results = collection.query(
    query_embeddings=[[11.1, 12.1, 13.1],[1.1, 2.3, 3.2], ...],
    n_results=10,
    where={"metadata_field": "is_equal_to_this"},
    where_document={"$contains":"search_string"}
)
或者:
results = collection.query(
    query_texts=["俄乌战争发生在哪天?"],
    n_results=2
)
print(156, results)
156 {'ids': [['id1', 'id2']], 'embeddings': None, 'documents': [['2022年2月2号,美国国防部宣布:将向欧洲增派部队,应对俄乌边境地区的紧张局势.',
 ' 2月17号,乌克兰军方称:东部民间武装向政府军控制区发动炮击,而东部民间武装则指责乌政府军先动用了重型武器发动袭击,乌东地区紧张局势持续升级']], 
 'metadatas': [[{'source': 'my_source'}, {'source': 'my_source'}]], 'distances': [[1.2127416133880615, 1.3881784677505493]]}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70

检索原理

随机投影

随机投影背后的基本思想是使用随机投影矩阵将高维向量投影到低维空间。我们创建一个随机数矩阵。矩阵的大小将是我们想要的目标低维值。然后,我们计算输入向量和矩阵的点积,这会产生一个投影矩阵,其维度比原始向量少,但仍保留它们的相似性。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

当我们查询时,我们使用相同的投影矩阵将查询向量投影到低维空间上。然后,我们将投影查询向量与数据库中的投影向量进行比较,以找到最近的邻居。由于数据的维数降低了,因此搜索过程比搜索整个高维空间要快得多。

请记住,随机投影是一种近似方法,投影质量取决于投影矩阵的属性。一般来说,投影矩阵越随机,投影的质量就越好。但生成真正随机的投影矩阵的计算成本可能很高,尤其是对于大型数据集

局部敏感哈希

局部敏感哈希 (LSH) 是一种在近似最近邻搜索上下文中建立索引的技术。它针对速度进行了优化,同时仍提供近似的、非详尽的结果。LSH 使用一组哈希函数将相似的向量映射到“桶”中,如下所示:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

为了找到给定查询向量的最近邻居,我们使用与将相似向量“存储”到哈希表中相同的哈希函数。查询向量被散列到特定的表,然后与同一表中的其他向量进行比较以找到最接近的匹配。这种方法比搜索整个数据集要快得多,因为每个哈希表中的向量比整个空间中的向量少得多。

重要的是要记住,LSH 是一种近似方法,近似的质量取决于哈希函数的属性。一般来说,使用的哈希函数越多,近似质量就越好。然而,使用大量哈希函数的计算成本可能很高,并且对于大型数据集可能不可行。

分层可导航小世界 (HNSW)

HNSW 创建一个分层的树状结构,其中树的每个节点代表一组向量。节点之间的边代表向量之间的**相似度。**该算法首先创建一组节点,每个节点都有少量向量。这可以随机完成,也可以通过使用 k 均值等算法对向量进行聚类来完成,其中每个聚类都成为一个节点。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

然后,该算法检查每个节点的向量,并在该节点和与其向量最相似的节点之间绘制一条边。

相似性测量

基于前面讨论的算法,我们需要了解向量数据库中相似性度量的作用。这些度量是矢量数据库如何比较和识别给定查询的最相关结果的基础。

相似性度量是用于确定向量空间中两个向量相似程度的数学方法。向量数据库中使用相似性度量来比较数据库中存储的向量并找到与给定查询向量最相似的向量。

可以使用多种相似性度量,包括:

  • **余弦相似度:**测量向量空间中两个向量之间角度的余弦。取值范围为-1到1,其中1表示相同向量,0表示正交向量,-1表示完全相反的向量。
  • **欧氏距离:**测量向量空间中两个向量之间的直线距离。它的范围从 0 到无穷大,其中 0 表示相同的向量,较大的值表示越来越不相似的向量。
    量向量空间中两个向量之间角度的余弦。取值范围为-1到1,其中1表示相同向量,0表示正交向量,-1表示完全相反的向量。
  • **欧氏距离:**测量向量空间中两个向量之间的直线距离。它的范围从 0 到无穷大,其中 0 表示相同的向量,较大的值表示越来越不相似的向量。
  • **点积:**测量两个向量的幅值与它们之间角度的余弦的乘积。范围为-∞到∞,其中正值表示指向相同方向的向量,0表示正交向量,负值表示指向相反方向的向量。
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/153035
推荐阅读
相关标签
  

闽ICP备14008679号