开发技术分享

  • 文章分类
    • 技术
    • 工作
    • 相册
    • 杂谈
    • 未分类
  • 工具
    • AI 试衣
靡不有初,鲜克有终
[换一句]
  1. 首页
  2. 技术
  3. 正文

学习笔记:LLM 时代,知识库是如何“工作”的?——从 RAG 到语义空间的底层逻辑

2024年5月15日 12点热度

引言:重谈“知识库”

在很长一段时间里,企业里的“知识库”是什么样的?

大多数人都不陌生:一堆文档、Wiki、FAQ,外加一个搜索框。 你输入关键词,系统帮你在标题、正文里做字符串匹配,然后返回一串结果。

这种方式能用,但问题也很明显:

  • 用户需要思考该用什么关键词去搜
  • 同一个意思,换个说法,可能就搜不到了
  • 文档写得再好,也经常躺在硬盘的角落里吃灰

后来,搜索引擎变聪明了一点,引入了排序、权重、召回策略等,但核心逻辑一直没变:

“你给我词,我帮你找“包含这些词”的文章。”


直到大语言模型(LLM)出现,事情开始变得不一样了。我们第一次看到一种系统,可以:

  • 用自然语言提问
  • 得到结构清晰、看起来“理解了问题”的回答

于是我们自然会想一个问题:

既然模型这么聪明了,是不是可以让它“读完”公司的所有资料,然后直接回答问题?

但现实很快泼了一盆冷水,训练好的模型并不知道我们的私有数据,即使我们“喂”过私有数据,它也可能记不准、答不全、甚至编造。

况且模型本身也并不适合频繁更新知识。


一、RAG

于是,大家有了一个新的思路:

不是让模型去“记住”所有知识,而是在回答问题前,先帮它把相关资料找出来,再让它基于这些资料回答。

这就是RAG(Retrieval-Augmented Generation)——检索增强生成

RAG 的核心流程非常简单,基本上就是下面四步:

  1. 把文档(PDF、网页、说明书、代码注释)拆成一小段一小段
  2. 把每一段文本,转换成一种模型能理解的“表示”
  3. 当用户提问时,找出与问题相关性最高的几段文本
  4. 把这些文本作为提示词(Prompt)塞给大模型,让它基于这些内容回答问题

在这个过程中,模型并没有“记住”这些文档,它只是在回答之前,“临时查阅了外部资料”。

它既不是传统搜索引擎,

  • 搜索引擎匹配的是关键词
  • RAG 要找的是:语义上相关的内容

也不是模型微调(fine-tuning),

  • 微调会改变模型参数
  • RAG 只是给模型提供“可参考的上下文”

到这里,问题的核心就变成了:计算机凭什么能找到“相关性最高”的文本片段呢?


二、语义不是标签,而是一种“方向”

对人来说,下面这两句话的意思很接近:

  • “如何安装 Python”
  • “Python 环境怎么配置”

但对计算机来说,它们只是两段不同的字符。如果你直接问计算机:“这两段文字像不像?”它其实是回答不了的,这是因为:

“像不像”这个问题,本身就不是文字问题,而是一个“比较”的问题。而计算机,只会比较数字。

这也是为什么传统搜索只能依赖“关键词匹配”的根本原因。

1. 文本的数字化:文本向量化(Embedding)

所以,RAG 要做的第一件事,是把文字转换成一种计算机能比较的形式,我们把它叫做文本向量化(Embedding)。

过去,文本向量化的方法有很多,但都有各种各样的缺点,比如:不懂语义、不理解上下文、句子不好处理......

而在大模型时代,Transformer Embedding 成为了主流。

在 Transformer Embedding 中:每一段文本,都会被映射成高维空间中,一个从原点出发的向量。

真实模型中,向量维度通常是 128 / 384 / 768 / 1536 甚至更高

通常来说,人是解释不了单独某一维的。但向量整体编码了语义信息。

比如它可能隐式表示:

  • 是否和“动物”相关
  • 是否表达情感
  • 是否是陈述句
  • 是否和时间、地点有关
  • ......

2. 为什么“方向相近 = 语义相近”?

当文本被向量化之后,向量的每一维,代表了某种抽象语义特征,向量中各维度的相对大小,则代表这些特征被激活的比例。

当模型读到一句话时,更像是在说:

“这句话激活了这些特征,大致是这样的比例。”

如果两段文本:

  • 激活的是差不多的一组特征
  • 激活比例也相似

那它们的向量,就会指向相近的方向。这时我们说:

它们的“语义结构”是相似的。

这也正是余弦相似度(cosine similarity)被广泛使用的原因。


但为什么这种方法居然能成立呢?

向量的“相似度”高、“距离”相近,真的能代表语义相似吗?

