摘要
本文详解文本嵌入(Embedding)的核心概念与工作原理。通过向量空间映射,Embedding 能将语义转化为计算机可理解的数值序列。文章结合实例剖析其优势与局限,并给出基于 Embedding 构建本地知识库问答系统的三步实现指南。
文本嵌入(Embedding):核心概念与实现原理
基于大语言模型(LLM)构建的应用,离不开三项关键技术:提示词工程(Prompt Engineering)、嵌入(Embedding)与微调(Fine-tuning)。其中,Embedding 是大模型理解文本语义的核心技术。它广泛应用于搜索引擎、私有知识库问答、内容推荐等场景。
Embedding 的基本概念
什么是 Embedding? 根据 OpenAI 官方文档的定义:“Embedding 是将概念转换为数字序列的数值表示,这使得计算机能够轻松理解这些概念之间的关系。”
简单来说,Embedding 将抽象概念转化为数值序列。这让计算机能够理解概念之间的关联。

Embedding 还能提供信息密集的文本语义表示。每个 Embedding 都是一个浮点数向量。在向量空间中,两个 Embedding 之间的距离,与原始输入文本的语义相似度呈正相关。例如,两段文本越相似,它们的向量表示也就越接近。这种向量空间中的数组排列,精准描述了文本间细微的特征差异。
总结而言,Embedding 帮助计算机理解人类信息背后的“含义”。它可以捕捉文本、图像、视频等信息中特征的“关联性”。它常用于搜索、推荐、分类和聚类等任务。
Embedding 的工作原理
我们以三句话为例:
- “猫追老鼠。”
- “小猫捕食啮齿动物。”
- “我喜欢火腿三明治。”
如果让人类分类,前两句意思几乎相同。第三句则完全不同。但看英文原文,前两句除了“The”之外没有其他共同词汇。计算机如何理解前两句的关联性?
Embedding 将离散信息(单词和符号)压缩为分布式的连续值数据(向量)。如果将这些短语绘制在图表上,大致如下:

将文本通过 Embedding 压缩为计算机可理解的多维向量空间后,由于语义相似,第一句和第二句在空间中彼此靠近。第三句因语义无关,距离较远。如果引入第四句“莎莉吃瑞士奶酪”,它可能会出现在第三句(奶酪可夹三明治)和第一句(老鼠喜欢瑞士奶酪)之间。
此例仅使用二维(X轴和Y轴)。实际应用中,Embedding 模型会提供更高维度来表征人类语言的复杂性。例如,OpenAI 的 Embedding 模型 text-embedding-ada-002 输出 1536 维。这足以让计算机捕捉文本中细微的语义差异。在三维空间中,相似文本的分布可能如下(见下图):关于动物、运动员、电影、车辆和村庄的文本会彼此靠近。

Embedding 的优势
尽管 ChatGPT 擅长回答问题,但其能力受限于训练数据。对于训练数据之外的内容、特定领域知识(如医疗、法律、金融)或企业内部非公开数据,GPT 的表现往往不佳。
GPT 学习新知识主要有两种途径:
- 模型权重(在训练集上进行微调)。
- 模型输入(将知识作为 Few-shot Prompt 使用)。
微调看似更自然。因为它让模型从数据中学习所有知识。但在事实回忆方面,微调并不可靠。打个比方,把大模型比作参加考试的学生。模型权重相当于长期记忆。微调模型就像提前一周备考。考试时,模型可能会遗忘之前学过的知识。或者答错从未教过的问题。
相比之下,使用 Embedding 就像学生没复习直接进考场,但带了一张“小抄”。遇到问题时,学生只需查看小抄即可准确作答。考完后,小抄直接丢弃,不占用任何记忆。整个过程简单高效(技术实现同理)。
但这种“小抄”模式也有局限。每次考试,学生只能带几页笔记。无法携带所有学习资料。这受限于大模型的单次输入长度(Max Tokens)。GPT-3.5 的 Token 限制为 4K(约 5 页纸)。而后续发布的 GPT-4 将限制提高了八倍,最高支持 32K Tokens(约 40 页纸)。
那么,当处理的数据集远超此限制时该怎么办?这时,基于 Embedding + 上下文注入的语义检索策略便派上了用场。
在我之前的文章《为什么微软新版 Bing 集成的 GPT-4 效果不如预期?》中,我简要介绍了 Embedding 在搜索引擎中的应用。接下来,我们以构建本地知识库问答系统为例,说明 Embedding 的具体应用。其原理类似,主要包含三个步骤:
步骤一:数据准备
- 收集(Collection):准备本地知识库,提供所需文本(如文章、报告、日记、博客、网页、论文等)。
- 切分(Chunking):将完整文档切分为较小的文本片段(Chunks)。
- 向量化(Embedding):使用 OpenAI API 或本地 Embedding 模型,将文本片段向量化为多维数组。
- 存储(Storage):对于大数据集,将向量数组存入数据库以备后续检索。小数据集可暂存内存。
步骤二:语义检索
- 使用 OpenAI Embedding API 或本地模型,将用户问题向量化。
- 使用相似度度量算法(如余弦相似度或欧氏距离),查询与问题最匹配的文本片段。
步骤三:文本注入与回答
- 将用户问题与检索到的最相似文本片段(TopK)作为上下文提示词,注入 LLM。
- LLM 基于用户问题和注入的 Few-shot 提示词生成答案。
以下是实现流程的示意图:

基于 Embedding 的语义检索 vs 关键词检索
语义理解(Semantic Understanding)
Embedding 检索能捕捉词汇间的语义关系。它使模型理解词汇间的内在联系。关键词检索通常依赖字面匹配。它容易忽略语义关联。
鲁棒性(Robustness)
Embedding 方法能更好地处理拼写错误、同义词和近义词。因为它理解词汇关系。关键词检索在此类场景下表现较弱。
多语言支持(Multilingual Support)
许多 Embedding 方法支持多语言。它便于跨语言文本检索。例如,可用中文输入查询英文内容。这对关键词检索来说很难实现。
上下文理解(Contextual Understanding)
Embedding 方法在处理一词多义(Polysemy)时具有优势。因为向量能够根据具体语境准确区分词义。