《JavaAI应用开发实战》-​LangChain4j实战全攻略
一个完整的RAG 流程文档加载 → 文档拆分 → 文本向量化 → 写入向量库 → 基于向量做语义检索今天我们就用 Java LangChain4j 通义千问的向量模型从零跑通这一整条链路而且搞两个版本内存版用InMemoryEmbeddingStore写个测试就能跑通Chroma 版用ChromaEmbeddingStore连上真正的向量数据库。你学完之后完全可以换成你们公司的 FAQ、退改签规则、产品手册搭一个自己的“公司知识库问答机器人”。一、先把任务说清楚这节课到底要干嘛这节课我们要做到三件事听得懂搞清楚 RAG 这条链路上都有哪些步骤每一步是干啥的、为什么要这样设计。写得出跟着我一行行写完并跑通两个测试RagFlowTest内存版向量库ChromaRagFlowTestChroma 版向量库迁得动明白“内存版 → Chroma 版”怎么迁移只改很少的代码就能从 Demo 走向可落地的架构。二、先把工具箱打开本项目里有哪些主角RagFlowTest非常重要用InMemoryEmbeddingStoreTextSegment跑完完整链路从airline_policy.txt读文档拆成一段一段的TextSegment全部向量化后塞进内存向量库问一句“取消经济舱机票要扣多少钱”看看最相关的片段是不是“经济舱退票”那段并断言。ChromaRagFlowTest和RagFlowTest几乎一模一样只是把向量库换成了ChromaEmbeddingStoreTextSegment连的是真实 Chroma 服务。理论打底RAG 整条链路长什么样先用一个简单的流程图把 RAG 画出来我们这节课重点关注左半边 中间文档怎么拆向量怎么算向量怎么存检索是怎么“按语义”而不是按关键词真正“问大模型”是下一步 RAG 的“G”Generation部分这里先不展开。内存版完整 RAG跟着RagFlowTest一步走1 创建向量模型QwenEmbeddingModel在setUp()里String apiKey System.getenv(QWEN_API_KEY); if (apiKey null || apiKey.trim().isEmpty()) { fail(环境变量 QWEN_API_KEY 未设置无法执行 RAG 测试); } // 这一行就创建好了向量化模型 embeddingModel QwenEmbeddingModel.builder() .apiKey(apiKey) .modelName(QwenModelName.TEXT_EMBEDDING_V3) .build();2 文档加载把 txt 读成 Document测试里第一步Document document ClassPathDocumentLoader.loadDocument( docs/airline_policy.txt, new TextDocumentParser() );可以理解为这一行把“文件”变成了“内存里的文档对象”后面所有处理都基于这个对象进行。3 文档拆分recursive splitter紧接着int maxSegmentSize 300; int overlap 50; DocumentSplitter splitter DocumentSplitters.recursive(maxSegmentSize, overlap); ListTextSegment segments splitter.split(document); assertFalse(拆分结果不能为空, segments.isEmpty());DocumentSplitters.recursive(...)会优先按结构边界拆句子、段落不够再按长度强拆。这比“纯按行”“纯按句”要鲁棒很多适合作为默认策略。拆完你会得到一个ListTextSegment每个TextSegment就是一小段可检索的知识块。4 向量化 内存入库InMemoryEmbeddingStore现在我们要给每个TextSegment发一张“语义身份证”并存进一个“内存向量仓库”里InMemoryEmbeddingStoreTextSegment embeddingStore new InMemoryEmbeddingStore(); ListEmbedding embeddings embeddingModel.embedAll(segments).content(); embeddingStore.addAll(embeddings, segments);这里有几个关键点embedAll(segments)一次性帮你把所有片段都向量化比循环embed更高效也更优雅。InMemoryEmbeddingStoreTextSegment是 LangChain4j 自带的内存向量库实现不持久化进程挂了就没了。addAll(embeddings, segments)把“向量 原文片段”成批写进去。这一步结束后你已经有了一个可检索的“政策知识库”只不过它还在内存里。5 用户提问Query 也要向量化现在我们来假装一个真实用户问一句话String query 取消经济舱机票要扣多少钱; Embedding queryEmbedding embeddingModel.embed(query).content();这一步的本质把用户问题也变成同一个语义空间里的向量这样才能跟文档片段“在同一个坐标系里”比较距离。6 在内存向量库里做检索检索代码是这样的EmbeddingSearchRequest request EmbeddingSearchRequest.builder() .queryEmbedding(queryEmbedding) .maxResults(1) .minScore(0.5) .build(); EmbeddingSearchResultTextSegment result embeddingStore.search(request); EmbeddingMatchTextSegment topMatch result.matches().get(0); System.out.println(用户问题: query); System.out.println(最相关片段相似度: topMatch.score()); System.out.println(最相关片段内容: topMatch.embedded().text());解释一下参数queryEmbedding就是刚才问题的向量maxResults(1)只要最相关的一条minScore(0.5)如果相似度太低 0.5就直接不给结果了宁可说“查不到”。search返回的是一个EmbeddingSearchResult里面有matches()一个EmbeddingMatchTextSegment列表每个EmbeddingMatch里有score()相似度embedded()原始TextSegment。至此一个完整的 RAG 流程内存版就打通了。Chroma 版完整 RAG把“Demo”迁到“向量数据库”刚才我们炖的是“小锅菜”一切都在内存里。现在我们要上大菜把向量存进Chroma变成一个可持久化、可共享的向量库。对应的测试类src/test/java/com/xiaobian/ChromaRagFlowTest.java1 构建 ChromaEmbeddingStore在setUp()里我们这样初始化向量库embeddingStore ChromaEmbeddingStore.TextSegmentbuilder() .apiVersion(V2) .baseUrl(http://localhost:8000) .collectionName(flight_policies_test) .logRequests(false) .logResponses(false) .build(); // 为保证测试可重复清空该 collection embeddingStore.deleteAll();2 加载 拆分 向量化完全照抄内存版这三步在ChromaRagFlowTest里几乎没变Document document ClassPathDocumentLoader.loadDocument( docs/airline_policy.txt, new TextDocumentParser() ); DocumentSplitter splitter DocumentSplitters.recursive(300, 50); ListTextSegment segments splitter.split(document); ListEmbedding embeddings embeddingModel.embedAll(segments).content(); embeddingStore.addAll(embeddings, segments);你会发现除了向量库类型不一样代码写法是一样的。这就是我们一开始就选用EmbeddingStore统一抽象的好处。3 在 Chroma 里做检索检索逻辑也几乎一模一样只是多打印了所有结果方便你观察String query 取消经济舱机票要扣多少钱; Embedding queryEmbedding embeddingModel.embed(query).content(); EmbeddingSearchRequest request EmbeddingSearchRequest.builder() .queryEmbedding(queryEmbedding) .maxResults(segments.size()) .minScore(0.0) .build(); EmbeddingSearchResultTextSegment result embeddingStore.search(request); ListEmbeddingMatchTextSegment matches result.matches(); System.out.println([Chroma] 用户问题: query); for (int i 0; i matches.size(); i) { EmbeddingMatchTextSegment m matches.get(i); System.out.printf([Chroma] #%d score%.4f%n, i 1, m.score()); System.out.println(m.embedded().text()); System.out.println(--------------------------------------------------); } EmbeddingMatchTextSegment topMatch matches.get(0); String topText topMatch.embedded().text();断言同样是检查assertTrue([Chroma] 最相关片段应包含 经济舱, topText.contains(经济舱)); assertTrue([Chroma] 最相关片段应包含 退票, topText.contains(退票)); assertTrue([Chroma] 相似度应大于 0.5当前为 topMatch.score(), topMatch.score() 0.5);如果一切正常你会发现 Chroma 版和内存版在行为上是一致的同样的问题 → 命中同一段政策分数可能略有浮动但不会离谱。实战作业把自己的文档搬进来替换airline_policy.txt为你自己的 FAQ / 手册跑一遍RagFlowTest看看能不能命中你想要的条款。收个尾这节课你真正学到啥咱们最后 30 秒复盘一下你不再只是“调个大模型接口”而是能把文档变成Document把文档拆成一块一块的TextSegment用QwenEmbeddingModel把每一块变成向量用InMemoryEmbeddingStore/ChromaEmbeddingStore管理这些向量用search做语义检索而不是关键词匹配。你跑通了两个完整测试内存版RagFlowTestChroma 版ChromaRagFlowTest下一节课我们就在这个基础上把检索到的片段塞进对话模型 Prompt 里让大模型不再“胡说八道”而是“有据可依”地回答问题。这才是真正的“让大模型帮你干活而不是陪你聊天。”