简单来说,这些向量不是随便算出来的,它们来自被大量语言数据训练过的模型,模型被训练成:“语义相近 → 向量更像” 的模式

在 embedding 的训练过程中,模型不断被告诉:

  • 这两段文本是“相关的” → 向量要靠近
  • 那两段文本是“不相关的” → 向量要分开

而“靠近 / 分开”的度量方式,正是基于向量夹角。久而久之,模型就学会了用“方向”来编码语义相似性。

三、模型是怎么学会语义的?

既然是人类在训练模型的过程中,告诉它什么是相关的,什么是不相关的。

那么,原始训练材料一定都经过了人为的的筛选和标注吧,比如:

句子 A 和句子 B 相似度是 0.93,相关性极高
句子 A 和句子 C 相似度是 -0.85,相关性极低

事实上,现实中几乎不会出现这种训练数据。

不光是因为标注大量语料所用到的人力成本极高,最关键的是,人和人之间往往很难统一标准。

那“相似”和“不相似”从哪来呢?

答案其实很朴素:

语义关系,早就藏在语言数据本身里了。

举几个非常常见的例子:

  • 问题 ↔ 回答
  • 标题 ↔ 正文
  • 中文 ↔ 英文翻译
  • 同一句话的不同说法

这些数据在互联网上大量存在,而且天然就“相关”。

与互联网上质量参差不齐的语料相比,在【标题↔正文】这个场景下,整个人类社会的论文库,就是天然的、极高质量的语料数据。


训练时,模型一次会看到一小批文本(也就是一个 batch):同一组里的“正样本”向量被拉近,不相关的“负样本”向量被推远。

久而久之,模型就被训练成:相似语义 → 相似方向,不相关语义 → 不同方向

于是,一个“语义空间”自然就形成了。

所以说,语义不是人教的,而是“比较出来的”

模型并不是先理解语义,再学 embedding,而是在不断比较中,逐渐形成语义结构。

人类在这个过程中扮演的角色,其实只是提供大量真实的语言数据、偶尔做一点校准罢了。


四、RAG 为何能“查到正确的知识”?

到这里,其实可以先回答一个问题:

RAG 到底是在“理解知识”,还是只是在做一次更高级的查找?

答案是后者。但关键在于:它查找的对象,已经不再是“文字本身”了。

1. 检索,其实是一个几何问题

一旦文本被映射到空间中,“相关性”就变成了

  • “夹角有多小”
  • “方向有多像”

于是检索不再是:

  • if / else
  • 规则匹配
  • 关键词打分

而是:

  • top-k 最近邻搜索

我们甚至可以暂时忘掉“语言”这件事,把它当成一个纯数学问题来理解。

说到这里,就必须引入一个新的角色:向量数据库。

2. 向量数据库

用一句话形容它的职责:向量数据库不是知识库,而是“语义空间的索引器”。

向量数据库里存的,通常只有三样东西:

  • 一段文本(或它的 ID)
  • 这段文本对应的向量
  • 一些用于快速检索的索引结构

它干的事情其实很纯粹,帮我们找到距离目标向量最近的那几个向量。

无论是 FAISS、Milvus、HNSW 还是其他方案,本质上都在解决同一个问题:

在高维空间里,怎么快、准、稳地找邻居。

尽管它们并不理解这些向量代表的是什么意思。

五、总结

在理解了 RAG 的整个工作流程之后,我们可以回过头来看一个更大的问题:

RAG 到底改变了什么?

在没有 RAG 的时候,大模型更像一个封闭系统:

它能总结、能推理、能表达,但前提是——这些信息已经以某种形式存在于它的参数里。你问它最新的数据、内部文档、私有知识,它要么不知道,要么只能“合理猜测”。

RAG 改变的并不是模型的“聪明程度”,而是它获取信息的方式。它并不能保证“绝对正确的答案”。它做的是一件更基础、也更重要的事情:

让模型站在正确的语义上下文中思考问题。

如果说早期的 AI 更像是在“背题库”,那么 LLM + RAG,第一次开始接近一种我们熟悉的方式:

查资料,然后思考。

标签: 暂无
最后更新:2026年1月26日

zt52875287

这个人很懒,什么都没留下

点赞
< 上一篇
下一篇 >
文章目录
  • 引言:重谈“知识库”
  • 一、RAG
  • 二、语义不是标签,而是一种“方向”
    • 1. 文本的数字化:文本向量化(Embedding)
    • 2. 为什么“方向相近 = 语义相近”?
  • 三、模型是怎么学会语义的?
  • 四、RAG 为何能“查到正确的知识”?
    • 1. 检索,其实是一个几何问题
    • 2. 向量数据库
  • 五、总结

Copyright © by zt52875287@gmail.com All Rights Reserved.

Theme Kratos Made By Seaton Jiang

陕ICP备2021009385号-1