前情摘要: 1、零基础学AI大模型之读懂AI大模型 2、零基础学AI大模型之从0到1调用大模型API 3、零基础学AI大模型之SpringAI 4、零基础学AI大模型之AI大模型常见概念 5、零基础学AI大模型之大模型私有化部署全指南 6、零基础学AI大模型之AI大模型可视化界面 7、零基础学AI大模型之LangChain 8、零基础学AI大模型之LangChain六大核心模块与大模型IO交互链路 9、零基础学AI大模型之Prompt提示词工程 10、零基础学AI大模型之LangChain-PromptTemplate 11、零基础学AI大模型之ChatModel聊天模型与ChatPromptTemplate实战 12、零基础学AI大模型之LangChain链 13、零基础学AI大模型之Stream流式输出实战 14、零基础学AI大模型之LangChain Output Parser 15、零基础学AI大模型之解析器PydanticOutputParser 16、零基础学AI大模型之大模型的“幻觉”
咱们先抛官方定义,用“人类做事的逻辑”类比,一眼就能懂:
你遇到一个陌生问题,比如“2024年某公司财报里的净利润是多少?”,会怎么做? → 先查资料(翻公司官网的财报文档、权威财经平台数据)→ 再结合查到的信息,组织语言回答。
RAG做的事,跟这个过程几乎一模一样! 官方定义:RAG(Retrieval-Augmented Generation,检索增强生成)是一种“先检索、再生成”的AI技术架构——先从外部知识库(比如文档、数据库)里找到和问题相关的“靠谱资料”,再把这些资料和问题一起喂给大模型,让模型基于真实信息生成回答,而不是靠自己“脑补”。
简单说:传统大模型是“凭记忆答题”,RAG是“先翻书再答题”,自然不容易出错~
咱们之前吐槽过大模型的“幻觉”,其实这只是传统生成模型的问题之一。RAG的出现,就是为了填这些坑:
传统大模型的训练数据有“截止日期”,比如GPT-3截止2021年、某国产模型截止2023年,2024年后的新事儿它根本不知道。
传统模型靠“预测下一个词”生成内容,不管事实对错,只要逻辑通顺就敢说。
通用大模型(比如GPT-4基础版)没有垂直领域的深度知识,比如法律条文、医疗指南、企业内部数据。
咱们用表格更直观对比下:
问题类型 | 问题示例 | 传统模型表现 | RAG表现 |
|---|---|---|---|
时效性问题 | 2027年诺奖得主是谁? | 无法回答(知识过期) | 检索实时信息,准确回答 |
领域专业问题 | 如何配置Hadoop YARN参数? | 回答模糊/错误 | 检索专业文档,给精准步骤 |
需要引源问题 | 不睡觉有哪些副作用? | 无可信出处,可能编内容 | 标注参考资料,列真实副作用 |
RAG不是“替代大模型”,而是“给大模型装了个外接大脑(检索系统)”。两者分工明确,互补优势:
作用:从海量数据里快速找到“和问题最相关”的信息,比如文档片段、数据库记录。 特点:
作用:把检索到的“零散资料”和用户问题结合,生成流畅、易懂的回答。 特点:
咱们用“Java开发者能看懂的类比”,拆解RAG的完整工作流程:
简单说:加载文档→拆分处理→转向量存库→检索相关内容→生成回答 每个环节的作用和常用工具,咱们对应Java知识理解:
环节 | 作用 | 常用工具 | Java类比(方便理解) |
|---|---|---|---|
文档加载器 | 读取各种格式的文档(PDF、Word、TXT) | PyPDFLoader、Unstructured | FileInputStream(读文件) |
文档转换器(分块) | 把长文档拆成短片段(方便检索) | RecursiveTextSplitter | String.split()增强版(按逻辑拆分) |
文本嵌入模型 | 把文字转成“向量”(机器能比较相关性) | OpenAI Embeddings | 把字符串转成哈希值(类比) |
向量存储 | 存向量,快速查“相似向量” | FAISS、Pinecone | 数据库索引(比如MySQL索引) |
检索器 | 根据用户问题,查向量库找相关内容 | LangChain Retriever | SQL查询(where条件找相关数据) |
咱们以“用户问‘如何申请公司报销’”为例,写一段伪代码,每步都有注释,一看就懂:
public class RAGWorkflow {
public static void main(String[] args) {
// 第一步:加载文档(比如公司的《报销制度.pdf》《FAQ文档.txt》)
// 类比:用FileInputStream读本地文件
List<Document> companyDocs = DocumentLoader.load("D:/公司知识库/报销相关/");
// 第二步:文档分块+转向量(长文档拆成短片段,再转成机器能懂的向量)
// 类比:把长字符串按“章节”拆分,再转哈希值
List<TextChunk> chunks = TextSplitter.split(companyDocs, 500); // 每段500字
List<Vector> vectorList = EmbeddingModel.convertToVector(chunks);
// 第三步:向量存入向量库(建索引,方便后续快速检索)
// 类比:把哈希值存入数据库,建索引加速查询
VectorDB vectorDB = new FAISSVectorDB(); // 常用的FAISS向量库
vectorDB.addVectors(vectorList);
// 第四步:处理用户问题,检索相关内容
String userQuestion = "如何申请公司报销?";
// 1. 先把问题转成向量
Vector questionVector = EmbeddingModel.convertToVector(userQuestion);
// 2. 从向量库找“最相似的3个文档片段”(即和问题最相关的资料)
List<TextChunk> relatedChunks = vectorDB.search(questionVector, 3);
// 第五步:结合检索结果,生成回答
// 1. 把检索到的3个片段拼成“上下文”
String context = relatedChunks.stream()
.map(chunk -> chunk.getContent() + "(来源:" + chunk.getSource() + ")")
.collect(Collectors.joining("\n"));
// 2. 把“上下文+用户问题”一起喂给大模型
String prompt = "根据以下资料回答问题:\n" + context + "\n问题:" + userQuestion;
String answer = LLM.generate(prompt); // 调用大模型生成回答
// 输出结果
System.out.println("RAG生成回答:" + answer);
// 示例输出:
// "根据《公司报销制度.pdf》P5:申请报销需先在OA提交《报销单》,附发票照片,经部门经理审批后,财务3个工作日内打款(来源:《公司报销制度.pdf》P5)。若有疑问,可参考《FAQ文档.txt》第8条:发票需为近3个月内有效票据(来源:《FAQ文档.txt》P2)。"
}
}咱们不说虚的,直接上真实案例,看看RAG在企业里到底怎么用,解决什么问题:
传统客服的坑:产品更新快(比如新出了一款手机),客服知识库来不及同步,模型答不上“这个手机老人能用吗?”这种问题。 RAG方案:
传统医疗模型的坑:通用模型不懂专业医学知识,可能给“新冠疫苗导致自闭症”这种错误建议,出问题要担法律责任。 RAG方案:
传统分析师的坑:市场数据天天变(比如某公司刚发财报),分析师要花几小时找数据、整理报告,效率低。 RAG方案:
RAG的核心不是“高大上的新技术”,而是“用检索补全大模型的短板”——让模型从“凭记忆答题”变成“先翻书再答题”,既解决了知识过时、幻觉问题,又不用花大价钱重训模型。
对咱们开发者来说,入门RAG不用怕:先掌握LangChain的文档加载、向量存储(比如FAISS),再结合今天讲的“检索+生成”逻辑,就能搭一个简单的RAG系统
最后问大家:你所在的行业,有没有“需要RAG来解决的问题”?比如公司内部文档太多,查资料慢?欢迎在评论区聊聊!