向量数据库(Vector Database)就是存储和处理向量的数据库。向量是指一组数据,而向量数据库是指处理高维数组的数据库。

上面这个定义,几乎就是个废话,既没有解释清楚向量,也没有解释清楚向量数据库。

通俗地讲,对于一段文本(或任何其他数据比如图片/音频/视频等),可以使用多个维度的数据表示,在高纬空间中,这个文本数据就表示成一个点。多个文本就是多个点,点和点之间可以用距离表示相关性,比如“汽车”和“交通工具”离的会很近,和“橘子”就离的比较远。向量就是一组这样的维度数据(表示一段文本,一个图片),而把原始数据转为维度数据称作“嵌入”(Embedding),需要使用模型。

常用的向量数据库是Milvus,轻量级的是ChromaDB. ChromaDB 可以使用pip安装,直接集成到python。

pip3 install chromadb

ChromaDB默认使用的模型是 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): 台风'梅花'预计明晚登陆东南沿海,部分地区将有暴雨和大风