当前位置: 首页 > article >正文

Java RAG入门基础教程(非常详细),用LangChain4j构建问答系统看这篇就够了!

1. 引言为什么需要 RAG1.1 大模型的局限性在使用大语言模型LLM时我们常常遇到以下问题❌ 问题 1模型不知道企业内部信息用户我们公司的年假政策是什么AI抱歉我不知道贵公司的具体政策...❌ 问题 2模型会产生幻觉用户张三经理的联系方式是什么AI张三经理的电话是 138-xxxx-xxxx实际是编造的❌ 问题 3知识更新滞后用户公司 2024 年最新的产品价格是多少AI模型训练数据只到 2023 年无法回答1.2 RAG 的解决方案RAGRetrieval-Augmented Generation检索增强生成技术应运而生┌─────────────────────────────────────────────────────────────┐│ RAG 核心思想 │├─────────────────────────────────────────────────────────────┤│ ││ 传统 LLM用户问题 → 大模型 → 答案 ││ ││ RAG 增强用户问题 → 检索相关文档 → 问题 文档 → 大模型 → 答案 ││ │└─────────────────────────────────────────────────────────────┘RAG 的优势• ✅准确可靠基于真实文档回答减少幻觉• ✅知识可更新添加新文档即可更新知识• ✅数据私有化企业数据无需上传到模型训练• ✅成本可控使用较小模型 私有数据降低 API 成本1.3 为什么选择 LangChain4j框架语言特点LangChainPython/JS功能强大但需要 Python 技术栈Spring AIJavaSpring 官方出品生态整合好LangChain4jJava轻量级、API 简洁、学习曲线平缓LangChain4j 的核心理念让 Java 开发者也能像调用普通方法一样使用 AI 能力2. RAG 核心原理详解2.1 RAG 完整流程┌─────────────────────────────────────────────────────────────┐│ RAG 完整工作流程 │├─────────────────────────────────────────────────────────────┤│ ││ 【准备阶段 - 应用启动时执行】 ││ ││ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ ││ │ 1. 加载 │ → │ 2. 分割 │ → │ 3. 向量化│ → │ 4. 存储 │ ││ │ 文档 │ │ 文档 │ │ Embedding│ │ 向量库 │ ││ └──────────┘ └──────────┘ └──────────┘ └──────────┘ ││ ││ 【问答阶段 - 用户提问时执行】 ││ ││ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ ││ │ 5. 用户 │ → │ 6. 检索 │ → │ 7. 构建 │ → │ 8. 生成 │ ││ │ 提问 │ │ 相关文档 │ │ 提示词 │ │ 答案 │ ││ └──────────┘ └──────────┘ └──────────┘ └──────────┘ ││ │└─────────────────────────────────────────────────────────────┘2.2 什么是向量Embedding向量是将文本转换成的数字数组语义相似的文本向量也相似。文本 → 向量简化示例实际有 1536 维公司的年假政策 → [0.12, -0.34, 0.56, 0.78, ...]年假有多少天 → [0.11, -0.33, 0.55, 0.77, ...] ← 向量很接近今天天气不错 → [0.89, 0.23, -0.67, 0.45, ...] ← 向量差别大请假流程是什么 → [0.15, -0.31, 0.52, 0.75, ...] ← 向量也很接近相似度计算余弦相似度similarity cos(θ) (A·B) / (||A|| × ||B||)结果范围-1 到 1- 1完全相同- 0无关- -1完全相反通常设定阈值 0.5-0.7低于阈值的认为不相关2.3 文档分割策略为什么需要分割• 向量模型有输入长度限制通常 512-8192 tokens• 检索时需要精确匹配相关片段而非整篇文档常用分割方法// LangChain4j 的递归分割器DocumentSplitter splitter DocumentSplitters.recursive( 500, // 每个文本块最大 500 字符 50 // 文本块之间重叠 50 字符保持上下文连贯);// 分割示例原文档2000 字符 ↓文本块 10-500 字符文本块 2450-950 字符 ← 重叠 50 字符文本块 3900-1400 字符文本块 41350-1850 字符文本块 51800-2000 字符2.4 检索与生成用户提问公司的年假政策是什么 ↓【Step 1: 问题向量化】调用 Embedding 模型 → 问题向量 [0.13, -0.32, 0.54, ...]【Step 2: 向量检索】在向量数据库中搜索相似向量- 文本块 A年假政策相似度 0.89 ✓- 文本块 B请假流程相似度 0.72 ✓- 文本块 C产品介绍相似度 0.31 ✗- 文本块 D联系方式相似度 0.28 ✗【Step 3: 构建提示词】系统你是一个智能助手请基于以下参考信息回答问题。参考信息[文本块 A 内容工作满 1 年享受 5 天带薪年假...][文本块 B 内容请假需提前 3 个工作日申请...]用户问题公司的年假政策是什么【Step 4: 调用大模型生成】qwen-max 生成答案 → 根据员工手册工作满 1 年可享受 5 天带薪年假...3. LangChain4j 框架介绍3.1 核心组件┌─────────────────────────────────────────────────────────────┐│ LangChain4j 核心组件架构 │├─────────────────────────────────────────────────────────────┤│ ││ ┌─────────────────┐ ┌─────────────────┐ ││ │ ChatLanguage │ │ Embedding │ ││ │ Model │ │ Model │ ││ │ (对话模型) │ │ (向量化模型) │ ││ └────────┬────────┘ └────────┬────────┘ ││ │ │ ││ └────────┬───────────┘ ││ │ ││ ┌────────▼────────┐ ││ │ AiServices │ ← 核心抽象层 ││ │ (AI 服务构建器) │ ││ └────────┬────────┘ ││ │ ││ ┌──────────────┼──────────────┐ ││ │ │ │ ││ ▼ ▼ ▼ ││ ┌──────┐ ┌──────────┐ ┌──────────┐ ││ │ 记忆 │ │ 检索器 │ │ 工具 │ ││ │Memory│ │Retriever │ │ Tools │ ││ └──────┘ └──────────┘ └──────────┘ ││ │└─────────────────────────────────────────────────────────────┘3.2 AiServices最强大的抽象传统 AI 调用方式RestControllerpublic class AiController { Autowired private RestTemplate restTemplate; PostMapping(/chat) public String chat(RequestBody ChatRequest request) { // 1. 手动构建提示词 String prompt 你是客服助手请基于以下信息回答\n getContext() \n 用户问题 request.getQuestion(); // 2. 调用 HTTP API HttpHeaders headers new HttpHeaders(); headers.set(Authorization, Bearer apiKey); HttpEntityMap entity new HttpEntity(...); ResponseEntityString response restTemplate.postForEntity(...); // 3. 解析结果 JsonNode root objectMapper.readTree(response.getBody()); return root.get(choices).get(0).get(message).get(content).asText(); }}LangChain4j 方式// 1. 定义接口interface Assistant { String chat(MemoryId String userId, UserMessage String question);}// 2. 创建服务Assistant assistant AiServices.builder(Assistant.class) .chatLanguageModel(model) .contentRetriever(retriever) .build();// 3. 使用像调用普通方法一样简单String answer assistant.chat(user123, 公司的年假政策是什么);3.3 支持的模型提供商LangChain4j 支持多种大模型提供商提供商模型依赖阿里云通义千问langchain4j-dashscopeOpenAIGPT-3.5/4langchain4j-open-ai百度文心一言langchain4j-qianfan本地部署Ollamalangchain4j-ollama4. 项目架构与环境搭建4.1 项目结构langchain4j-rag-demo/├── pom.xml # Maven 配置├── src/main/java/com/example/rag/│ ├── RagDemoApplication.java # 主启动类│ ├── config/│ │ ├── RagConfig.java # RAG 配置│ │ └── RagInitializer.java # RAG 初始化│ ├── service/│ │ └── AiAssistantService.java # AI 助手服务│ └── controller/│ └── AiController.java # REST API└── src/main/resources/ ├── application.yml # 配置文件 └── documents/ ├── company-policy.txt # 公司政策文档 └── product-info.txt # 产品文档4.2 核心依赖properties java.version17/java.version langchain4j.version0.29.0/langchain4j.version/propertiesdependencies !-- Spring Boot Web -- dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-web/artifactId /dependency !-- LangChain4j 核心 -- dependency groupIddev.langchain4j/groupId artifactIdlangchain4j/artifactId version${langchain4j.version}/version /dependency !-- LangChain4j Spring Boot Starter -- dependency groupIddev.langchain4j/groupId artifactIdlangchain4j-spring-boot-starter/artifactId version${langchain4j.version}/version /dependency !-- LangChain4j DashScope阿里云通义千问 -- dependency groupIddev.langchain4j/groupId artifactIdlangchain4j-dashscope/artifactId version${langchain4j.version}/version /dependency/dependencies4.3 配置文件server: port: 8080spring: application: name: langchain4j-rag-demo# LangChain4j 配置langchain4j: dashscope: chat-model: api-key: ${DASHSCOPE_API_KEY:sk-xxx} model-name: qwen-max # 对话模型 temperature: 0.7 embedding-model: api-key: ${DASHSCOPE_API_KEY:sk-xxx} model-name: text-embedding-v2 # 向量化模型# 日志配置logging: level: com.example: DEBUG dev.langchain4j: DEBUG4.4 快速启动# 1. 设置 API Keyexport DASHSCOPE_API_KEYsk-your-api-key# 2. 启动项目cd langchain4j-rag-demomvn spring-boot:run# 3. 测试接口curl -G http://localhost:8080/api/ask \ --data-urlencode question公司的年假政策是什么5. 核心代码解析5.1 RAG 配置类RagConfig.javaConfigurationpublic class RagConfig { /** * 向量数据库内存版 * 生产环境可替换为PgVectorEmbeddingStore, ChromaEmbeddingStore 等 */ Bean public EmbeddingStoreTextSegment embeddingStore() { return new InMemoryEmbeddingStore(); } /** * 内容检索器 * 用于从向量数据库中检索与查询最相关的文本块 */ Bean public ContentRetriever contentRetriever( EmbeddingStoreTextSegment embeddingStore, EmbeddingModel embeddingModel) { return EmbeddingStoreContentRetriever.builder() .embeddingStore(embeddingStore) // 向量数据库 .embeddingModel(embeddingModel) // 嵌入模型 .maxResults(3) // 每次检索返回 3 个最相关结果 .minScore(0.5) // 最低相似度阈值 .build(); }}5.2 RAG 初始化器RagInitializer.javaComponentpublic class RagInitializer implements CommandLineRunner { Autowired private EmbeddingModel embeddingModel; Autowired private EmbeddingStoreTextSegment embeddingStore; Override public void run(String... args) throws Exception { log.info(开始初始化 RAG 知识库...); // Step 1: 加载文档 ListDocument documents loadDocuments(); log.info(✓ 加载了 {} 个文档, documents.size()); // Step 2: 分割文档 ListTextSegment segments splitDocuments(documents); log.info(✓ 分割成 {} 个文本块, segments.size()); // Step 3: 向量化并存储 embedAndStore(segments); log.info(✓ 向量化完成已存储到向量数据库); } private ListDocument loadDocuments() throws IOException { ListDocument documents new ArrayList(); // 加载公司政策文档 String companyPolicy loadFile(documents/company-policy.txt); if (companyPolicy ! null) { documents.add(Document.from(companyPolicy)); } // 加载产品文档 String productDoc loadFile(documents/product-info.txt); if (productDoc ! null) { documents.add(Document.from(productDoc)); } return documents; } private ListTextSegment splitDocuments(ListDocument documents) { // 创建文档分割器500 字符/块重叠 50 字符 DocumentSplitter splitter DocumentSplitters.recursive(500, 50); ListTextSegment segments new ArrayList(); for (Document document : documents) { segments.addAll(splitter.split(document)); } return segments; } private void embedAndStore(ListTextSegment segments) { for (TextSegment segment : segments) { // 调用嵌入模型将文本转换为向量 ResponseEmbedding response embeddingModel.embed(segment); Embedding embedding response.content(); // 将向量和原始文本存储到向量数据库 embeddingStore.add(embedding, segment); } }}5.3 AI 助手服务AiAssistantService.javaServicepublic class AiAssistantService { Autowired private ChatLanguageModel chatLanguageModel; Autowired private ContentRetriever contentRetriever; private Assistant assistant; private final MapString, ChatMemory userMemories new ConcurrentHashMap(); PostConstruct public void init() { // 创建 AI 助手 this.assistant AiServices.builder(Assistant.class) .chatLanguageModel(chatLanguageModel) .contentRetriever(contentRetriever) .build(); } public String ask(String userId, String question) { // 获取或创建用户记忆最多保留 10 条消息 ChatMemory memory userMemories.computeIfAbsent( userId, id - MessageWindowChatMemory.withMaxMessages(10) ); // 添加用户消息到记忆 memory.add(UserMessage.userMessage(question)); // 调用 AI 助手自动使用 RAG 检索 String response assistant.chat(userId, question); // 添加 AI 回复到记忆 memory.add(AiMessage.aiMessage(response)); return response; } // AI 助手接口定义 interface Assistant { String chat(MemoryId String userId, UserMessage String userMessage); }}5.4 REST 控制器AiController.javaRestControllerRequestMapping(/api)public class AiController { Autowired private AiAssistantService aiAssistantService; /** * 智能问答接口POST * * curl -X POST http://localhost:8080/api/ask \ * -H Content-Type: application/json \ * -d {userId: user123, question: 公司的年假政策是什么} */ PostMapping(/ask) public MapString, String ask(RequestBody AskRequest request) { String answer aiAssistantService.ask(request.getUserId(), request.getQuestion()); return Map.of(answer, answer); } /** * 简单问答接口GET * * curl -G http://localhost:8080/api/ask \ * --data-urlencode question公司的年假政策是什么 */ GetMapping(/ask) public MapString, String askGet(RequestParam String question) { String answer aiAssistantService.ask(default-user, question); return Map.of(answer, answer); } public static class AskRequest { private String userId; private String question; // getters and setters... }}5.5 完整数据流图┌─────────────────────────────────────────────────────────────────┐│ RAG 完整数据流 │├─────────────────────────────────────────────────────────────────┤│ ││ 用户请求 ││ │ ││ ▼ ││ ┌───────────────────────────────────────────────────────────┐ ││ │ AiController.ask() │ ││ │ - 接收 HTTP 请求 │ ││ │ - 提取 userId 和 question │ ││ └───────────────────────────────────────────────────────────┘ ││ │ ││ ▼ ││ ┌───────────────────────────────────────────────────────────┐ ││ │ AiAssistantService.ask() │ ││ │ - 获取用户记忆MessageWindowChatMemory │ ││ │ - 保存用户问题到记忆 │ ││ └───────────────────────────────────────────────────────────┘ ││ │ ││ ▼ ││ ┌───────────────────────────────────────────────────────────┐ ││ │ Assistant.chat() [AiServices 代理] │ ││ │ - 触发 ContentRetriever 检索 │ ││ └───────────────────────────────────────────────────────────┘ ││ │ ││ ▼ ││ ┌───────────────────────────────────────────────────────────┐ ││ │ ContentRetriever.retrieve() │ ││ │ 1. 调用 EmbeddingModel 将问题向量化 │ ││ │ 2. 在 EmbeddingStore 中检索 Top 3 相似文本 │ ││ │ 3. 返回相关文本块 │ ││ └───────────────────────────────────────────────────────────┘ ││ │ ││ ▼ ││ ┌───────────────────────────────────────────────────────────┐ ││ │ 构建 RAG 提示词 │ ││ │ ┌─────────────────────────────────────────────────────┐ │ ││ │ │ 系统你是智能助手请基于参考信息回答问题 │ │ ││ │ │ │ │ ││ │ │ 参考信息 │ │ ││ │ │ [文本块 1: 工作满 1 年享受 5 天带薪年假...] │ │ ││ │ │ [文本块 2: 每增加 1 年增加 1 天上限 15 天...] │ │ ││ │ │ [文本块 3: 请假需提前 3 个工作日申请...] │ │ ││ │ │ │ │ ││ │ │ 用户问题公司的年假政策是什么 │ │ ││ │ └─────────────────────────────────────────────────────┘ │ ││ └───────────────────────────────────────────────────────────┘ ││ │ ││ ▼ ││ ┌───────────────────────────────────────────────────────────┐ ││ │ ChatLanguageModel.generate() │ ││ │ - 调用 qwen-max 模型 │ ││ │ - 生成答案 │ ││ └───────────────────────────────────────────────────────────┘ ││ │ ││ ▼ ││ ┌───────────────────────────────────────────────────────────┐ ││ │ 返回答案 │ ││ │ 根据员工手册工作满 1 年可享受 5 天带薪年假每增加 1 年... │ ││ └───────────────────────────────────────────────────────────┘ ││ │└─────────────────────────────────────────────────────────────────┘6. 实际案例企业智能客服系统6.1 场景描述背景某科技公司有 200 员工HR 部门每天需要回答大量重复问题• 年假有多少天• 五险一金怎么缴纳• 公司产品有哪些• 智能客服系统多少钱需求构建一个 7x24 小时在线的智能客服自动回答员工咨询。6.2 文档准备公司政策文档company-policy.txt示例科技有限公司 - 员工手册第一章 公司简介示例科技有限公司成立于 2024 年是一家专注于人工智能技术的高新技术企业。第三章 员工福利1. 薪酬福利 - 具有竞争力的薪资水平 - 年终奖金1-3 个月薪资2. 社会保障 - 五险一金全额缴纳社会保险和住房公积金3. 休假制度 - 带薪年假工作满 1 年享受 5 天带薪年假每增加 1 年增加 1 天上限 15 天 - 带薪病假每年 5 天带薪病假4. 工作时间 - 弹性工作早上 9-10 点弹性打卡 - 周末双休产品文档product-info.txt示例科技 - 产品信息文档产品一智能客服系统 (SmartCS)价格方案- 基础版9999 元/年1000 次/天- 专业版29999 元/年5000 次/天- 企业版99999 元/年不限次数产品二文档助手 (DocHelper)价格方案- 基础版4999 元/年10GB 存储- 专业版14999 元/年100GB 存储- 企业版49999 元/年不限存储6.3 接口测试# 单轮问答测试 # 测试 1年假政策curl -G http://localhost:8080/api/ask \ --data-urlencode question公司的年假政策是什么# 预期输出# {# answer: 根据示例科技有限公司的员工手册公司的年假政策如下# - 工作满 1 年的员工可以享受 5 天带薪年假# - 每增加 1 年工龄年假天数增加 1 天# - 年假天数上限为 15 天# }# 测试 2产品价格curl -G http://localhost:8080/api/ask \ --data-urlencode question智能客服系统多少钱一年# 预期输出# {# answer: 根据产品信息文档智能客服系统 (SmartCS) 的价格方案如下# - 基础版9999 元/年支持每天 1000 次交互# - 专业版29999 元/年支持每天 5000 次交互# - 企业版99999 元/年不限每日交互次数# }# 测试 3工作时间curl -G http://localhost:8080/api/ask \ --data-urlencode question# 预期输出# {# answer: 公司实行弹性工作制# - 上班时间早上 9-10 点弹性打卡# - 周末双休# - 不鼓励加班# }# 多轮对话测试 # 第一轮询问产品功能curl -X POST http://localhost:8080/api/ask \ -H Content-Type: application/json \ -d { userId: user-001, question: 智能客服系统有什么功能 }# 第二轮追问价格AI 会记住上下文curl -X POST http://localhost:8080/api/ask \ -H Content-Type: application/json \ -d { userId: user-001, question: 那专业版多少钱 }# 第三轮继续追问curl -X POST http://localhost:8080/api/ask \ -H Content-Type: application/json \ -d { userId: user-001, question: 有售后服务吗 }6.4 前端集成示例Vue 3 前端组件template div classchat-container div classmessages div v-formsg in messages :keymsg.id :class[message, msg.role] div classcontent{{ msg.content }}/div /div /div div classinput-area input v-modelinputMessage keyup.entersendMessage placeholder输入问题... / button clicksendMessage发送/button /div /div/templatescript setupimport { ref } from vueconst messages ref([])const inputMessage ref()const userId ref(user- Date.now())async function sendMessage() { if (!inputMessage.value.trim()) return // 添加用户消息 messages.value.push({ id: Date.now(), role: user, content: inputMessage.value }) // 调用 API const response await fetch(/api/ask, { method: POST, headers: { Content-Type: application/json }, body: JSON.stringify({ userId: userId.value, question: inputMessage.value }) }) const data await response.json() // 添加 AI 回复 messages.value.push({ id: Date.now() 1, role: assistant, content: data.answer }) inputMessage.value }/script7. 生产环境升级方案7.1 替换向量数据库从内存版升级到 PostgreSQL pgvectorConfigurationpublic class ProductionRagConfig { Bean public EmbeddingStoreTextSegment embeddingStore(DataSource dataSource) { return PgVectorEmbeddingStore.builder() .dataSource(dataSource) .tableName(document_embeddings) .dimension(1536) // text-embedding-v2 的维度 .createTable(true) .dropTableFirst(false) .build(); }}使用 ChromaDBBeanpublic EmbeddingStoreTextSegment embeddingStore() { return ChromaEmbeddingStore.builder() .baseUrl(http://localhost:8000) .collectionName(company-knowledge) .build();}使用 RedisBeanpublic EmbeddingStoreTextSegment embeddingStore() { return RedisEmbeddingStore.builder() .host(localhost) .port(6379) .indexName(rag-embeddings) .dimension(1536) .build();}7.2 支持更多文档格式Componentpublic class DocumentLoader { /** * 加载 PDF 文档 */ public Document loadPdf(String path) { return PdfDocumentLoader.from(path); } /** * 加载 Word 文档 */ public Document loadWord(String path) { return WordDocumentLoader.from(path); } /** * 加载网页 */ public Document loadWeb(String url) { return JsoupDocumentLoader.from(url); } /** * 批量加载目录下的所有文档 */ public ListDocument loadDirectory(String dirPath) { ListDocument documents new ArrayList(); Path dir Path.of(dirPath); try (var stream Files.walk(dir)) { stream.filter(Files::isRegularFile) .forEach(path - { try { String ext path.toString().toLowerCase(); if (ext.endsWith(.pdf)) { documents.add(PdfDocumentLoader.from(path.toString())); } else if (ext.endsWith(.docx)) { documents.add(WordDocumentLoader.from(path.toString())); } else if (ext.endsWith(.txt)) { documents.add(TextDocumentLoader.from(path.toString())); } } catch (IOException e) { log.warn(加载文件失败{}, path, e); } }); } catch (IOException e) { throw new RuntimeException(e); } return documents; }}7.3 添加 Agent 工具调用让 AI 能够调用外部 API如天气、计算器等Servicepublic class WeatherAgent { Tool(查询指定城市的天气) public String getWeather(P(城市名称) String city) { // 调用天气 API return 北京晴25°C东南风 2 级; } Tool(计算数学表达式) public double calculate(P(数学表达式) String expression) { // 使用脚本引擎计算 ScriptEngine engine new ScriptEngineManager() .getEngineByName(JavaScript); try { return ((Number) engine.eval(expression)).doubleValue(); } catch (ScriptException e) { return 0; } }}// 注册工具Servicepublic class AiAssistantService { Autowired private WeatherAgent weatherAgent; PostConstruct public void init() { this.assistant AiServices.builder(Assistant.class) .chatLanguageModel(chatLanguageModel) .contentRetriever(contentRetriever) .tools(weatherAgent) // 注册工具 .build(); }}// 使用// 用户问北京今天天气怎么样25 度加 10 度等于多少// AI 会自动调用 getWeather(北京) 和 calculate(2510)7.4 添加监控和日志Componentpublic class RagMetrics { private final MeterRegistry meterRegistry; private final Counter questionCounter; private final Timer responseTimer; public RagMetrics(MeterRegistry meterRegistry) { this.meterRegistry meterRegistry; this.questionCounter meterRegistry.counter(rag.questions.total); this.responseTimer meterRegistry.timer(rag.response.time); } public void recordQuestion() { questionCounter.increment(); } public T T recordResponse(SupplierT supplier) { return responseTimer.record(supplier); }}// 在 Service 中使用Servicepublic class AiAssistantService { Autowired private RagMetrics metrics; public String ask(String userId, String question) { metrics.recordQuestion(); return metrics.recordResponse(() - { // ... 原有逻辑 }); }}7.5 生产配置示例# application-prod.ymlserver: port: 8080spring: datasource: url: jdbc:postgresql://localhost:5432/rag_db username: rag_user password: ${DB_PASSWORD}langchain4j: dashscope: chat-model: api-key: ${DASHSCOPE_API_KEY} model-name: qwen-max temperature: 0.7 max-tokens: 2000 embedding-model: api-key: ${DASHSCOPE_API_KEY} model-name: text-embedding-v2# 连接池配置langchain4j: dashscope: connect-timeout: 30000 read-timeout: 60000# 日志配置logging: level: dev.langchain4j: INFO pattern: console: %d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n8. 总结与最佳实践8.1 学习路线回顾阶段内容关键代码理解 RAG检索增强生成原理问题→检索→增强→生成向量基础Embedding 向量化embeddingModel.embed(text)文档处理加载与分割DocumentSplitters.recursive(500, 50)向量存储存储与检索EmbeddingStore.add(),retrieve()AI 服务AiServices 抽象AiServices.builder().build()多轮对话记忆管理MessageWindowChatMemory8.2 最佳实践建议1. 文档分割策略推荐配置- 文本块大小300-800 字符- 重叠字符数30-100 字符- 按段落/句子边界分割2. 检索参数调优推荐配置- maxResults: 3-5返回结果数量- minScore: 0.5-0.7相似度阈值- 阈值过高会漏掉相关信息过低会引入噪声3. 提示词设计好的 RAG 提示词应包含- 明确的角色设定- 清晰的回答规则- 参考信息的明确标识- 处理不知道的情况4. 成本控制- 使用较小的嵌入模型text-embedding-v2- 合理设置 max-tokens 限制- 对常见问题使用缓存- 批量处理文档向量化8.3 常见问题与解决方案问题原因解决方案回答不准确检索结果不相关调整 minScore 阈值优化文档分割回答太简短提示词约束不足在系统提示词中要求详细回答响应速度慢向量检索慢使用向量数据库索引如 pgvector多轮对话丢失上下文记忆配置问题检查 MessageWindowChatMemory 配置学AI大模型的正确顺序千万不要搞错了2026年AI风口已来各行各业的AI渗透肉眼可见超多公司要么转型做AI相关产品要么高薪挖AI技术人才机遇直接摆在眼前有往AI方向发展或者本身有后端编程基础的朋友直接冲AI大模型应用开发转岗超合适就算暂时不打算转岗了解大模型、RAG、Prompt、Agent这些热门概念能上手做简单项目也绝对是求职加分王给大家整理了超全最新的AI大模型应用开发学习清单和资料手把手帮你快速入门学习路线:✅大模型基础认知—大模型核心原理、发展历程、主流模型GPT、文心一言等特点解析✅核心技术模块—RAG检索增强生成、Prompt工程实战、Agent智能体开发逻辑✅开发基础能力—Python进阶、API接口调用、大模型开发框架LangChain等实操✅应用场景开发—智能问答系统、企业知识库、AIGC内容生成工具、行业定制化大模型应用✅项目落地流程—需求拆解、技术选型、模型调优、测试上线、运维迭代✅面试求职冲刺—岗位JD解析、简历AI项目包装、高频面试题汇总、模拟面经以上6大模块看似清晰好上手实则每个部分都有扎实的核心内容需要吃透我把大模型的学习全流程已经整理好了抓住AI时代风口轻松解锁职业新可能希望大家都能把握机遇实现薪资/职业跃迁这份完整版的大模型 AI 学习资料已经上传CSDN朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费】

