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

别再只调API了!用Langchain4j的RAG功能,5分钟给你的Java应用加上专属知识库

用Langchain4j的RAG功能为Java应用快速构建智能知识库在当今信息爆炸的时代企业内部的文档资料往往分散在各个角落员工需要花费大量时间查找相关信息。传统的全文检索方式虽然能解决部分问题但当用户用自然语言提问时往往难以精准定位到所需内容。本文将介绍如何利用Langchain4j的RAG检索增强生成功能在5分钟内为现有Java应用添加智能问答能力。1. RAG技术原理与优势RAGRetrieval-Augmented Generation是当前最先进的智能问答解决方案它结合了信息检索和文本生成两大能力检索Retrieval从海量文档中快速找到与问题相关的内容片段生成Generation基于检索到的内容生成自然、准确的回答与传统聊天机器人相比RAG具有以下优势知识实时更新只需更新文档库无需重新训练模型回答有据可查每个回答都基于实际文档内容避免幻觉问题部署成本低不需要微调大模型利用现有LLM即可// RAG工作流程伪代码 ListDocument relevantDocs vectorStore.search(userQuestion); String answer llm.generate(relevantDocs, userQuestion);2. 环境准备与依赖配置2.1 创建Spring Boot项目首先创建一个基础的Spring Boot项目添加以下依赖dependencies !-- Spring Boot基础依赖 -- dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-web/artifactId /dependency !-- Langchain4j核心依赖 -- dependency groupIddev.langchain4j/groupId artifactIdlangchain4j-spring-boot-starter/artifactId version0.25.0/version /dependency !-- 阿里云通义千问集成 -- dependency groupIddev.langchain4j/groupId artifactIdlangchain4j-qianfan/artifactId version0.25.0/version /dependency !-- Pinecone向量数据库支持 -- dependency groupIddev.langchain4j/groupId artifactIdlangchain4j-pinecone/artifactId version0.25.0/version /dependency /dependencies2.2 配置API密钥在application.yml中配置必要的API密钥langchain4j: qianfan: api-key: ${QIANFAN_API_KEY} secret-key: ${QIANFAN_SECRET_KEY} embedding-model: model-name: text-embedding-v3 pinecone: api-key: ${PINECONE_API_KEY} index: company-knowledge-base3. 文档处理流水线搭建3.1 文档加载与解析Langchain4j提供了多种文档加载器支持从不同来源加载文档// 从文件系统加载PDF文档 Document pdfDoc FileSystemDocumentLoader.loadDocument( path/to/document.pdf, new ApachePdfBoxDocumentParser() ); // 从URL加载HTML文档 Document htmlDoc UrlDocumentLoader.load( new URL(https://example.com/doc.html), new JsoupHtmlParser() );支持的文档格式包括格式解析器类依赖PDFApachePdfBoxDocumentParserlangchain4j-document-parser-apache-pdfboxWordApachePoiDocumentParserlangchain4j-document-parser-apache-poiHTMLJsoupHtmlParserlangchain4j-document-parser-jsoup纯文本TextDocumentParser内置3.2 文档分块策略大文档需要分割成适当大小的块Langchain4j提供了多种分块策略// 按段落分割每块不超过500字符重叠50字符 DocumentSplitter splitter new DocumentByParagraphSplitter(500, 50); // 递归分割策略推荐 DocumentSplitter recursiveSplitter DocumentSplitters.recursive( 500, // 最大块大小 50, // 重叠大小 new HuggingFaceTokenizer() // 使用tokenizer精确计算长度 ); ListTextSegment segments splitter.split(document);提示分块大小需要根据实际内容调整技术文档通常需要比普通文本更大的块4. 向量化与存储4.1 文本向量化使用阿里云通义千问的text-embedding-v3模型将文本转换为向量Autowired private EmbeddingModel embeddingModel; public Embedding embedText(String text) { return embeddingModel.embed(text).content(); } // 批量向量化 ListEmbedding embeddings embeddingModel.embedAll(segments).content();4.2 向量存储配置Pinecone是目前最流行的向量数据库之一免费套餐足够中小型知识库使用Bean public EmbeddingStoreTextSegment embeddingStore() { return PineconeEmbeddingStore.builder() .apiKey(System.getenv(PINECONE_API_KEY)) .index(company-knowledge-base) .dimension(1024) // text-embedding-v3的向量维度 .build(); }其他可选向量数据库对比数据库特点适用场景Pinecone全托管服务简单易用生产环境首选Chroma开源可本地部署开发测试环境Weaviate支持混合搜索需要结合关键字搜索的场景5. 构建RAG问答服务5.1 实现问答接口public interface KnowledgeBaseService { String answerQuestion(String question); } AiService public class KnowledgeBaseServiceImpl implements KnowledgeBaseService { Autowired private EmbeddingModel embeddingModel; Autowired private EmbeddingStoreTextSegment embeddingStore; Autowired private ChatLanguageModel chatModel; Override public String answerQuestion(String question) { // 1. 将问题向量化 Embedding questionEmbedding embeddingModel.embed(question).content(); // 2. 检索相关文档片段 ListEmbeddingMatchTextSegment relevantMatches embeddingStore .findRelevant(questionEmbedding, 3); // 返回最相关的3个片段 // 3. 构建提示词 String prompt buildPrompt(question, relevantMatches); // 4. 调用大模型生成回答 return chatModel.generate(prompt); } private String buildPrompt(String question, ListEmbeddingMatchTextSegment matches) { StringBuilder context new StringBuilder(); for (EmbeddingMatchTextSegment match : matches) { context.append(match.embedded().text()).append(\n\n); } return String.format( 基于以下上下文信息回答问题。如果无法从上下文中得到答案 请回答我不知道。 上下文 %s 问题%s , context.toString(), question); } }5.2 集成到现有系统将RAG服务集成到Spring Boot应用中RestController RequestMapping(/api/knowledge) public class KnowledgeController { Autowired private KnowledgeBaseService knowledgeService; PostMapping(/ask) public ResponseEntityString askQuestion(RequestBody String question) { String answer knowledgeService.answerQuestion(question); return ResponseEntity.ok(answer); } }6. 性能优化与进阶技巧6.1 缓存策略为提升响应速度可以实现问题向量和回答的缓存Cacheable(value qaCache, key #question.hashCode()) public String answerQuestion(String question) { // ...原有实现 }6.2 混合检索结合关键词检索提升召回率ListEmbeddingMatchTextSegment vectorResults embeddingStore.findRelevant(embedding, 5); ListTextSegment keywordResults keywordSearch(question); // 合并结果并去重 ListTextSegment allResults Stream.concat( vectorResults.stream().map(EmbeddingMatch::embedded), keywordResults.stream() ).distinct().collect(Collectors.toList());6.3 反馈循环收集用户反馈持续优化PostMapping(/feedback) public void recordFeedback( RequestParam String question, RequestParam String answer, RequestParam boolean wasHelpful ) { // 记录反馈到数据库或日志系统 feedbackService.record(question, answer, wasHelpful); }7. 实际应用案例7.1 企业OA系统集成为HR系统添加政策问答功能// 加载员工手册 Document employeeHandbook FileSystemDocumentLoader.loadDocument( hr/employee-handbook.pdf, new ApachePdfBoxDocumentParser() ); // 初始化HR问答服务 AiServices.builder(HRService.class) .chatLanguageModel(chatModel) .contentRetriever(EmbeddingStoreContentRetriever.builder() .embeddingStore(embeddingStore) .embeddingModel(embeddingModel) .maxResults(2) .build()) .build();7.2 产品帮助中心构建智能客服系统AiService public interface ProductSupportService { SystemMessage(你是产品技术支持专家根据知识库内容回答用户问题) String answerTechnicalQuestion(UserMessage String question); SystemMessage(你是客户服务代表用友好礼貌的方式回答问题) String answerGeneralQuestion(UserMessage String question); }在实际项目中我们发现RAG系统对技术文档的问答准确率能达到85%以上显著降低了客服人力成本。一个常见的陷阱是没有设置合理的分块策略导致检索到的内容不完整。通过调整分块大小和重叠区域我们最终将准确率提升了20%。

