开启左侧

向量数据库chromadb

[复制链接]
林克link02 发表于 2 小时前 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题
作者:CSDN博客
最近在学习AGI, 学习了向量数据库,
    什么是向量:

    向量是一种有大小和方向的数学对象。它可以表示为从一个点到另一个点的有向线段。例如,二维空间中的向量可以表示为 (x,y),表示从原点 (0,0) 到点 (x,y) 的有向线段。
    向量数据库chromadb-1.png


    以此类推,我可以用一组坐标 (x0,x1,…,xN−1) 表示一个 N 维空间中的向量,N 叫向量的维度。
  • 文本向量:

    将文本转成一组N维浮点数,即文本向量又叫Embeddings,向量之间通过计算距离,根据距离远近来确定语义的相似度。
    向量间的相似度计算:可以通过欧氏距离或余弦距离来判断
    向量数据库chromadb-2.png

    1. import numpy as np
    2. from numpy import dot
    3. from numpy.linalg import norm
    4. def cos_sim(a, b):
    5.     '''余弦距离 -- 越大越相似'''
    6.     return dot(a, b)/(norm(a)*norm(b))
    7. def l2(a, b):
    8.     '''欧氏距离 -- 越小越相似'''
    9.     x = np.asarray(a)-np.asarray(b)
    10.     return norm(x)
    复制代码
    向量数据库

    知道什么是向量和文本向量后,我们来继续了解什么时向量数据库:
    向量数据库,就是一种专门用于存储和查询向量数据库的数据库系统。这类数据库的主要特点存储的数据类型是数学向量,即一系列数值的有序集合。这些向量通常表示的是多维空间中的点,可以用来表示文本、图像、音频、视频等多种类型的数据经过向量化后的特征表示。
    工作原理:
           1: 数据存储:将向量数据及其相关的元数据存储到数据库中
           2: 索引构建:为了加速相似性搜索,数据库会建立索引结构,如 KD 树、球树(Ball Tree)、局部敏感哈希(LSH)等。
           3: 当用户发起查询时,数据库利用索引来快速找到与查询向量最相似的结果。
  • chroma

    chroma是一个向量数据库,官网的描述如下(Chroma Docs (trychroma.com)):

    向量数据库chromadb-3.png

         存储向量数据及其元数据
         向量文档和查询文档
         查询向量文档
    Chroma 默认使用的相似度计算模式是 L2(欧氏距离)。这意味着当用户没有明确指定其他的相似度度量方法时,Chroma 会采用计算两个向量之间欧氏距离的方式来衡量它们的相似度。
    在实际应用中,如果需要更改默认的相似度计算方式,比如改为使用余弦相似度(cosine),可以在初始化 Chroma 数据库或者创建集合时通过相应的参数进行设置。
    在python环境下,可以跑以下脚本运行:
    1. db = Chroma(
    2.     collection_name=collection_name,
    3.     embedding_function=emb_fun,
    4.     persist_directory=persist_directory,
    5.     client_settings={
    6.         'hnsw:space': 'cosine'  # 或者 'l2' 等其他度量方法
    7.     }
    8. )
    复制代码
    1. pip install chromadb
    2. pip install sentence_transformers
    3. chroma run --path /db_path
    复制代码
    1. import chromadb
    2. from chromadb import Settings
    3. class MyVectorDBConnector:
    4.     def __init__(self, collection_name, embedding_fn):
    5.         chroma_client = chromadb.Client(Settings(allow_reset=True))
    6.         chroma_client.reset()
    7.         # 创建一个collection
    8.         self.collection = chroma_client.get_or_create_collection(
    9.             name = collection_name)
    10.         self.embedding_fn = embedding_fn
    11.     def add_documents(self, documents):
    12.         '''向 collection 中添加文档与向量'''
    13.         self.collection.add(
    14.             embeddings=self.embedding_fn(documents),
    15.             documents=documents,
    16.             ids=[f"id{i}" for i in range(len(documents))]
    17.         )
    18.     def search(self, query_text, top_n=3):
    19.         '''检索向量数据库'''
    20.         results = self.collection.query(
    21.             query_embeddings=self.embedding_fn([query_text]),
    22.             n_results=top_n
    23.         )
    24.         return results
    复制代码

原文地址:https://blog.csdn.net/weiwin/article/details/142521531
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

发布主题
阅读排行更多+

Powered by Discuz! X3.4© 2001-2013 Discuz Team.( 京ICP备17022993号-3 )