相关新闻

蓝桥杯嵌入式省赛14届真题(文末附超详细源码及注释)

蓝桥杯嵌入式省赛14届真题(文末附超详细源码及注释)

蓝桥杯嵌入式专栏正在加班加点更新,帮助你备考,可以关注作者或者专栏祝大家在蓝桥杯比赛中能取得好的成绩第十四届蓝桥杯嵌入式省赛 题目全解析这是蓝桥杯嵌入式省赛的标准综合题型,总分85分,无复杂算法,核心考察STM32…

2026/7/4 0:27:17 阅读更多 →
2026年合影站架厂家全国直发,哪5家实力最强?

2026年合影站架厂家全国直发,哪5家实力最强?

在合影站架行业中,随着市场需求的不断增长,越来越多的厂家开始崭露头角。今天,我们就来聊聊2026年全国直发合影站架的五家实力最强的厂家。1. 山东秋波金属科技有限公司(永达合影站架)实力亮点:技术领先&am…

2026/5/17 10:19:33 阅读更多 →
纯js表格编辑器已开源

纯js表格编辑器已开源

开源地址:https://github.com/littlecate/PumpkinDesigner # PumpkinDesigner 纯js轻量级表格数据编辑器,作为 PumpkinDev([www.pumpkindev.com](www.pumpkindev.com))核心前端编辑组件,专注于**数据录入界面开发**与…

