AI创想
标题:
向量数据库chromadb
[打印本页]
作者:
林克link02
时间:
4 小时前
标题:
向量数据库chromadb
作者:CSDN博客
最近在学习AGI, 学习了向量数据库,
什么是向量:
向量是一种有大小和方向的数学对象。它可以表示为从一个点到另一个点的有向线段。例如,二维空间中的向量可以表示为 (x,y),表示从原点 (0,0) 到点 (x,y) 的有向线段。
(, 下载次数: 0)
上传
点击文件名下载附件
以此类推,我可以用一组坐标 (x0,x1,…,xN−1) 表示一个 N 维空间中的向量,N 叫向量的维度。
文本向量:
将文本转成一组N维浮点数,即文本向量又叫Embeddings,向量之间通过计算距离,根据距离远近来确定语义的相似度。
向量间的相似度计算:可以通过欧氏距离或余弦距离来判断
(, 下载次数: 0)
上传
点击文件名下载附件
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)):
(, 下载次数: 0)
上传
点击文件名下载附件
存储向量数据及其元数据
向量文档和查询文档
查询向量文档
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
复制代码
原文地址:https://blog.csdn.net/weiwin/article/details/142521531
欢迎光临 AI创想 (https://llms-ai.com/)
Powered by Discuz! X3.4