RAG 核心模块工作原理(Java + 智能客服场景,超详细版)
RAG(Retrieval-Augmented Generation)检索增强生成,本质就是一句话: 先从本地知识库检索相关答案片段 → 把片段喂给大模型 → 让大模型基于真实资料回答,不瞎编。
下面我用最通俗、最贴近 Java 开发的方式,把 RAG 从原理到流程、到每个组件干什么,讲得清清楚楚。
一、先搞懂:为什么客服系统必须用 RAG?
LLM 大模型有两个致命问题,客服绝对不能忍:
- 知识过时:模型训练数据是过去的,产品规则、价格、活动随时变
- 幻觉(胡说八道) :不知道就瞎编,客服会出重大事故
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:用户问题向量化(在线)
用户问:
“我买的东西不想要了怎么退?”
步骤:
- 后端接收问题
- 调用同一个 Embedding 模型 → 生成问题向量
- 进入向量库做相似度检索
阶段3:向量检索(核心中的核心)
1. 相似度计算
常见两种:
- 余弦相似度(最常用)
- 欧氏距离
向量库会计算: 用户问题向量 ↔ 所有知识库片段向量
2. TopK 召回
返回最相似的 N 条:
- 一般取 top3~5
- 客服场景足够精准
例如召回:
- 7天无理由退款规则
- 退款需要订单号
- 退款路径在个人中心订单页
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 的关键特点
- 低温度(temperature ≤ 0.3) 不让模型发挥,只做复述。
- 强限制 Prompt 禁止编造,禁止扩展。
- 短片段、高重叠 客服知识碎、规则多,必须切小。
- 必须阈值过滤 避免乱答导致客诉。
- 多轮对话记忆 把历史也拼进 Prompt,实现上下文理解。
六、如果你需要,我可以继续讲
- RAG 常见优化:重排序 Rerank、混合检索、父子分块、上下文压缩
- Java 中如何自己手写一个简易 RAG 引擎(不用 Spring AI)
- 向量数据库索引原理(HNSW / IVFFlat)
- 智能客服 RAG 实战源码(完整可运行)
你想继续深入哪一部分?