相关文章:

别再只调API了!用Langchain4j的RAG功能,5分钟给你的Java应用加上专属知识库

用Langchain4j的RAG功能为Java应用快速构建智能知识库 在当今信息爆炸的时代,企业内部的文档资料往往分散在各个角落,员工需要花费大量时间查找相关信息。传统的全文检索方式虽然能解决部分问题,但当用户用自然语言提问时,往往难…...

Logisim-Evolution完全指南:从入门到精通数字电路仿真

Logisim-Evolution完全指南:从入门到精通数字电路仿真 【免费下载链接】logisim-evolution Digital logic design tool and simulator 项目地址: https://gitcode.com/gh_mirrors/lo/logisim-evolution 开源电路仿真软件Logisim-Evolution是一款功能强大的数…...

如何高效捕获网页媒体资源?猫抓插件让智能嗅探变得如此简单

如何高效捕获网页媒体资源?猫抓插件让智能嗅探变得如此简单 【免费下载链接】cat-catch 猫抓 chrome资源嗅探扩展 项目地址: https://gitcode.com/GitHub_Trending/ca/cat-catch 你是否遇到过想保存网页上的精彩视频却找不到下载按钮的尴尬?是否曾…...

从手机照片同步到数据去重:用C++ STL set/map搞定‘两个数组交集’背后的真实业务逻辑

