向量数据库是什么
向量数据库是用来存储和搜索 embedding 向量的数据库。
普通数据库擅长查:
where user_id = 123
向量数据库擅长查:
找出和这个问题语义最接近的 5 段文档
为什么需要向量数据库
Embedding 会把文本变成向量:
"登录失败" -> [0.12, -0.45, 0.87, ...]
当文档很多时,需要一个数据库高效搜索“距离最近”的向量。
常见能力
- 存储向量
- 相似度搜索
- topK 检索
- metadata 过滤
- 增量更新
- 删除和重建索引
常见能力解释
存储向量
普通数据库通常存文本、数字、时间等字段;向量数据库除了存原文,还会存 embedding。
{
"id": "chunk-001",
"text": "用户登录失败时需要检查账号状态。",
"embedding": [0.12, -0.45, 0.87]
}
这里的 embedding 可以理解成这段文本在“语义空间”里的坐标。
相似度搜索
相似度搜索不是按关键词完全匹配,而是按“意思接近”来找内容。
比如用户问:
为什么登录不了?
即使原文没有“为什么登录不了”这几个字,只要原文语义接近,也可能被搜出来:
用户登录失败时需要检查账号状态。
代码上可以理解成:
const queryEmbedding = embed("为什么登录不了?")
const results = await vectorDB.search({
vector: queryEmbedding
})
topK 检索
topK 表示只返回最相似的前 K 条结果。
const results = await vectorDB.search({
vector: embed("为什么登录不了?"),
topK: 3
})
如果 topK = 3,就是只拿最相关的 3 段文档。
返回结果可能长这样:
[ { "id": "chunk-001", "score": 0.92 }, { "id": "chunk-008", "score": 0.87 }, { "id": "chunk-015", "score": 0.81 }]
score 通常表示相似度分数,越高越相似。
metadata 过滤
metadata 是向量之外的附加信息,用来缩小搜索范围。
比如只搜索 auth.md 里的内容:
const results = await vectorDB.search({
vector: embed("为什么登录不了?"),
topK: 5,
filter: {
file: "auth.md"
}
})
常见 metadata:
{
"file": "auth.md",
"section": "登录排查",
"module": "account"
}
它的作用类似普通数据库里的 where 条件。
增量更新
文档发生变化时,不一定要把整个知识库全部重建。更常见的做法是只更新变化的 chunk。
await vectorDB.upsert({
id: "chunk-001",
text: "用户登录失败时需要检查账号是否被冻结。",
embedding: embed("用户登录失败时需要检查账号是否被冻结。"),
metadata: {
file: "auth.md",
section: "登录排查"
}
})
upsert 可以理解为:
如果 id 已存在,就更新;
如果 id 不存在,就插入。
删除和重建索引
如果某个文件被删除,就要把这个文件对应的向量也删掉:
await vectorDB.delete({
filter: {
file: "auth.md"
}
})
如果切分规则、embedding 模型或 metadata 结构变了,通常需要重建索引:
await vectorDB.dropIndex()
await vectorDB.createIndex()
for (const chunk of chunks) {
await vectorDB.upsert({
id: chunk.id,
text: chunk.text,
embedding: embed(chunk.text),
metadata: chunk.metadata
})
}
重建索引可以理解成:把旧的语义搜索目录清空,然后按新的规则重新生成一份。
常见产品
- Qdrant
- Milvus
- Chroma
- LanceDB
- pgvector
- Weaviate
数据通常长这样
{
"id": "chunk-001",
"text": "用户登录失败时需要检查账号状态。",
"embedding": [0.12, -0.45, 0.87],
"metadata": {
"file": "auth.md",
"section": "登录排查"
}
}
总结
向量数据库 = 存储 embedding 并按语义相似度搜索内容的数据库。