文章目录
-
- 一、什么是RAG中的Embedding模型
- 二、主流Embedding模型分类
-
- 1. 基于Transformer的通用模型
-
- (1) OpenAI系列
- (2) Cohere系列
- (3) Google系列
- 2. 开源模型
-
- (1) Sentence Transformers
- (2) 其他开源模型
- 3. 多模态Embedding模型
- 三、核心Embedding模型详解
-
- 1. Sentence-BERT (SBERT)
- 2. OpenAI Embedding模型
- 3. BGE (BAAI General Embedding)
- 四、Embedding模型在RAG中的工作流程
- 五、如何选择适合的Embedding模型
- 六、Embedding模型微调实战
- 七、Embedding模型评估方法
- 八、优化Embedding使用的实用技巧
- 九、常见问题与解决方案
- 十、未来发展趋势
- 结语
一、什么是RAG中的Embedding模型
在检索增强生成(Retrieval-Augmented Generation, RAG)系统中,Embedding模型扮演着核心角色,它负责将文本数据转换为高维向量表示,使得语义相似的文本在向量空间中距离相近。
Embedding模型的质量直接决定了RAG系统的检索效果,进而影响最终生成内容的相关性和准确性。一个好的Embedding模型应当能够:
- 捕捉文本的深层语义
- 处理不同长度的文本
- 对同义词和近义词有良好的识别能力
- 对领域特定术语有较好的理解
二、主流Embedding模型分类
1. 基于Transformer的通用模型
(1) OpenAI系列
- text-embedding-ada-002:目前OpenAI最先进的Embedding模型
- text-embedding-3-small/large:OpenAI最新推出的嵌入模型系列
(2) Cohere系列
- embed-english-v2.0/v3.0:专为英语优化的商业Embedding模型
- multilingual-22-12:支持多种语言的模型
(3) Google系列
- Universal Sentence Encoder (USE):基于Transformer的句子编码器
- BERT及其变体:虽然主要用于NLU任务,但也可用于生成Embedding
2. 开源模型
(1) Sentence Transformers
- all-mpnet-base-v2:在多种任务上表现优异的模型
- all-MiniLM-L6-v2:轻量级但效果不错的模型
- multi-qa-mpnet-base-dot-v1:专为问答任务优化的模型
(2) 其他开源模型
- GTE (General Text Embeddings):阿里巴巴开源的文本嵌入模型
- bge (BAAI General Embedding):智源研究院开源的嵌入模型
- Instructor:可指令微调的嵌入模型
3. 多模态Embedding模型
- CLIP:同时处理文本和图像的模型
- OpenCLIP:CLIP的开源实现
三、核心Embedding模型详解
1. Sentence-BERT (SBERT)
SBERT是对原始BERT模型的修改,使其能够生成有意义的句子Embedding。原始BERT的[CLS]标记或平均池化产生的Embedding效果不佳,而SBERT通过孪生网络结构解决了这一问题。
代码示例:使用Sentence Transformers
from sentence_transformers import SentenceTransformer
model = SentenceTransformer('all-mpnet-base-v2')
sentences = [
"The cat sits on the mat",
"A feline is sitting on a rug",
"The weather today is beautiful"
]
embeddings = model.encode(sentences)
for sent, embed in zip(sentences, embeddings):
print(f"Sentence: {sent}")
print(f"Embedding shape: {embed.shape}")
print(f"First 5 dimensions: {embed[:5]}\n")
2. OpenAI Embedding模型
OpenAI的Embedding模型以其出色的性能著称,特别是text-embedding-ada-002模型,支持最大8192个token的输入长度。
代码示例:使用OpenAI API
import openai
import numpy as np
openai.api_key = 'your-api-key'
def get_openai_embedding(text, model="text-embedding-3-small"):
text = text.replace("\n", " ")
return openai.Embedding.create(input=[text], model=model)['data'][0]['embedding']
texts = [
"The quick brown fox jumps over the lazy dog",
"Fast brown foxes leap over sleepy hounds",
"The weather is nice today"
]
embeddings = [get_openai_embedding(text) for text in texts]
# 计算相似度
def cosine_similarity(a, b):
return np.dot(a, b) / (np.linalg.norm(a) * np.linalg.norm(b))
print(f"Similarity 1-2: {cosine_similarity(embeddings[0], embeddings[1])}")
print(f"Similarity 1-3: {cosine_similarity(embeddings[0], embeddings[2])}")
3. BGE (BAAI General Embedding)
BGE是智源研究院开源的强大Embedding模型,在多个基准测试中表现优异。
代码示例:使用FlagEmbedding
from FlagEmbedding import FlagModel
# 加载模型 (可以选择不同大小的模型)
model = FlagModel('BAAI/bge-base-en', query_instruction_for_retrieval="Represent this sentence for searching relevant passages: ")
# 编码句子
sentences = [
"The capital of France is Paris",
"Paris is the largest city in France",
"The Eiffel Tower is located in Paris"
]
sentence_embeddings = model.encode(sentences)
# 计算相似度
query = "What is the capital of France?"
query_embedding = model.encode(query)
for sent, embed in zip(sentences, sentence_embeddings):
sim = model.similarity(query_embedding, embed)
print(f"Query: '{query}'")
print(f"Doc: '{sent}'")
print(f"Similarity: {sim}\n")
四、Embedding模型在RAG中的工作流程
#mermaid-svg-PLxa0nJvIURBCNsH {font-family:“trebuchet ms”,verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-PLxa0nJvIURBCNsH .error-icon{fill:#552222;}#mermaid-svg-PLxa0nJvIURBCNsH .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-PLxa0nJvIURBCNsH .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-PLxa0nJvIURBCNsH .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-PLxa0nJvIURBCNsH .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-PLxa0nJvIURBCNsH .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-PLxa0nJvIURBCNsH .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-PLxa0nJvIURBCNsH .marker{fill:#333333;stroke:#333333;}#mermaid-svg-PLxa0nJvIURBCNsH .marker.cross{stroke:#333333;}#mermaid-svg-PLxa0nJvIURBCNsH svg{font-family:“trebuchet ms”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-PLxa0nJvIURBCNsH .label{font-family:“trebuchet ms”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-PLxa0nJvIURBCNsH .cluster-label text{fill:#333;}#mermaid-svg-PLxa0nJvIURBCNsH .cluster-label span{color:#333;}#mermaid-svg-PLxa0nJvIURBCNsH .label text,#mermaid-svg-PLxa0nJvIURBCNsH span{fill:#333;color:#333;}#mermaid-svg-PLxa0nJvIURBCNsH .node rect,#mermaid-svg-PLxa0nJvIURBCNsH .node circle,#mermaid-svg-PLxa0nJvIURBCNsH .node ellipse,#mermaid-svg-PLxa0nJvIURBCNsH .node polygon,#mermaid-svg-PLxa0nJvIURBCNsH .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-PLxa0nJvIURBCNsH .node .label{text-align:center;}#mermaid-svg-PLxa0nJvIURBCNsH .node.clickable{cursor:pointer;}#mermaid-svg-PLxa0nJvIURBCNsH .arrowheadPath{fill:#333333;}#mermaid-svg-PLxa0nJvIURBCNsH .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-PLxa0nJvIURBCNsH .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-PLxa0nJvIURBCNsH .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-PLxa0nJvIURBCNsH .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-PLxa0nJvIURBCNsH .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-PLxa0nJvIURBCNsH .cluster text{fill:#333;}#mermaid-svg-PLxa0nJvIURBCNsH .cluster span{color:#333;}#mermaid-svg-PLxa0nJvIURBCNsH div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:“trebuchet ms”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-PLxa0nJvIURBCNsH :root{–mermaid-font-family:“trebuchet ms”,verdana,arial,sans-serif;}
用户查询
查询Embedding
文档库
文档分块
文档Embedding
向量数据库
向量相似度检索
相关文档片段
LLM生成
最终回答
-
文档处理阶段:
- 文档分块:将长文档分割成适当大小的块
- 生成Embedding:为每个文档块生成向量表示
- 存储:将向量存入向量数据库
-
查询处理阶段:
- 查询Embedding:将用户查询转换为向量
- 向量检索:在向量数据库中查找相似文档
- 结果传递:将检索结果传递给LLM生成最终回答
五、如何选择适合的Embedding模型
选择Embedding模型时需要考虑以下因素:
-
语言支持:
- 仅英语:可以选择优化英语的模型如text-embedding-ada-002
- 多语言:考虑multilingual-e5或paraphrase-multilingual-MiniLM-L12-v2
-
领域适配:
- 通用领域:大多数预训练模型都适用
- 专业领域:可能需要微调或选择领域适配模型
-
性能要求:
- 延迟敏感:选择小型模型如all-MiniLM-L6-v2
- 精度优先:选择大型模型如bge-large
-
预算限制:
- 商业API:方便但可能有成本和使用限制
- 开源模型:免费但需要自行部署和维护
六、Embedding模型微调实战
虽然预训练模型表现良好,但在特定领域微调可以显著提升性能。以下是微调Sentence Transformer的示例:
from sentence_transformers import SentenceTransformer, InputExample, losses
from torch.utils.data import DataLoader
# 准备训练数据
train_examples = [
InputExample(texts=['The car is driving on the road', 'A vehicle is moving on the street'], label=1.0),
InputExample(texts=['The cat sits on the mat', 'A dog is barking loudly'], label=0.1),
# 更多样本...
]
# 加载预训练模型
model = SentenceTransformer('all-MiniLM-L6-v2')
# 数据加载器
train_dataloader = DataLoader(train_examples, shuffle=True, batch_size=16)
# 定义损失函数
train_loss = losses.CosineSimilarityLoss(model)
# 微调模型
model.fit(
train_objectives=[(train_dataloader, train_loss)],
epochs=5,
warmup_steps=100,
output_path='./my_finetuned_model'
)
# 使用微调后的模型
finetuned_model = SentenceTransformer('./my_finetuned_model')
embeddings = finetuned_model.encode(["This is a test sentence"])
七、Embedding模型评估方法
评估Embedding模型质量的主要方法:
-
内在评估:
- 语义相似度任务:如STS-B
- 类比任务:如"king - man + woman = queen"
-
外在评估:
- 在下游任务(如RAG)中的表现
- 检索准确率和召回率
评估代码示例:
from sentence_transformers import evaluation
# 准备测试数据
sentences1 = ["A cat is sitting on the mat", "A man is playing guitar"]
sentences2 = ["A feline is on the rug", "Someone is playing music"]
scores = [0.8, 0.6] # 人工标注的相似度分数
# 创建评估器
evaluator = evaluation.EmbeddingSimilarityEvaluator(sentences1, sentences2, scores)
# 评估模型
model = SentenceTransformer('all-mpnet-base-v2')
evaluator(model, output_path="./evaluation_results")
八、优化Embedding使用的实用技巧
-
分块策略优化:
- 重叠分块:相邻块之间有部分重叠,避免信息切断
- 动态分块:根据文档结构(如标题)智能分块
-
混合检索策略:
- 结合关键词检索和向量检索
- 使用重新排序(re-ranking)提高精度
-
元数据过滤:
- 在向量检索前先进行元数据过滤
- 如日期范围、文档类型等
-
多向量检索:
- 对长文档生成多个Embedding
- 使用最大相似度或平均相似度
九、常见问题与解决方案
-
处理长文档:
- 问题:Transformer模型有长度限制
- 方案:使用滑动窗口或分层Embedding
-
领域适配不足:
- 问题:预训练模型在专业领域表现差
- 方案:领域特定微调或领域适配预训练
-
多语言支持:
- 问题:单一语言模型无法处理多语言
- 方案:使用多语言模型如paraphrase-multilingual-MiniLM-L12-v2
-
计算资源限制:
- 问题:大型模型需要大量资源
- 方案:量化、剪枝或使用小型化模型
十、未来发展趋势
-
更大上下文窗口:
- 如支持32k甚至更长上下文的Embedding模型
-
多模态统一Embedding:
- 文本、图像、音频的统一向量空间
-
可指令Embedding模型:
- 根据指令调整Embedding特性
-
更高效的训练方法:
- 如对比学习的改进方法
-
动态Embedding:
- 根据上下文动态调整的Embedding表示
结语
Embedding模型是RAG系统的核心组件之一,选择合适的模型并正确使用可以显著提升系统性能。本文介绍了主流Embedding模型、实现代码、评估方法和优化技巧,希望能为开发高效RAG系统提供参考。随着AI技术的发展,Embedding模型将变得更加强大和智能,为信息检索和知识管理带来新的可能性。
零基础入门AI大模型
由于新岗位的生产效率,要优于被取代岗位的生产效率,所以实际上整个社会的生产效率是提升的。
但是具体到个人,只能说是:
“最先掌握AI的人,将会比较晚掌握AI的人有竞争优势”。
这句话,放在计算机、互联网、移动互联网的开局时期,都是一样的道理。
我在一线互联网企业工作十余年里,指导过不少同行后辈。帮助很多人得到了学习和成长。
我意识到有很多经验和知识值得分享给大家,也可以通过我们的能力和经验解答大家在人工智能学习中的很多困惑,所以在工作繁忙的情况下还是坚持各种整理和分享。但苦于知识传播途径有限,很多互联网行业朋友无法获得正确的资料得到学习提升,故此将并将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。
需要的可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费】

