什么是 RAG简单来说RAG 是一种在发送给大模型LLM之前从你的数据中找到并注入相关信息片段到提示中的方法。这样 LLM 将获得相关信息并能够使用这些信息回复——这应该会降低产生幻觉的概率。相关信息片段可以使用各种信息检索方法找到最流行的方法有三种1️⃣ 全文关键词搜索使用 TF-IDF 和 BM25 等技术通过匹配查询中的关键词与文档数据库进行搜索。 根据每个文档中这些关键词的频率和相关性对结果进行排名。2️⃣ 向量搜索语义搜索文本文档使用嵌入模型转换为数字向量。 然后根据查询向量和文档向量之间的余弦相似度或其他相似度度量找到并排序文档从而捕捉更深层次的语义含义。3️⃣ 混合搜索结合多种搜索方法例如全文 向量通常可以提高搜索的有效性。 RAG 的两个核心阶段RAG 过程分为两个不同的阶段索引和检索。 LangChain4j 为这两个阶段提供了完整的工具支持。 阶段一索引Indexing在索引阶段文档会被预处理以便在检索阶段进行高效搜索。对于向量搜索这通常涉及清理文档用额外数据和元数据丰富文档将文档分割成更小的片段也称为分块嵌入这些片段最后将它们存储在嵌入存储向量数据库中“提示索引阶段通常是离线进行的最终用户不需要等待其完成。 例如可以通过定时任务在周末每周重新索引一次公司内部文档。但在某些情况下最终用户可能希望上传自己的自定义文档使 LLM 能够访问这些文档。 在这种情况下索引应该在线进行并成为主应用程序的一部分。索引阶段流程图 阶段二检索Retrieval检索阶段通常在线进行当用户提交一个应该使用索引文档回答的问题时。对于向量搜索这通常涉及嵌入用户的查询问题在嵌入存储中执行相似度搜索将相关片段原始文档的片段注入到提示中发送给 LLM 生成回答检索阶段流程图 RAG 实战案例Java 8 文档问答 步骤一准备资料首先准备一份 PDF 文档作为知识来源——《Java 8 从入门到精通》。我们的目标是投喂这个 PDF让大模型回答文档中的问题。️ 步骤二创建项目结构创建标准的 Spring Boot 项目结构pom.xml 依赖配置核心依赖包括Spring Boot WebLangChain4j 核心库阿里百炼平台DashScope集成Qdrant 向量数据库Easy RAG 模式AllMiniLmL6V2 本地嵌入模型?xml version1.0 encodingUTF-8?project xmlnshttp://maven.apache.org/POM/4.0.0 xmlns:xsihttp://www.w3.org/2001/XMLSchema-instance xsi:schemaLocationhttp://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd modelVersion4.0.0/modelVersion parent groupIdcom.whc/groupId artifactIdlangChain4j-whc/artifactId version1.0-SNAPSHOT/version /parent artifactIdlangchain4j-whc-rag/artifactId properties maven.compiler.source17/maven.compiler.source maven.compiler.target17/maven.compiler.target project.build.sourceEncodingUTF-8/project.build.sourceEncoding /properties dependencies dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-web/artifactId /dependency !-- LangChain4j 核心 -- dependency groupIddev.langchain4j/groupId artifactIdlangchain4j-open-ai/artifactId /dependency dependency groupIddev.langchain4j/groupId artifactIdlangchain4j/artifactId /dependency dependency groupIddev.langchain4j/groupId artifactIdlangchain4j-reactor/artifactId /dependency !-- 阿里百炼平台 -- dependency groupIddev.langchain4j/groupId artifactIdlangchain4j-community-dashscope-spring-boot-starter/artifactId /dependency !-- 工具库 -- dependency groupIdorg.projectlombok/groupId artifactIdlombok/artifactId optionaltrue/optional /dependency dependency groupIdcn.hutool/groupId artifactIdhutool-all/artifactId version5.8.22/version /dependency dependency groupIddev.langchain4j/groupId artifactIdlangchain4j-spring-boot-starter/artifactId /dependency !-- Qdrant 向量数据库 -- dependency groupIddev.langchain4j/groupId artifactIdlangchain4j-qdrant/artifactId version1.5.0-beta11/version /dependency !-- Easy RAG 模式 -- dependency groupIddev.langchain4j/groupId artifactIdlangchain4j-easy-rag/artifactId /dependency !-- AllMiniLmL6V2 本地嵌入模型 -- dependency groupIddev.langchain4j/groupId artifactIdlangchain4j-embeddings-all-minilm-l6-v2/artifactId version1.5.0-beta11/version /dependency /dependencies/project“注意将 PDF 文件放到resources/doc目录下。⚙️ 步骤三YAML 配置配置服务端口、DashScope API 和 Qdrant 连接信息server: port: 9009 servlet: encoding: enabled: true force: true charset: UTF-8spring: application: name: langchain_whc_ragai: dashScope: apiKey: ${AI_DASHSCOPE_API_KEY} modelName: ${AI_DASHSCOPE_MODEL_NAME} baseUrl: ${AI_DASHSCOPE_BASE_URL}qdrant: host: ${QDRANT_HOST} port: ${QDRANT_PORT} collectionName: ${QDRANT_COLLECTION_NAME} 步骤四大模型配置类这是最核心的配置部分需要配置三个关键 Bean向量存储实例Qdrant嵌入模型实例本地 AllMiniLmL6V2聊天模型实例DashScope内容检索器实例重点Slf4jGetterConfigurationpublic class LlmConfig { Value(${ai.dashScope.apiKey}) private String dashScopeApiKey; Value(${ai.dashScope.modelName}) private String dashScopeModelName; Value(${ai.dashScope.baseUrl}) private String dashScopeBaseUrl; Value(${qdrant.host}) private String qdrantHost; Value(${qdrant.port}) private int qdrantPort; Value(${qdrant.collectionName}) private String qdrantCollectionName; /** * 创建向量存储实例 * 使用 Qdrant 作为向量数据库 */ Bean public EmbeddingStoreTextSegment embeddingStore() { return QdrantEmbeddingStore.builder() .host(qdrantHost) .port(qdrantPort) .collectionName(qdrantCollectionName) .build(); } /** * 创建嵌入模型实例 * 使用本地的 AllMiniLmL6V2 嵌入模型避免 DashScope 兼容性问题 */ Bean public EmbeddingModel embeddingModel() { return new dev.langchain4j.model.embedding.onnx.allminilml6v2.AllMiniLmL6V2EmbeddingModel(); } /** * 创建聊天模型实例 * 使用 OpenAI 兼容的聊天模型通过 DashScope 提供的 API 服务进行对话 */ Bean public ChatModel chatModel() { return OpenAiChatModel.builder() .apiKey(dashScopeApiKey) .modelName(dashScopeModelName) .baseUrl(dashScopeBaseUrl) .logRequests(true) .build(); } /** * 创建内容检索器实例 * ⚠️ 重点必须明确指定嵌入模型避免冲突 */ Bean public ContentRetriever contentRetriever(EmbeddingStoreTextSegment embeddingStore, EmbeddingModel embeddingModel) { return EmbeddingStoreContentRetriever.builder() .embeddingStore(embeddingStore) .embeddingModel(embeddingModel) .build(); }} 步骤五定义 AI 服务接口使用AiService注解显式指定要使用的模型和检索器AiService(wiringMode AiServiceWiringMode.EXPLICIT, chatModel chatModel, contentRetriever contentRetriever)public interface RagAssist { /** * 聊天接口 * param message 用户问题 * return AI 回答 */ String chat(String message);} 步骤六Controller 实现实现 REST API完成文档解析、嵌入存储和问答的完整流程RestControllerRequiredArgsConstructorpublic class RagController { private final EmbeddingModel embeddingModel; private final EmbeddingStoreTextSegment embeddingStore; private final RagAssist ragAssist; GetMapping(value /rag/chat) public String java8(RequestParam String message) throws IOException { // 1. 读取并解析 PDF 文档 ClassPathResource resource new ClassPathResource(doc/java8从入门到精通.pdf); InputStream inputStream resource.getInputStream(); Document document new ApacheTikaDocumentParser().parse(inputStream); // 2. 创建文档嵌入存储处理器 EmbeddingStoreIngestor ingestor EmbeddingStoreIngestor.builder() .documentSplitter(DocumentSplitters.recursive(1000, 0)) .embeddingStore(embeddingStore) .embeddingModel(embeddingModel) .build(); // 3. 将文档处理并存储到向量数据库 ingestor.ingest(document); // 4. 使用 RAG 助手回答问题 String result ragAssist.chat(message); System.out.println(result); return result; }}✅ 测试效果验证测试一询问第九章内容文档第九章是关于「本地时间和时间戳」的内容接口调用GET http://localhost:9009/rag/chat?message第九章主要讲了啥 ![](http://cdn.zhipoai.cn/6cd51e2d.jpg) **AI 回答** “ 第九章主要讲述了本地时间和时间戳的相关概念。内容包括如何在程序中处理不同地区的本地时间时区的转换以及时间戳Timestamp的定义和使用方法。本章还介绍了如何将时间戳与本地时间进行相互转换帮助开发者更好地理解和操作时间数据确保在跨时区应用中的时间一致性与准确性。 **完美达到预期效果** --- ### 测试二询问 Stream 创建方法 **接口调用** plaintext GET http://localhost:9009/rag/chat?message如何创建Stream ![](http://cdn.zhipoai.cn/9fdbbbb6.jpg) **调用结果** ![](http://cdn.zhipoai.cn/4a3b079b.jpg) 很显然AI 回答参考了文档中的内容并明确说明了对应的章节来源。 ✅ **再次验证成功** --- ### 向量数据库存储效果 文档被分割成了一个又一个的 text_segment 存储在 Qdrant 中 ![](http://cdn.zhipoai.cn/c5ab4da4.jpg) --- ⚠️ 踩坑记录与解决方案 ------------ ### 坑一多个嵌入模型冲突 **问题**配置内容检索器时如果不明确指定 model会报错 plaintext Conflict: multiple embedding models have been found in the classpath解决方案在EmbeddingStoreContentRetriever中必须显式指定要使用的嵌入模型Beanpublic ContentRetriever contentRetriever(EmbeddingStoreTextSegment embeddingStore, EmbeddingModel embeddingModel) { return EmbeddingStoreContentRetriever.builder() .embeddingStore(embeddingStore) .embeddingModel(embeddingModel) // ✅ 关键明确指定模型 .build();}坑二DashScope 兼容性问题**问题**尝试使用百炼平台的向量模型TEXT-EMBEDDING-V4时报 OpenAI 不兼容异常。**解决方案**改用本地的AllMiniLmL6V2EmbeddingModel嵌入模型完美避开兼容性问题Beanpublic EmbeddingModel embeddingModel() { // ✅ 使用本地嵌入模型避免兼容性问题 return new dev.langchain4j.model.embedding.onnx.allminilml6v2.AllMiniLmL6V2EmbeddingModel();}有技术底子的人正站在AI大模型开发的黄金入口先问自己一个问题你写了这么多年代码薪资是不是已经很久没动了面试的时候“会Spring Boot”“会Vue”会MySQL已经变成了基本操作没有人在乎了。大家都会的东西就不值钱了。但另一边有人在疯狂涨薪拉勾、BOSS直聘上“AI应用开发”“大模型开发”Agent开发的岗位数量在过去一年翻了3倍薪资中位数比同级别后端开发高出 40%-60%。不是因为他们比你聪明而是因为他们踩对了赛道。你可能觉得我又不是搞算法的大模型跟我有什么关系这就是最大的误区。AI大模型应用开发 ≠ 训练大模型说清楚一点训练大模型的是那几家大厂但用大模型做应用的是千千万万的普通企业和团队。而这些团队需要的不是PhD而是——能用大模型API搭出可用产品的应用开发者能设计Agent工作流、调用工具链的Agent工程师能把RAG、Function Calling、多轮对话落地到真实业务的AI全栈这些活儿有编程基础的你完全能干。你需要补的不是算法基础而是AI开发的技术栈和工程思维。Agent开发为什么是程序员最好的切入点因为Agent开发本质上就是用自然语言编程——而这恰恰需要你已有的工程能力你有代码功底 → 理解Function Calling、工具调用、API集成比零基础快10倍你有系统设计经验 → 设计多Agent协作架构、状态管理、错误处理逻辑一脉相承你懂工程化 → 部署、监控、性能优化这些AI项目同样需要你理解数据 → RAG系统的数据清洗、向量检索、效果调优你的DB经验直接复用说白了你已有的能力是资产不是沉没成本。差的只是AI这一层的认知和工具链。学完之后你值多少钱转型 从传统后端/前端转AI应用开发打开薪资天花板跳槽议价权拉满升职 在现有团队主导AI项目落地从写代码的变成定方向的独立 用Agent开发能力做SaaS产品、接AI外包项目技术变现多一条腿不可替代 当AI能写CRUD了你是那个用AI写代码的人而不是被AI替代的人这不是危言耸听。GitHub Copilot已经能写出70%的CRUD代码了纯执行层面的程序员价值在快速缩水。但能用AI构建AI应用的人目前严重不够用。这门课会教你什么面向有编程基础的开发者从AI大模型应用开发的工程实践出发✅ 大模型API调用与Prompt工程实战✅ RAG系统搭建从数据处理到向量检索全流程✅ Agent开发Function Calling、工具链、多步推理✅ 多Agent协作与工作流编排✅ 真实项目落地从需求到部署的完整工程链路不讲虚的全是能直接用在项目里的东西。 AI大模型应用开发课程有编程基础这就是你的下一个赛道“程序员最大的风险不是技术过时而是用旧技术赚新钱的心态。”你可能还在想再等等看——但AI这个赛道窗口期就这么长。等大模型开发变成标配技能的时候你就不是先行者了而是追赶者。你有技术底子这是你最大的优势。别浪费它。