当前位置:首页 > 技术 > 正文内容

RAG与嵌入技术深度解析:从原理到代码实现

访客 技术 2026年6月29日 1

一、RAG架构核心机制

RAG(Retrieval-Augmented Generation)通过融合外部知识源,显著提升大语言模型的输出质量。其流程可拆解为三个关键环节:

  • 知识库:存储结构化或非结构化数据,经过清洗、切块、向量化后建立索引。
  • 检索模块:将用户输入转化为向量,与知识库中的向量进行相似度匹配,返回最相关的内容片段。
  • 生成模型:结合原始问题和检索结果,生成更准确、可追溯的答案。

相比纯大模型推理,RAG在以下方面具备明显优势:

  • 支持实时信息获取,无需重新训练即可反映最新知识;
  • 可集成私有领域文档,保障数据安全;
  • 显著降低幻觉率,答案可溯源,增强可信度;
  • 有效缓解上下文长度限制,减少长文本处理开销。

二、嵌入技术在RAG中的角色

嵌入(Embedding)是实现语义理解的基础技术。它将自然语言转换为高维数值向量,使机器能够计算"语义距离"。

典型工作流如下:

  1. 离线构建阶段
  • 原始文本 → 分段处理 → 输入嵌入模型 → 输出向量 → 存入向量数据库(如Chroma、Milvus)
  1. 在线查询阶段
  • 用户提问 → 同样经嵌入模型编码为向量 → 在向量库中搜索最近邻 → 返回候选段落
  1. 生成阶段
  • 将问题与检索内容拼接,输入大模型生成最终响应

由此可见,嵌入既是知识表示的载体,也是检索过程的"钥匙"。

三、嵌入向量的核心特性

在嵌入空间中,语义相近的句子会彼此靠近,而差异较大的则相距较远。例如,"北京是中国的首都"与"中华人民共和国的首都是北京"在向量空间中具有极高的相似度。

该技术依赖于预训练模型对语言模式的学习能力,通常使用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):动态选择累积概率超过阈值的词集,平衡质量和多样性。

这些参数共同决定了生成结果的风格和可靠性,应根据具体任务进行调优。

标签: embedding

相关文章

Linux crontab 详解

1) crontab 是什么cron 是 Linux 的定时任务守护进程;crontab 是用来编辑/查看“按时间周期执行命令”的表(cron table)。常见两类:用户 crontab:每个用户一份(crontab -e 编辑)系统级 crontab / cron.d:可指定执行用户(/etc/crontab、/etc/cron.d/*)2) crontab 时间...

富文本里可以允许的 HTML 属性

一、所有标签默认允许的安全属性(极少)class        (可选)id           (通常建议禁用)title️ 注意:id 容易被滥用做锚点注入,很多系统直接禁用class 允许的话最好只允许固定前缀(如 editor-*)二、a 标签允许属性<a href="" t...

Mac 安装 Node.js 指南

方法一:通过官网安装包(最简单,适合初学者)如果你只是想快速安装并开始使用,这是最直接的方法。访问 Node.js 官网。页面会显示两个版本:LTS (Recommended For Most Users):长期支持版,最稳定。建议选这个。Current:最新特性版,包含最新功能但可能不够稳定。下载 .pkg 安装包并运行。按照安装向导点击“下一步”即可完成。方法二:使用 Homebrew 安装(...

Dom\HTML_NO_DEFAULT_NS 的副作用:自动加闭合标签

在使用Dom\HTMLDocument时,Dom\HTML_NO_DEFAULT_NS 将禁止在解析过程中设置元素的命名空间, 此设置是为了与DOMDocument向后兼容而存在的。当使用它时,已知的一个副作用就是:自动加闭合标签例如 </img> 为什么会这样?当你使用:Dom\HTML_NO_DEFAULT_NS文档会变成 无命名空间模式,此时内部更接近 XML...

自定义域名解析神器 dnsmasq

什么是 dnsmasq?dnsmasq 是一个轻量级、功能强大的网络服务工具,专为小型和中等规模网络设计。它是一个综合的网络基础设施解决方案[1]。dnsmasq 能做什么?功能说明应用场景DNS 转发与缓存将 DNS 查询转发到上游服务器(ISP、Google DNS 等),并在本地缓存结果加快 DNS 查询速度,减少外部 DNS 流量本地 DNS解析本地网络设备的主机名,无需编辑&n...

linux screen 用法详情 (nohup 的替代方案)

一、screen 是什么?能干嘛?screen 是一个终端复用器,可以:在一个 SSH 会话中开多个“虚拟终端”SSH 断线后,程序仍然在后台运行随时重新连接到原来的会话特别适合:nohup 的替代方案跑脚本 / 爬虫 / 训练模型运维、远程开发二、安装 screen# CentOS / Rocky / Almayum install -y screen# Debian / Ubuntuapt i...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。