向量数据库:AI记忆的秘密仓库

一句话总结:向量数据库是AI时代最重要的基础设施之一,它让AI能够"记住"和"检索"海量非结构化数据,是RAG和Agent的核心组件。


🧠 引子:AI为什么需要"特殊"的数据库?

传统数据库很擅长回答:

-- 精确查询
SELECT * FROM users WHERE id = 12345;

-- 条件过滤
SELECT * FROM products WHERE price < 100 AND category = '电子产品';

但有一类问题,传统数据库完全无能为力:

"帮我找出所有和'苹果手机摄像头评测'这个含义相似的文章"
"找到和这张图片风格最接近的10张图"
"找出所有和这份简历最匹配的职位描述"

这些问题的共同特点:查询的是"含义相似",而不是"字面相等"。

解决这个问题,就需要向量数据库


🔢 什么是"向量"?

理解向量数据库,先要理解什么是向量(Embedding)。

一句话解释

向量就是用一组数字来表示某个事物的"意义"。

# 举个简单例子(实际向量维度是1536维或更高)
"猫"[0.8, 0.2, 0.1, 0.7, ...]
"猫咪"[0.79, 0.21, 0.12, 0.69, ...]  # 非常接近
"汽车"[0.1, 0.9, 0.6, 0.2, ...]       # 很不同
"狗"[0.7, 0.3, 0.2, 0.6, ...]         # 比较接近(都是宠物)

相似的内容,向量就接近

这些数字不是随机的——OpenAI的text-embedding-3模型或其他Embedding模型通过大量训练,学会了让语义相似的内容产生接近的向量。

衡量两个向量的"距离",常用方法是:

余弦相似度 = cos(向量A, 向量B)
= 0 → 完全不同
= 0.5 → 有些相似
= 1.0 → 完全相同

🏗️ 向量数据库的工作原理

原始数据(文本/图片/音频)
         ↓
   Embedding模型处理
         ↓
   生成向量(1536维数字)
         ↓
   存入向量数据库
         ↓
   高效索引(HNSW/IVF等算法)
         
查询时:
查询内容 → Embedding → 查询向量
                              ↓
                    在数据库中找最相似的向量
                              ↓
                    返回对应的原始内容

核心挑战:高维向量的快速检索

1536维的向量,如果有1000万条数据,暴力比较需要计算1000万次1536维的相似度——极其慢。

向量数据库用专门的近似最近邻(ANN)算法解决这个问题:

HNSW(分层可导航小世界图)

把所有向量组织成多层"小世界网络"
查询时从顶层快速定位大概区域
然后逐层精确找到最相似的结果

效果:1亿条数据,毫秒级返回最相似的100条

🗄️ 主流向量数据库对比

数据库 特点 适合场景
Pinecone 纯云服务,全托管,零运维 快速原型,不想管运维
Weaviate 开源+云,内置BM25混合搜索 需要关键词+语义混合搜索
Qdrant 开源,Rust编写,性能极好 高性能本地部署
Milvus 开源,阿里支持,适合超大规模 十亿级向量,企业级
Chroma 轻量开源,Python原生 开发测试,小规模应用
pgvector PostgreSQL插件 已有PG数据库,想加向量能力
Redis Vector Redis扩展 已有Redis,低延迟场景

选型建议

  • 个人项目/原型:Chroma(最简单)
  • 生产环境:QdrantWeaviate
  • 超大规模:Milvus
  • 不想运维:Pinecone

💻 实战:用Chroma构建文档问答系统

# 安装
pip install chromadb langchain openai

import chromadb
from langchain.embeddings import OpenAIEmbeddings
from langchain.text_splitter import RecursiveCharacterTextSplitter

# 1. 准备文档
documents = [
    "机器学习是人工智能的一个分支,通过算法让计算机从数据中学习。",
    "深度学习使用多层神经网络处理复杂模式,是现代AI的核心技术。",
    "自然语言处理(NLP)让计算机理解和生成人类语言。",
    "计算机视觉使计算机能够理解和分析图像和视频。",
    "强化学习通过奖励机制训练智能体做出决策。"
]

# 2. 初始化向量数据库
client = chromadb.Client()
collection = client.create_collection("ai_knowledge")

# 3. 生成向量并存储
embeddings_model = OpenAIEmbeddings()
embeddings = embeddings_model.embed_documents(documents)

collection.add(
    documents=documents,
    embeddings=embeddings,
    ids=[f"doc_{i}" for i in range(len(documents))]
)

# 4. 语义搜索
query = "怎么让AI理解图片?"
query_embedding = embeddings_model.embed_query(query)

results = collection.query(
    query_embeddings=[query_embedding],
    n_results=2  # 返回最相似的2条
)

print("最相关的内容:")
for doc in results['documents'][0]:
    print(f"- {doc}")
    
# 输出:
# - 计算机视觉使计算机能够理解和分析图像和视频。
# - 深度学习使用多层神经网络处理复杂模式...

🔄 向量数据库 + RAG:AI记忆的完整方案

向量数据库最重要的应用是和RAG(检索增强生成)结合:

from langchain_openai import ChatOpenAI, OpenAIEmbeddings
from langchain.vectorstores import Chroma
from langchain.chains import RetrievalQA

# 构建知识库(一次性操作)
vectorstore = Chroma.from_texts(
    texts=your_documents,  # 你的私有文档
    embedding=OpenAIEmbeddings()
)

# 创建问答链
qa_chain = RetrievalQA.from_chain_type(
    llm=ChatOpenAI(model="gpt-4o"),
    retriever=vectorstore.as_retriever(
        search_kwargs={"k": 5}  # 每次检索5条相关内容
    )
)

# 问答
answer = qa_chain.invoke("公司的员工报销流程是什么?")

工作流程:

  1. 用户提问 → 转为查询向量
  2. 在向量库中找到最相关的5段文档
  3. 把这5段文档 + 用户问题一起发给GPT
  4. GPT基于这些真实文档生成回答

效果:AI只会基于你的实际文档回答,不会"编造",也不会用训练数据中的过时信息。


📊 向量数据库的进阶功能

混合搜索(Hybrid Search)

# 传统关键词搜索 + 语义搜索的混合
results = collection.query(
    query_text="苹果手机",
    # 关键词匹配:"苹果"、"手机" 精确出现的文档得分高
    # 语义匹配:"iPhone"、"iOS设备" 也被找到
    search_type="hybrid",
    alpha=0.5  # 0=纯关键词,1=纯语义,0.5=各半
)

元数据过滤

# 先过滤,再做语义搜索
results = collection.query(
    query_embeddings=[query_vector],
    where={
        "date": {"$gte": "2024-01-01"},  # 只搜2024年之后的文档
        "category": "technology"          # 只搜技术类文档
    }
)

📌 总结

向量数据库解决的问题 技术本质
语义搜索 相似向量检索
推荐系统 用户/物品向量匹配
RAG知识库 文档向量+相似度召回
图像搜索 视觉向量比较
人脸识别 人脸向量匹配

向量数据库是AI时代的基础设施,就像关系型数据库是互联网时代的基础设施。

几乎所有真正有用的AI应用,背后都有一个向量数据库在支撑。


延伸阅读

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