目录

向量数据库 2023:从 RAG 到大模型的知识引擎

前言

2023 年,大语言模型(LLM)的爆发催生了一个新的基础设施赛道——向量数据库。从 LlamaIndex 到 LangChain,几乎所有 LLM 应用框架都把向量数据库作为核心组件。GitHub 上向量数据库相关项目在一年内增长了 10 倍以上。那么,向量数据库到底是什么?它解决了什么问题?

什么是向量数据库?

向量(Vector)是什么

在 AI 世界中,任何数据——文本、图片、音频、视频——都可以被 AI 模型转化为一组浮点数,称为向量(embedding)。相似的向量在空间中距离更近:

"猫" → [0.12, 0.34, -0.56, 0.78, ...]  # 512 维向量
"狗" → [0.15, 0.31, -0.50, 0.80, ...]  # 与猫的向量接近
"汽车" → [0.90, -0.23, 0.45, -0.12, ...] # 与猫的向量很远

传统数据库(MySQL、PostgreSQL)用精确匹配或关键字搜索,而向量数据库专门做相似性搜索——“找和这个最像的 N 个”。

与传统数据库的对比

维度 传统数据库 向量数据库
查询方式 精确匹配、B-tree 索引 近似最近邻(ANN)搜索
数据类型 结构化数据(字符串、数字) 高维浮点向量(128-4096 维)
索引结构 B+ 树、哈希 HNSW、IVF、PQ
核心操作 SELECT WHERE id = ? SELECT WHERE vector ≈ ?
典型场景 电商订单、用户信息 语义搜索、推荐系统

为什么 2023 年向量数据库突然火了?

大模型的"知识短板"

ChatGPT 等大模型有一个致命问题:训练数据有截止日期,不知道私有数据。要让它了解你自己的文档库、客服记录或代码库,就需要把数据喂给模型。但:

  1. 每次问答都把所有文档塞进 Prompt?——Token 数量爆炸,成本太高
  2. 让模型增量训练?——训练一次几百万美元,不现实

RAG(检索增强生成)架构

解决之道就是 RAG(Retrieval-Augmented Generation)

用户提问 → 向量搜索 → 找到最相关的 N 段文本 → 拼入 Prompt → LLM 回答

RAG 把"记忆"外挂到向量数据库上,LLM 只管"理解"和"生成"。这样既省钱,又能随时更新知识。

RAG 是 2023 年最火的 LLM 应用架构,而向量数据库是 RAG 的基石。

主流向量数据库对比

Pinecone(SaaS / 专有)

最早商业化、最成熟的向量数据库。

import pinecone

pinecone.init(api_key="your-key")
index = pinecone.Index("my-index")

# 写入向量
index.upsert([
    ("id1", [0.1, 0.2, 0.3], {"text": "示例文档"}),
])

# 搜索
results = index.query(
    vector=[0.1, 0.2, 0.3],
    top_k=5,
    include_metadata=True
)
  • 优点:零运维,开箱即用,性能稳定
  • 缺点:专有 SaaS,数据不出云,成本较高

Milvus(开源 / CNCF 项目)

最流行的开源向量数据库,CNCF 毕业项目。

from pymilvus import Collection, connections

connections.connect("default", host="localhost", port="19530")
collection = Collection("my_collection")

# 搜索
results = collection.search(
    data=[[0.1, 0.2, 0.3]],
    anns_field="vector",
    param={"metric_type": "L2", "params": {"ef": 64}},
    limit=5,
    output_fields=["text"]
)
  • 优点:功能丰富,支持 GPU 加速,大规模集群
  • 缺点:部署运维复杂,小场景有点重

Qdrant(开源 / Rust 编写)

2023 年增长最快的向量数据库之一。

from qdrant_client import QdrantClient

client = QdrantClient(host="localhost", port=6333)

client.upsert(
    collection_name="docs",
    points=[
        {"id": 1, "vector": [0.1, 0.2, 0.3], "payload": {"text": "示例"}}
    ]
)
  • 优点:Rust 编写,性能优秀,单二进制部署简单
  • 优点:支持过滤 + 向量混合搜索,API 设计优雅
  • 缺点:社区规模不如 Milvus

Chroma(轻量级 / 开发者友好)

专为 AI 应用设计的嵌入式向量数据库。

import chromadb

client = chromadb.Client()
collection = client.create_collection("docs")

collection.add(
    documents=["这是一篇关于 AI 的文章"],
    metadatas=[{"source": "blog"}],
    ids=["doc1"]
)

results = collection.query(
    query_texts=["机器学习"],
    n_results=5
)
  • 优点:零配置,pip install 即用,完美嵌入 AI Prototype
  • 缺点:不适合生产级大规模场景

