最近在学习AGI, 学习了向量数据库,
-
什么是向量:
向量是一种有大小和方向的数学对象。它可以表示为从一个点到另一个点的有向线段。例如,二维空间中的向量可以表示为 (x,y),表示从原点 (0,0) 到点 (x,y) 的有向线段。
以此类推,我可以用一组坐标 (x0,x1,…,xN−1) 表示一个 N 维空间中的向量,N 叫向量的维度。 -
文本向量:
将文本转成一组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)
-
向量数据库
知道什么是向量和文本向量后,我们来继续了解什么时向量数据库:
向量数据库,就是一种专门用于存储和查询向量数据库的数据库系统。这类数据库的主要特点存储的数据类型是数学向量,即一系列数值的有序集合。这些向量通常表示的是多维空间中的点,可以用来表示文本、图像、音频、视频等多种类型的数据经过向量化后的特征表示。
工作原理:
1: 数据存储:将向量数据及其相关的元数据存储到数据库中
2: 索引构建:为了加速相似性搜索,数据库会建立索引结构,如 KD 树、球树(Ball Tree)、局部敏感哈希(LSH)等。
3: 当用户发起查询时,数据库利用索引来快速找到与查询向量最相似的结果。 -
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