news 2026/4/19 1:17:17

【LangChain4j学习笔记】LangChain4j RAG 检索增强生成

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【LangChain4j学习笔记】LangChain4j RAG 检索增强生成

LangChain4j RAG 检索增强生成

学习时间:2026/4/4
技术栈:Spring Boot 4.0.5 + LangChain4j 1.12.2 + 通义千问模型

一、什么是 RAG?

RAG(Retrieval-Augmented Generation,检索增强生成)是一种结合信息检索和文本生成的 AI 技术。

解决的问题

问题传统 LLMRAG 方案
知识时效性训练数据截止可检索实时数据
幻觉问题可能编造信息基于真实文档回答
私有数据无法访问可接入私有知识库
成本每次训练成本高只需更新向量库

工作原理

用户提问 → 向量化 → 向量数据库检索 → 获取相关知识 → LLM 生成答案

二、文本向量化

2.1 Embedding 模型

QwenEmbeddingModelembeddingModel=QwenEmbeddingModel.builder().apiKey(System.getenv("ALI_AI")).build();Response<Embedding>embed=embeddingModel.embed("你好,我是ZHECSDN");System.out.println(embed.content().vector().length);// 向量维度System.out.println(embed.content());// 向量内容

核心概念

  • Embedding:将文本转换为高维向量
  • 语义相似性:语义相近的文本,向量距离更近
  • 向量维度:通义千问 embedding 模型输出 1536 维向量

2.2 向量存储与检索

// 1. 创建内存向量数据库InMemoryEmbeddingStore<TextSegment>embeddingStore=newInMemoryEmbeddingStore<>();// 2. 准备文本片段并嵌入TextSegmentsegment1=TextSegment.from("预订航班规则...");Embeddingcontent1=embeddingModel.embed(segment1).content();embeddingStore.add(content1,segment1);// 3. 向量检索EmbeddingsearchVector=embeddingModel.embed("退票多少钱?").content();EmbeddingSearchRequestsearchRequest=EmbeddingSearchRequest.builder().queryEmbedding(searchVector).maxResults(1)// 返回最相关的 1 条.minScore(0.6)// 最小相似度阈值, 取值范围[0,1].build();EmbeddingSearchResult<TextSegment>searched=embeddingStore.search(searchRequest);searched.matches().forEach(match->{System.out.println(match.score());// 相似度分数System.out.println(match.embedded().text());// 匹配的文本});

三、ELP 流程详解

ELP 是 RAG 的三个核心步骤:

  • Extract(提取):从文档中提取文本
  • Load(加载):将文本加载到系统中
  • Process(处理):分割、向量化、存储

3.1 文档加载与解析

// 声明文本解析器TextDocumentParsertextDocumentParser=newTextDocumentParser();// 从 classpath 加载文档Documentdocument=ClassPathDocumentLoader.loadDocument("rag/terms-of-service.txt",textDocumentParser);

支持的文档格式

模块解析器支持格式
核心模块TextDocumentParsertxt, md, html
apache-pdfboxApachePdfBoxDocumentParserPDF
apache-poiApachePoiDocumentParserdoc, docx, xls, xlsx, ppt, pptx
apache-tikaApacheTikaDocumentParser几乎所有文件

3.2 文档分割策略

为什么需要分割?

  • 大文本超出模型上下文窗口限制
  • 提高检索精度
  • 降低计算成本

三种分割器

// 1. 按字符分割(不推荐,可能断句)DocumentByCharacterSplittercharacterSplitter=newDocumentByCharacterSplitter(100,// 每段最长字数10// 重叠字数);// 2. 按正则表达式分割DocumentByRegexSplitterregexSplitter=newDocumentByRegexSplitter("\\n\\d+\\.",// 匹配换行 + 数字 + 点"\n",// 分隔符70,// 最大长度10,// 重叠长度newDocumentByCharacterSplitter(100,10));// 3. 按句子分割(推荐,保证语义完整)DocumentBySentenceSplittersentenceSplitter=newDocumentBySentenceSplitter(100,// 最大长度30// 重叠长度);// 分割文本List<TextSegment>segments=regexSplitter.split(document);