性能对比总览

数据库 开源 部署方式 核心语言 适合场景
Pinecone SaaS 生产级、不想运维
Milvus 自建/K8s Go/C++ 大规模、企业级
Qdrant 自建/Docker Rust 高性能、中大规模
Chroma 嵌入式 Python 原型开发、学习
Weaviate 自建/Docker Go 自带向量化模块

实战:构建一个 RAG 知识库

下面用一个完整的 Python 示例,展示向量数据库在 RAG 中的工作流程:

import os
from openai import OpenAI
import chromadb

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

# 2. 准备文档
documents = [
    "Go 1.21 引入了 min/max 内置函数和 clear 函数",
    "Go 1.21 的 log/slog 标准库提供了结构化日志",
    "Go 1.21 新增了 slices 和 maps 两个标准包",
]

# 3. 创建 Embedding(使用 OpenAI 的 text-embedding-ada-002)
openai = OpenAI(api_key=os.getenv("OPENAI_API_KEY"))

for i, doc in enumerate(documents):
    response = openai.embeddings.create(
        model="text-embedding-ada-002",
        input=doc
    )
    embedding = response.data[0].embedding
    
    # 存入向量数据库
    collection.add(
        embeddings=[embedding],
        documents=[doc],
        ids=[f"doc_{i}"]
    )

# 4. 用户提问
question = "Go 1.21 有什么新特性?"

# 5. 将问题转为向量
q_response = openai.embeddings.create(
    model="text-embedding-ada-002",
    input=question
)
q_embedding = q_response.data[0].embedding

# 6. 向量数据库中搜索
results = collection.query(
    query_embeddings=[q_embedding],
    n_results=2
)

# 7. 组装 Prompt
context = "\n".join(results["documents"][0])
prompt = f"""基于以下信息回答问题:

{context}

问题:{question}
"""

# 8. LLM 生成回答
answer = openai.chat.completions.create(
    model="gpt-3.5-turbo",
    messages=[{"role": "user", "content": prompt}]
)

print(answer.choices[0].message.content)

完整的 RAG 流程就是:文档 → 向量化 → 存储 → 搜索 → 增强 → 生成。

2023 年的趋势与新进展

1. PostgreSQL + pgvector

如果你不想引入额外的数据库,PostgreSQL 的 pgvector 扩展在 2023 年变得非常流行:

-- 安装 pgvector 扩展
CREATE EXTENSION vector;

-- 创建向量列
CREATE TABLE documents (
    id SERIAL PRIMARY KEY,
    content TEXT,
    embedding vector(1536)
);

-- 创建索引(IVFFlat 或 HNSW)
CREATE INDEX ON documents USING ivfflat (embedding vector_cosine_ops);

-- 相似性搜索
SELECT content, 1 - (embedding <=> '[0.1, 0.2, ...]') AS similarity
FROM documents
ORDER BY embedding <=> '[0.1, 0.2, ...]'
LIMIT 5;

pgvector 的意义在于:在已有的 PostgreSQL 上零额外运维成本获得向量能力

Sparse + Dense 向量的混合搜索成为 2023 年热门方向。稀疏向量(如 BM25)擅长关键词精确匹配,稠密向量擅长语义理解,两者结合效果最佳。

关键词搜索(BM25)    → 稀疏向量
语义搜索(Embedding) → 稠密向量
        ↓
   加权融合结果
        ↓
   最佳排序输出

3. 向量数据库 + AI Agent

2023 年底,向量数据库不只是"知识外挂",还成为 AI Agent 的长期记忆层。Agent 的每次对话、行为、决策向量化后存入数据库,让 Agent 拥有"记忆"。

选型建议

场景 推荐 理由
学习/原型 Chroma 零配置,最快上手
已有 PostgreSQL pgvector 无需新基础设施
中小生产(<1M 向量) Qdrant 单二进制部署,性能好
大规模生产(>10M 向量) Milvus + K8s 集群能力,GPU 加速
不想运维 Pinecone SaaS,开箱即用

总结

2023 年是向量数据库从"小众技术"走向"基础设施"的一年。它的命运与 LLM 和 RAG 紧密绑定——只要大模型的"知识断层"问题存在,向量数据库就是不可或缺的一环。选型时要根据团队运维能力、数据规模和场景来决定,不必过度追求大规模方案。

核心要点 说明
核心价值 在百万级向量中毫秒级找到最相似的结果
爆发原因 LLM 的"知识短板" + RAG 架构需求
主流方案 Pinecone / Milvus / Qdrant / Chroma / pgvector
发展趋势 混合搜索、PostgreSQL 集成、AI Agent 记忆层