📚 一:先明白我们要做什么——学习目标
简单说,我们要搞懂现代智能搜索和RAG系统是怎么工作的。你问ChatGPT一个问题,它为什么能快速从海量资料中找到最相关的答案?这背后就靠两招:
-
快速找一堆可能相关的答案(检索/召回)
-
从里面挑出最准的那个(重排序/精排)
就像你先用百度搜“怎么做红烧肉”,出来100个结果,然后你一个个看,把最靠谱的那个菜谱挑出来。
🔄 二:搜索系统的“两步走”策略
第一阶段:大海捞针(检索/召回)
-
目标:从百万文档中快速找出前100个可能相关的
-
特点:快!非常快!
-
用的武器:Embedding模型(也叫“双塔模型”)
第二阶段:精挑细选(重排序/精排)
-
目标:从100个候选里找出最相关的10个
-
特点:准!非常准!
-
用的武器:Rerank模型(也叫“交互式模型”)
比喻:就像找对象,先根据“年龄、城市、学历”快速筛选100个人(检索),再跟这100人详细聊天,找出最合适的3个(重排序)。
⚖️ 三:两种不同的任务类型
对称性任务:两句话角色平等
-
特点:两句话可以互换位置,意思不变
-
例子:
-
“我的快递到哪了?” vs “查一下我的包裹状态”
-
“今天天气怎么样?” vs “天气情况如何?”
-
-
判断标准:A对B的相似度 = B对A的相似度
非对称性任务:问题和答案的关系
-
特点:查询短小精悍,文档详细丰富
-
例子:
-
查询:“感冒吃什么药?”(简短)
-
文档:“感冒时建议服用板蓝根、感冒灵等中成药,同时多喝水、多休息……”(详细)
-
-
关键:查询和文档角色不同,不能互换!
在RAG中的位置:非对称性任务正是检索(Retrieval)阶段要解决的核心问题——如何根据简短的问题找到最相关的长文档。
🏗️ 四:Embedding模型——你的“快速筛选器”
什么是Embedding?
把文字变成一串数字(向量),让计算机能“理解”文字的意思。相似的文字会有相似的数字串。
比喻:给每个人一个“身份证号码”,相似的人(比如同一家人)身份证号前几位会很像。
Embedding的三种进化形态:
-
传统词嵌入:基于统计,像查字典
-
例子:TF-IDF
-
优点:简单快速
-
缺点:不懂语义,“苹果公司”和“吃的苹果”分不清
-
-
静态词嵌入:每个词有固定“身份证”
-
例子:Word2Vec、GloVe
-
进步:能捕捉一些语义关系
-
局限:一词多义处理不好
-
-
动态词嵌入:根据上下文动态变化
-
例子:BERT、BGE系列
-
重大突破:同一个词在不同句子中向量不同!
-
“苹果股价上涨” vs “苹果真好吃”——两个“苹果”向量完全不同
-
双塔模型工作原理
[查询编码器] --(编码)--> [查询向量]
↓
[向量相似度计算]
↑
[文档编码器] --(编码)--> [文档向量]
-
为什么快?文档可以提前编码存好,用户提问时只需编码查询+计算相似度
-
在LangChain/RAG中:通常用于
Retrieval环节,生成文档的向量存入向量数据库(如Milvus)
重要参数和指标
-
维度:向量的长度
-
GPT-2:768维(像有768个特征描述一个词)
-
DeepSeek-V3:7168维(描述更精细)
-
权衡:维度越高表达能力越强,但计算越慢
-
-
相似度计算方式:
-
余弦相似度(最常用):看两个向量方向的接近程度
-
点积相似度
-
欧氏距离
-
🎯 五:Rerank模型——你的“终极裁判”
交互式模型工作原理
把问题和文档拼在一起输入模型,让它们“深度交流”后打分。
输入:[CLS] 查询文本 [SEP] 文档文本 [SEP]
输出:相关性分数(0-1)
优缺点大实话
-
优点:准!非常准!因为模型能看到查询和文档的全部交互
-
缺点:慢!非常慢!每个查询-文档对都要单独计算
在RAG中的位置:通常接在初步检索之后,对top K(如50-100)个结果进行精细排序。
实际使用建议
-
候选文档少的时候用(<100)
-
对精度要求极高的场景用
-
通常和Embedding模型搭配使用:Embedding快速找候选,Rerank精细排序
📊 六:怎么知道哪个模型好?——评测基准
MTEB:世界级“模型奥运会”
-
包含8大类任务:检索、重排、分类、聚类等
-
覆盖100+语言
-
就像综合全能比赛
C-MTEB:中文专属“擂台赛”
-
完全针对中文场景
-
重点关注检索任务
-
关键指标:nDCG@10
-
衡量前10个结果的质量
-
分数越高越好(满分1.0)
-
实战评测示例
# 使用mteb库评估模型
from mteb import MTEB
# 选择科学事实检索任务
evaluation = MTEB(tasks=["SciFact"])
results = evaluation.run(model)
print(f"nDCG@10分数: {results['ndcg_at_10']}")
🚀 七:BGE-M3模型——中国人的“瑞士军刀”
三大绝招集成一身
-
密集检索:语义匹配(像人一样理解意思)
-
稀疏检索:词法匹配(像传统搜索匹配关键词)
-
多向量检索:ColBERT风格(更精细的匹配)
在代码中怎么用?
from FlagEmbedding import BGEM3FlagModel
# 加载模型
model = BGEM3FlagModel("BAAI/bge-m3")
# 编码查询(会自动添加指令)
query_vec = model.encode_queries("如何学习编程?")
# 编码文档
doc_vec = model.encode_corpus("学习编程需要掌握基础知识...")
# 计算相似度
similarity = cosine_similarity(query_vec, doc_vec)
指令功能揭秘
# 给查询和文档不同的“提示语”
model = BGEM3FlagModel(
model_path,
query_instruction_for_retrieval="为这个检索问题生成向量:",
passage_instruction_for_retrieval="为这段用于检索的文字生成向量:"
)
**为什么有用**?让模型更清楚当前编码的是查询还是文档,提高检索精度。
🎯 八:在真实RAG系统中怎么用?
典型LangChain RAG流程
用户问题 → [Embedding模型] → 查询向量 → [向量数据库检索] → 候选文档
候选文档 → [Rerank模型] → 重排序 → Top 3文档 → [LLM生成答案]
参数选择指南
-
Embedding维度:768-1024维平衡效果和速度
-
检索数量:先取50-100个(Embedding),再精排到3-5个(Rerank)
-
相似度阈值:设置最低相似度,过滤完全不相关的结果
性能衡量指标
-
检索阶段:
-
召回率@K:前K个结果中包含正确答案的比例
-
响应时间:用户感受的延迟
-
-
重排序阶段:
-
nDCG@K:排序质量
-
MRR(平均倒数排名):第一个正确答案出现的位置
-
💎 九:一句话记住重点
-
Embedding快但粗,像快速扫描仪
-
Rerank准但慢,像显微镜
-
中文场景看C-MTEB,重点关注nDCG@10
-
BGE系列中文强,支持多种检索模式
-
实际应用要权衡:速度、精度、成本三者的平衡
深入探索,请看下回分解~
206

被折叠的 条评论
为什么被折叠?