从手机照片同步到数据去重:用C STL set/map搞定‘两个数组交集’背后的真实业务逻辑 每次换新手机时,最头疼的莫过于照片和联系人的迁移——那些重复的截图、相似的风景照、多年前的证件照,究竟该如何高效筛选?这背后隐藏的正是计…...

InstructPix2Pix在.NET平台的应用开发实战

InstructPix2Pix在.NET平台的应用开发实战 1. 引言:当AI修图遇上.NET开发 想象一下这样的场景:电商平台的商品图片需要批量调整风格,摄影工作室想要快速实现创意效果,或者内容创作者需要即时编辑社交媒体图片。传统图像处理方式…...

捉妖雷达Web版:如何解决游戏数据实时同步的技术挑战?

捉妖雷达Web版:如何解决游戏数据实时同步的技术挑战? 【免费下载链接】zhuoyao_radar 捉妖雷达 web版 项目地址: https://gitcode.com/gh_mirrors/zh/zhuoyao_radar 捉妖雷达Web版是一个开源的游戏辅助工具项目,旨在为捉妖游戏玩家提供…...

攻克Godot资源提取难题:godot-unpacker工具的创新解法

攻克Godot资源提取难题:godot-unpacker工具的创新解法 【免费下载链接】godot-unpacker godot .pck unpacker 项目地址: https://gitcode.com/gh_mirrors/go/godot-unpacker 问题:为什么普通解压工具无法胜任PCK文件提取? Godot引擎打…...

CLIP-GmP-ViT-L-14多场景:新闻图解自动配文与虚假信息识别联动

CLIP-GmP-ViT-L-14多场景:新闻图解自动配文与虚假信息识别联动 你有没有想过,当你在新闻网站上看到一张图片时,旁边的文字描述是怎么来的?是编辑手动写的,还是机器自动生成的?更关键的是,你怎么…...

基于SenseVoice-Small的语音日记应用开发指南

基于SenseVoice-Small的语音日记应用开发指南 1. 语音日记应用的核心价值 你有没有想过,每天用说话的方式记录生活,然后自动变成文字日记?这种语音日记的方式特别适合忙碌的现代人,不用打字,随时随地都能记录心情和想…...

职场新人必看:用豆包+WPS AI+Canva免费版1小时搞定专业述职PPT(附真实案例)

职场新人1小时速成专业述职PPT:豆包WPS AICanva黄金组合实战指南 刚结束试用期的你,是否正为述职报告焦头烂额?看着同事那些排版精美、数据可视化的PPT,再对比自己Word转PPT的简陋作品,这种落差感我太懂了。三年前我刚…...

