LangChain4J-(3)-模型參數配置

LangChain4j 提供了靈活的模型參數配置方式,允許你根據不同的 AI 模型(如 OpenAI、GPT-4、Anthropic 等)設置各種參數來控制生成結果。

后面手擼代碼繼續在之前章節的代碼上拓展

一、日志配置(Logging)

在 LangChain4j 中,日志(logging)相關參數主要用于控制是否記錄模型的請求和響應信息,這對于開發調試、監控 API 調用內容以及排查問題非常有用。

將日志級別調整為debug級別,同時配置上langchain日志輸出開關才能有效。

step1:修改LLMConfig類

package com.xxx.demo.config;import dev.langchain4j.model.chat.ChatModel;
import dev.langchain4j.model.openai.OpenAiChatModel;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class LLMConfig {@Bean(name = "qwen")public ChatModel chatModelQwen(){return OpenAiChatModel.builder().apiKey(System.getenv("aliqwen-apikey")).modelName("qwen-plus").baseUrl("https://dashscope.aliyuncs.com/compatible-mode/v1").logRequests(true) // 日志界別設置為debug才有效.logResponses(true)// 日志界別設置為debug才有效.build();}}

step2:修改YML文件

server.port=9005spring.application.name=langchain4j-0301-parameters# 只有日志級別調整為debug級別,同時配置以上 langchain 日志輸出開關才有效
logging.level.dev.langchain4j = DEBUG 

step3:在控制臺檢查結果

二、監控(Observability)

LangChain4j 的 Observability(可觀測性)配置主要涉及日志記錄、指標監控及鏈路追蹤等方面

step1:先實現ChatModelListener

package com.xxx.demo.listener;import cn.hutool.core.util.IdUtil;
import dev.langchain4j.model.chat.listener.ChatModelErrorContext;
import dev.langchain4j.model.chat.listener.ChatModelListener;
import dev.langchain4j.model.chat.listener.ChatModelRequestContext;
import dev.langchain4j.model.chat.listener.ChatModelResponseContext;
import lombok.extern.slf4j.Slf4j;@Slf4j
public class TestModeLlistener  implements ChatModelListener {@Overridepublic void onRequest(ChatModelRequestContext requestContext){// onRequest配置的k:v鍵值對,在onResponse階段可以獲得,上下文傳遞參數好用String uuidValue = IdUtil.simpleUUID();requestContext.attributes().put("TraceID",uuidValue);log.info("請求參數requestContext:{}", requestContext+"\t"+uuidValue);}@Overridepublic void onResponse(ChatModelResponseContext responseContext){Object object = responseContext.attributes().get("TraceID");log.info("返回結果responseContext:{}", object);}@Overridepublic void onError(ChatModelErrorContext errorContext){log.error("請求異常ChatModelErrorContext:{}", errorContext);}
}

step2:再次拓展LLMConfig類

package com.xxx.demo.config;import com.bbchat.demo.listener.TestModeLlistener;
import dev.langchain4j.model.chat.ChatModel;
import dev.langchain4j.model.openai.OpenAiChatModel;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;import java.util.List;@Configuration
public class LLMConfig {@Bean(name = "qwen")public ChatModel chatModelQwen(){return OpenAiChatModel.builder().apiKey(System.getenv("aliqwen-apikey")).modelName("qwen-plus").baseUrl("https://dashscope.aliyuncs.com/compatible-mode/v1").logRequests(true) // 日志界別設置為debug才有效.logResponses(true)// 日志界別設置為debug才有效.listeners(List.of(new TestModeLlistener())) //監聽器.build();}}

step3:驗證結果

三、重試機制(Retry Configuration)

在 LangChain4j 中配置重試機制,核心是通過?RetryAssistant(重試助手)或結合底層依賴(如 OkHttp、Resilience4j 等)實現,用于解決 LLM 調用過程中的網絡波動、API 限流、臨時服務不可用等問題。下面代碼簡單做展示一下效果,更加詳細的配置請大家看官網查API。

再次拓展LLMConfig

package com.xxx.demo.config;import com.bbchat.demo.listener.TestModeLlistener;
import dev.langchain4j.model.chat.ChatModel;
import dev.langchain4j.model.openai.OpenAiChatModel;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;import java.util.List;@Configuration
public class LLMConfig {@Bean(name = "qwen")public ChatModel chatModelQwen(){return OpenAiChatModel.builder().apiKey(System.getenv("aliqwen-apikey")).modelName("qwen-plus").baseUrl("https://dashscope.aliyuncs.com/compatible-mode/v1").logRequests(true) // 日志界別設置為debug才有效.logResponses(true)// 日志界別設置為debug才有效.listeners(List.of(new TestModeLlistener())) //監聽器.maxRetries(2)// 重試機制共計2次.build();}}

四、超時機制(timeout)

繼續拓展LLMConfig

package com.xxx.demo.config;import com.bbchat.demo.listener.TestModeLlistener;
import dev.langchain4j.model.chat.ChatModel;
import dev.langchain4j.model.openai.OpenAiChatModel;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;import java.time.Duration;
import java.util.List;@Configuration
public class LLMConfig {@Bean(name = "qwen")public ChatModel chatModelQwen(){return OpenAiChatModel.builder().apiKey(System.getenv("aliqwen-apikey")).modelName("qwen-plus").baseUrl("https://dashscope.aliyuncs.com/compatible-mode/v1").logRequests(true) // 日志界別設置為debug才有效.logResponses(true)// 日志界別設置為debug才有效.listeners(List.of(new TestModeLlistener())) //監聽器.maxRetries(2)// 重試機制共計2次.timeout(Duration.ofSeconds(2))//向大模型發送請求,2s沒有響應將中斷請求并提示reqquest time out.build();}}

找一個大模型思考肯定超過2s問題測試一下即可見效果

五、流式輸出(Response Streaming)

流式輸出(StreamingOutput)是一種逐步返回大模型生成結果的技術,生成一點返回一點,允許服務器將響應內容。分批次實時傳輸給客戶端,而不是等待全部內容生成完畢后再一次性返回。

?這種機制能顯著提升用戶體驗,尤其適用于大模型響應較慢的場景(如生成長文本或復雜推理結果)

step1:修改一下我們的pom文件,確認下langchain4j原生maven坐標三件套

  		<dependency><groupId>dev.langchain4j</groupId><artifactId>langchain4j-open-ai</artifactId></dependency><dependency><groupId>dev.langchain4j</groupId><artifactId>langchain4j</artifactId></dependency><dependency><groupId>dev.langchain4j</groupId><artifactId>langchain4j-reactor</artifactId></dependency>

step2:修改下yml文件

server.port=9005spring.application.name=langchain4j-0301-parameters# 只有日志級別調整為debug級別,同時配置以上 langchain 日志輸出開關才有效
logging.level.dev.langchain4j = DEBUG# 設置響應的字符編碼,避免流式返回輸出亂碼
server.servlet.encoding.charset=utf-8
server.servlet.encoding.enabled=true
server.servlet.encoding.force=true

step3:ChatAssistant接口

package com.xxx.demo.service;
import reactor.core.publisher.Flux;public interface ChatAssistant {String chat(String prompt);Flux<String> chatFlux(String prompt);
}

step4:重寫LLMConfig

package com.xxx.demo.config;import com.bbchat.demo.listener.TestModeLlistener;
import com.bbchat.demo.service.ChatAssistant;
import dev.langchain4j.model.chat.ChatModel;
import dev.langchain4j.model.chat.StreamingChatModel;
import dev.langchain4j.model.openai.OpenAiChatModel;
import dev.langchain4j.model.openai.OpenAiStreamingChatModel;
import dev.langchain4j.service.AiServices;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;import java.util.List;@Configuration
public class LLMConfig {/*普通對話接口*/@Bean(name = "qwen")public ChatModel chatModelQwen(){return OpenAiChatModel.builder().apiKey(System.getenv("aliqwen-apikey")).modelName("qwen-plus").baseUrl("https://dashscope.aliyuncs.com/compatible-mode/v1").logRequests(true) // 日志界別設置為debug才有效.logResponses(true)// 日志界別設置為debug才有效.listeners(List.of(new TestModeLlistener())) //監聽器//  .maxRetries(2)// 重試機制共計2次// .timeout(Duration.ofSeconds(2))//向大模型發送請求,2s沒有響應將中斷請求并提示reqquest time out.build();}/*流式對話接口*/@Beanpublic StreamingChatModel streamingChatModel(){return OpenAiStreamingChatModel.builder().apiKey(System.getenv("aliqwen-apikey")).modelName("qwen-plus").baseUrl("https://dashscope.aliyuncs.com/compatible-mode/v1").build();}@Beanpublic ChatAssistant chatAssistant(StreamingChatModel streamingChatModel){return AiServices.create(ChatAssistant.class, streamingChatModel);}}

step5:寫一個新的controller,分別調用一下就能體驗流式輸出了。

接口地址

核心邏輯

返回類型

適用場景

/chatstream/chat

直接調用?StreamingChatModel?的?chat?方法,通過?Flux.create?包裝流式響應

Flux<String>

前端需要流式接收文本(如 SSE)

/chatstream/chat2

直接調用?StreamingChatModel,控制臺打印流式結果,無返回值

void

后端調試(無前端交互)

/chatstream/chat3

調用自定義?ChatAssistant?的?chatFlux?方法,封裝后返回流式響應

Flux<String>

高內聚場景(業務邏輯封裝)

package com.xxx.demo.controller;import com.bbchat.demo.service.ChatAssistant;
import dev.langchain4j.model.chat.StreamingChatModel;
import dev.langchain4j.model.chat.response.ChatResponse;
import dev.langchain4j.model.chat.response.StreamingChatResponseHandler;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import reactor.core.publisher.Flux;@RestController
@Slf4j
public class StreamingChatModelController {@Resource //直接使用 low-level LLM APIprivate StreamingChatModel streamingChatLanguageModel;@Resource //自己封裝接口使用 high-level LLM APIprivate ChatAssistant chatAssistant;// http://localhost:9005/chatstream/chat?prompt=天津有什么好吃的@GetMapping(value = "/chatstream/chat")public Flux<String> chat(@RequestParam("prompt") String prompt){return Flux.create(stringFluxSink -> {streamingChatLanguageModel.chat(prompt, new StreamingChatResponseHandler(){@Overridepublic void onPartialResponse(String s){stringFluxSink.next(s);}@Overridepublic void onCompleteResponse(ChatResponse completeResponse){stringFluxSink.complete();}@Overridepublic void onError(Throwable throwable){stringFluxSink.error(throwable);}});});}@GetMapping(value = "/chatstream/chat2")public void chat2(@RequestParam(value = "prompt", defaultValue = "北京有什么好吃") String prompt){System.out.println("---come in chat2");streamingChatLanguageModel.chat(prompt, new StreamingChatResponseHandler(){@Overridepublic void onPartialResponse(String partialResponse){System.out.println(partialResponse);}@Overridepublic void onCompleteResponse(ChatResponse completeResponse){System.out.println("---response over: "+completeResponse);}@Overridepublic void onError(Throwable throwable){throwable.printStackTrace();}});}@GetMapping(value = "/chatstream/chat3")public Flux<String> chat3(@RequestParam(value = "prompt", defaultValue = "南京有什么好吃") String prompt){System.out.println("---come in chat3");return chatAssistant.chatFlux(prompt);}
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/94720.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/94720.shtml
英文地址,請注明出處:http://en.pswp.cn/web/94720.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

LangGraph - API多種訪問方式

本文介紹了Langgraph服務的四種調用方式&#xff1a;1. 通過LangGraph Studio UI界面手動測試&#xff1b;2. 使用Python SDK進行同步/異步調用&#xff1b;3. 通過REST API測試&#xff1b;4. 使用JavaScript SDK接入。Langgraph 服務端代碼 graph.pyfrom langchain_openai im…

HEI-612 HART/EtherNet/IPModbus TCP 網關:打通工業通信壁壘

在工業自動化領域&#xff0c;HART 協議設備的廣泛應用與以太網網絡的高效管理常面臨 “協議孤島” 難題 —— 老舊 HART 傳感器、變送器難以接入 EtherNet/IP 或 Modbus TCP 系統&#xff0c;數據雙向交互卡頓、調試復雜、兼容性差等問題&#xff0c;嚴重制約生產效率提升。上…

OSPF 的工作過程、Router ID 機制、報文結構

視頻版講解>>>>>>>>>>>>>>路由協議深度解析&#xff1a;從靜態路由到 OSPF 實戰 一、回顧靜態路由&#xff1a;拓撲與核心邏輯 我們先回到上周講解的拓撲圖&#xff0c;這張圖是理解靜態路由的核心載體 —— 路由器作為網段分割的…

Qt 6 與 Qt 5 存在的兼容性差異

之前有提到。我的是Qt5&#xff0c;我朋友的是Qt 6&#xff0c;由于版本不兼容問題&#xff0c;在遷移時會有問題。所以這一我們說說這兩個的區別。&#xff08; 正文開始嘍&#xff01; 總結來說&#xff1a;Qt5遷移至 Qt 6 需&#xff1a;1. 破壞性變更&#xff08;必須修改…

本地windows電腦部署html網頁到互聯網:html+node.js+ngrok/natapp

目錄 核心概念&#xff1a;為什么不能直接分享HTML文件&#xff1f; 1&#xff0c;html文件修改 2&#xff0c;安裝設置node.js 3&#xff0c;路由器虛擬服務器 4&#xff0c;采用ngrok工具進行內網穿透&#xff08;國外工具&#xff09; 5&#xff0c;采用natapp工具進行…

electron離線開發核心環境變量npm_config_cache

npm_config_cache 這個環境變量。它在離線環境配置中扮演著核心角色。什么是 npm_config_cache&#xff1f;npm_config_cache 是一個環境變量&#xff0c;用于直接設置 npm 的緩存目錄的絕對路徑。npm 在安裝包時&#xff0c;會遵循一個特定的工作流程&#xff1a;檢查緩存&…

CTFshow系列——命令執行web57-60

本篇文章介紹命令執行的另一種情況&#xff0c;CTFshow的Web57-60關的講解解析&#xff1b;要想了解其它關卡可查看我以往的文章&#xff0c;感謝關注。 文章目錄Web57&#xff08;新方法&#xff09;Web58&#xff08;POST型&#xff09;不可用函數可用函數Web59第二種方法&am…

域名、ip、DSN、URL

目錄 1、ip 2、域名 3、DSN 4、URL 1、ip 每個連接到Internet上的主機都會分配一個IP地址&#xff0c;此ip是該計算機在互聯網上的邏輯地址的唯一標識&#xff0c;計算機之間的訪問就是通過IP地址來進行的。寫法&#xff1a;十進制的形式&#xff0c;用“.”分開&#xff0…

【JAVA實現websocket】

JAVA實現websocket背景依賴問題代碼實現測試背景 近期項目中需要用到websocket&#xff0c;實現即時通信。 依賴 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-websocket</artifactId></depen…

2.6 提示詞調優編碼實戰(一)

目錄 寫在前面 一,需求定義 二,簡單提示詞 2.1 代碼示例 2.2 輸出結果 三,提示詞模版 3.1 提示詞 3.1.1 任務描述 3.1.2 用戶輸入 3.1.3 模型輸出格式 3.1.4 Prompt模版 3.2 輸出結果 寫在前面 前面我們總結了提示詞對于模型的意義,接下來我們來通過向模型輸入…

使用Stone 3D快速制作第一人稱視角在線小游戲

首先得有個怪物模型&#xff0c;怪物帶有idle, attack動作 然后有個場景模型&#xff0c;把怪物&#xff08;如果模型較大&#xff0c;建議使用remote-mesh來加載&#xff09;擺放到想放的位置。 給相機加上fps-controls和character組件 給所有怪物加上character組件 可以在…

嵌入式第三十七課!!!TCP機制與HTTP協議

TCP的其他機制TCP頭部標志位SYN&#xff1a;請求建立連接標志位 ACK&#xff1a;響應報文標志位 PSH&#xff1a;攜帶數據標志位&#xff0c;通知接收方該從緩沖區讀數據 FIN&#xff1a; 請求斷開連接標志位 RST&#xff1a;復位標志位 URG: 緊急數據標志…

【測試】pytest測試環境搭建

使用pytest進行API測試&#xff0c;vscode運行 創建虛擬環境&#xff0c;安裝pytest&#xff0c;httpx&#xff0c;requests&#xff0c;dotenvvscode中ctrlshiftp&#xff0c;選擇python: Configure Tests&#xff0c;選擇pytest&#xff0c;目錄左側插件testing里面可以看到有…

javaweb開發筆記——微頭條項目開發

第八章 微頭條項目開發 一 項目簡介 1.1 微頭條業務簡介 微頭條新聞發布和瀏覽平臺,主要包含業務如下 用戶功能 注冊功能 登錄功能 頭條新聞 新聞的分頁瀏覽 通過標題關鍵字搜索新聞 查看新聞詳情 新聞的修改和刪除 權限控制 用戶只能修改和自己發布的頭條新聞 1.…

Linux(二十二)——服務器初始化指南

文章目錄前言一、配置國內 Yum 源&#xff08;加速軟件安裝&#xff09;二、更新系統與安裝必備工具三、網絡連接驗證四、配置主機名五、同步時間六、配置防火墻6.1 使用 iptables6.1.1 整體思路6.1.2 詳細步驟6.1.3 完整配置腳本示例6.1.4 常用管理命令6.2 使用 firewalld總結…

我用Photoshop Firefly+Blender,拯救被環境毀掉的人像大片

今日陽光正好。這樣的天氣對于攝影師來說是種饋贈&#xff0c;但也讓我想起了這個行業最普遍也最無奈的痛點&#xff1a;我們精心策劃了一場拍攝&#xff0c;模特的表現、光線的質感都近乎完美&#xff0c;但最終卻因為一個平淡的陰天、一處雜亂的背景&#xff0c;或是一個無法…

【線性代數】常見矩陣類型

目錄 1. 方陣(Square Matrix) 2. 對稱矩陣(Symmetric Matrix) 3. 反對稱矩陣 / 斜對稱矩陣(Skew-Symmetric Matrix) 4. 對角矩陣(Diagonal Matrix) 5. 三角矩陣 6. 正交矩陣(Orthogonal Matrix) 7. 冪等矩陣(Idempotent Matrix) 8. 正定矩陣 / 半正定矩陣 …

達夢數據庫統計信息收集

達夢數據庫統計信息收集 檢查統計信息收集情況 如何手動收集統計信息 查看統計信息收集結果 統計信息手動收集策略 統計信息的自動收集 檢查統計信息收集情況 檢查最近一次統計信息收集時間: --表的最近一次統計信息收集時間 SQL> select owner,table_name,last_analyzed…

【目標檢測】論文閱讀4

Fast and accurate object detector for autonomous driving based on improved YOLOv5 發表時間&#xff1a;2023年&#xff1b;期刊&#xff1a;scientific reports 論文地址 摘要 自動駕駛是人工智能的一個重要分支&#xff0c;實時準確的目標檢測是保證自動駕駛車輛安全穩…

wpf之DockPanel

前言 DockPanel是一個容器控件&#xff0c;容器中的子控件通過設置DockPanel.Dock屬性來調整位置 1、DockPanel.Dock DockPanel.Dock的值有Left、Right、Top、Bottom 1.1 Left 指示控件靠左停靠 1.2 Right 指示控件靠右停靠 1.3 Top 指示控件靠上停靠 1.4 Bottom 指示…