4. LangChain4j 模型参数配置超详细说明

4. LangChain4j 模型参数配置超详细说明

@[toc]

LangChain4j 模型参数配置超详细说明

java 复制代码
OpenAiChatModel model = OpenAiChatModel.builder()
        .apiKey(System.getenv("OPENAI_API_KEY"))
        .modelName("gpt-4o-mini")
        .temperature(0.3)
        .timeout(ofSeconds(60))
        .logRequests(true)
        .logResponses(true)
        .build();
properties 复制代码
quarkus.langchain4j.openai.api-key=${OPENAI_API_KEY}
quarkus.langchain4j.openai.chat-model.temperature=0.5
quarkus.langchain4j.openai.timeout=60s
properties 复制代码
# Mandatory properties:
langchain4j.open-ai.chat-model.api-key=${OPENAI_API_KEY}
langchain4j.open-ai.chat-model.model-name=gpt-4o-mini

# Optional properties:
langchain4j.open-ai.chat-model.base-url=...
langchain4j.open-ai.chat-model.custom-headers=...
langchain4j.open-ai.chat-model.frequency-penalty=...
langchain4j.open-ai.chat-model.log-requests=...
langchain4j.open-ai.chat-model.log-responses=...
langchain4j.open-ai.chat-model.logit-bias=...
langchain4j.open-ai.chat-model.max-retries=...
langchain4j.open-ai.chat-model.max-completion-tokens=...
langchain4j.open-ai.chat-model.max-tokens=...
langchain4j.open-ai.chat-model.metadata=...
langchain4j.open-ai.chat-model.organization-id=...
langchain4j.open-ai.chat-model.parallel-tool-calls=...
langchain4j.open-ai.chat-model.presence-penalty=...
langchain4j.open-ai.chat-model.project-id=...
langchain4j.open-ai.chat-model.reasoning-effort=...
langchain4j.open-ai.chat-model.response-format=...
langchain4j.open-ai.chat-model.return-thinking=...
langchain4j.open-ai.chat-model.seed=...
langchain4j.open-ai.chat-model.service-tier=...
langchain4j.open-ai.chat-model.stop=...
langchain4j.open-ai.chat-model.store=...
langchain4j.open-ai.chat-model.strict-schema=...
langchain4j.open-ai.chat-model.strict-tools=...
langchain4j.open-ai.chat-model.supported-capabilities=...
langchain4j.open-ai.chat-model.temperature=...
langchain4j.open-ai.chat-model.timeout=...
langchain4j.open-ai.chat-model.top-p=
langchain4j.open-ai.chat-model.user=...

创建对应模块内容:注意:这里我们需要导入的 langchain4j 高阶 和 langchain4j 低阶。

想要使用 langchain4j 高阶 的就必须导入 langchain4j 低阶的配置。

xml 复制代码
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!--langchain4j-open-ai 基础-->
        <!--所有调用均基于 OpenAI 协议标准,实现一致的接口设计与规范LangChain4j 提供与许多 LLM 提供商的集成
        从最简单的开始方式是从 OpenAI 集成开始https://docs.langchain4j.dev/get-started    -->
        <dependency>
            <groupId>dev.langchain4j</groupId>
            <artifactId>langchain4j-open-ai</artifactId>
        </dependency>
        <!--langchain4j 高阶-->
        <dependency>
            <groupId>dev.langchain4j</groupId>
            <artifactId>langchain4j</artifactId>
        </dependency>

        <!--lombok-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>

LangChain4j 日志配置

  1. 创建配置大模型的配置类,同时,在配置类当中,开启日志。如下图所示:
java 复制代码
package com.rainbowsea.langchain4jmodelparameters.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;

/**
 * @Date 2025-05-27 22:04
 * @Description: 知识出处 https://docs.langchain4j.dev/get-started
 */
@Configuration
public class LLMConfig
{

    @Bean(name = "qwen")
    public ChatModel chatModelQwen()
    {
        return OpenAiChatModel.builder()
                .apiKey(System.getenv("aliQwen_api"))
                .modelName("qwen-plus")
                .baseUrl("https://dashscope.aliyuncs.com/compatible-mode/v1")
                .logRequests(true) // 日志界别设置为debug才有效
                .logResponses(true)// 日志界别设置为debug才有效
                .build();
    }
}
  1. 在 application.prperties/yaml 配置文件当中,开启日志级别调整为:debug

注意:只有日志级别调整为debug级别,同时配置以上 langchain 日志输出开关才有效

properties 复制代码
server.port=9003
spring.application.name=langchain4j-03model-parameters
# 只有日志级别调整为debug级别,同时配置以上 langchain 日志输出开关才有效
logging.level.dev.langchain4j=DEBUG 
  1. 编写调用大模型测试类的 Cutroller 测试
java 复制代码
package com.rainbowsea.langchain4jmodelparameters.controller;

import dev.langchain4j.model.chat.ChatModel;
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;

/**
 */
@RestController
@Slf4j
public class ModelParameterController
{
    @Resource
    private ChatModel chatModelQwen;

