java详细介绍一下 RAG 核心模块的工作原理

3 阅读5分钟

RAG 核心模块工作原理(Java + 智能客服场景,超详细版)

RAG(Retrieval-Augmented Generation)检索增强生成,本质就是一句话: 先从本地知识库检索相关答案片段 → 把片段喂给大模型 → 让大模型基于真实资料回答,不瞎编。

下面我用最通俗、最贴近 Java 开发的方式,把 RAG 从原理到流程、到每个组件干什么,讲得清清楚楚。


一、先搞懂:为什么客服系统必须用 RAG?

LLM 大模型有两个致命问题,客服绝对不能忍:

  1. 知识过时:模型训练数据是过去的,产品规则、价格、活动随时变
  2. 幻觉(胡说八道) :不知道就瞎编,客服会出重大事故

RAG 就是解决这两个问题:

  • 知识存在你自己的数据库,随时更新
  • 强制模型只根据你给的资料回答,不许编

二、RAG 整体工作流程(四步走)

用户问题 → 检索(Retrieval)→ 构造 Prompt → 生成(Generation)→ 返回回答

拆成四大核心阶段

阶段1:知识库构建(离线)

这一步是提前做的,用户提问前就准备好。

1. 文档加载

  • 来源:PDF、Word、Excel、txt、网页、数据库配置表
  • Java 工具:Apache Tika、PDFBox
  • 作用:把非结构化文本提取出来

2. 文本分片(Chunking)

大模型有长度限制,不能把整本书丢进去。 客服场景常用规则:

  • 每片 300~512 字符
  • 重叠 64~128 字符(防止语义被切断)
  • 按标题/段落/序号切割,保持语义完整

类比:把一本书撕成一页一页,方便检索。

3. 向量化(Embedding)

这是 RAG 最核心的技术点。

  • 模型把一段文本变成 高维浮点数组(比如 1024 维向量)
  • 语义相似的文本,向量距离近
  • 语义无关的文本,向量距离远

例如:

  • “怎么退款” ≈ 向量 [0.12, 0.45, 0.67, …]
  • “退款流程” ≈ 向量 [0.11, 0.46, 0.68, …] → 距离极近

Java 中一般通过调用:

  • 通义千问 Embedding
  • 文心 Embedding
  • BGE 本地向量模型 生成向量。

4. 向量入库

原文 + 向量 存入向量数据库:

  • PGVector(最适合 Java 开发者)
  • Redis Stack
  • Milvus / Chroma

库中存储结构类似:

id | content             | embedding(向量)
1  | 7天无理由退款规则   | [0.12,0.45,...]
2  | 退款需要订单号      | [0.11,0.46,...]

阶段2:用户问题向量化(在线)

用户问:

“我买的东西不想要了怎么退?”

步骤:

  1. 后端接收问题
  2. 调用同一个 Embedding 模型 → 生成问题向量
  3. 进入向量库做相似度检索

阶段3:向量检索(核心中的核心)

1. 相似度计算

常见两种:

  1. 余弦相似度(最常用)
  2. 欧氏距离

向量库会计算: ​​用户问题向量​​ ↔ ​​所有知识库片段向量​

2. TopK 召回

返回最相似的 N 条:

  • 一般取 top3~5
  • 客服场景足够精准

例如召回:

  1. 7天无理由退款规则
  2. 退款需要订单号
  3. 退款路径在个人中心订单页

3. 相似度阈值过滤(非常重要)

如果相似度 < 0.5~0.6:

  • 说明知识库没有相关答案
  • 直接拒绝回答,避免模型瞎编
  • 返回:“请联系人工客服”

阶段4:Prompt 构造 + LLM 生成

1. 拼接上下文(RAG 的灵魂)

把以下内容拼成一个完整 Prompt:

系统提示:
你是专业客服,只根据下面提供的知识库回答,不许编造。
不知道就说“暂无相关答案,将为您转接人工”。

知识库片段:
1. xxx
2. xxx
3. xxx

历史对话:
用户:xxx
助手:xxx

用户问题:我买的东西不想要了怎么退?

2. 送给 LLM 生成回答

LLM 不再自由发挥,而是:

  • 阅读理解
  • 整理语言
  • 用自然口语复述知识库内容

3. 返回结果

这就是用户看到的最终回答。


三、RAG 核心模块内部结构(Java 视角)

一个完整 RAG 模块包含 6 个子组件:

1. DocumentLoader 文档加载器

作用:读取各种文件 → 纯文本 支持:PDF、Word、MD、HTML、CSV Java 实现:Tika + 自定义解析器

2. TextSplitter 文本分片器

策略:

  • 按字符切割
  • 按 token 切割
  • 按语义切割(进阶)

保证:

  • 不破坏句子完整性
  • 片段之间有重叠,避免断语义

3. EmbeddingModel 向量模型

接口统一:

List<Double> embed(String text);

可以对接:

  • 云端 API(通义、文心、OpenAI)
  • 本地模型(BGE-small,Java 可通过 Ollama 调用)

4. VectorStore 向量存储

核心接口:

// 插入
void add(List<Document> docs);

// 检索
List<Document> similaritySearch(String query, int topK);

5. Retriever 检索器

高级功能:

  • 相似度阈值过滤
  • 关键词重排(Rerank)
  • 多路召回(向量 + 关键词混合)

6. PromptTemplate 提示词模板

固定格式,保证回答风格统一、专业、克制。


四、用一张图总结 RAG 原理(极简版)

【知识库】
文档 → 分片 → Embedding → 向量库

【用户提问】
问题 → Embedding → 向量检索 → 召回相关片段

【最终回答】
片段 + 问题 + 历史 → Prompt → LLM → 专业回答

五、智能客服场景下 RAG 的关键特点

  1. 低温度(temperature ≤ 0.3) 不让模型发挥,只做复述。
  2. 强限制 Prompt 禁止编造,禁止扩展。
  3. 短片段、高重叠 客服知识碎、规则多,必须切小。
  4. 必须阈值过滤 避免乱答导致客诉。
  5. 多轮对话记忆 把历史也拼进 Prompt,实现上下文理解。

六、如果你需要,我可以继续讲

  • RAG 常见优化:重排序 Rerank、混合检索、父子分块、上下文压缩
  • Java 中如何自己手写一个简易 RAG 引擎(不用 Spring AI)
  • 向量数据库索引原理(HNSW / IVFFlat)
  • 智能客服 RAG 实战源码(完整可运行)

你想继续深入哪一部分?