ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

LangChain4j 在 Jakarta EE / MicroProfile 中构建 AI 聊天机器人:Open Liberty 完整实战指南

LangChain4j 在 Jakarta EE / MicroProfile 中构建 AI 聊天机器人:Open Liberty 完整实战指南 示例工程【免费下载链接】langchain4j-examples项目地址https://gitcode.com/GitHub_Trending/la/langchain4j-examples点击查看免费下载本指南以仓库中的jakartaee-microprofile-example示例应用为核心完整讲解如何在 Jakarta EE / MicroProfileOpen Liberty 运行时下用 LangChain4j 集成 Hugging Face 大语言模型构建一个集 WebSocket 聊天、REST 模型 API、配置管理与集成测试于一体的 AI 聊天机器人。读完本文你将掌握从环境准备、Liberty 开发模式启动、网页与命令行双通道调用 LLM到基于源码的架构剖析与测试验证的完整实战路径。一、示例应用概览当 Jakarta EE 遇见 LangChain4j该示例展示了 LangChain4J 在 Jakarta EE / MicroProfile 应用中的落地方式运行在Open Liberty上应用形态是一个由 LangChain4J 驱动的聊天机器人。它综合使用了以下 Java 企业级规范特性Jakarta CDI依赖注入与作用域管理Jakarta RESTful Web ServicesREST 模型 APIJakarta WebSocket浏览器端实时聊天通道MicroProfile Config外部化配置注入MicroProfile Metrics指标埋点MicroProfile OpenAPI自动生成 API 文档与调试界面底层大模型能力由 Hugging Face 提供通过 LangChain4j 的langchain4j-hugging-face集成模块接入涉及三类模型语言模型补全、聊天模型对话与嵌入模型语义相似度计算。项目完整源码位于 jakartaee-microprofile-example其工程声明依赖、插件、打包方式见 pom.xmlLiberty 服务器配置见 server.xml。二、前置条件2.1 Java 21应用以 Java 21 编译运行pom.xml中maven.compiler.source/maven.compiler.target均为21。请确保本机已安装 JDK 21 及以上的运行时。2.2 Hugging Face API Key示例通过 Hugging Face Inference API 调用模型需要访问令牌注册并登录 Hugging Face 账户进入Access Tokens设置页新建一个read角色的访问令牌readrole 即可满足推理调用与模型访问需求。该令牌在下一步环境设置中通过HUGGING_FACE_API_KEY环境变量注入并被 MicroProfile Config 的hugging.face.api.key配置项引用。三、环境准备与配置注入3.1 进入示例目录并设置环境变量首先切换到示例工程所在目录cd langchain4j-examples/jakartaee-microprofile-example然后设置两个环境变量export JAVA_HOMEyour Java 21 home path export HUGGING_FACE_API_KEYyour Hugging Face read token3.2 配置文件解析MicroProfile Config环境变量如何进入应用答案在 MicroProfile Config 配置文件 microprofile-config.propertieshugging.face.api.keyset it by env variable #chat.model.idmeta-llama/Llama-3.2-1B-Instruct chat.model.idmistralai/Mistral-Nemo-Instruct-2407 chat.model.timeout120 chat.model.max.token200 chat.model.temperature1.0 chat.memory.max.messages20 language.model.idmicrosoft/Phi-3-mini-4k-instruct各配置项的作用如下配置键默认值作用hugging.face.api.key占位文本Hugging Face 访问令牌实际值由环境变量HUGGING_FACE_API_KEY覆盖MicroProfile Config 的配置优先级体系中环境变量高于 properties 文件chat.model.idmistralai/Mistral-Nemo-Instruct-2407聊天模型 ID注释中保留了可选的meta-llama/Llama-3.2-1B-Instructchat.model.timeout120模型调用超时秒数对应Duration.ofSeconds(...)chat.model.max.token200生成的最大新 token 数maxNewTokenschat.model.temperature1.0采样温度控制回答随机性chat.memory.max.messages20聊天记忆窗口保留的最大消息条数language.model.idmicrosoft/Phi-3-mini-4k-instructREST 语言模型 API 与聊天 API 使用的模型 ID四、启动应用Liberty 开发模式使用 Maven wrapper 配合Liberty dev mode启动应用这是 Open Liberty 的迭代开发模式支持热部署与一键跑测试./mvnw liberty:dev该命令由pom.xml中的io.openliberty.tools:liberty-maven-plugin版本 3.11.3提供工程最终打包为warjakartaee-microprofile-example.war。启动后Liberty 服务器配置见 server.xml决定运行时行为featureManager platformjakartaee-10.0/platform platformmicroprofile-7.0/platform featurecdi/feature featurejsonb/feature featurempConfig/feature featurempMetrics/feature featurempOpenAPI/feature featurerestfulWS/feature featurewebsocket/feature /featureManager httpEndpoint host* httpPort9080 httpsPort9443 iddefaultHttpEndpoint/ applicationManager autoExpandtrue/ webApplication contextRoot/ locationjakartaee-microprofile-example.war/ mpMetrics authenticationfalse/ logging consoleLogLevelINFO/要点解读同时启用jakartaee-10.0与microprofile-7.0平台特性并显式声明 CDI、JSON-B、mpConfig、mpMetrics、mpOpenAPI、RESTful WS、WebSocket 子特性HTTP 端点监听9080HTTPS 为9443应用上下文根为/mpMetrics authenticationfalse关闭指标端点认证便于本地观察pom.xml中同时配置了maven-failsafe-plugin3.5.3用于运行集成测试*IT类。五、试用应用5.1 网页聊天浏览器导航到 http://localhost:9080在输入框中尝试以下示例消息What are large language models?Which are the most used models?show me the documentation前端页面通过WebSocket与后端通信输入框位于 index.html由 web.xml 指定为 welcome file页面 JSchatroom.js建立ws://localhost:9080/chat连接。5.2 聊天背后的 WebSocket CDI 实现WebSocket 服务端由 ChatService.java 实现它是一个同时标注ApplicationScoped与ServerEndpoint(/chat)的 CDI BeanApplicationScoped ServerEndpoint(value /chat, encoders { ChatMessageEncoder.class }) public class ChatService { Inject ChatAgent agent null; OnOpen public void onOpen(Session session) { ... } OnMessage Timed(name chatProcessingTime, absolute true, description Time needed chatting to the agent.) public void onMessage(String message, Session session) { String sessionId session.getId(); answer agent.chat(sessionId, message); session.getBasicRemote().sendObject(answer); } OnClose ... OnError ... }三个关键设计点Timed指标埋点onMessage方法上的Timed(name chatProcessingTime, absolute true)是 MicroProfile Metrics 注解每次聊天耗时都会被记录可通过 Liberty 的指标端点观测ServerEndpoint与 CDI 共存ApplicationScoped使 ChatService 成为单例 BeanInject ChatAgent让 WebSocket 端点直接依赖 CDI 管理的 AI 代理消息编码器ChatMessageEncoder.java 实现Encoder.TextString负责把模型原始回复加工为适合前端渲染的文本——若回复不以句号结尾则追加...并将换行符\n替换为br/。5.3 AI 代理AiServices 聊天记忆ChatAgent.java 是整个聊天能力的核心展示了 LangChain4jAiServices与聊天记忆的标准用法interface Assistant { String chat(MemoryId String sessionId, UserMessage String userMessage); } public Assistant getAssistant() { if (assistant null) { HuggingFaceChatModel model HuggingFaceChatModel.builder() .accessToken(HUGGING_FACE_API_KEY) .modelId(CHAT_MODEL_ID) .timeout(ofSeconds(TIMEOUT)) .temperature(TEMPERATURE) .maxNewTokens(MAX_NEW_TOKEN) .waitForModel(true) .build(); assistant AiServices.builder(Assistant.class) .chatModel(model) .chatMemoryProvider( sessionId - MessageWindowChatMemory.withMaxMessages(MAX_MESSAGES)) .build(); } return assistant; }值得展开的源码级细节ConfigProperty注入HUGGING_FACE_API_KEY、CHAT_MODEL_ID、TIMEOUT、MAX_NEW_TOKEN、TEMPERATURE、MAX_MESSAGES六个字段全部通过 MicroProfile Config 注入值来自第三节的 properties 文件与环境变量HuggingFaceChatModel.builder()逐项映射配置——timeout由chat.model.timeout120 秒转换而来waitForModel(true)表示调用时若模型尚未就绪则等待加载MemoryId按会话隔离记忆接口方法签名chat(MemoryId String sessionId, UserMessage String userMessage)使记忆按 WebSocket session id 区分chatMemoryProvider为每个 session 创建一个最多保留MAX_MESSAGES默认 20条的MessageWindowChatWindow滑动窗口记忆懒加载单例getAssistant()仅在首次调用时构建模型与 AiServices避免重复创建回复裁剪chat()方法中reply.lastIndexOf(message)的逻辑用于去除模型回显用户输入的前缀只保留真正的回答部分。六、通过 REST API 试用其他模型除了 WebSocket 聊天应用还通过 ModelResource.java 暴露 3 个 REST 端点JAX-RS 根路径由 RestApplication.java 中的ApplicationPath(/api)决定并在MicroProfile OpenAPI自动生成的 UIhttp://localhost:9080/openapi/ui中提供交互式调试入口。6.1 HuggingFaceLanguageModelGET /api/model/languageOpenAPI UI 操作展开GET /api/model/language→ 点击Try it out→ 在question字段输入When was Hugging Face launched?或任意问题→ 点击Executecurl 方式curl http://localhost:9080/api/model/language?questionWhen%20was%20Hugging%20Face%20launched%3F底层实现getLanguageModel()使用HuggingFaceLanguageModel.builder()构建modelId来自language.model.idmicrosoft/Phi-3-mini-4k-instructtimeout为 120 秒maxNewTokens30temperature1.0。调用model.generate(question).content()返回纯文本补全结果异常时返回My failure reason is:\n\n e.getMessage()便于排查。6.2 HuggingFaceChatModelGET /api/model/chatOpenAPI UI 操作展开GET /api/model/chat→Try it out→ 在userMessage字段输入Which are the most used Large Language Models?→Executecurl 方式curl http://localhost:9080/api/model/chat?userMessageWhich%20are%20the%20most%20used%20Large%20Language%20Models%3F | jq底层实现该端点每次请求动态构建HuggingFaceChatModelmaxNewTokens为 200手工构造消息对象并调用model.chat(...)SystemMessage systemMessage SystemMessage.from( You are very knowledgeable about Large Language Models. Be friendly. Give concise answers.); AiMessage aiMessage model.chat(systemMessage, UserMessage.from(userMessage)).aiMessage(); return List.of( System: systemMessage.text(), Me: userMessage, Agent: aiMessage.text().trim());响应为 JSON 数组依次包含系统提示、用户问题与模型回答是理解 LangChain4j 消息模型SystemMessage/UserMessage/AiMessage的直接范例。6.3 InProcessEmbeddingModelGET /api/model/similarityOpenAPI UI 操作展开GET /api/model/similarity→Try it out→text1输入I like Jakarta EE and MicroProfile.text2输入I like Python language.→Executecurl 方式curl http://localhost:9080/api/model/similarity?text1I%20like%20Jakarta%20EE%20and%20MicroProfile.text2I%20like%20Python%20language. | jq底层实现展示了 LangChain4j 嵌入模型的完整数据流嵌入模型使用SENTENCE_TRANSFORMERS_ALL_MINI_LM_L6_V2all-MiniLM-L6-v2一个体积小巧的句子级嵌入模型随langchain4j-hugging-face模块提供的常量引用timeout120 秒model.embedAll(List.of(textSegment(text1), textSegment(text2)))将两段文本编码为两个向量CosineSimilarity.between(...)计算余弦相似度RelevanceScore.fromCosineSimilarity(...)进一步换算为相关性分数响应 JSON 同时携带分词后的words、嵌入向量embedding-vector、similarity与relevance-score便于直观对比语义距离。七、运行测试由于应用以 Liberty dev mode 启动可以在启动 dev mode 的命令行会话中直接按enter/return键运行工程内置的集成测试mvn failsafe:integration-test由maven-failsafe-plugin执行。测试通过时控制台输出类似如下[INFO] ------------------------------------------------------- [INFO] T E S T S [INFO] ------------------------------------------------------- [INFO] Running it.dev.langchan4j.example.ChatServiceIT [INFO] ... [INFO] Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.439 s... [INFO] ... [INFO] Running it.dev.langchan4j.example.ModelResourceIT [INFO] Tests run: 3, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.733 s... [INFO] [INFO] Results: [INFO] [INFO] Tests run: 4, Failures: 0, Errors: 0, Skipped: 0两类测试分别对应两大功能面ChatServiceIT.java使用websocket-jakarta-client建立到ws://localhost:9080/chat的 WebSocket 连接发送When was the LangChain4j launched?后通过CountDownLatch等待响应并断言回复中包含2023验证模型能正确回答 LangChain4j 的诞生年份ModelResourceIT.java基于 RESTEasy Client 的三个用例分别验证language端点回答包含2018Hugging Face 成立年份chat端点回答包含BERTsimilarity端点返回的relevance-score落在(0.69, 0.70)、similarity落在(0.38, 0.39)区间——这是对嵌入计算精度的数值级断言说明I like Jakarta EE and MicroProfile.与I like Python language.在语义空间中的距离是稳定可预期的。依赖方面测试所需工具类由 pom.xml 的 test scope 依赖提供JUnit 5、RESTEasy Client、jakarta.json、Jetty WebSocket Client日志输出由src/test/resources/log4j.properties控制。八、退出开发模式体验完毕在运行liberty:dev的命令行会话中按CtrlC停止服务器也可以输入q再按enter/return键优雅退出 dev mode。九、小结可复用的企业级 AI 集成模板回顾整个示例它提供了一条清晰的 Jakarta EE / MicroProfile LangChain4j 集成范式配置层用 MicroProfile Configproperties 环境变量覆盖管理 API Key、模型 ID、超时、温度、token 上限等全部参数代码中零硬编码接入层HuggingFaceChatModel/HuggingFaceLanguageModel/HuggingFaceEmbeddingModel三个 builder 覆盖对话、补全、嵌入三类场景waitForModel(true)简化模型冷启动处理服务层AiServices 结合MemoryId与MessageWindowChatMemory实现按 WebSocket 会话隔离的带记忆对话暴露层Jakarta WebSocket 提供浏览器实时聊天JAX-RS MicroProfile OpenAPI 提供可交互调试的 REST APIMicroProfile Metrics 提供耗时观测验证层dev mode 一键触发集成测试用确定性断言年份、模型名、相似度区间保证端到端链路可用。对于希望在传统 Java 企业级技术栈中引入 LLM 能力的团队这个示例无论是作为学习入口还是作为新项目脚手架都具备直接的参考价值。赞分享示例工程【免费下载链接】langchain4j-examples项目地址https://gitcode.com/GitHub_Trending/la/langchain4j-examples点击查看免费下载相关推荐stable-diffusion.cpp × Chroma1-Radiance从零跑通 Radiance 推理的完整链路stable diffusion.cpp × Chroma1 Radiance从零跑通 Radiance 推理的完整链路 Chroma1 Radiance 是人工智能大模型本地部署推理引擎媒体生成基于Next-Forge构建AI聊天机器人实战指南基于Next Forge构建AI聊天机器人实战指南 前言 在现代Web开发中集成AI功能已成为提升用户体验的重要手段。本文将详细介绍如何使用next forg前端后端示例工程CLI快速搭建AI聊天机器人Python FastAPI完整指南快速搭建AI聊天机器人Python FastAPI完整指南 想要快速搭建一个功能强大的AI聊天机器人吗本文将通过模块化部署方式使用Python F后端AI 应用大模型RAG上一篇Faster Whisper终极指南高效语音识别与AI转录技术深度解析下一篇500 AI Agent 开源项目库三步定位行业案例五分钟跑通 20 个源码创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表