RAG与嵌入技术深度解析:从原理到代码实现
一、RAG架构核心机制
RAG(Retrieval-Augmented Generation)通过融合外部知识源,显著提升大语言模型的输出质量。其流程可拆解为三个关键环节:
- 知识库:存储结构化或非结构化数据,经过清洗、切块、向量化后建立索引。
- 检索模块:将用户输入转化为向量,与知识库中的向量进行相似度匹配,返回最相关的内容片段。
- 生成模型:结合原始问题和检索结果,生成更准确、可追溯的答案。
相比纯大模型推理,RAG在以下方面具备明显优势:
- 支持实时信息获取,无需重新训练即可反映最新知识;
- 可集成私有领域文档,保障数据安全;
- 显著降低幻觉率,答案可溯源,增强可信度;
- 有效缓解上下文长度限制,减少长文本处理开销。
二、嵌入技术在RAG中的角色
嵌入(Embedding)是实现语义理解的基础技术。它将自然语言转换为高维数值向量,使机器能够计算"语义距离"。
典型工作流如下:
- 离线构建阶段:
- 原始文本 → 分段处理 → 输入嵌入模型 → 输出向量 → 存入向量数据库(如Chroma、Milvus)
- 在线查询阶段:
- 用户提问 → 同样经嵌入模型编码为向量 → 在向量库中搜索最近邻 → 返回候选段落
- 生成阶段:
- 将问题与检索内容拼接,输入大模型生成最终响应
由此可见,嵌入既是知识表示的载体,也是检索过程的"钥匙"。
三、嵌入向量的核心特性
在嵌入空间中,语义相近的句子会彼此靠近,而差异较大的则相距较远。例如,"北京是中国的首都"与"中华人民共和国的首都是北京"在向量空间中具有极高的相似度。
该技术依赖于预训练模型对语言模式的学习能力,通常使用Transformer架构,并通过对比学习等策略优化向量分布。
四、实战代码演示:两种实现方式对比
1. 基于 HuggingFace Transformers 手动实现
from transformers import AutoModel, AutoTokenizer
from sentence_transformers.util import cos_sim
import torch.nn.functional as F
# 准备测试文本
queries = [
"中国的首都是哪里?",
"中华人民共和国的首都位于哪里",
"请问北京是不是中国的首都",
"中国的首都有什么特色美食",
"东京是日本的首都",
"今天天气怎么样",
"北京是中国的首都"
]
# 加载本地模型
model_path = r"D:\Model\gte-large-zh"
model = AutoModel.from_pretrained(model_path).to("cpu")
tokenizer = AutoTokenizer.from_pretrained(model_path)
# 文本分词
inputs = tokenizer(
queries,
max_length=30,
padding=True,
truncation=True,
return_tensors="pt"
)
# 模型推理并提取句向量
outputs = model(**inputs)
sentence_embeddings = F.normalize(outputs.last_hidden_state[:, 0], p=2, dim=1)
# 计算相似度
print("=== 与基准句相似度对比 ===")
for i, q in enumerate(queries):
sim = cos_sim(sentence_embeddings[0], sentence_embeddings[i]).item()
print(f"{q} → {sim:.4f}")
2. 使用 Sentence Transformers 快速封装
from sentence_transformers import SentenceTransformer
from sentence_transformers.util import cos_sim
model_path = "D:\\Model\\gte-large-zh"
model = SentenceTransformer(model_path)
queries = [
"中国的首都是哪里?",
"中华人民共和国的首都位于哪里",
"请问北京是不是中国的首都",
"中国的首都有什么特色美食",
"东京是日本的首都",
"今天天气怎么样",
"北京是中国的首都"
]
embeddings = model.encode(queries)
print("=== 相似度对比结果 ===")
for i, q in enumerate(queries):
sim = cos_sim(embeddings[0], embeddings[i]).item()
print(f"{q} → {sim:.4f}")
✅ 说明:
sentence-transformers提供了更高层次的抽象,自动完成分词、编码、归一化等步骤,适合快速原型开发。而transformers则提供更强的自定义控制能力,适用于需要精细调整的场景。
五、关键参数影响分析
- Temperature:控制输出随机性。值越低,模型越倾向于选择高概率词;越高则输出更多样化。
- Top-K:限制候选词数量,提高稳定性但可能丢失多样性。
- Top-P (Nucleus Sampling):动态选择累积概率超过阈值的词集,平衡质量和多样性。
这些参数共同决定了生成结果的风格和可靠性,应根据具体任务进行调优。