DFR0554双芯片显示模块驱动解析:PCA9633与AIP31068协同控制

1. DFR0554 显示模块驱动深度解析:基于 PCA9633 与 AIP31068 的双芯片协同架构 DFR0554 是 DFRobot 推出的一款集成化智能显示模块,其核心并非单一显示控制器,而是由两颗功能互补的专用 IC 协同构成: PCA9633 LED 驱动器 与 A…...

破解代码智能壁垒:DeepSeek-Coder-V2实战指南与开源优势深度解析

破解代码智能壁垒:DeepSeek-Coder-V2实战指南与开源优势深度解析 【免费下载链接】DeepSeek-Coder-V2 项目地址: https://gitcode.com/GitHub_Trending/de/DeepSeek-Coder-V2 面对日益复杂的软件开发需求,开发者们常常在代码生成质量、多语言支持…...

CAN FD通信中,如何用AUTOSAR配置搞定TDC和SSP?一个80% Offset的实战案例

CAN FD通信中AUTOSAR配置实战:TDC与SSP的80% Offset实现 在汽车电子领域,CAN FD(Controller Area Network Flexible Data-rate)正逐步取代传统CAN总线,成为车载网络的主流选择。随着数据传输速率提升至2Mbps甚至更高&a…...

避坑指南:单相有源逆变电路Simulink仿真中那些教科书没讲的细节(附反电动势设置模板)

单相有源逆变电路Simulink仿真实战:从参数配置到波形调试的工程化指南 第一次在Simulink里搭建单相有源逆变电路时,看着报错窗口弹出的"Algebraic loop detected"提示,我盯着屏幕足足愣了五分钟。教科书上明明写着"连接好器件…...

SQLite Indexed By: 高效索引策略解析与应用

SQLite Indexed By: 高效索引策略解析与应用 引言 SQLite 是一款轻量级的关系型数据库管理系统,以其小巧的体积和强大的功能在移动应用、嵌入式系统和网络应用中得到了广泛的应用。索引是数据库中不可或缺的一部分,它能够极大地提高查询效率。本文将深入探讨 SQLite 的索引…...

终极ESLyric歌词源配置指南:三步解锁酷狗QQ网易云逐字歌词

终极ESLyric歌词源配置指南:三步解锁酷狗QQ网易云逐字歌词 【免费下载链接】ESLyric-LyricsSource Advanced lyrics source for ESLyric in foobar2000 项目地址: https://gitcode.com/gh_mirrors/es/ESLyric-LyricsSource 想在Foobar2000中享受酷狗音乐、QQ…...

EcomGPT-7B多语言能力:俄语商品→自动适配Wildberries平台标题规则

EcomGPT-7B多语言能力:俄语商品→自动适配Wildberries平台标题规则 1. 引言:跨境电商的本地化难题 如果你正在做俄罗斯电商,或者想把商品卖到Wildberries平台,一定遇到过这个头疼的问题:怎么把中文的商品信息&#x…...

zteOnu:核心功能全解析与实战指南

zteOnu:核心功能全解析与实战指南 【免费下载链接】zteOnu 项目地址: https://gitcode.com/gh_mirrors/zt/zteOnu 解锁高级配置:工厂模式激活指南 场景描述 网络管理员在配置中兴光猫时,发现普通用户权限无法修改关键网络参数&…...

YOLOv5实战:如何用Python手写IoU计算函数提升目标检测精度

YOLOv5实战:手写IoU计算函数提升目标检测精度的Python实现 在目标检测任务中,边界框的定位精度直接影响模型性能。IoU(Intersection over Union)作为衡量预测框与真实框重合度的核心指标,其计算准确性对模型优化至关重…...

3分钟打造个性化英雄联盟体验:LeaguePrank工具让段位展示彻底自定义

3分钟打造个性化英雄联盟体验:LeaguePrank工具让段位展示彻底自定义 【免费下载链接】LeaguePrank 项目地址: https://gitcode.com/gh_mirrors/le/LeaguePrank 你是否曾想在好友面前展示独特的游戏段位?是否希望自己的游戏生涯页面与众不同&…...

