RAG检索增强生成把你的文档PDF/Word/TXT/Excel切成一段段转成向量Embedding存在向量库用户提问时先去向量库里检索相关内容把检索到的内容丢给 AI让 AI 只根据你的资料回答准备一、先拿 通义千问 API 信息打开https://dashscope.console.aliyun.com/左侧 API-KEY 管理 → 创建并复制API-KEY通义的 Embedding 模型名固定text-embedding-v1通义的 接口地址固定https://dashscope.aliyuncs.com/compatible-mode/v1二、准备文本信息新建文件info.txt公司名称科技有限公司 成立时间2025年 员工人数50人 主营业务AI软件开发、智能系统集成 创始人张三入门版RAG手动拼接提示词、手动处理向量、手动检索DEMOpom?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 !-- 使用 Spring Boot 父项目自动管理版本 -- parent groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-parent/artifactId version3.2.5/version relativePath/ /parent groupIdorg.example/groupId artifactIdlangchain4j-demo/artifactId version1.0-SNAPSHOT/version properties java.version17/java.version maven.compiler.source${java.version}/maven.compiler.source maven.compiler.target${java.version}/maven.compiler.target project.build.sourceEncodingUTF-8/project.build.sourceEncoding langchain4j.version1.3.0/langchain4j.version /properties dependencies !-- 1. Spring Boot 核心依赖 -- dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-web/artifactId /dependency dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter/artifactId /dependency !-- 2. LangChain4j 核心依赖 -- dependency groupIddev.langchain4j/groupId artifactIdlangchain4j/artifactId /dependency !-- 3. OpenAI 适配依赖 -- dependency groupIddev.langchain4j/groupId artifactIdlangchain4j-open-ai/artifactId /dependency !-- 4. 流式依赖 -- dependency groupIddev.langchain4j/groupId artifactIdlangchain4j-reactor/artifactId /dependency /dependencies dependencyManagement dependencies dependency groupIddev.langchain4j/groupId artifactIdlangchain4j-bom/artifactId version${langchain4j.version}/version typepom/type scopeimport/scope /dependency /dependencies /dependencyManagement build plugins !-- Spring Boot 打包插件 -- plugin groupIdorg.springframework.boot/groupId artifactIdspring-boot-maven-plugin/artifactId /plugin /plugins /build /project实现package org.deepseek.demo09; // 基础依赖 // 文档对象代表一个完整的文件 import dev.langchain4j.data.document.Document; // 文件加载器用于从本地磁盘读取文件 import dev.langchain4j.data.document.loader.FileSystemDocumentLoader; // 文档切分工具把大文件切成小段 import dev.langchain4j.data.document.splitter.DocumentSplitters; // 向量对象存储文本的向量表示 import dev.langchain4j.data.embedding.Embedding; // 文本片段切分后的每一小段文本 import dev.langchain4j.data.segment.TextSegment; // 模型依赖 // 对话模型接口 import dev.langchain4j.model.chat.ChatModel; // 向量生成模型接口 import dev.langchain4j.model.embedding.EmbeddingModel; // DeepSeek 对话模型OpenAI 兼容格式 import dev.langchain4j.model.openai.OpenAiChatModel; // 通义千问 向量模型OpenAI 兼容格式 import dev.langchain4j.model.openai.OpenAiEmbeddingModel; // 向量库依赖 // 向量匹配结果包含匹配到的文本和分数 import dev.langchain4j.store.embedding.EmbeddingMatch; // 向量搜索请求构建搜索的参数 import dev.langchain4j.store.embedding.EmbeddingSearchRequest; // 向量库顶层接口 import dev.langchain4j.store.embedding.EmbeddingStore; // 内存版向量库重启消失适合学习 import dev.langchain4j.store.embedding.inmemory.InMemoryEmbeddingStore; import java.util.List; /** * 【RAG 入门版】 * 功能读取本地 info.txt 文件构建知识库根据文档内容准确回答问题 * 解决AI 胡说八道、无法回答私有数据问题 */ public class SimpleRAGDemo { public static void main(String[] args) { // 步骤 1初始化 对话模型DeepSeek // 作用负责理解问题 整理资料 生成最终回答 ChatModel chatModel OpenAiChatModel.builder() .apiKey(sk-xxxxxxxxxxxxx) // 你的 API Key .baseUrl(https://api.deepseek.com) // DeepSeek 接口地址 .modelName(deepseek-chat) // 对话模型名称 .temperature(0.1) // 温度越低回答越严谨、稳定 .build(); // 步骤 2初始化 向量模型通义千问 Embedding // 作用把【文本】转换成【向量】让计算机能理解语义、做相似度匹配 EmbeddingModel embeddingModel OpenAiEmbeddingModel.builder() .apiKey(sk-xxxxxxxxxxxx) // 阿里云 API Key .baseUrl(https://dashscope.aliyuncs.com/compatible-mode/v1) // 通义兼容接口 .modelName(text-embedding-v1) // 通义向量模型固定 .build(); // 步骤 3加载本地文档 // 从本地磁盘读取 txt 文件封装成 Document 对象 Document document FileSystemDocumentLoader.loadDocument(D:\\Project\\public\\langchain4j\\demo\\info.txt); // 步骤 4文档切分核心 // 为什么要切分 // 1. 大模型有输入长度限制 // 2. 检索更精准 // 3. 向量计算更快 var splitter DocumentSplitters.recursive(300, 50); // 300每一段最大长度 // 50段落重叠长度防止语义被切断 ListTextSegment segments splitter.split(document); // 步骤 5初始化向量库 // 内存向量库学习用重启项目数据消失 // 生产环境建议使用Redis / Milvus / Chroma / Qdrant EmbeddingStoreTextSegment embeddingStore new InMemoryEmbeddingStore(); // 步骤 6批量生成向量并存入向量库 // 把所有文本片段 → 转换成向量 ListEmbedding embeddings embeddingModel.embedAll(segments).content(); // 把【向量】和【对应的文本】一起存入向量库 embeddingStore.addAll(embeddings, segments); // 步骤 7用户提问 → 生成查询向量 String question 公司创始人是谁; // 把问题也变成向量才能去向量库做“语义匹配” Embedding queryEmbedding embeddingModel.embed(question).content(); // 步骤 8向量库检索最核心 // 构建搜索请求 EmbeddingSearchRequest request EmbeddingSearchRequest.builder() .queryEmbedding(queryEmbedding) // 查询向量 .maxResults(3) // 最多返回 3 条最相关的片段 .build(); // 执行搜索根据向量相似度找到最相关的文本片段 var result embeddingStore.search(request); ListEmbeddingMatchTextSegment matches result.matches(); // 步骤 9拼接检索到的内容 StringBuilder context new StringBuilder(); for (EmbeddingMatchTextSegment match : matches) { TextSegment segment match.embedded(); if (segment ! null) { context.append(segment.text()).append(\n); } } // 步骤 10交给 AI生成最终回答 // 提示词强制 AI 只根据资料回答禁止编造 String prompt 请根据资料回答不要编造。 资料%s 问题公司创始人是谁 .formatted(context); // AI 生成回答 String answer chatModel.chat(prompt); System.out.println(AI 回答 answer); } }知识点1. 什么是 RAGRAG Retrieval Augmented Generation检索增强生成。作用让 AI 只能根据你提供的文档回答解决 AI 胡说八道 问题让 AI 能使用私有数据、内部文档2. RAG 执行流程加载文档txt/pdf/word切分文档split向量化embedding存入向量库用户提问问题向量化检索相关片段拼接上下文交给大模型回答3. 什么是 Embedding向量把文字变成 一串数字语义相似的文本向量距离更近是 RAG 能 “语义检索” 的基础4. 为什么要切分文档大模型有最大输入长度太长的文本向量会丢失信息切分后检索更精准切分参数maxSegmentSize片段长度overlapSize重叠长度防止切断语义5. 向量库是什么专门存储向量、提供相似度检索的数据库。学习用InMemoryEmbeddingStore内存生产用Redis、Milvus、Qdrant、Chroma6. 检索原理用户问题向量 → 去库中匹配 最相似的文本向量不是关键词匹配是语义匹配7. 为什么要用混合模型deepseek-chat擅长对话、推理、总结text-embedding-v1擅长中文向量LangChain4j 支持任意模型混用8.提示词工程请根据资料回答不要编造。 资料xxx 问题xxx作用强制 AI 不能瞎编。9. 温度参数temperature0.1 ~ 0.3RAG 专用严谨、事实准确0.7 ~ 1.0创意写作、发散思考10. 企业 RAG 优化方向更好的切分策略更好的 Embedding 模型加入关键词混合检索加入重排Rerank加入会话记忆加入元数据过滤AiServices 优雅版 RAGAiServices 自动帮你做检索 提示词拼接 对话 记忆接收问题自动去向量库检索自动拼接提示词自动调用大模型自动返回结果DEMO接口package org.deepseek.demo10; import dev.langchain4j.service.SystemMessage; public interface CompanyAssistant { SystemMessage(你是公司智能助手请严格根据提供的资料回答问题绝对不能编造信息) String ask(String question); }实现package org.deepseek.demo10; import dev.langchain4j.data.document.Document; import dev.langchain4j.data.document.loader.FileSystemDocumentLoader; import dev.langchain4j.data.document.splitter.DocumentSplitters; import dev.langchain4j.data.segment.TextSegment; import dev.langchain4j.memory.chat.MessageWindowChatMemory; import dev.langchain4j.model.chat.ChatModel; import dev.langchain4j.model.embedding.EmbeddingModel; import dev.langchain4j.model.openai.OpenAiChatModel; import dev.langchain4j.model.openai.OpenAiEmbeddingModel; import dev.langchain4j.rag.content.retriever.ContentRetriever; import dev.langchain4j.rag.content.retriever.EmbeddingStoreContentRetriever; import dev.langchain4j.service.AiServices; import dev.langchain4j.store.embedding.EmbeddingStore; import dev.langchain4j.store.embedding.inmemory.InMemoryEmbeddingStore; import java.util.List; /** * 【 AiServices 优雅版 RAG】 * 企业标准写法自动检索 自动提示 自动回答 */ public class AiServicesRAGDemo { public static void main(String[] args) { // 1. 配置对话模型DeepSeek ChatModel chatModel OpenAiChatModel.builder() .apiKey(sk-xxxxxxxxxxxxxx) .baseUrl(https://api.deepseek.com) .modelName(deepseek-chat) .temperature(0.1) .build(); // 2. 配置向量模型通义千问 EmbeddingModel embeddingModel OpenAiEmbeddingModel.builder() .apiKey(sk-xxxxxxxxxxxxxxxxx) .baseUrl(https://dashscope.aliyuncs.com/compatible-mode/v1) .modelName(text-embedding-v1) .build(); // 3. 加载并向量化文档只执行一次 Document document FileSystemDocumentLoader.loadDocument(D:\\Project\\public\\langchain4j\\demo\\info.txt); ListTextSegment segments DocumentSplitters.recursive(300, 50).split(document); EmbeddingStoreTextSegment embeddingStore new InMemoryEmbeddingStore(); embeddingStore.addAll(embeddingModel.embedAll(segments).content(), segments); // 4. 构建检索器 ContentRetriever contentRetriever EmbeddingStoreContentRetriever.builder() .embeddingStore(embeddingStore) .embeddingModel(embeddingModel) .maxResults(3) .build(); // 5. 自动创建 AI 助手自动集成 RAG CompanyAssistant assistant AiServices.builder(CompanyAssistant.class) .chatModel(chatModel) .contentRetriever(contentRetriever) // 自动 RAG .chatMemory(MessageWindowChatMemory.withMaxMessages(10)) // 自动记忆 .build(); // 7. 直接提问RAG 全自动执行 String answer assistant.ask(公司创始人是谁); System.out.println(AI 回答 answer); } }知识点1. AiServices 是什么LangChain4j 核心大脑动态代理生成 AI 实现类自动整合模型、RAG、记忆、工具2. ContentRetriever 作用封装所有检索逻辑对接向量库给 AiServices 提供检索能力3. SystemMessage 作用设定 AI 角色约束行为RAG 必须加禁止编造4. 为什么这种写法更强代码量减少 70%不用处理向量、Embedding、TextSegment不用处理空指针不用拼接提示词支持流式输出、多轮对话、工具调用