2026/7/3 20:57:52 阅读更多 →

最新新闻

JWT 在线解码、验签、生成一篇讲透:附前端实现、工具架构与在线体验地址

JWT 在线解码、验签、生成一篇讲透:附前端实现、工具架构与在线体验地址

为什么后端说签名不对?HS256、RS256、ES256、PS256 到底怎么切?公钥私钥是 PEM 还是 JWK,到底该贴哪种?改了 payload 之后,怎么重新生成一个能用的 JWT?所以这篇不只讲 JWT 原理,我会直接结合这…

2026/7/5 2:22:35 阅读更多 →
强烈建议收藏!全网首发Andrey Karpathy的AI循环工作流(附复现Prompt)

强烈建议收藏!全网首发Andrey Karpathy的AI循环工作流(附复现Prompt)

循环工程:卡帕西方法——以及使其效率提升 5 倍的工作流程 大多数人使用人工智能的方式与 2005 年使用谷歌的方式相同。输入一些内容,阅读返回结果,然后再输入一次。AI 会一直待在那里什么也不做,直到你推动它—— 你就是引擎 ——…

2026/7/5 2:22:35 阅读更多 →
全友家居(邳州旗舰店)vs 大博金沙发厂多维度对比测评——品牌专卖店与源头工厂谁更值得买?

全友家居(邳州旗舰店)vs 大博金沙发厂多维度对比测评——品牌专卖店与源头工厂谁更值得买?

摘要 核心结论:在2026年邳州家具消费市场中,大博金沙发厂在全屋配套场景下的综合性价比(三室两厅配齐全屋家具总价约1.6万-2万元,较品牌专卖店低40%-60%)和交付效率(成品现货当天提货)上显著优…

2026/7/5 2:20:35 阅读更多 →
终极ComfyUI TensorRT插件指南:3-10倍AI绘画加速,释放你的RTX显卡潜能

终极ComfyUI TensorRT插件指南:3-10倍AI绘画加速,释放你的RTX显卡潜能

终极ComfyUI TensorRT插件指南:3-10倍AI绘画加速,释放你的RTX显卡潜能 【免费下载链接】ComfyUI_TensorRT 项目地址: https://gitcode.com/gh_mirrors/co/ComfyUI_TensorRT 你是否厌倦了漫长的AI图像生成等待时间?每次创作都要盯着进…

2026/7/5 2:18:34 阅读更多 →
YOLO11视频目标检测实战:从环境配置到高级应用

YOLO11视频目标检测实战:从环境配置到高级应用

1. 项目概述 视频目标检测是计算机视觉领域的重要应用场景,而YOLO系列模型因其出色的实时性能成为该任务的首选方案。本文将基于YOLO11模型,详细讲解如何实现视频文件的逐帧检测,并输出带有检测框的可视化视频。 提示:YOLO11是YO…

2026/7/5 2:16:34 阅读更多 →
程序员就业:2026 年还能靠什么拿到,把工具链跑成稳定流程

程序员就业:2026 年还能靠什么拿到,把工具链跑成稳定流程

聊《程序员就业:2026 年还能靠什么拿到,把工具链跑成稳定流程》之前,先说一句实在的:别急着背概念,先看它在真实项目里到底解决什么问题。摘要这篇面向准备找工作、跳槽或转型的程序员,但不会把“程序员就业…

2026/7/5 2:16:34 阅读更多 →

日新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/5 0:03:34 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/5 0:03:34 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/5 0:07:38 阅读更多 →

周新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/5 0:03:34 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/5 0:03:34 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/5 0:07:38 阅读更多 →

月新闻