    // http://localhost:9003/chatconfig/config
    @GetMapping(value = "/modelparam/config")
    public String config(@RequestParam(value = "prompt", defaultValue = "你是谁") String prompt)
    {
        String result = chatModelQwen.chat(prompt);

        System.out.println("通过langchain4j调用模型返回结果:"+result);

        return result;
    }
}

控制台打印显示日志如下:

json 复制代码
- method: POST
- url: https://dashscope.aliyuncs.com/compatible-mode/v1/chat/completions
- headers: [Authorization: Beare...03], [User-Agent: langchain4j-openai], [Content-Type: application/json]
- body: {
  "model" : "qwen-plus",
  "messages" : [ {
    "role" : "user",
    "content" : "你是谁"
  } ],
  "stream" : false
}

2025-08-03T14:35:10.126+08:00  INFO 22816 --- [langchain4j-03model-parameters] [nio-9003-exec-1] d.l.http.client.log.LoggingHttpClient    : HTTP response:
- status code: 200
- headers: [:status: 200], [content-length: 708], [content-type: application/json], [date: Sun, 03 Aug 2025 06:34:59 GMT], [req-arrive-time: 1754202897910], [req-cost-time: 1807], [resp-start-time: 1754202899718], [server: istio-envoy], [set-cookie: acw_tc=fc4c2368-33d6-91de-98a5-5dfa67e550c2ee7ef2f5553bde2a7a0f7a3d9825739d;path=/;HttpOnly;Max-Age=1800], [vary: Origin,Access-Control-Request-Method,Access-Control-Request-Headers, Accept-Encoding], [x-dashscope-call-gateway: true], [x-envoy-upstream-service-time: 1806], [x-request-id: fc4c2368-33d6-91de-98a5-5dfa67e550c2]
- body: {"choices":[{"message":{"role":"assistant","content":"我是通义千问,阿里巴巴集团旗下的通义实验室自主研发的超大规模语言模型。我可以帮助你回答问题、创作文字,比如写故事、写公文、写邮件、写剧本、逻辑推理、编程等等,还能表达观点,玩游戏等。如果你有任何问题或需要帮助,欢迎随时告诉我!"},"finish_reason":"stop","index":0,"logprobs":null}],"object":"chat.completion","usage":{"prompt_tokens":14,"completion_tokens":66,"total_tokens":80,"prompt_tokens_details":{"cached_tokens":0}},"created":1754202900,"system_fingerprint":null,"model":"qwen-plus","id":"chatcmpl-fc4c2368-33d6-91de-98a5-5dfa67e550c2"}

通过langchain4j调用模型返回结果:我是通义千问,阿里巴巴集团旗下的通义实验室自主研发的超大规模语言模型。我可以帮助你回答问题、创作文字,比如写故事、写公文、写邮件、写剧本、逻辑推理、编程等等,还能表达观点,玩游戏等。如果你有任何问题或需要帮助,欢迎随时告诉我!

LangChain4j 监控配置

结论:重写 ChatModeListener 当中监听器的方法即可

  1. 实现 ChatModelListener 监听器的实现类,同时重写实现其中的 onRequest() ,onResponse,onError() 方法。
java 复制代码
package com.rainbowsea.langchain4jmodelparameters.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;

/**
 * @Description: 知识出处,https://docs.langchain4j.dev/tutorials/spring-boot-integration#observability
 */
@Slf4j
public class TestChatModelListener implements ChatModelListener
{
    @Override
    public void onRequest(ChatModelRequestContext requestContext)
    {

        // onRequest配置的k:v键值对,在onResponse阶段可以获得,上下文传递参数好用
        String uuidValue = IdUtil.simpleUUID();
        requestContext.attributes().put("TraceID",uuidValue);
        log.info("请求参数requestContext:{}", requestContext+"\t"+uuidValue);
    }

    @Override
    public void onResponse(ChatModelResponseContext responseContext)
    {
        Object object = responseContext.attributes().get("TraceID");

        log.info("返回结果responseContext:{}", object);
    }

    @Override
    public void onError(ChatModelErrorContext errorContext)
    {
        log.error("请求异常ChatModelErrorContext:{}", errorContext);
    }
}

特别说明: onRequest配置的k:v键值对,在onResponse阶段可以获得,上下文传递参数好用

  1. 在我们创建配置接入的大模型的配置类当中,指明我们自定义的监听器是那个(就是上面我们创建实现 ChatModelListener 接口类的实现类)
java 复制代码
package com.rainbowsea.langchain4jmodelparameters.config;

import com.rainbowsea.langchain4jmodelparameters.listener.TestChatModelListener;
import com.sun.tools.javac.util.List;
import dev.langchain4j.model.chat.ChatModel;
import dev.langchain4j.model.openai.OpenAiChatModel;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * @Date 2025-05-27 22:04
 * @Description: 知识出处 https://docs.langchain4j.dev/get-started
 */
@Configuration
public class LLMConfig
{

