建 AI 聊天機(jī)器人:Open Liberty 完整實(shí)戰(zhàn)指南)
示例工程【免費(fèi)下載鏈接】langchain4j-examples項(xiàng)目地址https://gitcode.com/GitHub_Trending/la/langchain4j-examples點(diǎn)擊查看免費(fèi)下載本指南以倉(cāng)庫(kù)中的jakartaee-microprofile-example示例應(yīng)用為核心完整講解如何在 Jakarta EE / MicroProfileOpen Liberty 運(yùn)行時(shí)下用 LangChain4j 集成 Hugging Face 大語(yǔ)言模型構(gòu)建一個(gè)集 WebSocket 聊天、REST 模型 API、配置管理與集成測(cè)試于一體的 AI 聊天機(jī)器人。讀完本文你將掌握從環(huán)境準(zhǔn)備、Liberty 開發(fā)模式啟動(dòng)、網(wǎng)頁(yè)與命令行雙通道調(diào)用 LLM到基于源碼的架構(gòu)剖析與測(cè)試驗(yàn)證的完整實(shí)戰(zhàn)路徑。一、示例應(yīng)用概覽當(dāng) Jakarta EE 遇見 LangChain4j該示例展示了 LangChain4J 在 Jakarta EE / MicroProfile 應(yīng)用中的落地方式運(yùn)行在Open Liberty上應(yīng)用形態(tài)是一個(gè)由 LangChain4J 驅(qū)動(dòng)的聊天機(jī)器人。它綜合使用了以下 Java 企業(yè)級(jí)規(guī)范特性Jakarta CDI依賴注入與作用域管理Jakarta RESTful Web ServicesREST 模型 APIJakarta WebSocket瀏覽器端實(shí)時(shí)聊天通道MicroProfile Config外部化配置注入MicroProfile Metrics指標(biāo)埋點(diǎn)MicroProfile OpenAPI自動(dòng)生成 API 文檔與調(diào)試界面底層大模型能力由 Hugging Face 提供通過(guò) LangChain4j 的langchain4j-hugging-face集成模塊接入涉及三類模型語(yǔ)言模型補(bǔ)全、聊天模型對(duì)話與嵌入模型語(yǔ)義相似度計(jì)算。項(xiàng)目完整源碼位于 jakartaee-microprofile-example其工程聲明依賴、插件、打包方式見 pom.xmlLiberty 服務(wù)器配置見 server.xml。二、前置條件2.1 Java 21應(yīng)用以 Java 21 編譯運(yùn)行pom.xml中maven.compiler.source/maven.compiler.target均為21。請(qǐng)確保本機(jī)已安裝 JDK 21 及以上的運(yùn)行時(shí)。2.2 Hugging Face API Key示例通過(guò) Hugging Face Inference API 調(diào)用模型需要訪問(wèn)令牌注冊(cè)并登錄 Hugging Face 賬戶進(jìn)入Access Tokens設(shè)置頁(yè)新建一個(gè)read角色的訪問(wèn)令牌readrole 即可滿足推理調(diào)用與模型訪問(wèn)需求。該令牌在下一步環(huán)境設(shè)置中通過(guò)HUGGING_FACE_API_KEY環(huán)境變量注入并被 MicroProfile Config 的hugging.face.api.key配置項(xiàng)引用。三、環(huán)境準(zhǔn)備與配置注入3.1 進(jìn)入示例目錄并設(shè)置環(huán)境變量首先切換到示例工程所在目錄cd langchain4j-examples/jakartaee-microprofile-example然后設(shè)置兩個(gè)環(huán)境變量export JAVA_HOMEyour Java 21 home path export HUGGING_FACE_API_KEYyour Hugging Face read token3.2 配置文件解析MicroProfile Config環(huán)境變量如何進(jìn)入應(yīng)用答案在 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各配置項(xiàng)的作用如下配置鍵默認(rèn)值作用hugging.face.api.key占位文本Hugging Face 訪問(wèn)令牌實(shí)際值由環(huán)境變量HUGGING_FACE_API_KEY覆蓋MicroProfile Config 的配置優(yōu)先級(jí)體系中環(huán)境變量高于 properties 文件chat.model.idmistralai/Mistral-Nemo-Instruct-2407聊天模型 ID注釋中保留了可選的meta-llama/Llama-3.2-1B-Instructchat.model.timeout120模型調(diào)用超時(shí)秒數(shù)對(duì)應(yīng)Duration.ofSeconds(...)chat.model.max.token200生成的最大新 token 數(shù)maxNewTokenschat.model.temperature1.0采樣溫度控制回答隨機(jī)性chat.memory.max.messages20聊天記憶窗口保留的最大消息條數(shù)language.model.idmicrosoft/Phi-3-mini-4k-instructREST 語(yǔ)言模型 API 與聊天 API 使用的模型 ID四、啟動(dòng)應(yīng)用Liberty 開發(fā)模式使用 Maven wrapper 配合Liberty dev mode啟動(dòng)應(yīng)用這是 Open Liberty 的迭代開發(fā)模式支持熱部署與一鍵跑測(cè)試./mvnw liberty:dev該命令由pom.xml中的io.openliberty.tools:liberty-maven-plugin版本 3.11.3提供工程最終打包為warjakartaee-microprofile-example.war。啟動(dòng)后Liberty 服務(wù)器配置見 server.xml決定運(yùn)行時(shí)行為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/要點(diǎn)解讀同時(shí)啟用jakartaee-10.0與microprofile-7.0平臺(tái)特性并顯式聲明 CDI、JSON-B、mpConfig、mpMetrics、mpOpenAPI、RESTful WS、WebSocket 子特性HTTP 端點(diǎn)監(jiān)聽9080HTTPS 為9443應(yīng)用上下文根為/mpMetrics authenticationfalse關(guān)閉指標(biāo)端點(diǎn)認(rèn)證便于本地觀察pom.xml中同時(shí)配置了maven-failsafe-plugin3.5.3用于運(yùn)行集成測(cè)試*IT類。五、試用應(yīng)用5.1 網(wǎng)頁(yè)聊天瀏覽器導(dǎo)航到 http://localhost:9080在輸入框中嘗試以下示例消息What are large language models?Which are the most used models?show me the documentation前端頁(yè)面通過(guò)WebSocket與后端通信輸入框位于 index.html由 web.xml 指定為 welcome file頁(yè)面 JSchatroom.js建立ws://localhost:9080/chat連接。5.2 聊天背后的 WebSocket CDI 實(shí)現(xiàn)WebSocket 服務(wù)端由 ChatService.java 實(shí)現(xiàn)它是一個(gè)同時(shí)標(biāo)注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 ... }三個(gè)關(guān)鍵設(shè)計(jì)點(diǎn)Timed指標(biāo)埋點(diǎn)onMessage方法上的Timed(name chatProcessingTime, absolute true)是 MicroProfile Metrics 注解每次聊天耗時(shí)都會(huì)被記錄可通過(guò) Liberty 的指標(biāo)端點(diǎn)觀測(cè)ServerEndpoint與 CDI 共存ApplicationScoped使 ChatService 成為單例 BeanInject ChatAgent讓 WebSocket 端點(diǎn)直接依賴 CDI 管理的 AI 代理消息編碼器ChatMessageEncoder.java 實(shí)現(xiàn)Encoder.TextString負(fù)責(zé)把模型原始回復(fù)加工為適合前端渲染的文本——若回復(fù)不以句號(hào)結(jié)尾則追加...并將換行符\n替換為br/。5.3 AI 代理AiServices 聊天記憶ChatAgent.java 是整個(gè)聊天能力的核心展示了 LangChain4jAiServices與聊天記憶的標(biāo)準(zhǔn)用法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; }值得展開的源碼級(jí)細(xì)節(jié)ConfigProperty注入HUGGING_FACE_API_KEY、CHAT_MODEL_ID、TIMEOUT、MAX_NEW_TOKEN、TEMPERATURE、MAX_MESSAGES六個(gè)字段全部通過(guò) MicroProfile Config 注入值來(lái)自第三節(jié)的 properties 文件與環(huán)境變量HuggingFaceChatModel.builder()逐項(xiàng)映射配置——timeout由chat.model.timeout120 秒轉(zhuǎn)換而來(lái)waitForModel(true)表示調(diào)用時(shí)若模型尚未就緒則等待加載MemoryId按會(huì)話隔離記憶接口方法簽名chat(MemoryId String sessionId, UserMessage String userMessage)使記憶按 WebSocket session id 區(qū)分chatMemoryProvider為每個(gè) session 創(chuàng)建一個(gè)最多保留MAX_MESSAGES默認(rèn) 20條的MessageWindowChatWindow滑動(dòng)窗口記憶懶加載單例getAssistant()僅在首次調(diào)用時(shí)構(gòu)建模型與 AiServices避免重復(fù)創(chuàng)建回復(fù)裁剪chat()方法中reply.lastIndexOf(message)的邏輯用于去除模型回顯用戶輸入的前綴只保留真正的回答部分。六、通過(guò) REST API 試用其他模型除了 WebSocket 聊天應(yīng)用還通過(guò) ModelResource.java 暴露 3 個(gè) REST 端點(diǎn)JAX-RS 根路徑由 RestApplication.java 中的ApplicationPath(/api)決定并在MicroProfile OpenAPI自動(dòng)生成的 UIhttp://localhost:9080/openapi/ui中提供交互式調(diào)試入口。6.1 HuggingFaceLanguageModelGET /api/model/languageOpenAPI UI 操作展開GET /api/model/language→ 點(diǎn)擊Try it out→ 在question字段輸入When was Hugging Face launched?或任意問(wèn)題→ 點(diǎn)擊Executecurl 方式curl http://localhost:9080/api/model/language?questionWhen%20was%20Hugging%20Face%20launched%3F底層實(shí)現(xiàn)getLanguageModel()使用HuggingFaceLanguageModel.builder()構(gòu)建modelId來(lái)自language.model.idmicrosoft/Phi-3-mini-4k-instructtimeout為 120 秒maxNewTokens30temperature1.0。調(diào)用model.generate(question).content()返回純文本補(bǔ)全結(jié)果異常時(shí)返回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底層實(shí)現(xiàn)該端點(diǎn)每次請(qǐng)求動(dòng)態(tài)構(gòu)建HuggingFaceChatModelmaxNewTokens為 200手工構(gòu)造消息對(duì)象并調(diào)用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());響應(yīng)為 JSON 數(shù)組依次包含系統(tǒng)提示、用戶問(wèn)題與模型回答是理解 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底層實(shí)現(xiàn)展示了 LangChain4j 嵌入模型的完整數(shù)據(jù)流嵌入模型使用SENTENCE_TRANSFORMERS_ALL_MINI_LM_L6_V2all-MiniLM-L6-v2一個(gè)體積小巧的句子級(jí)嵌入模型隨langchain4j-hugging-face模塊提供的常量引用timeout120 秒model.embedAll(List.of(textSegment(text1), textSegment(text2)))將兩段文本編碼為兩個(gè)向量CosineSimilarity.between(...)計(jì)算余弦相似度RelevanceScore.fromCosineSimilarity(...)進(jìn)一步換算為相關(guān)性分?jǐn)?shù)響應(yīng) JSON 同時(shí)攜帶分詞后的words、嵌入向量embedding-vector、similarity與relevance-score便于直觀對(duì)比語(yǔ)義距離。七、運(yùn)行測(cè)試由于應(yīng)用以 Liberty dev mode 啟動(dòng)可以在啟動(dòng) dev mode 的命令行會(huì)話中直接按enter/return鍵運(yùn)行工程內(nèi)置的集成測(cè)試mvn failsafe:integration-test由maven-failsafe-plugin執(zhí)行。測(cè)試通過(guò)時(shí)控制臺(tái)輸出類似如下[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兩類測(cè)試分別對(duì)應(yīng)兩大功能面ChatServiceIT.java使用websocket-jakarta-client建立到ws://localhost:9080/chat的 WebSocket 連接發(fā)送When was the LangChain4j launched?后通過(guò)CountDownLatch等待響應(yīng)并斷言回復(fù)中包含2023驗(yàn)證模型能正確回答 LangChain4j 的誕生年份ModelResourceIT.java基于 RESTEasy Client 的三個(gè)用例分別驗(yàn)證language端點(diǎn)回答包含2018Hugging Face 成立年份chat端點(diǎn)回答包含BERTsimilarity端點(diǎn)返回的relevance-score落在(0.69, 0.70)、similarity落在(0.38, 0.39)區(qū)間——這是對(duì)嵌入計(jì)算精度的數(shù)值級(jí)斷言說(shuō)明I like Jakarta EE and MicroProfile.與I like Python language.在語(yǔ)義空間中的距離是穩(wěn)定可預(yù)期的。依賴方面測(cè)試所需工具類由 pom.xml 的 test scope 依賴提供JUnit 5、RESTEasy Client、jakarta.json、Jetty WebSocket Client日志輸出由src/test/resources/log4j.properties控制。八、退出開發(fā)模式體驗(yàn)完畢在運(yùn)行l(wèi)iberty:dev的命令行會(huì)話中按CtrlC停止服務(wù)器也可以輸入q再按enter/return鍵優(yōu)雅退出 dev mode。九、小結(jié)可復(fù)用的企業(yè)級(jí) AI 集成模板回顧整個(gè)示例它提供了一條清晰的 Jakarta EE / MicroProfile LangChain4j 集成范式配置層用 MicroProfile Configproperties 環(huán)境變量覆蓋管理 API Key、模型 ID、超時(shí)、溫度、token 上限等全部參數(shù)代碼中零硬編碼接入層HuggingFaceChatModel/HuggingFaceLanguageModel/HuggingFaceEmbeddingModel三個(gè) builder 覆蓋對(duì)話、補(bǔ)全、嵌入三類場(chǎng)景waitForModel(true)簡(jiǎn)化模型冷啟動(dòng)處理服務(wù)層AiServices 結(jié)合MemoryId與MessageWindowChatMemory實(shí)現(xiàn)按 WebSocket 會(huì)話隔離的帶記憶對(duì)話暴露層Jakarta WebSocket 提供瀏覽器實(shí)時(shí)聊天JAX-RS MicroProfile OpenAPI 提供可交互調(diào)試的 REST APIMicroProfile Metrics 提供耗時(shí)觀測(cè)驗(yàn)證層dev mode 一鍵觸發(fā)集成測(cè)試用確定性斷言年份、模型名、相似度區(qū)間保證端到端鏈路可用。對(duì)于希望在傳統(tǒng) Java 企業(yè)級(jí)技術(shù)棧中引入 LLM 能力的團(tuán)隊(duì)這個(gè)示例無(wú)論是作為學(xué)習(xí)入口還是作為新項(xiàng)目腳手架都具備直接的參考價(jià)值。贊分享示例工程【免費(fèi)下載鏈接】langchain4j-examples項(xiàng)目地址https://gitcode.com/GitHub_Trending/la/langchain4j-examples點(diǎn)擊查看免費(fèi)下載相關(guān)推薦stable-diffusion.cpp × Chroma1-Radiance從零跑通 Radiance 推理的完整鏈路stable diffusion.cpp × Chroma1 Radiance從零跑通 Radiance 推理的完整鏈路 Chroma1 Radiance 是人工智能大模型本地部署推理引擎媒體生成基于Next-Forge構(gòu)建AI聊天機(jī)器人實(shí)戰(zhàn)指南基于Next Forge構(gòu)建AI聊天機(jī)器人實(shí)戰(zhàn)指南 前言 在現(xiàn)代Web開發(fā)中集成AI功能已成為提升用戶體驗(yàn)的重要手段。本文將詳細(xì)介紹如何使用next forg前端后端示例工程CLI快速搭建AI聊天機(jī)器人Python FastAPI完整指南快速搭建AI聊天機(jī)器人Python FastAPI完整指南 想要快速搭建一個(gè)功能強(qiáng)大的AI聊天機(jī)器人嗎本文將通過(guò)模塊化部署方式使用Python F后端AI 應(yīng)用大模型RAG上一篇Faster Whisper終極指南高效語(yǔ)音識(shí)別與AI轉(zhuǎn)錄技術(shù)深度解析下一篇500 AI Agent 開源項(xiàng)目庫(kù)三步定位行業(yè)案例五分鐘跑通 20 個(gè)源碼創(chuàng)作聲明:本文部分內(nèi)容由AI輔助生成(AIGC),僅供參考