乐途乐途
主页
  • 计算机基础

    • TCP/IP
    • Linux
    • HTTP
  • 数据库

    • SQL
    • MySQL 5.7
  • 编程语言

    • C
    • C++
    • Java SE
    • Python2
    • Python3
  • 数据格式

    • JSON
    • XML
  • 认证与安全

    • JWT
  • 工具

    • Markdown
  • Git

    • GitFlow
  • Quartz

    • Quartz
  • Java

    • Maven 入门
    • Maven 进阶
    • MyBatis
    • Spring
    • Spring MVC
  • Java

    • Spring Boot
    • Spring Cloud
    • Spring Cloud Alibaba
    • Spring Security
    • Spring AI
    • Spring Batch
    • Kafka
    • Java 设计模式
  • 缓存

    • Redis
  • 搜索引擎

    • Elasticsearch
  • 分布式协调

    • ZooKeeper
联系
阿里云
主页
  • 计算机基础

    • TCP/IP
    • Linux
    • HTTP
  • 数据库

    • SQL
    • MySQL 5.7
  • 编程语言

    • C
    • C++
    • Java SE
    • Python2
    • Python3
  • 数据格式

    • JSON
    • XML
  • 认证与安全

    • JWT
  • 工具

    • Markdown
  • Git

    • GitFlow
  • Quartz

    • Quartz
  • Java

    • Maven 入门
    • Maven 进阶
    • MyBatis
    • Spring
    • Spring MVC
  • Java

    • Spring Boot
    • Spring Cloud
    • Spring Cloud Alibaba
    • Spring Security
    • Spring AI
    • Spring Batch
    • Kafka
    • Java 设计模式
  • 缓存

    • Redis
  • 搜索引擎

    • Elasticsearch
  • 分布式协调

    • ZooKeeper
联系
阿里云
  • Spring AI 学习路径
  • 第1章 Spring AI 概述与核心理念

    • 章节导读
    • Spring AI 概述与可移植 API
    • 核心模块与依赖关系
  • 第2章 快速入门与第一个AI应用

    • 章节导读
    • 环境准备与配置
    • 第一个 AI 对话应用
  • 第3章 聊天模型与ChatClient

    • 章节导读
    • ChatClient 详解
    • ChatModel 底层抽象
    • 多轮对话与 ChatMemory
  • 第4章 提示词管理与模板

    • 章节导读
    • Prompt 与 Message 体系
    • 提示词模板与动态构建
  • 第5章 输出解析与结构化响应

    • 章节导读
    • 输出解析器与 BeanOutputConverter
  • 第6章 嵌入模型与向量存储

    • 章节导读
    • EmbeddingModel 与文本向量化
    • ETL 数据注入流水线
    • 向量存储抽象与配置
  • 第7章 检索增强生成(RAG)

    • 章节导读
    • RAG 核心机制与流程
    • QuestionAnswerAdvisor 详解
    • RAG 实战案例
  • 第8章 函数调用(Function Calling)

    • 章节导读
    • Tool 注解与函数声明
    • 函数调用实战
  • 第9章 多模态

    • 章节导读
    • 图像输入与视觉模型
    • 图像生成
  • 第10章 Advisor拦截器链

    • 章节导读
    • Advisor 链与内置拦截器
  • 第11章 MCP 协议与跨语言工具集成

    • 章节导读
    • MCP 协议深入
  • 第12章 可观测性测试与最佳实践

    • 章节导读
    • 可观测性与指标监控
    • 测试策略与 Mock 实践
    • 最佳实践与面试考点汇总

白歌在白板上画出 RAG 的三段式架构:"检索 → 增强 → 生成,本质是把'大海捞针'变成'带地图寻宝'——先找到相关文档,再让 AI 基于证据回答。"

RAG 核心机制与流程

定义与作用

RAG(Retrieval Augmented Generation,检索增强生成)是一种架构模式:在 AI 生成回答之前,先从私有知识库中检索相关信息,拼接成上下文注入 Prompt,让 AI 基于真实数据作答。

私有数据 + LLM = 领域专家