第一阶段: 从大模型系统设计入手,讲解大模型的主要方法;
第二阶段: 在通过大模型提示词工程从Prompts角度入手更好发挥模型的作用;
第三阶段: 大模型平台应用开发借助阿里云PAI平台构建电商领域虚拟试衣系统;
第四阶段: 大模型知识库应用开发以LangChain框架为例,构建物流行业咨询智能问答系统;
第五阶段: 大模型微调开发借助以大健康、新零售、新媒体领域构建适合当前领域大模型;
第六阶段: 以SD多模态大模型为主,搭建了文生图小程序案例;
第七阶段: 以大模型平台应用与开发为主,通过星火大模型,文心大模型等成熟大模型构建大模型行业应用。
👉学会后的收获:👈
• 基于大模型全栈工程实现(前端、后端、产品经理、设计、数据分析等),通过这门课可获得不同能力;
• 能够利用大模型解决相关实际项目需求: 大数据时代,越来越多的企业和机构需要处理海量数据,利用大模型技术可以更好地处理这些数据,提高数据分析和决策的准确性。因此,掌握大模型应用开发技能,可以让程序员更好地应对实际项目需求;
• 基于大模型和企业数据AI应用开发,实现大模型理论、掌握GPU算力、硬件、LangChain开发框架和项目实战技能, 学会Fine-tuning垂直训练大模型(数据准备、数据蒸馏、大模型部署)一站式掌握;
• 能够完成时下热门大模型垂直领域模型训练能力,提高程序员的编码能力: 大模型应用开发需要掌握机器学习算法、深度学习框架等技术,这些技术的掌握可以提高程序员的编码能力和分析能力,让程序员更加熟练地编写高质量的代码。
1.AI大模型学习路线图
2.100套AI大模型商业化落地方案
3.100集大模型视频教程
4.200本大模型PDF书籍
5.LLM面试题合集
6.AI产品经理资源合集
这份完整版的学习资料已经上传CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费】
