向量数据库的基本概念、原理、算法与选型
向量数据库是 AI 应用基础设施中的关键组件,其核心在于高效存储和检索高维向量数据。随着大模型技术的发展,向量数据库在语义搜索、RAG(检索增强生成)等场景中扮演着重要角色。
GPT 的缺陷与需求背景
过去几个月,人工智能领域经历了革命性变化,GPT-3.5/4 等大语言模型横空出世。然而,这些模型存在天然的限制,尤其是输入端上下文(tokens)大小的限制。例如 gpt-3.5-turbo 模型的限制约为 4K tokens(约 3000 字),这意味着使用者最多只能输入有限的内容给模型进行理解和推理。
有人可能会认为,既然 ChatGPT 有对话记忆功能,将文字拆分成多次输入即可解除限制。这种想法并不完全正确。GPT 作为 LLM 模型本身没有长期记忆功能,所谓的记忆只是开发者将对话记录存储在内存或数据库中,通过 Prompt 组合发送给模型。如果对话记忆超过 token 限制,模型就会遗忘之前的内容。这是目前 GPT 在处理复杂任务时无法克服的缺陷。
不同模型的 token 限制也不同,gpt-4 为 32K tokens,Claude 模型可达 100K tokens。虽然这能处理更长的上下文(如整本《哈利波特》),但响应速度会显著下降(例如处理 72K tokens 需 22 秒)。更重要的是,API 价格按 tokens 收费,输入上下文越多,成本越昂贵。在算力、成本和注意力机制未有重大突破前,绕过 GPT token 限制成为开发者的难题。
向量数据库的崛起
在 GPT 模型的限制下,向量数据库提供了一种解决方案。其核心思想是将文本转换成向量,存储在数据库中。当用户输入问题时,将问题转换为向量,在数据库中搜索最相似的向量和上下文,最后将文本返回给用户。
例如,对于客服培训资料或操作手册,可以先将所有内容转化为向量(Vector Embedding)。当用户提问时,将问题转化为向量,搜索最相似的几个上下文,返回给 GPT。这不仅减少了 GPT 的计算量,提高了响应速度,还降低了成本并绕过了 token 限制。
此外,向量数据库还可用于保存长对话记录。当提问时,将问题转化为向量对聊天记录进行语义搜索,找到最相关的'记忆'发送给 GPT,提高输出质量。
Vector Embeddings
传统数据库基于 B Tree、倒排索引等实现精确匹配和排序(BM25、TF-IDF),适合关键字搜索,但对语义搜索较弱。例如搜索'小狗',无法得到'柯基'、'金毛'的结果,因为它们是不同词,传统数据库无法识别语义关系。
处理非结构化数据(图像、音频、视频)时,特征数量会快速膨胀,人工标注特征(Feature Engineering)变得困难。Vector Embedding 通过 AI 模型自动生成高维度向量数据,代表数据的不同特征。
- 文本:特征包括词汇、语法、语义、情感、主题等。例如使用 OpenAI 的 text-embedding-ada-002 模型生成 1536 维向量。
- 图像:可使用 clip-vit-base-patch32 模型生成。
- 音频:可使用 wav2vec2-base-960h 模型生成。
这些向量包含语义信息,可存入向量数据库进行后续语义搜索。
特征和向量
区分不同事物通常通过识别不同特征来实现。例如区分狗的种类,可通过体型、毛发长度、鼻子长短等特征。每只狗对应一个多维坐标点,世间万物都可以用一个多维坐标系表示,在高维特征空间中对应一个坐标点。
相似性搜索(Similarity Search)即通过计算向量之间的距离来判断相似度。距离越近,特征越接近,相似度越高。
相似性搜索 (Similarity Search)
在海量的数据中找到和某个向量最相似的向量,直接比较计算量巨大,需要高效的近似最近邻(Approximate Nearest Neighbor, ANN)算法。主要思想是通过减少向量大小或缩小搜索范围来提高效率。
K-Means 和 Faiss
聚类算法可以将向量数据分成多个簇。搜索时先判断搜索向量属于哪个簇,再在该簇中搜索,减少搜索范围。
- K-Means:将数据分成 k 个类别,通过迭代调整聚类中心位置。
- Faiss:利用 Voronoi 单元格划分空间,测量查询向量与质心距离,限制搜索范围。支持动态调整 nprobe 值以平衡速度与精度。
Product Quantization (PQ)
大规模数据集中,聚类算法内存占用大。PQ 通过量化(有损压缩)解决此问题。
在高维坐标系中,维度灾难会导致聚类中心数量指数级增长。PQ 将向量分解为多个子向量,对每个子向量独立进行量化。例如将 128 维向量分为 8 个 16 维子向量,分别聚类,大幅降低码本大小和内存开销。代价是搜索质量略有下降。


