在大模型、AI应用遍地的今天,你也许听说过关系数据库以及向量数据库这些概念,它到底是什么?为什么AI离不开它?这和我们所熟悉的MySQL、Redis有什么区别呢?
今天用一篇博客,把向量数据库分享一下,新手也能轻松看明白!

一、先明白什么是向量

在讲数据库之前,必须要理解向量(Embedding,嵌入向量)。
简单来说,向量就是把文字、图片、声音、视频等多模态信息转变为一串数字
比如:

  • 猫→[0.12,0.33,-0.56,…]
  • 狗→[0.11,0.38,-0.57,…]
  • 手机→[0.82,-0.63,0.36,…]
    AI模型会把语义相近的内容,生成距离相近的向量,内容差别越大,向量的距离就越远。
    向量数据库就是专门用于存储这些"数字串",并能够快速找出最相似的那一个。

二、向量数据库与关系数据库区别

  • 关系型数据库例如MySQL擅长:精准查询(查找ID=1,name=Jack);结构化数据(表格、数字、字符串)
  • 向量数据库擅长:相似性查询(意思最像、内容最接近);高维非结构化数据(文本、图片、音频等)
    接下来用一个例子深入说明一下:在我们手机的相册里有很多照片,传统的关系型数据库可以帮你存储照片的元数据,比如拍摄的时间、地点、经纬度等,但是你要根据照片的人物、颜色、纹理进行搜索时,传统的数据库将不能满足需求,此时,向量数据库就可以派上用场。可以使用一个多维的空间使得每张照片特征都位于该空间内,并用已有的纬度进行表示,此照片的信息将作为一个点。以此类推,可以在该空间中构建出无数的点,将这些点与坐标原点进行连接,就产生一个个的向量,此时就能够获取更多的信息,当要进行检索时,也会更加容易。
    注意:在对向量数据库进行检索时,检索不是唯一的、精确的,而是查询和目标向量最为相似的一些向量,具有模糊性。
    其实,我们现在使用的以图搜图、视频相关推荐、相似物品推荐等功能都是基于对多模态信息(图片、视频、商品)进行向量化所产生的功能。

三、向量数据库的核心技术原理

1、向量相似度计算

向量数据库依靠<距离>来判断相似性,常用两种方式:
余弦相似度:适用于文本、语义检索、关注方向
欧式距离:适合图片、特征检索、关注绝对距离

2、索引方法

数据库中存储的信息一般很多,这就必须使用索引加速来解决:

  • HNSW(层次化导航):它是工业界的主流,特点是速度快、精度高
  • IVF(倒排文件):适用于大数据量,用精度换速度
  • FLAT:暴力搜索,数据量少,精度最高

3、数据结构

向量数据库的数据结构是向量结合__元数据__(标签、时间、来源)混合存储成熟
支持过滤检索:向量相似搭配元数据条件

四、向量数据库在RAG中的技术流程

检索增强生成是向量数据库最核心的使用,流程如下:
文档切分:长文本按照一定的切割要求划分为小块
向量化处理:用嵌入模型Embedding进行向量转换
入库存储:向量化的结果结合原文存入向量数据库
检索:用户问题也进行向量转换,查找最相似的文档块
生成:将检索结果输入大模型,生成答案

from langchain_community.vectorstores import Chroma
from langchain_openai import OpenAIEmbeddings
from langchain_community.document_loaders import TextLoader
from langchain_text_splitters import CharacterTextSplitter
import os
import dotenv

dotenv.load_dotenv()
os.environ['OPENAI_API_KEY'] = os.getenv("OPENAI_API_KEY")
os.environ['OPENAI_BASE_URL'] = os.getenv("OPENAI_BASE_URL")

# 1、创建一个TextLoader的实例,并将指定的文档加载
loader = TextLoader(
    file_path = "./asset/load/09-ai1.txt",
    encoding="utf-8"
)
docs = loader.load() # List[Document]

# 2、创建文本拆分器并拆分文档
text_split = CharacterTextSplitter(
    chunk_size=1000,
    chunk_overlap=100
)
splitter_docs = text_split.split_documents(docs)

# 3、创建嵌入模型
embedding_model = OpenAIEmbeddings(model="text-embedding-ada-002")

# 4、将文档及嵌入模型传入到Chroma相关结构,进行数据存储
db = Chroma.from_documents(
    documents=splitter_docs,
    embedding=embedding_model,
)

五、常见的向量数据库有哪些

Milvus:开源、高性能、生态成熟、用于存储检索和管理由深度神经网络和其他ML模型产生的大量嵌入向量的数据库
Chroma:轻量、适合于小项目、对Python友好
Pinecone:云原生、托管服务、开箱即用
Weaviate:支持混合搜索、图结构
FAISS:Facebook开源、算法库

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