分割器选择经验值

场景分块策略参考值
微博/短文本句子级分割100-200
学术论文段落级分割300-500
法律合同条款级分割200-400
长篇小说章节级分割500-1000

分割注意事项

  • ❌ 分块过细:破坏上下文连贯性,增加计算成本
  • ❌ 分块过宽:可能超出模型限制,降低匹配度
  • ✅ 首要原则:保证句子完整性!

3.3 向量化与存储

// 1. 创建 Embedding 模型QwenEmbeddingModelembeddingModel=QwenEmbeddingModel.builder().apiKey(System.getenv("ALI_AI")).build();// 2. 批量嵌入所有文本片段List<Embedding>embeddings=embeddingModel.embedAll(segments).content();// 3. 存储到向量数据库InMemoryEmbeddingStore<TextSegment>embeddingStore=newInMemoryEmbeddingStore<>();embeddingStore.addAll(embeddings,segments);

3.4 检索增强生成

// 1. 创建聊天模型ChatModelqwenModel=QwenChatModel.builder().apiKey(System.getenv("ALI_AI")).modelName("qwen-max").build();// 2. 创建内容检索器EmbeddingStoreContentRetrievercontentRetriever=EmbeddingStoreContentRetriever.builder().embeddingStore(embeddingStore).embeddingModel(embeddingModel).maxResults(5)// 返回最相关的 5 条.minScore(0.6)// 最小相似度.build();// 3. 构建 AI 助手(集成 RAG)publicinterfaceAssistant{Stringchat(@UserMessageStringmessage);}Assistantassistant=AiServices.builder(Assistant.class).chatModel(qwenModel).contentRetriever(contentRetriever)// 关键:添加内容检索器.build();// 4. 使用 RAG 进行问答Stringanswer=assistant.chat("退费费用?");System.out.println(answer);

3.5 RAG 工作流程图

用户提问:"退费费用?" ↓ 1. 问题向量化 ↓ 2. 向量数据库检索(返回 top 5 相关文档片段) ↓ 3. 将检索到的文档片段 + 用户问题一起发送给 LLM ↓ 4. LLM 基于检索到的知识生成答案 ↓ AI 回复:"根据服务条款,取消费用为:经济舱 75 元..."

四、Spring Boot 集成

4.1 应用启动时加载 RAG 数据

