向量数据库
向量数据库(Vector Database)就是存储和处理向量的数据库。向量是指一组数据,而向量数据库是指处理高维数组的数据库。
上面这个定义,几乎就是个废话,既没有解释清楚向量,也没有解释清楚向量数据库。
通俗地讲,对于一段文本(或任何其他数据比如图片/音频/视频等),可以使用多个维度的数据表示,在高纬空间中,这个文本数据就表示成一个点。多个文本就是多个点,点和点之间可以用距离表示相关性,比如“汽车”和“交通工具”离的会很近,和“橘子”就离的比较远。向量就是一组这样的维度数据(表示一段文本,一个图片),而把原始数据转为维度数据称作“嵌入”(Embedding),需要使用模型。
常用的向量数据库是Milvus,轻量级的是ChromaDB. ChromaDB 可以使用pip安装,直接集成到python。
pip3 install chromadbChromaDB默认使用的模型是 all-MiniLM-L6-v2,这是一个比较小的模型,生成384维的向量。其他可选择的模型有OpenAI的text-embedding-3-small (1536 维) 和 text-embedding-3-large (3072 维)。
下面使用python调用chromadb的例子
import chromadb
chroma_client = chromadb.Client()
collection = chroma_client.get_or_create_collection(name="city_life_docs")
documents = [
"沈阳今天天气晴朗,最高气温25度,适合户外活动",
"上海地铁二号线因设备故障暂时停运,建议乘客选择其他交通方式",
"杭州西湖是著名的旅游景点,四季风景各异,吸引大量游客参观",
"故宫是中国古代建筑的杰出代表,展现了传统宫殿建筑的精湛工艺",
"台风'梅花'预计明晚登陆东南沿海,部分地区将有暴雨和大风"
]
collection.add(
documents=documents,
ids=["doc1", "doc2", "doc3", "doc4", "doc5"],
metadatas=[
{"category": "weather", "city": "沈阳"},
{"category": "traffic", "city": "上海"},
{"category": "tourism", "city": "杭州"},
{"category": "architecture", "city": "北京"},
{"category": "weather", "city": "东南沿海"}
]
)
results = collection.query(
query_texts=["明天天气情况"], #推荐适合旅游的城市
n_results=2
)
ids = results['ids'][0]
documents = results['documents'][0]
distances = results['distances'][0]
for i in range(len(ids)):
doc_id = ids[i]
distance = distances[i]
document = documents[i]
print(f"{doc_id:<5}(Distance {distance}): {document}")
输出如下:
doc1 (Distance 0.5425974726676941): 沈阳今天天气晴朗,最高气温25度,适合户外活动
doc5 (Distance 0.9872395992279053): 台风'梅花'预计明晚登陆东南沿海,部分地区将有暴雨和大风