相关文章:

Java RAG入门基础教程(非常详细),用LangChain4j构建问答系统看这篇就够了!

1. 引言:为什么需要 RAG 1.1 大模型的局限性 在使用大语言模型(LLM)时,我们常常遇到以下问题: ❌ 问题 1:模型不知道企业内部信息用户:我们公司的年假政策是什么?AI:抱…...

C语言学习的第一周

1.自我介绍我姓马,来自成都的一个双非一本,目前大一,神秘专业,目前学c语言是兴趣使然和为了未来转码作铺垫,多项技能傍身也没错嘛2.学习目标打下c语言的坚实基础,方向初步是逐步从c语言到c再到更深度的知识…...

简易数据采集与分析系统

我用 Trae(SOLO Coder) 自主开发了这款专为硬件工程师打造的数据分析工具,无需懂代码,点点鼠标即可完成采集卡数据全流程分析。核心功能一键导入采集卡原始 ADC 数据,自动适配 12/16 位分辨率,精准转换为真…...

CSS如何利用Less快速生成颜色渐变背景_使用混合函数生成多样渐变

用带参数的.gradient-bg()混合函数,支持start-color、end-color、direction及透明度微调,避免硬编码;多色用.gradient-bg-stops();注意转义方向值、变量定义顺序、CSS变量分层及Safari渲染兼容性。Less混合函数怎么写才能生成可复…...

