向量数据库chromadb

最近在学习AGI, 学习了向量数据库,

  1. 什么是向量:

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


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

  2.  文本向量:

     将文本转成一组N维浮点数,即文本向量又叫Embeddings,向量之间通过计算距离,根据距离远近来确定语义的相似度。

    向量间的相似度计算:可以通过欧氏距离或余弦距离来判断

    import numpy as np
    from numpy import dot
    from numpy.linalg import norm
    
    
    def cos_sim(a, b):
        '''余弦距离 -- 越大越相似'''
        return dot(a, b)/(norm(a)*norm(b))
    
    
    def l2(a, b):
        '''欧氏距离 -- 越小越相似'''
        x = np.asarray(a)-np.asarray(b)
        return norm(x)
  3. 向量数据库 

    知道什么是向量和文本向量后,我们来继续了解什么时向量数据库:

    向量数据库,就是一种专门用于存储和查询向量数据库的数据库系统。这类数据库的主要特点存储的数据类型是数学向量,即一系列数值的有序集合。这些向量通常表示的是多维空间中的点,可以用来表示文本、图像、音频、视频等多种类型的数据经过向量化后的特征表示。

    工作原理:
          1: 数据存储:将向量数据及其相关的元数据存储到数据库中
          2: 索引构建:为了加速相似性搜索,数据库会建立索引结构,如 KD 树、球树(Ball Tree)、局部敏感哈希(LSH)等。
          3: 当用户发起查询时,数据库利用索引来快速找到与查询向量最相似的结果。

  4. chroma

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

        存储向量数据及其元数据
        向量文档和查询文档
        查询向量文档
    Chroma 默认使用的相似度计算模式是 L2(欧氏距离)。这意味着当用户没有明确指定其他的相似度度量方法时,Chroma 会采用计算两个向量之间欧氏距离的方式来衡量它们的相似度。
    在实际应用中,如果需要更改默认的相似度计算方式,比如改为使用余弦相似度(cosine),可以在初始化 Chroma 数据库或者创建集合时通过相应的参数进行设置。
    在python环境下,可以跑以下脚本运行:

    db = Chroma(
        collection_name=collection_name,
        embedding_function=emb_fun,
        persist_directory=persist_directory,
        client_settings={
            'hnsw:space': 'cosine'  # 或者 'l2' 等其他度量方法
        }
    )
    pip install chromadb
    pip install sentence_transformers
    chroma run --path /db_path 
    import chromadb
    from chromadb import Settings
    
    
    
    class MyVectorDBConnector:
        def __init__(self, collection_name, embedding_fn):
            chroma_client = chromadb.Client(Settings(allow_reset=True))
    
            chroma_client.reset()
    
            # 创建一个collection
            self.collection = chroma_client.get_or_create_collection(
                name = collection_name)
            self.embedding_fn = embedding_fn
    
        def add_documents(self, documents):
            '''向 collection 中添加文档与向量'''
            self.collection.add(
                embeddings=self.embedding_fn(documents),
                documents=documents,
                ids=[f"id{i}" for i in range(len(documents))]
            )
    
        def search(self, query_text, top_n=3):
            '''检索向量数据库'''
            results = self.collection.query(
                query_embeddings=self.embedding_fn([query_text]),
                n_results=top_n
            )
            return results

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值