手把手教你用Python搭建IPTV直播源管理系统(DIYP影音定制版)

Python实战:构建高可用IPTV直播源管理系统(DIYP影音深度集成版) 在流媒体技术蓬勃发展的今天,个性化直播解决方案正成为技术爱好者的新宠。本文将带你从零开始,用Python打造一个功能完备的IPTV直播源管理系统&#xf…...

PCL2-CE社区版启动器:终极指南打造个性化Minecraft游戏中心

PCL2-CE社区版启动器:终极指南打造个性化Minecraft游戏中心 【免费下载链接】PCL-CE PCL2 社区版,可体验上游暂未合并的功能 项目地址: https://gitcode.com/gh_mirrors/pc/PCL-CE PCL2-CE社区版启动器是一款功能强大的开源Minecraft启动工具&…...

告别单行代码:在Python IDLE中编写完整函数的完整指南

告别单行代码:在Python IDLE中编写完整函数的完整指南 对于刚接触Python的开发者来说,IDLE是一个既熟悉又陌生的环境。熟悉是因为它随Python安装包一起提供,陌生则是因为很多人仅仅把它当作一个简单的交互式Shell,而忽略了它作为完…...

YOLOv8模型剪枝实战:如何利用BN层特性实现高效通道裁剪(附完整代码)

YOLOv8模型剪枝实战:从BN层特性到工程化部署的完整指南 在计算机视觉领域,YOLOv8凭借其卓越的实时检测性能已成为工业界的热门选择。但当我们将模型部署到资源受限的边缘设备时,模型大小和计算效率往往成为瓶颈。本文将深入探讨如何利用BN层γ…...

Onnxruntime模型量化实战:从PTQ到精度调优

1. Onnxruntime模型量化入门指南 第一次接触模型量化时,我也被各种术语搞得晕头转向。简单来说,量化就是把模型参数从32位浮点数转换为8位整数,就像把高清图片压缩成更小的文件。Onnxruntime作为业界领先的推理引擎,提供了完整的量…...

自编码器在异常检测中的实战:如何用TensorFlow识别异常数据点

自编码器在异常检测中的实战:如何用TensorFlow识别异常数据点 金融交易中的一笔异常转账、工业设备传感器突然的读数波动、医疗影像中微小的病变区域——这些隐藏在庞大数据流中的异常信号,往往预示着关键风险或机会。传统基于阈值规则的检测方法在面对高…...

MATLAB实战:16QAM调制解调完整代码解析(附误码率对比图)

MATLAB实战:16QAM调制解调完整代码解析与性能优化 在数字通信系统中,正交幅度调制(QAM)因其高频谱效率而广受青睐。16QAM作为中阶调制方案,在频谱利用率和抗噪性能之间取得了良好平衡。本文将深入解析16QAM调制解调的MATLAB实现,…...

Apache-Guacamole实战:用Docker三分钟搞定Windows11远程控制环境搭建

Apache-Guacamole实战:三分钟Docker部署Windows11远程控制环境 远程办公和跨平台协作已成为现代开发者的日常需求。想象一下这样的场景:你正在咖啡馆用MacBook调试代码,突然需要访问办公室的Windows11开发环境;或是团队需要共享一…...

Android Qcom USB Driver学习(十):Type-C充电管理与ADSP电源架构深度解析

1. Type-C充电管理在高通平台的核心架构 高通平台的Type-C充电管理采用分层设计,最上层是Generic TypeC Driver PowerSupply Framework,作为Linux内核与硬件之间的抽象层。这个框架负责统一管理充电策略、电源角色切换和状态上报。中间层通过Glink通信协…...

MogFace人脸检测模型Java后端服务实战:SpringBoot集成与高并发优化

MogFace人脸检测模型Java后端服务实战:SpringBoot集成与高并发优化 最近在做一个智能门禁系统的项目,需要用到人脸检测功能。选型的时候,MogFace模型以其高精度和不错的速度进入了我们的视线。但问题来了,怎么把这个用Python写的…...