别再让图片拖慢你的多模态模型了:手把手教你用Q-Former和PruMerge压缩视觉Token(附代码)

视觉Token压缩实战:用Q-Former和PruMerge提升多模态模型效率 当你在深夜调试一个多模态问答系统时,突然收到告警——GPU显存爆了。查看日志发现,一张用户上传的4K产品图片生成了超过3万个视觉Token,直接拖垮了整个推理流程。这不是…...

深入解析MCU:从哈佛架构到智能家居应用

1. MCU的哈佛架构揭秘 第一次拆开智能音箱时,我盯着那块指甲盖大小的芯片发愣——这就是控制所有功能的"大脑"?后来才知道,这种叫MCU的微型计算机,核心秘密藏在它的哈佛架构里。想象你同时用两只手写字:左手…...

微信聊天记录导出终极指南:如何快速安全备份你的珍贵回忆

微信聊天记录导出终极指南:如何快速安全备份你的珍贵回忆 【免费下载链接】WeChatExporter 一个可以快速导出、查看你的微信聊天记录的工具 项目地址: https://gitcode.com/gh_mirrors/wec/WeChatExporter 你是否曾经因为手机丢失或系统升级,担心…...

HsMod:革新性炉石传说增强工具,全方位提升游戏体验

HsMod:革新性炉石传说增强工具,全方位提升游戏体验 【免费下载链接】HsMod Hearthstone Modification Based on BepInEx 项目地址: https://gitcode.com/GitHub_Trending/hs/HsMod 一、你是否也面临这些游戏痛点? 当你兴致勃勃地开启…...

