欢迎光临
我们一直在努力

Embedding 与向量数据库原理

前言

很多开发者开始做 AI 项目时,最先接触的是聊天接口。

最简单的架构通常是:

用户输入
↓
后端接口
↓
大模型 API
↓
返回答案

这种方式适合普通问答,但一旦项目涉及私有知识库、文档问答、企业资料检索、客服系统、代码库分析,就会遇到一个核心问题:

模型本身并不知道你的私有数据。

例如:

  • 公司内部文档
  • 产品说明书
  • 用户手册
  • 历史工单
  • 项目代码
  • 数据库说明
  • 业务 SOP

这些内容不在模型训练数据里,即使模型能力很强,也无法凭空知道。

这时就需要 Embedding 和向量数据库。

它们的作用不是让模型“变聪明”,而是让系统能够从外部知识中找到与用户问题最相关的内容,再交给模型回答。


什么是 Embedding?

Embedding 可以理解为:

把文本转换成一组数字。

例如一句话:

Docker 是什么?

经过 Embedding 模型处理后,会变成类似这样的向量:

[0.012, -0.253, 0.887, ...]

这组数字本身人类看不懂,但模型可以通过它表达文本含义。

也就是说,Embedding 的核心价值是:

把自然语言变成机器可以计算的语义表示。


为什么不能直接用关键词搜索?

传统搜索主要依赖关键词。

例如用户搜索:

如何部署 Node.js 项目?

如果文档标题是:

使用 PM2 和 Nginx 发布后端服务

关键词可能对不上。

传统搜索可能认为这两者相关性不高。

但从语义上看,它们其实很接近:

  • 部署
  • Node.js
  • PM2
  • Nginx
  • 后端服务

Embedding 的优势就在这里。

它不是只看字面关键词,而是计算语义相似度。

因此:

如何部署 Node.js 项目?

和:

使用 PM2 和 Nginx 发布后端服务

在向量空间中会比较接近。


向量空间是什么意思?

可以把向量空间想象成一个巨大的坐标系。

每一段文本都会被放到这个空间里的某个位置。

语义相近的文本,位置更接近。

语义无关的文本,距离更远。

例如:

Docker 如何部署应用?

和:

Docker Compose 如何启动服务?

距离较近。

而:

如何做番茄炒蛋?

距离就很远。

向量数据库的工作,就是在这个空间里快速找到距离用户问题最近的内容。


向量数据库是什么?

向量数据库是专门用来存储和检索向量的数据库。

它主要解决一个问题:

当你有几十万、几百万甚至上千万条文本向量时,如何快速找到最相似的几条?

普通数据库擅长:

  • 精确查询
  • 条件过滤
  • 排序
  • 聚合统计

例如:

select * from articles where id = 1;

但普通数据库并不擅长:

找出语义最接近这句话的 10 段文本

向量数据库擅长的正是这个任务。


Embedding + 向量数据库的基本流程

一个典型流程如下:

原始文档
↓
文本切分
↓
生成 Embedding
↓
写入向量数据库
↓
用户提问
↓
问题生成 Embedding
↓
向量检索
↓
取回相关片段
↓
交给大模型回答

这就是很多知识库问答系统的基础。


第一步:文档切分

不能把一整本文档直接丢给 Embedding。

原因有两个:

第一,文本太长会超出模型限制。

第二,长文本会降低检索精度。

例如一篇 8000 字文章里只有一段内容与问题相关,如果整篇文章作为一个向量存储,检索出来之后会包含大量无关内容。

更合理的方式是将文档切成小块。

常见切分单位:

  • 按标题切分
  • 按段落切分
  • 按固定字数切分
  • 按语义边界切分

例如:

chunk 1:Docker 的基本概念
chunk 2:Dockerfile 的作用
chunk 3:Docker Compose 的使用方式
chunk 4:生产环境部署注意事项

用户问 Docker Compose 时,系统只需要召回 chunk 3 和 chunk 4,而不是整篇文章。


第二步:生成向量

每个 chunk 都会被送入 Embedding 模型。

生成类似这样的数据:

{
  "id": "doc_001_chunk_003",
  "content": "Docker Compose 用于管理多个容器服务...",
  "embedding": [0.12, -0.08, 0.31, ...],
  "metadata": {
    "title": "Docker Compose 实战",
    "source": "article",
    "url": "/docker-compose-guide"
  }
}

其中 metadata 非常重要。

它可以保存:

  • 文档标题
  • 原文链接
  • 作者
  • 创建时间
  • 分类
  • 权限信息
  • 版本号

后期做检索、过滤、溯源都离不开 metadata。


第三步:写入向量数据库

常见向量数据库包括:

  • Pinecone
  • Milvus
  • Qdrant
  • Weaviate
  • Chroma
  • PostgreSQL + pgvector

对于个人项目或中小型项目,pgvector 是一个非常实用的选择。

因为它可以直接在 PostgreSQL 中同时存储:

  • 业务数据
  • 文档内容
  • 向量数据
  • metadata

系统复杂度较低。

