Langchain4j实现java+ai,内含多模态、RAG、MCP等知识讲解
今天要做的是一个ai小助手的项目如果简历里面有一个ai类的项目绝对会让面试官眼前一亮本次开发的环境就是一个后端springboot的项目直接创建项目即可JDK推荐21/17都可以不要低于17我们引入依赖SpringWeb和lombok这俩项目创建好之后我们要先干一些事情比如配置yml文件1ChatModel我们引入第一个知识点chatmodel这个是最基础的概念负责和ai大模型交互。本次学习我们使用阿里的qwen大模型因为成本比较低☺️。我们先引入依赖dependency groupIddev.langchain4j/groupId artifactIdlangchain4j-community-dashscope-spring-boot-starter/artifactId version1.1.0-beta7/version /dependency我们这里还需要去阿里云百炼平台获取到apikey和ModelName写入到配置里面langchain4j: community: dashscope: chat-model: api-key: 你自己的key model-name: qwen-maxpackage com.example.aicodeheapers.ai; import dev.langchain4j.data.message.AiMessage; import dev.langchain4j.data.message.SystemMessage; import dev.langchain4j.data.message.UserMessage; import dev.langchain4j.model.chat.ChatModel; import dev.langchain4j.model.chat.response.ChatResponse; import jakarta.annotation.Resource; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; Service Slf4j public class AiCodeHelper { Resource private ChatModel qwenChatModel; //简单对话 public String chat(String message){ UserMessage userMessage UserMessage.from(message); ChatResponse chatResponse qwenChatModel.chat(userMessage); AiMessage aiMessage chatResponse.aiMessage(); log.info(AI 输出aiMessage.toString()); return aiMessage.text(); } }我们现在简单的引入一个ChatModel模型然后创建一个UserMessage对象然后把传过来的消息给到UserMessage然后调用qwenChatModel.chat方法就可以得到返回值我们直接创建AiMessage对象将返回值打印出来这样就完成了与ai的交流恭喜你现在已经和ai大模型完成了对话了2多模态多模态是指能够同时处理、理解和生成多种不同类型的数据的能力比如文本、图像、音频、视频、PDF等等。//自定义用户消息 public String chatWithMessage(UserMessage userMessage){ ChatResponse chatResponse qwenChatModel.chat(userMessage); AiMessage aiMessage chatResponse.aiMessage(); log.info(AI 输出aiMessage.toString()); return aiMessage.text(); }这样传过来的数据是用户方自己定义的传过来什么都是用户说了算有一个bug就是现在qwen大模型不支持多模态....所以...我们就不继续演示了有条件的朋友可以换一个模型哈哈哈哈3系统提示词系统提示词是指设置AI模型行为规则和角色定位的隐藏指令用户通常不能直接看到。系统Prompt相当于给AI设定人格和能力边界也就是告诉AI你是谁你能做什么private static final String SYSTEM_STRING 你是一位资深的编程与面试辅导专家。你的核心使命是帮助用户在技术面试和编程能力提升方面取得成功。在回答任何问题时你必须始终围绕以下四个核心方向展开确保内容专业、实用、有深度 1. 编程语言与工程实践 - 深入讲解主流语言Java、Python、Go、JavaScript 等的核心语法、高级特性、代码规范与最佳实践。 - 提供代码优化、重构、调试技巧及常见坑点分析。 - 结合实际项目场景给出可落地的工程建议。 2. 算法与数据结构 - 系统梳理常用数据结构数组、链表、树、图、哈希表等和算法排序、搜索、动态规划、回溯等的原理与应用。 - 针对 LeetCode 或面试真题提供清晰的解题思路、复杂度分析及多语言代码示例。 - 引导用户建立算法思维提升问题拆解与逻辑推导能力。 3. 系统设计与架构 - 讲解高可用、高并发、分布式系统的设计原则与模式如微服务、缓存、消息队列、负载均衡等。 - 通过真实案例如设计一个短链接服务、秒杀系统展示从需求分析到架构落地的全过程。 - 探讨技术选型、数据库设计、接口定义及性能优化策略。 4. 面试技巧与职业发展 - 分享简历撰写技巧、项目亮点提炼方法帮助用户打造有竞争力的简历。 - 模拟面试场景提供行为面试BQ回答框架、技术面试沟通技巧及薪资谈判策略。 - 分析不同公司大厂、独角兽、外企的面试流程与考察重点给出针对性准备建议。 当用户提问时请根据问题性质自动关联到上述一个或多个方向进行解答。回答要结构清晰、循序渐进并鼓励用户动手实践。如果用户问题超出这四个方向可以礼貌地引导对方回归核心领域或简要提示后继续聚焦。 ; Resource private ChatModel qwenChatModel; //简单对话 public String chat(String message){ SystemMessage systemMessage SystemMessage.systemMessage(SYSTEM_STRING); UserMessage userMessage UserMessage.from(message); ChatResponse chatResponse qwenChatModel.chat(systemMessage,userMessage); AiMessage aiMessage chatResponse.aiMessage(); log.info(AI 输出aiMessage.toString()); return aiMessage.text(); }我们定义了一个系统消息注意新写法我们会给系统设置一个前置的提示词这样的系统预设就会生效了就是可以让ai的回复更精确了4AI Service在学习更多特性前我们要了解Langchain4j最重要的开发模式-AI Service。提供了很多高层抽象的、用起来更方便的API把AI应用当做服务来开发。我们先引入依赖dependency groupIddev.langchain4j/groupId artifactIdlangchain4j/artifactId version1.1.0/version /dependency用了AI Service提供的api我们系统预设就不需要这么写了我们先创建一个接口然后上面加上注解SystemMessage后面加上你的txt文件文件里是你的提示词内容这样就可以实现更快的写好系统提示词package com.example.aicodeheapers.ai; import dev.langchain4j.service.SystemMessage; public interface AiCodeHelperService { SystemMessage(fromResource system-prompt.txt) String chat(String userMessage); }我们只有接口没有实现类肯定是不可以的这里有点设计模式的概念其实不懂也无所谓就知道什么是工厂工厂就是专门生产服务的我们的AICodeHelperServiceFactory就是专门生产ai变成助手服务的package com.example.aicodeheapers.ai; import dev.langchain4j.model.chat.ChatModel; import dev.langchain4j.service.AiServices; import jakarta.annotation.Resource; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; Configuration public class AiCodeHelperServiceFactory { Resource private ChatModel qwenCharModel; Bean public AiCodeHelperService aiCodeHelperService(){ return AiServices.create(AiCodeHelperService.class,qwenCharModel); } }我们可以看到这个方法直接就可以返回一个Service所以这个方法到底做了什么事情呢我们点进源码看一下代码有一行这个我怎么从运行代码的class中获取到方法信息呢这不就是反射吗其实这一步就是运用到了反射和动态代理调用AiService.create方法就可以创建出AiService的实现累了背后的原理就是利用的java的反射机制创建了一个实现接口的代理对象代理对象负责输入和输出转换比如把String类型的用户消息参数转换为UserMessage类型病调用ChatModel再讲Ai返回的AiMessage类型转换为String类型作为返回值但我们不用关心那么多直接写接口和注解开发就好了Method method : context.aiServiceClass.getMethods()package com.example.aicodeheapers.ai; import dev.langchain4j.service.Result; import jakarta.annotation.Resource; import org.junit.jupiter.api.Test; import org.springframework.boot.test.context.SpringBootTest; import static org.junit.jupiter.api.Assertions.*; SpringBootTest class AiCodeHelperServiceTest { Resource private AiCodeHelperService aiCodeHelperService; Test void chat() { String chat aiCodeHelperService.chat(你好我是程序员小刘); System.out.println(chat); } }5会话记忆ChatMemory会话记忆是指让AI能够记住用户之前的对话内容并保持上下文连贯性这是实现AI英勇的核心特性。怎么实现对话记忆最传统的方式是自己维护消息立碑哦啊不仅要手动添加消息消息多了还要考虑淘汰、不同用户的消息还要隔离想想都头疼package com.example.aicodeheapers.ai; import dev.langchain4j.memory.ChatMemory; import dev.langchain4j.memory.chat.MessageWindowChatMemory; import dev.langchain4j.model.chat.ChatModel; import dev.langchain4j.model.chat.StreamingChatModel; import dev.langchain4j.rag.content.retriever.ContentRetriever; import dev.langchain4j.service.AiServices; import dev.langchain4j.service.spring.AiService; import jakarta.annotation.Resource; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; Configuration public class AiCodeHelperServiceFactory { Bean public AiCodeHelperService aiCodeHelperService(){ //会话记忆 ChatMemory chatMemory MessageWindowChatMemory.withMaxMessages(10); //构造Ai Service AiCodeHelperService aiCodeHelperService AiServices.builder(AiCodeHelperService.class) .chatMemoryProvider(memoryId-MessageWindowChatMemory.withMaxMessages(10))//每个会话独立存储 .chatMemory(chatMemory)//会话记忆 .build(); return aiCodeHelperService; } }6结构化输出结构化输出是指将大模型返回的文本输出转换为结构化的数据格式比如一段JSON、一个对象、或者是复杂的对象列表。有三种实现方式利用大模型的JSON schema利用promptJSON schema利用prompt重点了解prompt模式也就是在原本的用户提示词下拼接一段内容来制定大模型强制输出包含特定字段的JSON文本7检索增强生产RAGRAG是一种结合信息检索技术和AI内容生成的混合架构可以解决大模型的知识时效性限制和幻觉问题。简单来说RAG就想给AI配了一个”小抄本“让AI回答问题前先查一查特定的知识库来获取知识确保回答是基于真实资料而不是凭空想象。很多企业也基于RAG搭建了自己的智能客服可以用自己积累的领域知识回复用户。RAG完整工作流程第一步准备原始文档我们把原始文档分割成若干个小的片段并且去过滤掉一些无意义的内容再把这个片段喂给我们的向量转换模型也就是Embedding模型Embedding模型为了让我们的ai更好的检索会把知识转换成不同维度的向量数组来表示如果用户输入的知识和你的数组越接近那么这两个向量的距离就会越少。这样的话我们想要知道用户的问题和哪个向量有关我们就只需要从向量存储中查一下就好了我们把这些向量存到向量数据库中用户提问后我们也把用户的问题用同样维度的Embedding模型换成向量把用户问题的向量和向量数据库中存储的向量进行一个匹配相似度检索检索出和用户发送消息最相关的文档再把这些文档进行一个排序通过Rank模型可以对所有的文档和问题相关度进行一个打分。把分数高的文档和原始的用户问题拼在一起得到一个新的提示词最后在输入给ai让ai回答再代码里面我们放入两个docx文件里面放入了一些求职指南和常见面试题Langchain4j提供了3种rag的实现方式极简版-标准版-进阶版极简版没什么意思我们最主要学习的就是标准版下面来试试标准版RAG实现为了更好的效果我们需要加载文档并按需切割文档补充文件名信息自定义Embedding模型自定义内容检索器我们先加入配置angchain4j: community: dashscope: chat-model: api-key: model-name: qwen-max embedding-model: model-name: text-embedding-v4 api-key:我们看一下rag的代码package com.example.aicodeheapers.ai.rag; import dev.langchain4j.data.document.Document; import dev.langchain4j.data.document.loader.FileSystemDocumentLoader; import dev.langchain4j.data.document.splitter.DocumentByParagraphSplitter; import dev.langchain4j.data.segment.TextSegment; import dev.langchain4j.model.embedding.EmbeddingModel; import dev.langchain4j.rag.content.retriever.ContentRetriever; import dev.langchain4j.rag.content.retriever.EmbeddingStoreContentRetriever; import dev.langchain4j.store.embedding.EmbeddingStore; import dev.langchain4j.store.embedding.EmbeddingStoreIngestor; import jakarta.annotation.Resource; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import java.util.List; /** * 加载rag */ Configuration public class RagConfig { Resource private EmbeddingModel qwenEmbeddingModel; Resource private EmbeddingStoreTextSegment textSegmentEmbeddingStore; Bean public ContentRetriever contentRetriever(){ //Rag //1.加载文档 ListDocument documents FileSystemDocumentLoader.loadDocuments(src/main/resources/docs); //2.文档切割每一个文档进行切割每一段进行分割每段最大1000个字符每次最多重叠200个字符 DocumentByParagraphSplitter documentByParagraphSplitter new DocumentByParagraphSplitter(1000, 200); //3.自定义文档加载器把文档转换成向量保存到向量数据库中 EmbeddingStoreIngestor ingestor EmbeddingStoreIngestor.builder() .documentSplitter(documentByParagraphSplitter) //为了提高文档质量我们为每一个切割后的文档碎片添加一个文档名称 .textSegmentTransformer(textSegment - textSegment.from(textSegment.metadata().getString(file_name) \n textSegment.text(), textSegment.metadata())) //适用向量模型 .embeddingModel(qwenEmbeddingModel) .embeddingStore(textSegmentEmbeddingStore) .build(); //加载文档 ingestor.ingest(documents); //自定义内容加载器 EmbeddingStoreContentRetriever contentRetriever EmbeddingStoreContentRetriever.builder() .embeddingStore(textSegmentEmbeddingStore) .embeddingModel(qwenEmbeddingModel) .maxResults(5)//最多返回结果数 .minScore(0.75) //过滤分数小于0.75 的结果 .build(); return contentRetriever; } }8工具条用-Tools工具条用可以理解为让Ai大模型借用外部工具来完成他自己做不到的事情。跟人类一样如果只凭手脚完成不了工作那么就可以利用工具箱完成。工具可以使任何东西比如网页搜索、对外部API的调用、访问外部数据、或执行特定的代码等需要注意的是工具调用的 本质并不是AI服务器自己调用这些工具、也不是把工具的代码发送给AI服务器让他执行他只能提出要求表示我需要执行xx工具完成这些任务。而真正执行工具的使我们自己的程序执行后再把结果告诉AI让它继续工作。9模型上下文协议-MCPMCP是一种开放标准目的是增强AI与外部系统的交互能力。MCP为AI提供了与外部工具、资源和服务交互的标准化方式让Ai能够访问最新数据、执行复杂操作并与现有系统集成。可以将MCP想象成Ai应用的USB接口。就想USB为设备连接各种外设和配件提供了标准化方式一样MCP可以为AI模型连接不用的数据源和工具提供了标准化方法。简单来说通过MCP协议AI应用可以轻松接入别人提供的服务来实现更多功能比如查询地理位置、操作数据库、部署网站、甚至是支付10护轨-Guardrail可以理解成拦截器分为输入护轨和输出护轨可以再请求AI前和请求AI后执行一些额外的操作比如在AI前进行敏感词检测11AI服务化至此AI的能力基本开发完成但是目前只支持本地运行需要编写一个接口提供给前端调用让AI能够成为一个服务。我们平时开发的大多数接口都是同步接口也就是等后端处理完再返回。但是对于 Al 应用特别是响应时间较长的对话类应用可能会让用户失去耐心等待因此推荐使用 SSEServer-Sent Events技术实现实时流式输出类似打字机效果大幅提升用户体验。12SSE 流式接口开发LangChain 提供了 2种方式来支持流式响应注意流式响应不支持结构化输出。一种方法是 TokenStream先让 AI 对话方法返回 TokenStream然后创建 AI Service 时指定流式对话模型StreamingChatModel 另一种是使用Flux替代TokenStreamControllerpackage com.example.aicodeheapers.Controller; import com.example.aicodeheapers.ai.AiCodeHelperService; import jakarta.annotation.Resource; import org.springframework.http.codec.ServerSentEvent; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; import reactor.core.publisher.Flux; RestController public class AiController { Resource private AiCodeHelperService aiCodeHelperService; GetMapping(chat) public FluxServerSentEventString chat(int memoryId,String message){ return aiCodeHelperService.chatStream(memoryId,message) .map(chunk - ServerSentEvent.Stringbuilder().data(chunk).build()); } }Servicepackage com.example.aicodeheapers.ai; import dev.langchain4j.service.MemoryId; import dev.langchain4j.service.Result; import dev.langchain4j.service.SystemMessage; import dev.langchain4j.service.UserMessage; import dev.langchain4j.service.spring.AiService; import org.springframework.stereotype.Service; import reactor.core.publisher.Flux; import java.util.List; //AiService public interface AiCodeHelperService { SystemMessage(fromResource system-prompt.txt) String chat(String userMessage); SystemMessage(fromResource system-prompt.txt) Report chatForReport(String userMessage); record Report(String name, ListString suggestionList){}; //RAG返回封装后的结果 SystemMessage(fromResource system-prompt.txt) ResultString chatWithRag(String userMessage); //SSE流式输出之前做大屏兼职项目的时候见过这种后端返回形式是一点一点返回的形式 FluxString chatStream(MemoryId int memoryId,UserMessage String message); }

相关新闻

电子世界的奇妙冒险:17-1 调试与工程专题:显示器人机交互“看得见摸得着”全家桶!当你的屏幕黑屏、触摸失灵时的终极救援指南

电子世界的奇妙冒险:17-1 调试与工程专题:显示器人机交互“看得见摸得着”全家桶!当你的屏幕黑屏、触摸失灵时的终极救援指南

👉17-1 调试与工程专题:显示器&人机交互“看得见摸得着”全家桶!当你的屏幕黑屏、触摸失灵时的终极救援指南 咱们的电子江湖系列终于杀到最“直观”的战场——显示器(Display)和人机交互(HCI)!这俩家伙就是嵌入式系统的“脸面”和“手感”:显示器负责“秀”信息…

2026/7/2 23:00:28 阅读更多 →
Flutter 三方库 mediapipe_core 的鸿蒙化适配指南 - 实现高性能的端侧 AI 推理库集成、支持多维视觉任务与手势/表情识别实战

Flutter 三方库 mediapipe_core 的鸿蒙化适配指南 - 实现高性能的端侧 AI 推理库集成、支持多维视觉任务与手势/表情识别实战

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.csdn.net Flutter 三方库 mediapipe_core 的鸿蒙化适配指南 - 实现高性能的端侧 AI 推理库集成、支持多维视觉任务与手势/表情识别实战 前言 在进行 Flutter for OpenHarmony 的智能化应用开发时&a…

2026/7/3 23:02:52 阅读更多 →
Flutter 三方库 import_ozempic 的鸿蒙化适配指南 - 实现 Dart 代码中缺失库的自动化智能修复、支持端侧工程依赖清理与构建环境预治理

Flutter 三方库 import_ozempic 的鸿蒙化适配指南 - 实现 Dart 代码中缺失库的自动化智能修复、支持端侧工程依赖清理与构建环境预治理

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.csdn.net Flutter 三方库 import_ozempic 的鸿蒙化适配指南 - 实现 Dart 代码中缺失库的自动化智能修复、支持端侧工程依赖清理与构建环境预治理 前言 在进行 Flutter for OpenHarmony 的大型模块化…

2026/5/17 11:58:13 阅读更多 →

最新新闻

大模型数据准备实战:高信噪比语料构建七步法

大模型数据准备实战:高信噪比语料构建七步法

1. 为什么说“数据准备”才是训练定制大模型时最耗神、也最值钱的环节你有没有过这种体验:花两周时间调参、换架构、折腾分布式训练,最后发现模型在业务场景里答非所问,逻辑混乱,甚至编造事实?我带过三支不同行业的LLM…

2026/7/4 18:13:16 阅读更多 →
遗传算法优化大模型参数:自动化调参实战

遗传算法优化大模型参数:自动化调参实战

1. 项目概述:当遗传算法遇上大模型去年在优化一个客服对话系统时,我花了整整两周手工调整prompt模板和模型参数。直到某天深夜调试时突然想到:为什么不让算法自己寻找最优解?这就是GA(遗传算法)大模型组合的…

2026/7/4 18:11:15 阅读更多 →
机器学习新手必学的5大核心领域进阶地图

机器学习新手必学的5大核心领域进阶地图

1. 这不是一份“排行榜”,而是一张新手进阶地图:为什么初学者必须先搞懂这5个机器学习领域你点开这篇博客,大概率正站在机器学习的入口处——手头可能刚装好Python,跑通了第一个print("Hello, ML!"),但面对“…

2026/7/4 18:11:15 阅读更多 →
AI十年演进路径:从边缘智能到可信AI的工程化落地

AI十年演进路径:从边缘智能到可信AI的工程化落地

1. 这不是预言,而是技术演进路径的推演:我们真正该关注的AI十年图景你点开这篇文章,大概率不是为了听一句“AI会改变世界”——这句话从2012年AlexNet横空出世那天起,就被重复了上万遍。我做AI工程落地和系统架构设计整整11年&…

2026/7/4 18:07:14 阅读更多 →
Spring Boot + MyBatis + Vue 全栈毕设实战:从零到部署的完整项目开发指南

Spring Boot + MyBatis + Vue 全栈毕设实战:从零到部署的完整项目开发指南

🚀 30款热门AI模型一站整合,DeepSeek/GLM/Claude 随心用,限时 5 折。 👉 点击领海量免费额度 计算机专业的学生在完成毕业设计或课程设计时,常常面临一个核心矛盾:既要理解项目背后的技术原理&#xff0…

2026/7/4 18:07:14 阅读更多 →
从零实现大语言模型:Happy-LLM开源教程带你手写LLaMA2

从零实现大语言模型:Happy-LLM开源教程带你手写LLaMA2

🚀 30款热门AI模型一站整合,DeepSeek/GLM/Claude 随心用,限时 5 折。 👉 点击领海量免费额度 最近在社区里看到很多开发者,尤其是刚接触AI大模型的朋友,普遍反映一个痛点:大模型相关的资料要…

2026/7/4 18:05:14 阅读更多 →

日新闻

Memcached 1.6.43 发布:关键安全修复版本,多项问题得到解决

Memcached 1.6.43 发布:关键安全修复版本,多项问题得到解决

Memcached 1.6.43 正式发布,这是一个关键的安全修复版本,修复了多个方面的问题,还对部分功能进行了优化。 安全修复亮点 此次发布在安全修复上表现突出。binprot 避免了项目引用计数溢出,mcmc 因安全问题提升了上游版本号&#xf…

2026/7/4 0:04:29 阅读更多 →
终极指南:使用HMCL启动器跨平台畅玩Minecraft的完整解决方案

终极指南:使用HMCL启动器跨平台畅玩Minecraft的完整解决方案

终极指南:使用HMCL启动器跨平台畅玩Minecraft的完整解决方案 【免费下载链接】HMCL A Minecraft Launcher which is multi-functional, cross-platform and popular 项目地址: https://gitcode.com/gh_mirrors/hm/HMCL HMCL(Hello Minecraft! Lau…

2026/7/4 0:06:29 阅读更多 →
KMX63与PIC18F66K40在嵌入式HMI中的硬件协同与低功耗设计

KMX63与PIC18F66K40在嵌入式HMI中的硬件协同与低功耗设计

1. KMX63与PIC18F66K40的硬件协同架构解析KMX63作为一款三轴加速度计和磁力计组合传感器,与PIC18F66K40微控制器的搭配堪称嵌入式HMI开发的黄金组合。这套硬件组合的核心优势在于KMX63提供的高精度运动感知能力与PIC18F66K40强大的信号处理能力形成了完美互补。KMX6…

2026/7/4 0:06:29 阅读更多 →

周新闻

月新闻