Linux学习进展 计算机基本硬件结构

学习Linux系统,本质上是掌握“软件如何操控硬件”的逻辑——Linux作为开源操作系统,其内核与硬件的深度绑定的特性,决定了我们必须先理解计算机基本硬件结构,才能更清晰地明白Linux内核的调度机制、资源管理逻辑,以及后…...

Excel文件压缩难?这4个方法让文件秒变小,传输再也不卡壳!

在数据驱动的办公场景中,Excel文件的"臃肿"问题越来越普遍。比如财务部门每月导出的销售报表,因包含近百张动态图表和历史数据,文件大小可能达到几十MB;市场调研团队收集的问卷数据,若未做图片压缩&#xff…...

基于springboot+vue高校物资信息采购系统hx0807

文章目录详细视频演示技术介绍功能介绍核心代码系统效果图源码获取详细视频演示 文章底部名片,获取项目的完整演示视频,免费解答技术疑问 技术介绍 开发语言:Java 框架:ssm JDK版本:JDK1.8 服务器:tomca…...

【2026春招必看】MiniMax大模型算法岗面试深度解析:薪资福利+核心考点+项目经验!手把手教你冲刺高薪Offer!

今天给大家梳理出来minmax的福利待遇,顺便分享面试大模型算法岗的面试题。喜欢本文记得收藏、关注、点赞。 废话不多说,我们要开车了。 薪资介绍 月薪(base) 应届/初级(1–2年):35K–50K / 月中…...