如果数据规模很大,或者需要更强检索性能,可以考虑专门的向量数据库。


第四步:用户提问并检索

当用户输入:

Docker Compose 部署 Node.js 项目需要注意什么?

系统会先将这个问题也转换成向量。

然后在向量数据库里查找最相似的内容。

返回结果可能是:

chunk 12:Docker Compose 服务编排
chunk 19:Node.js 容器部署注意事项
chunk 25:MySQL 与 Redis 数据持久化

这些内容会作为上下文提供给大模型。


第五步:交给大模型生成答案

最终 Prompt 可能类似:

你是一个技术助手。

请根据以下资料回答用户问题。

资料:
1. Docker Compose 可以通过 docker-compose.yml 管理多个服务...
2. Node.js 服务不要直接使用 localhost 连接 MySQL,而应使用服务名...
3. MySQL 数据必须使用 volume 持久化...

用户问题:
Docker Compose 部署 Node.js 项目需要注意什么?

这样模型回答时就有依据,而不是凭空生成。


相似度是如何计算的?

常见方式包括:

  • Cosine Similarity
  • Dot Product
  • Euclidean Distance

最常见的是余弦相似度。

它关心两个向量方向是否接近,而不是绝对大小。

简单理解:

两个文本语义越接近,向量夹角越小,相似度越高。

开发者不一定需要手写这些算法,因为向量数据库通常已经封装好了。

但理解这个原理很重要。

否则很容易误以为向量数据库是“神奇搜索引擎”。

实际上它只是根据向量相似度返回最接近的内容。


Embedding 系统最容易踩的坑

1. Chunk 太大

如果一个 chunk 太大,就会包含太多主题。

结果是:

  • 检索不精准
  • 上下文浪费
  • 回答容易跑偏

例如一个 chunk 同时包含 Docker、Nginx、Redis、MySQL,用户只问 Redis,模型却看到大量无关内容。


2. Chunk 太小

太小也有问题。

例如只按一句话切分:

Redis 可以用来缓存。

这句话缺少上下文,模型很难判断它是在说什么业务场景。

因此 chunk 需要在“完整语义”和“足够精准”之间平衡。


3. 只做向量检索,不做关键词检索

向量检索擅长语义匹配,但不一定擅长精确匹配。

例如:

错误码 E1027 是什么意思?

这种问题更适合关键词搜索。

因此更成熟的系统会采用混合检索:

向量检索
+
关键词检索
+
排序重排

4. 不保存原始文本

有些开发者只保存向量,不保存原文。

这是错误设计。

向量用于检索,真正给模型看的仍然是原始文本。

因此必须保存:

  • 原文内容
  • 文档来源
  • chunk id
  • metadata

5. 忽略权限控制

企业知识库尤其要注意。

不是所有用户都能访问所有文档。

如果向量检索时没有权限过滤,可能出现严重数据泄露。

正确做法是在 metadata 中加入权限信息。

例如:

department: engineering
visibility: internal
tenant_id: xxx

检索时先过滤权限,再做相似度搜索。


向量数据库不是万能的

向量数据库解决的是“找到相关内容”。

它不负责:

  • 判断内容是否正确
  • 生成最终答案
  • 理解业务规则
  • 替代数据库查询
  • 替代权限系统

很多人把向量数据库想得太强。

实际上,一个可靠 AI 系统通常需要:

向量数据库
+
关系型数据库
+
缓存
+
权限系统
+
日志系统
+
模型调用层

它只是其中一个组件。


什么时候需要向量数据库?

适合使用向量数据库的场景:

  • 文档问答
  • 企业知识库
  • 客服机器人
  • 代码搜索
  • 商品语义搜索
  • 长文本检索
  • RAG 系统

不一定需要的场景:

  • 简单聊天机器人
  • 固定菜单客服
  • 纯结构化数据查询
  • 少量静态 FAQ

如果只有几十条 FAQ,直接用数据库和关键词搜索可能就够了。

不要为了技术而引入技术。


推荐架构

一个较完整的知识库系统可以这样设计:

文档上传
↓
文本解析
↓
文档清洗
↓
Chunk 切分
↓
Embedding 生成
↓
向量数据库
↓
用户提问
↓
混合检索
↓
重排序
↓
上下文拼接
↓
大模型生成
↓
答案引用来源

这里每一步都影响最终效果。

很多 RAG 系统效果不好,不是模型差,而是前面的文档处理和检索质量太差。


总结

Embedding 的本质是将文本转换成可计算的语义向量。

向量数据库的本质是快速找到语义相似的内容。

它们共同解决了 AI 系统中的一个核心问题:

如何让模型使用外部知识回答问题。

但真正优秀的 AI 知识库系统,不只是把文档塞进向量数据库。

还需要考虑:

  • 文档清洗
  • Chunk 策略
  • metadata 设计
  • 权限过滤
  • 混合检索
  • 重排序
  • 成本控制
  • 答案溯源

只有把这些环节串起来,Embedding 和向量数据库才能真正发挥价值。

赞(0)
未经允许不得转载:X记录空间 » Embedding 与向量数据库原理