认识AI的大脑:大模型与知识库
大模型与知识库:AI 是怎么"思考"的?
你有没有遇到过这样的场景:问 AI 一个历史人物的生日,它毫不犹豫地告诉你"1875 年 3 月 14 日",语气坚定得像一位老教授——可你查了资料才发现,那天其实没有任何名人出生,AI 是在一本正经地编故事。这不是 AI 在故意骗你,而是它的"大脑"里有一套我们马上就要学习的特殊工作方式。今天这一章,我们就来揭开这套工作方式的神秘面纱,看看大模型到底是怎么"说话"的、为什么会"胡说",以及我们聪明的小侦探要怎样给它装上一个"外置图书馆",让它从"瞎猜"变成"有据可查"。
---
1.1 大模型是什么?一个会接龙的超级背诵家
1.1.1 用一个游戏来理解 LLM
在我们深入"大模型到底是什么"之前,先来玩一个叫做"词语接龙"的小游戏。规则很简单:你说一个词,我接着说一个能跟它配上的下一个词。听起来很容易,对吧?
``` 你:"天空" 我:"是" 你:"蓝色" 我:"的" 你:"海洋" 我:"很大" ...... ```
如果你把这个小游戏一直玩下去,玩上几亿、几十亿次,你就会发现一个有趣的现象——词语接龙做得越多的人,就越能说出流畅、自然、有意义的句子。因为他们见过太多"前一个词+下一个词"的搭配,知道在什么时候接什么词最合适。
大语言模型(Large Language Model,简称 LLM) 本质上就是一个被"词语接龙游戏"训练到极致的超级玩家。它的工作机制可以浓缩成一句话:
> 给定前文,预测下一个最合理的词(token)。
每一次,它都在做这样一件事——看看前面的所有文字,然后从它的"词表"里挑一个概率最高的词接上去。这个过程不断重复,直到它认为"句子已经完整了"。
这个过程有一个专业名字,叫做 next-token prediction(下一个词元预测)。英文里 "token" 这个词你可以理解成"语言里最小的有意义单位"——有时候是一个完整的词,有时候是一个字,有时候甚至是半个字。在中文里,一个 token 通常就是一个汉字或者一个常用词组;在英文里,一个 token 通常是一个单词或者词根。
1.1.2 一个真实的简化例子
为了让这个概念更具体,我们来看一个真实的小例子。假设我们已经把一个玩具级的大模型训练好了,现在我们问它:
> 问题:"中国的首都是"
模型不会"理解"这个问题——它只是默默地算一算:在"中国的首都是"这五个字后面,最有可能接哪个词?
``` 模型内部计算的概率分布(简化为 Top 5): "北京" → 92.3% "上海" → 3.1% "深圳" → 1.2% "广州" → 0.8% "西安" → 0.4% ```
于是它选了"北京",输出"中国的首都是北京",然后继续预测下一个词:
> "中国的首都是北京,它是一个..."
它又算一算,发现"它是一个"后面跟着"历史悠久"、"国际化"、"巨大"、"现代化"都很合理。最终,它选了一个,开始一个字一个字地把答案写完。
重要的事情说三遍:
1. LLM 不是"理解"了问题再回答,而是"统计"了答案最可能是什么再回答。 2. 它的"聪明"完全来自于训练时见过的海量文本里模式的重复。 3. 它没有"记忆",每次对话对它来说都是独立的——除非对话被放进"前文"里。
1.1.3 LLM 是怎么"背诵"出来的?
"那它为什么会这么聪明?"——这是小侦探们最爱问的问题之一。
答案是:它见过太多的文字了。
想象一个孩子,从小到大读了 10 亿本书、100 亿篇文章、上百万个网页。他不能"记住"所有内容,但他对语言的"感觉"会变得极其敏锐。你随便写半句话,他就能接下去,因为他见过太多类似的句子。
LLM 训练的过程也是这样:
| 训练阶段 | 输入 | 输出 | 目的 | |---------|------|------|------| | 预训练(Pre-training) | 海量无标注文本 | 预测下一个 token | 学会"语言的规律" | | 监督微调(SFT,Supervised Fine-Tuning) | "问题-答案"对 | 给出标准答案 | 学会"怎么回答问题" | | 人类反馈强化学习(RLHF,Reinforcement Learning from Human Feedback) | 多个回答 + 人类评分 | 优化回答风格 | 学会"哪种回答更好" |
为了让你对这些数字有感觉,这里列出一些公开的真实数据:
- **GPT-3**(2020 年的明星模型):约 **1750 亿**个参数,训练数据约 **570 GB** 文本。
- **GPT-4**:参数量未公开,业界估计在 **1.8 万亿**左右。
- **Llama 2 70B**(Meta 开源模型):**700 亿**参数,训练数据约 **2 万亿** token。
1.1.4 什么是"参数"?
读到这里,你一定想问:"参数"又是什么?
这是一个好问题。我们可以用一个更小的比喻来理解:
你可以把 LLM 想象成一个有 N 个旋钮的巨大机器,每个旋钮都代表一个数字(一会儿拧到这个数字、一会儿拧到那个数字),这些数字合起来就是 LLM 的"参数"。在回答问题时,这些旋钮会一起"调制",把输入的句子"转译"成输出的词。
训练 LLM 的过程,本质上就是不断地微调这 N 个旋钮,让机器在给定前文时能给出更接近"正确答案"的预测。最终训练好的状态,就是这 N 个旋钮都被拧到了"对"的位置。
参数越多,模型能"记住"的模式也越多,表达能力就越强——但代价是计算量、内存、电费都会暴涨。大模型之所以"大",第一是因为参数多,第二是因为训练数据多。
1.1.5 一个关键的反直觉事实
在我们继续之前,必须让你理解一个反直觉但极其重要的事实:
> LLM 在回答问题时,并不"读取"任何外部资料。它只根据自己参数里"记住"的东西来回答。
这就像一场闭卷考试——学生不能翻书,只能凭记忆答题。如果你训练时见过的内容里有这个问题的答案,那它答得就不错;如果你训练时没见过,或者见过但记错了,它就只能瞎猜了。
这就是接下来我们要讲的——"幻觉问题"的根源。
---
1.2 大模型的"幻觉":为什么它会一本正经地胡说八道
1.2.1 什么是"幻觉"(Hallucination)?
在 AI 领域,"幻觉"(Hallucination)有一个非常专业的定义:
> 当 LLM 生成的内容看起来合理、语气自信,但实际上与事实不符,甚至是凭空编造的时候,我们就说它产生了"幻觉"。
注意关键词:"看起来合理"+"语气自信"。
这是幻觉最可怕的地方——它不是磕磕巴巴地说"我不知道",而是理直气壮地说假话。
1.2.2 三个真实的幻觉案例
下面给你三个真实例子(截至 2024 年初的实测可能出现的现象,模型和 prompt 不同结果会不同):
案例 1:编造学术论文
> 用户问:"请告诉我 Bert 论文的作者列表。" > 模型答:"这篇论文由 Jacob Devlin、Ming-Wei Chang、Kenton Lee 和 Kristina Toutanova 共同撰写,发表于 2018 年。" > 真相:答案里人名、时间都对,但顺序其实有细微错误,而且很多模型会"补上"一些实际上没在这篇论文里的共同作者。
案例 2:编造不存在的工具
> 用户问:"Python 里有没有一个叫 `array_reversal()` 的内置函数?" > 模型答:"有,该函数用于反转数组,例如 `import builtins; builtins.array_reversal([1,2,3])` 返回 `[3,2,1]`。" > 真相:Python 里根本没有 `array_reversal()` 这个内置函数。模型"仿造"了一个看起来很合理的函数名,甚至给出语法正确的示例——但运行时会报错。
案例 3:编造历史细节
> 用户问:"爱因斯坦获得诺贝尔奖的年份?" > 模型答(错误版):"爱因斯坦在 1905 年获得诺贝尔物理学奖,表彰他对光电效应的研究。" > 真相:爱因斯坦 1905 年发表了光电效应论文,但直到 1921 年才因为这个贡献获得诺贝尔奖。LLM 把"1905 年提出 + 1921 年获奖"两个正确事实错位拼接成了一个虚假的事实链。
1.2.3 幻觉为什么会产生?四个深层原因
我们用三层"洋葱"来解剖幻觉的根源:
原因 1:训练数据本身就含有错误
训练数据是互联网——而互联网里到处都是错别字、假新闻、过时信息、可疑论坛。模型在学习的时候,无法区分"权威教材"和"网友八卦",它看到的所有内容都是"语言模式"。
原因 2:模型在做"概率拼图",不做"事实核查"
记住第 1.1.5 节的反直觉事实——LLM 只做"下一个 token 预测",不查任何外部资料。这意味着它从机制上就无法保证事实正确——它只能保证"概率上合理"。
打个比方:如果训练数据里"爱因斯坦"和"诺贝尔奖"经常一起出现,模型就会学到这种"共现模式"。但"共现"不等于"因果",模型不知道爱因斯坦是哪一年得的奖,只知道这两个词常常挨在一起。
原因 3:模型的训练目标 ≠ "给出真话"
这是一个非常微妙的点。LLM 的训练目标是"让人类觉得这个回答像话",而不是"让这个回答是真的"。这两个目标在多数情况下重合,但在某些细节问题上会分道扬镳。
例如:如果你问一个不存在的小众历史人物,模型如果回答"我不知道",训练时它会被打低分(因为没有"帮助性");但如果它编造一个听起来合理的故事,它至少在形式上"回答了问题",拿到的反馈分更高。
这就是为什么需要 RLHF(人类反馈强化学习)——用人类评分员来强制模型在"流畅性"和"真实性"之间学会平衡。但即使有 RLHF,幻觉也只能减少,无法根除。
原因 4:知识有"截止日期"
每个 LLM 都有知识截止日期(Knowledge Cutoff)——也就是说,模型训练完成后,它就停止学习了。
- GPT-4 早期版本:知识截止到 **2021 年 9 月**
- GPT-4 Turbo:知识截止到 **2023 年 4 月**
- Claude 3.5:知识截止到 **2024 年 4 月**
- Llama 3:知识截止到 **2023 年 12 月**
如果训练完成后发生了某件大事(例如 2024 年奥运会冠军名单),模型就完全不知道。但它不会说"我不知道"——它会基于已有的语言模式"编造"出一个看起来合理的答案。
1.2.4 幻觉是一个数学问题
为了让小侦探们能从更底层的角度看待幻觉,我们用一个简单的数学视角来解释。
我们可以把 LLM 想成一个函数 $f$,它把输入的文本 $x$ 映射到输出的文本 $y$:
$$y = f(x)$$
这个函数有 $N$ 个参数(旋钮)$w_1, w_2, ..., w_N$,它们共同决定了函数的行为:
$$y = f(x; w_1, w_2, ..., w_N)$$
训练过程就是在调整这些参数,使得对于训练集 $\{(x_i, y_i)\}$,预测 $f(x_i)$ 尽可能接近真实答案 $y_i$。
但是注意:训练集是有限的,它不可能覆盖世界上所有的知识。当 $x$ 不在训练集附近时(即遇到了训练数据里没见过的问题),$f(x)$ 的输出只是基于"参数里学到的平均规律"做出的"猜测",这种猜测在分布外(out-of-distribution, OOD)区域天然就不可靠。
这就是为什么——
> 幻觉不是 bug,而是 feature。它是 next-token-prediction 模型的内在属性。
想要彻底消除幻觉,必须改变模型的工作机制——这正是接下来我们要讲的"知识库 + RAG"的核心动机。
---
1.3 知识库:给 AI 装一个外置百科全书
1.3.1 闭卷考试 vs 开卷考试:思路的根本转变
让我们回到刚才那个比喻。如果 LLM 像学生,那它的训练就像让他们"闭卷答题"——只能凭记忆。闭卷答题当然有它的好处:速度快、不依赖外部资源。
但在很多重要场合(医疗、法律、金融、科学研究),我们不希望它凭记忆,我们希望它能翻书——核对事实、引用权威、给出有据可查的答案。
"翻书",就是外部知识库的核心思想。
什么是知识库(Knowledge Base / Knowledge Store)?
> 知识库是一组被精心整理、可被程序自动检索的领域资料集合。它可以是结构化的(数据库、表格),也可以是半结构化的(文档、网页、FAQ)。
1.3.2 知识库的四种常见形态
下面给你列出小侦探 RAG 笔记里最常见的四种知识库形态:
形态 1:纯文本文件集合(Plain Text Corpus)
最简单的形态——一堆 `.txt`、`.md`、`.html` 文件躺在文件夹里。例如:
``` /my_knowledge_base/ ├── products/ │ ├── phone_X1.txt │ ├── laptop_Y2.txt │ └── tablet_Z3.txt ├── policies/ │ ├── return_policy.md │ └── privacy_policy.md └── faq/ └── common_questions.md ```
形态 2:结构化数据库(Relational Database / SQL)
当你的资料天然就是表格形态时,用数据库最方便。例如电商网站的商品表、订单表、用户表。
```sql CREATE TABLE products ( id INT PRIMARY KEY, name VARCHAR(100), price DECIMAL(10, 2), stock INT, description TEXT ); ```
形态 3:向量数据库(Vector Database)
这是专门为 RAG 设计的形态,我们稍后会详细讲。它把文档变成"数学向量"存起来,检索时通过"向量相似度"快速找到最相关的几段文字。
常见的向量数据库有:ChromaDB、FAISS、Pinecone、Weaviate、Milvus、Qdrant。
形态 4:混合形态
真实业务里常常混合使用。例如:
- 用户的 FAQ → 向量数据库(适合语义检索)
- 商品的库存、价格 → 关系型数据库(适合精确查询)
- 公司规章文档 → 纯文本(适合全文搜索)
- 近期聊天记录 → 时序数据库或专门的消息库
1.3.3 知识库 ≠ 大模型
这里要做一个关键区分:
> 知识库是被动的:它等着被检索。 > 大模型是主动的:它必须生成回答。
知识库本身不能回答任何问题。它只是"一堆数据" + "一些被组织好的索引"。要让它发挥作用,必须有一个"调用者"——这个调用者,就是我们的 LLM。
把它们两个组合起来,就构成了RAG 的核心架构。
---
1.4 RAG 的诞生:给 AI 配一个图书馆
1.4.1 RAG 三个字母的含义
RAG 这个词来自三个英文单词的首字母:
- **R**etrieval(检索):从知识库里找到相关资料。
- **A**ugmented(增强):把找到的资料"喂"给大模型,让它"看到"这些上下文。
- **G**eneration(生成):大模型基于这些上下文,生成最终回答。
这三个步骤合起来,就是 RAG 的全流程。它最早由 Patrick Lewis 等人在 2020 年的论文《Retrieval-Augmented Generation for Knowledge-Intensive NLP Tasks》 中正式提出,这篇论文可以说是整个 RAG 领域的奠基之作。
1.4.2 RAG 的完整工作流程
让我们把 RAG 的过程拆成 8 个具体步骤,这样小侦探们就能掌握每一个细节:
步骤 1:知识库准备(Offline / 离线阶段)
我们先把所有资料(文档、网页、表格……)整理成一个集合。这个阶段通常离线完成,不需要每次回答问题都重做。
步骤 2:文档切分(Chunking)
把大文档切成"小块"(chunks),每一块大约 200~500 个 token。这是为了让检索能更精细——如果一整本书就是一个 chunk,检索就会很粗糙。
```python
一个简单的切分示例
from langchain.text_splitter import RecursiveCharacterTextSplitter
splitter = RecursiveCharacterTextSplitter( chunk_size=300, # 每块最多 300 个字符 chunk_overlap=50 # 块之间重叠 50 个字符,避免切断句子 ) chunks = splitter.split_text(long_document) ```
步骤 3:向量化(Embedding)
把每一块文本变成一个向量(vector)——一组浮点数,例如 384 维、768 维、1024 维、1536 维……这组数字编码了这块文本的"语义"。
```python from sentence_transformers import SentenceTransformer
model = SentenceTransformer('all-MiniLM-L6-v2') # 一个常用的 embedding 模型 vector = model.encode("今天天气真好") # 输出一个 384 维的向量 print(vector.shape) # (384,) ```
步骤 4:存入向量数据库
把每个 chunk 的向量 + 原文 + 元数据(来源、标题、日期等)一起存到向量数据库里。
步骤 5:用户提问
用户输入问题:"我们公司最近的退货政策有