@SpringBootApplicationpublicclassLangchain4jSpringBootApplication{publicstaticvoidmain(String[]args){SpringApplication.run(Langchain4jSpringBootApplication.class,args);}@BeanCommandLineRunnerinsertTermsOfServiceToVectorStore(QwenEmbeddingModelqwenEmbeddingModel,EmbeddingStore<TextSegment>embeddingStore){returnargs->{// 加载文件Documentdocument=ClassPathDocumentLoader.loadDocument("rag/terms-of-service.txt",newTextDocumentParser());// 分割文件 - 使用句子分割器DocumentBySentenceSplittersplitter=newDocumentBySentenceSplitter(100,20);List<TextSegment>segments=splitter.split(document);// 向量化并存储List<Embedding>embeddings=qwenEmbeddingModel.embedAll(segments).content();embeddingStore.addAll(embeddings,segments);System.out.println("RAG 数据加载完成,共 "+segments.size()+" 个片段");};}}

4.2 AiConfig 配置

@ConfigurationpublicclassAiConfig{publicinterfaceAssistant{Stringchat(@UserMessageStringmessage);}@BeanpublicEmbeddingStore<TextSegment>embeddingStore(){returnnewInMemoryEmbeddingStore<>();}@BeanpublicAssistantassistant(ChatModelqwenChatModel,QwenEmbeddingModelembeddingModel,EmbeddingStore<TextSegment>embeddingStore){// 创建内容检索器EmbeddingStoreContentRetrievercontentRetriever=EmbeddingStoreContentRetriever.builder().embeddingStore(embeddingStore).embeddingModel(embeddingModel).maxResults(5).minScore(0.6).build();returnAiServices.builder(Assistant.class).chatModel(qwenChatModel).contentRetriever(contentRetriever).build();}}

五、向量数据库选型

类型代表产品适用场景
内存型InMemoryEmbeddingStore测试、小规模应用
云原生Pinecone、Weaviate、Milvus Cloud生产环境、大规模数据
自托管Milvus、Chroma、Qdrant数据敏感、需要私有部署
混合型Elasticsearch + 向量插件已有 ES 集群

六、最佳实践

6.1 提升检索质量

  1. 优化分块策略

    • 保证句子完整性
    • 适当的重叠(10%-20%)保持上下文连贯
  2. 调整检索参数

    EmbeddingStoreContentRetrieverretriever=EmbeddingStoreContentRetriever.builder().maxResults(5)// 根据任务复杂度调整.minScore(0.6)// 平衡召回率和准确率.build();
  3. 元数据过滤

    TextSegmentsegment=TextSegment.from("文本内容");segment.metadata().put("category","航空政策");// 检索时过滤Filterfilter=Filter.eq("category","航空政策");

6.2 RAG 应用场景

场景说明示例
智能客服基于企业知识库回答航空客服、电商客服
文档问答对长篇文档进行问答合同审查、论文阅读
代码助手基于代码库回答问题内部 API 文档查询
知识管理企业知识库智能检索员工手册、技术规范

七、总结

RAG 是企业级 AI 应用的核心技术:

  • 知识增强:基于私有文档回答问题
  • 减少幻觉:答案来自真实文档
  • 实时更新:只需更新向量库
  • 向量检索:语义相似度匹配

相关笔记:

  1. LangChain4j 入门指南
  2. LangChain4j 声明式 AI 服务开发
  3. LangChain4j 对话记忆与多用户隔离
  4. LangChain4j Function Call 工具调用
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/19 1:14:33

前端监控体系搭建

前端监控体系搭建&#xff1a;提升用户体验的关键 在当今互联网时代&#xff0c;用户体验已成为产品成功的关键因素之一。前端作为用户与产品交互的第一道门槛&#xff0c;其性能和稳定性直接影响用户满意度。前端环境复杂多变&#xff0c;如何快速发现并解决问题&#xff1f;…

作者头像 李华
网站建设 2026/4/19 1:13:37

Python 源码解读:核心数据结构与算法实现分析

一、前言Python 源码解读&#xff1a;核心数据结构与算法实现分析。本文深入源码层面&#xff0c;剖析核心设计原理&#xff0c;帮你从"会用"升级到"精通"。二、核心原理深度剖析2.1 数据结构设计# Python 装饰器的原理&#xff1a;闭包 函数作为一等公民…

作者头像 李华
网站建设 2026/4/19 1:03:57

防止SQL注入的运维实践_实时清理数据库缓存与历史记录.txt

游戏服务器不用net/http因HTTP协议不适合高频实时通信&#xff0c;应直接用net.Conn或WebSocket&#xff1b;需精细控制连接生命周期、避免goroutine泄漏&#xff0c;并用sync.Mapsync.Pool优化性能。为什么不用 net/http 直接写游戏服务器HTTP 协议本身有请求-响应模型、头部开…

作者头像 李华
网站建设 2026/4/19 0:54:15

雀魂AI辅助工具完整指南:免费开源实时麻将策略分析神器

雀魂AI辅助工具完整指南&#xff1a;免费开源实时麻将策略分析神器 【免费下载链接】Akagi 支持雀魂、天鳳、麻雀一番街、天月麻將&#xff0c;能夠使用自定義的AI模型實時分析對局並給出建議&#xff0c;內建Mortal AI作為示例。 Supports Majsoul, Tenhou, Riichi City, Amat…

作者头像 李华