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();
    }
}

运行测试:

最后:

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

相关推荐
MrGaoGang35 分钟前
耗时1年,终于我也拥有属于自己的AI工作流
前端·agent·ai编程
用户4099322502121 小时前
给接口加新字段又不搞崩老客户端?FastAPI的多版本API靠哪三招实现?
后端·ai编程·trae
阿然1653 小时前
首次尝试,95% 的代码都是垃圾:一位工程师使用 Claude Code 六周的心得
人工智能·agent·ai编程
华仔啊3 小时前
主线程存了用户信息,子线程居然拿不到?ThreadLocal 背锅
java·后端
和平hepingfly3 小时前
重塑 AI 编程范式!爆火开源项目 spec kit (GitHub万赞)一篇文章帮你搞懂
ai编程
间彧4 小时前
Spring Boot项目中,Redis 如何同时执行多条命令
java·redis
瑶琴AI前端4 小时前
【零成本高效编程】VS Code必装的5款免费AI插件,开发效率飙升!
前端·ai编程·visual studio code
蚝油菜花4 小时前
万字深度解析Claude Code的Hook系统:让AI编程更智能、更可控|下篇—实战篇
人工智能·ai编程·claude
召摇4 小时前
如何避免写垃圾代码:Java篇
java·后端·代码规范
vker4 小时前
第 1 天:单例模式(Singleton Pattern)—— 创建型模式
java·设计模式