核心价值:

  1. 消除幻觉:AI 基于真实文档回答,而非"编造"
  2. 私有知识:AI 能回答公司内部信息(产品规格、内部制度)
  3. 可控更新:更新文档库即可刷新 AI 知识,无需重新训练模型

核心原理:完整 RAG 流程

图释:用户问题不直接发给 AI,而是先经过向量库检索,将相关的文档片段拼入 Prompt 作为"答题参考",最终 AI 基于这些参考资料生成回答。

对比:无 RAG vs 有 RAG

操作前:无 RAG 时(AI 凭"记忆"回答)

用户:「飞翔科技员工请假需要提前几天?」

AI:  「作为 AI 助手,我没有飞翔科技的具体信息。
       通常企业请假需要提前 1-3 天,建议咨询公司 HR。  」
       ↑ 泛泛而谈,无法给出准确答案

操作后:有 RAG 时(AI 基于员工手册回答)

用户:「飞翔科技员工请假需要提前几天?」

AI:  「根据《飞翔科技员工手册》第三章请假制度:
       - 事假需提前 3 个工作日申请
       - 病假可当日电话报备,事后补交医院证明
       - 年假需提前 1 周提交申请并由部门负责人审批   」
       ↑ 精确、有依据、可信

完整示例:手动实现 RAG(理解原理)

场景说明

在引入 QuestionAnswerAdvisor 之前,先手动实现一个简化版 RAG,帮助理解底层机制。

关键代码

@RestController
public class ManualRagController {

    private final VectorStore vectorStore;
    private final ChatClient chatClient;

    public ManualRagController(VectorStore vectorStore, 
                                ChatClient.Builder builder) {
        this.vectorStore = vectorStore;
        this.chatClient = builder.build();
    }

    @GetMapping("/manual-rag")
    public String ask(@RequestParam String question) {
        // Step 1: 检索相关文档
        List<Document> documents = vectorStore.similaritySearch(
            SearchRequest.builder()
                .query(question)
                .topK(3)
                .similarityThreshold(0.7)
                .build()
        );

        // Step 2: 构建上下文
        String context = documents.stream()
                .map(doc -> doc.getContent())
                .collect(Collectors.joining("\n\n"));

        // Step 3: 构建增强 Prompt
        String prompt = String.format("""
                你是飞翔科技员工助手。基于以下文档内容回答问题。 
                如果文档中没有相关信息,请明确说明「文档库中未找到」。
                
                相关文档:
                %s
                
                用户问题:%s
                
                回答:
                """, context, question);

        // Step 4: 调用 AI
        return chatClient.prompt()
                .user(prompt)
                .call()
                .content();
    }
}

运行结果及分析

// 输入:请假需要提前几天?
// Step 1 检索到 3 条相关片段(相似度 0.89 / 0.82 / 0.76)
// Step 2-3 拼接 Prompt(约 1500 Token)
// Step 4 AI 返回精确答案,引用员工手册具体条款

关键观察:在没有特意训练/微调模型的情况下,AI 就能精准回答企业内部问题——这就是 RAG 的魔力。

面试高频题

Q1:RAG 为什么能减少幻觉?

RAG 将"开放式生成"约束为"基于证据生成"。AI 不是凭空编造答案,而是在给定的文档上下文中寻找答案。Prompt 中的"如果文档中没有相关信息,请明确说明"指令进一步抑制了 AI 编造信息的倾向。

Q2:RAG 和模型 Fine-tuning 的区别是什么?

RAG:知识存在外部向量库中,AI 实时检索。适合动态更新的知识库,成本低,无需 GPU。Fine-tuning:知识被写入模型参数,AI 内化。适合固定的格式/风格训练,成本高,需要标注数据。两者可互补使用:RAG 提供知识,Fine-tuning 优化风格。

本章小结

  • RAG = 检索(VectorStore)→ 增强(拼接 Prompt)→ 生成(ChatModel)
  • 无 RAG 时 AI 泛泛而谈或编造,有 RAG 时基于真实文档回答
  • 手动实现 RAG 只需四步:相似搜索 → 提取上下文 → 拼接 Prompt → 调用 AI
  • QuestionAnswerAdvisor 将这个流程自动化(下一节详解)
上一页
章节导读
下一页
QuestionAnswerAdvisor 详解