知识库与检索 - 向量数据库

向量数据库是什么

向量数据库是用来存储和搜索 embedding 向量的数据库。

普通数据库擅长查:

ini 复制代码
where user_id = 123

向量数据库擅长查:

复制代码
找出和这个问题语义最接近的 5 段文档

为什么需要向量数据库

Embedding 会把文本变成向量:

rust 复制代码
"登录失败" -> [0.12, -0.45, 0.87, ...]

当文档很多时,需要一个数据库高效搜索"距离最近"的向量。

常见能力

  • 存储向量
  • 相似度搜索
  • topK 检索
  • metadata 过滤
  • 增量更新
  • 删除和重建索引

常见能力解释

存储向量

普通数据库通常存文本、数字、时间等字段;向量数据库除了存原文,还会存 embedding。

json 复制代码
{
  "id": "chunk-001",
  "text": "用户登录失败时需要检查账号状态。",
  "embedding": [0.12, -0.45, 0.87]
}

这里的 embedding 可以理解成这段文本在"语义空间"里的坐标。

相似度搜索

相似度搜索不是按关键词完全匹配,而是按"意思接近"来找内容。

比如用户问:

复制代码
为什么登录不了?

即使原文没有"为什么登录不了"这几个字,只要原文语义接近,也可能被搜出来:

复制代码
用户登录失败时需要检查账号状态。

代码上可以理解成:

ini 复制代码
const queryEmbedding = embed("为什么登录不了?")

const results = await vectorDB.search({
  vector: queryEmbedding
})

topK 检索

topK 表示只返回最相似的前 K 条结果。

php 复制代码
const results = await vectorDB.search({
  vector: embed("为什么登录不了?"),
  topK: 3
})

如果 topK = 3,就是只拿最相关的 3 段文档。

返回结果可能长这样:

css 复制代码
[  { "id": "chunk-001", "score": 0.92 },  { "id": "chunk-008", "score": 0.87 },  { "id": "chunk-015", "score": 0.81 }]

score 通常表示相似度分数,越高越相似。

metadata 过滤

metadata 是向量之外的附加信息,用来缩小搜索范围。

比如只搜索 auth.md 里的内容:

php 复制代码
const results = await vectorDB.search({
  vector: embed("为什么登录不了?"),
  topK: 5,
  filter: {
    file: "auth.md"
  }
})

常见 metadata:

json 复制代码
{
  "file": "auth.md",
  "section": "登录排查",
  "module": "account"
}

它的作用类似普通数据库里的 where 条件。

增量更新

文档发生变化时,不一定要把整个知识库全部重建。更常见的做法是只更新变化的 chunk。

php 复制代码
await vectorDB.upsert({
  id: "chunk-001",
  text: "用户登录失败时需要检查账号是否被冻结。",
  embedding: embed("用户登录失败时需要检查账号是否被冻结。"),
  metadata: {
    file: "auth.md",
    section: "登录排查"
  }
})

upsert 可以理解为:

bash 复制代码
如果 id 已存在,就更新;
如果 id 不存在,就插入。

删除和重建索引

如果某个文件被删除,就要把这个文件对应的向量也删掉:

css 复制代码
await vectorDB.delete({
  filter: {
    file: "auth.md"
  }
})

如果切分规则、embedding 模型或 metadata 结构变了,通常需要重建索引:

vbnet 复制代码
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

数据通常长这样

json 复制代码
{
  "id": "chunk-001",
  "text": "用户登录失败时需要检查账号状态。",
  "embedding": [0.12, -0.45, 0.87],
  "metadata": {
    "file": "auth.md",
    "section": "登录排查"
  }
}

总结

向量数据库 = 存储 embedding 并按语义相似度搜索内容的数据库。

相关推荐
hrhcode2 小时前
【LangChain】一.LangChain v1.0-快速上手(核心组件、工具、中间件)
python·ai·langchain·agent
DO_Community2 小时前
DigitalOcean 打造 AI 原生云,帮助 AI 应用大幅降低成本与运维复杂度
运维·人工智能·agent·claude
陈蒙_2 小时前
三板斧解决 Trae 卡顿
安卓·agent·ai编程·trae·trae 卡顿
Chef_Chen3 小时前
Agent-memory-召回设计里分段过滤的重要性
agent·memory
xiaoxue..3 小时前
浅聊ReAct:Agent 的执行框架
ai·面试·agent
Old Uncle Tom12 小时前
OpenClaw 记忆系统 -- 记忆预加载
java·数据结构·算法·agent
深海鱼在掘金12 小时前
深入浅出 LangChain —— 第三章:模型抽象层
人工智能·langchain·agent
KaneLogger13 小时前
三省六部 Agent 这条路不通
agent·ai编程
薛定谔的猫36914 小时前
LLM Agents: 从大语言模型到自主智能体的演进与架构解析
ai·llm·agent·machine learning·architecture