    @Bean(name = "qwen")
    public ChatModel chatModelQwen()
    {
        return OpenAiChatModel.builder()
                .apiKey(System.getenv("aliQwen_api"))
                .modelName("qwen-plus")
                .baseUrl("https://dashscope.aliyuncs.com/compatible-mode/v1")
                .logRequests(true) // 日志界别设置为debug才有效
                .logResponses(true)// 日志界别设置为debug才有效
                .listeners(List.of(new TestChatModelListener())) //监听器
                .build();
    }
}

注意:这里的 List.of(new TestChatModelListener() 是 import com.sun.tools.javac.util.List; 包下的。JDK 17 包当中工具类,也可以用 JDK8 当中的import java.util.List;

  1. 运行测试:

LangChain4J 重试机制(RetryConfiguration)默认重试3次

所谓的重试机制:当我们第一次连接大模型失败了,就自动尝试连接第 2 次,第 3 次,默认是三次,当超过了 3 次还是没有连接上大模型就,会抛出异常,终止连接。

默认的情况下是重试 3 次。

  1. 在我们的创建配置连接大模型基本三件套(大模型 key,大模型 name,大模型 url) 的配置类当中,加上配置重试配置即可如下。
java 复制代码
package com.rainbowsea.langchain4jmodelparameters.config;

import com.rainbowsea.langchain4jmodelparameters.listener.TestChatModelListener;
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;

/**
 * @Date 2025-05-27 22:04
 * @Description: 知识出处 https://docs.langchain4j.dev/get-started
 */
@Configuration
public class LLMConfig {

    @Bean(name = "qwen")
    public ChatModel chatModelQwen() {
        return OpenAiChatModel.builder()
                .apiKey(System.getenv("aliQwen_api"))
                .modelName("qwen-plus")
                .baseUrl("https://dashscope.aliyuncs.com/compatible-mode/v1")
                .logRequests(true) // 日志界别设置为debug才有效
                .logResponses(true)// 日志界别设置为debug才有效
                .listeners(List.of(new TestChatModelListener()))  //监听器
                .maxRetries(2)// 重试机制共计2次
                .build();
    }
}

运行测试:关闭WiFI后中断网络再访问,看后台打印几次

LangChain4J 超时机制 timeout

同理:

  1. 在我们的创建配置连接大模型基本三件套(大模型 key,大模型 name,大模型 url) 的配置类当中,加上配置 "超时机制" 配置即可如下。

.timeout(Duration.ofSeconds(2))//向大模型发送请求时,如在指定时间内没有收到响应,该请求将被中断并报requesttimedout

java 复制代码
package com.rainbowsea.langchain4jmodelparameters.config;

import com.rainbowsea.langchain4jmodelparameters.listener.TestChatModelListener;
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;

/**
 * @Date 2025-05-27 22:04
 * @Description: 知识出处 https://docs.langchain4j.dev/get-started
 */
@Configuration
public class LLMConfig {

    @Bean(name = "qwen")
    public ChatModel chatModelQwen() {
        return OpenAiChatModel.builder()
                .apiKey(System.getenv("aliQwen_api"))
                .modelName("qwen-plus")
                .baseUrl("https://dashscope.aliyuncs.com/compatible-mode/v1")
                .logRequests(true) // 日志界别设置为debug才有效
                .logResponses(true)// 日志界别设置为debug才有效
                .listeners(List.of(new TestChatModelListener()))  //监听器
                .maxRetries(2)// 重试机制共计2次
                .timeout(Duration.ofSeconds(2)) //向大模型发送请求时,如在指定时间内没有收到响应,该请求将被中断并报requesttimedout
                .build();
    }
}

运行测试:

最后:

"在这个最后的篇章中,我要表达我对每一位读者的感激之情。你们的关注和回复是我创作的动力源泉,我从你们身上吸取了无尽的灵感与勇气。我会将你们的鼓励留在心底,继续在其他的领域奋斗。感谢你们,我们总会在某个时刻再次相遇。"

相关推荐
麦兜*27 分钟前
Spring Boot 集成 Docker 构建与发版完整指南
java·spring boot·后端·spring·docker·系统架构·springcloud
Cisyam^28 分钟前
Go环境搭建实战:告别Java环境配置的复杂
java·开发语言·golang
CHENFU_JAVA39 分钟前
使用EasyExcel实现Excel单元格保护:自由锁定表头和数据行
java·excel
青云交2 小时前
Java 大视界 -- 基于 Java 的大数据实时流处理在智能电网分布式电源接入与电力系统稳定性维护中的应用(404)
java·大数据·分布式·智能电网·flink 实时流处理·kafka 数据采集·iec 61850 协议
程序员老刘3 小时前
Dart MCP翻车了!3.9.0版本无法运行,这个坑你踩过吗?
flutter·ai编程·客户端
仰望星空@脚踏实地3 小时前
maven scope 详解
java·maven·scope
M_Reus_113 小时前
Groovy集合常用简洁语法
java·开发语言·windows
带刺的坐椅3 小时前
10分钟带你体验 Solon 的状态机
java·solon·状态机·statemachine
小鹅叻3 小时前
MyBatis题
java·tomcat·mybatis