十大AI写作工具迎来深度评测,AIGC论文助手从功能性、稳定性等维度出发,量化分析其核心表现。

工具名称 核心优势 适用场景 aicheck 快速降AIGC率至个位数 AIGC优化、重复率降低 aibiye 智能生成论文大纲 论文结构与内容生成 askpaper 文献高效整合 开题报告与文献综述 秒篇 降重效果显著 重复率大幅降低 一站式论文查重降重 查重改写一站式 完整论文优化…...

5分钟搞懂LLM、Token、Agent,解锁AI核心价值!

本文深入浅出地解析了AI核心概念,从基础的大语言模型(LLM)到Token、Tools、Skills、MCP,再到智能体(Agent)的演进。强调了AI虽擅长语言生成但缺乏实际操作能力,并通过工具和接口(Too…...

MTK平台Camera移植避坑指南:从驱动添加到DWS配置的完整流程(基于Kernel 4.19)

MTK平台Camera移植避坑指南:从驱动添加到DWS配置的完整流程(基于Kernel 4.19) 在嵌入式设备开发中,Camera模块的移植往往是系统集成中最具挑战性的环节之一。特别是基于MTK平台的Android设备,Camera驱动的移植涉及从内…...

从LLM到A2A:AI工程师必备7大核心概念解析,掌握AI未来!

从 LLM 到 A2A:AI 工程师必须掌握的七个核心概念 大模型 API Agent MCP Skill A2A 全景解析 你是否曾经困惑:调用一个大模型 API 和「部署一个 Agent」到底有什么本质区别?MCP 和 Skill 都是「能力扩展」,为什么需要两套机制…...

5分钟上手libhv:用自带httpd和curl工具快速搭建本地测试服务

5分钟实战libhv:零配置构建高效本地HTTP测试环境 第一次听说libhv时,我正被一个紧急的前后端联调任务逼得焦头烂额。当时需要快速搭建一个模拟API服务,但Node.js环境配置卡在了权限问题上,Python的SimpleHTTPServer又无法满足复杂…...

Python 办公自动化封神篇:PDF+Word 全自动处理,从此告别复制粘贴!

前言每天对着一堆 PDF 合并拆分、Word 改格式、手动做报表?重复操作又累又容易错,Python 几行代码就能全自动搞定!这篇不讲废话、不搞应试,全是能直接用在工作 / 学习 / 小项目的干货,从读取、创建、批量生成到美化排版…...

数字后端 | Innovus 中解决 Congestion 的常用方法

前言 Congestion(布线拥塞)是数字后端实现中常见的问题。当局部区域标准单元过密、pin 密度过高或走线方向冲突时,就会出现 Congestion,最终可能导致 DRC 违例增多甚至布线失败。本文介绍在 Innovus 中如何查看和分析 Congestion&…...

Polars 2.0大规模清洗踩坑实录:3类隐性OOM陷阱+4步零拷贝修复法,DBA紧急封存的内部手册

第一章:Polars 2.0大规模清洗踩坑实录:3类隐性OOM陷阱4步零拷贝修复法,DBA紧急封存的内部手册三类隐性OOM陷阱真实复现 在处理12TB电商日志(单文件超80GB Parquet)时,Polars 2.0默认配置下静默触发OOM——非…...

Python程序员最后的护城河:掌握无GIL环境下的内存序建模、seq_cst原子操作与TSO一致性验证(附GCC/Clang内联汇编对照表)

第一章:Python程序员的无GIL并发觉醒:从CPython锁争用到真正并行的范式跃迁Python开发者长期在CPython解释器下与全局解释器锁(GIL)共处——它保障了内存管理的安全,却也悄然扼杀了多核CPU上真正的并行计算能力。当I/O…...

Docker镜像拉取超时?5分钟搞定国内镜像源加速配置(附最新可用镜像列表)

Docker镜像加速全攻略:2024国内镜像源配置与疑难排解 每次在终端输入docker pull后盯着进度条卡住不动,是不是感觉血压都在飙升?作为国内开发者,Docker官方镜像源的访问问题就像一场永远打不完的"拉锯战"。但别急着摔键…...

eNSP启动AR报错码40终极排查指南:从Hyper-V冲突到虚拟网卡修复

1. 遇到eNSP启动AR报错码40怎么办? 最近在折腾eNSP的时候,遇到了AR设备启动报错码40的问题,按照官方帮助手册排查了一圈都没解决。这种系统级的虚拟化冲突确实让人头疼,特别是当你急着做实验的时候。经过反复测试和查阅资料&#…...

双轴卷取分切机程序,PLC和触摸屏使用西门子smart200系列。 前后卷取双轴张力控制计算

双轴卷取分切机程序,PLC和触摸屏使用西门子smart200系列。 前后卷取双轴张力控制计算。 利用变频器模拟量输出控制张力。 卷取版型较好。 内部张力梯度算法理解后可用于恒张力卷取设备。 程序有完整注释,完整的设备图纸,方便理解阅读。 只包含…...

小红书合规引流新姿势:聚光平台落地页卡片制作全流程指南

小红书聚光平台合规引流实战手册:从落地页设计到高效转化全解析 在小红书这个日活超过2亿的内容社区里,企业营销人员和个体创业者最关心的莫过于如何在不触碰平台红线的前提下实现精准引流。聚光平台作为小红书官方推出的商业工具,其落地页卡…...

【信息科学与工程学】【管理科学】第十六篇 利益设计与分配:从静态薪酬到动态激励生态系统的工程化重构

1. 从静态薪酬到动态激励:一场组织动力系统的革命 记得三年前我参与过一家科技公司的薪酬体系改革项目。当时他们的CTO对我说:"我们给工程师的薪水在行业里算高的,但为什么总感觉大家没干劲?"这个问题困扰着无数技术管理…...

Aseprite新手必看:5分钟搞定像素角色基础动画(附完整工程文件)

Aseprite像素动画速成指南:从静态角色到生动动作的5分钟魔法 第一次打开Aseprite时,我被它简洁的界面和强大的功能震撼了——作为一个独立游戏开发者,我需要快速制作角色动画,但又不想陷入复杂的美术流程。经过多次实践&#xff…...

从原理到实战:LRU缓存算法的核心机制与工程实践

1. LRU缓存算法的基础原理 最近最少使用(LRU)算法是每个后端工程师都应该掌握的缓存淘汰策略。我第一次在线上系统使用LRU时,发现它完美解决了我们的缓存击穿问题。简单来说,LRU就像图书馆里整理书籍的管理员——总是把最近被借阅…...

别再只靠瓦片等级了!用Cesium精准控制地图缩放的自定义比例尺方案

突破瓦片等级限制:Cesium动态比例尺的工程实践与业务集成 在三维地理信息系统的开发中,地图缩放控制一直是个既基础又关键的课题。传统依赖预定义瓦片等级的做法,就像用固定档位的变速箱驾驶越野车——虽然简单直接,但面对复杂地形…...

Keploy实战:基于真实流量的API自动化测试与Mock生成

1. Keploy是什么?它能解决什么问题? 第一次听说Keploy时,我也和大多数开发者一样疑惑:这工具到底能干嘛?简单来说,Keploy就像是你团队里的一个"影子测试工程师",它能悄无声息地记录下…...