ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

ai开发-langchain4j入门-进阶-02

ai开发-langchain4j入门-进阶-02 1、模型参数之日志配置dev.langchain4j.data.message.ChatMessageType 枚举类含义1、SYSTEM设定AI的角色如天气预报员。2、USER用户提问“北京明天天气如何”。3、AIAI生成一个工具调用请求而非直接回答。4、TOOL_EXECUTION_RESULT系统执行工具后将结果返回。5、AIAI根据工具返回的结果生成最终的文本回复给用户。SYSTEM(SystemMessage.class),USER(UserMessage.class),AI(AiMessage.class),TOOL_EXECUTION_RESULT(ToolExecutionResultMessage.class),CUSTOM(CustomMessage.class);配置类Configuration public class LLMConfig { Value(${llm.config.aliQwenApiKey}) private String aliQwenApiKey; Value(${llm.config.aliQwenModelName}) private String aliQwenModelName; Value(${llm.config.aliQwenUrl}) private String aliQwenUrl; Bean(name qwen) public ChatModel chatModelQwen() { return OpenAiChatModel.builder() .apiKey(aliQwenApiKey) .modelName(aliQwenModelName) .baseUrl(aliQwenUrl) .logRequests(true) // 日志级别设置为debug才有效 .logResponses(true)// 日志级别设置为debug才有效 .build(); } }conroller 测试RestController Slf4j public class ModelParameterController { Resource private ChatModel chatModelQwen; // http://localhost:9005/modelparam/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; } }打印日志2、监听器参数自定义监听器 / 重试机制 / 超时机制package com.langchain.study.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; /** * auther xulk * Date 2026-06-28 18:53 * Description: 知识出处https://docs.langchain4j.dev/tutorials/spring-boot-integration#observability */ Slf4j public class TestChatModelListener implements ChatModelListener { /** * 请求前回调生成并注入 TraceID 用于链路追踪 */ 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); } /** * 响应后回调从上下文取出 TraceID 记录响应日志 */ 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); } }配置类/** * auther xulk * Date 2026-06-27 22:04 * Description: 知识出处 https://docs.langchain4j.dev/tutorials/model-parameters/ * 超时机制 https://docs.langchain4j.dev/tutorials/model-parameters/ */ Configuration public class LLMConfig { Value(${llm.config.aliQwenApiKey}) private String aliQwenApiKey; Value(${llm.config.aliQwenModelName}) private String aliQwenModelName; Value(${llm.config.aliQwenUrl}) private String aliQwenUrl; Bean(name qwen) public ChatModel chatModelQwen() { return OpenAiChatModel.builder() .apiKey(aliQwenApiKey) .modelName(aliQwenModelName) .baseUrl(aliQwenUrl) .logRequests(true) // 日志级别设置为debug才有效 .logResponses(true)// 日志级别设置为debug才有效 .listeners(List.of(new TestChatModelListener())) .maxRetries(2) // 重试机制 .timeout(Duration.ofSeconds(2))//向大模型发送请求时如在指定时间内没有收到响应该请求将被中断并报request timed out .build(); } }controller 测试// http://localhost:9005/modelparam/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; }3、文生图1、图片和文字一起发送大模型 进行图像解析langchain4j 原生接口配置文件llm.config.aliQwenApiKeysk-.................. llm.config.aliQwenModelNameqwen-vl-max llm.config.aliQwenUrlhttps://dashscope.aliyuncs.com/compatible-mode/v1测试图片配置文件Value(${llm.config.aliQwenApiKey}) private String aliQwenApiKey; Value(${llm.config.aliQwenModelName}) private String aliQwenModelName; Value(${llm.config.aliQwenUrl}) private String aliQwenUrl; Bean public ChatModel ImageModel() { return OpenAiChatModel.builder() .apiKey(aliQwenApiKey) //qwen-vl-max 是一个多模态大模型支持图片和文本的结合输入适用于视觉-语言任务。 .modelName(aliQwenModelName) .baseUrl(aliQwenUrl) .build(); }测试图片controller 测试package com.langchain.study.controller; import dev.langchain4j.data.message.ImageContent; import dev.langchain4j.data.message.TextContent; import dev.langchain4j.data.message.UserMessage; import dev.langchain4j.model.chat.ChatModel; import dev.langchain4j.model.chat.response.ChatResponse; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.core.io.Resource; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; import java.io.IOException; import java.util.Base64; /** * auther xulk * Date 2026-06-21 11:26 * Description: https://docs.langchain4j.dev/tutorials/chat-and-language-models/#multimodality */ RestController Slf4j public class ImageModelController { Autowired private ChatModel chatModel; Value(classpath:static/images/mi.jpg) private Resource resource;//import org.springframework.core.io.Resource; /** * Description: 通过Base64编码将图片转化为字符串 * 结合ImageContent和TextContent形成UserMessage一起发送到模型进行处理。 * Auther: xulk * p * 测试地址http://localhost:9006/image/call */ GetMapping(value /image/call) public String readImageContent() throws IOException { String result null; //第一步图片转码通过Base64编码将图片转化为字符串 byte[] byteArray resource.getContentAsByteArray(); String base64Data Base64.getEncoder().encodeToString(byteArray); //第二步提示词指定结合ImageContent和TextContent一起发送到模型进行处理。 UserMessage userMessage UserMessage.from( TextContent.from(从下面图片种获取来源网站名称股价走势和5月30号股价), ImageContent.from(base64Data, image/jpg) ); //第三步API调用使用OpenAiChatModel来构建请求并通过chat()方法调用模型。 //请求内容包括文本提示和图片模型会根据输入返回分析结果。 ChatResponse chatResponse chatModel.chat(userMessage); //第四步解析与输出从ChatResponse中获取AI大模型的回复打印出处理后的结果。 result chatResponse.aiMessage().text(); //后台打印 System.out.println(result); //返回前台 return result; } }2、langchain4j 和 springboot alibaba 整合 文本生成图像父工程引入依赖!--langchain4j-community 引入阿里云百炼平台依赖管理清单-- langchain4j-community.version1.0.1-beta6/langchain4j-community.version !--引入阿里云百炼平台依赖管理清单 https://docs.langchain4j.dev/integrations/language-models/dashscope -- dependency groupIddev.langchain4j/groupId artifactIdlangchain4j-community-bom/artifactId version${langchain4j-community.version}/version typepom/type scopeimport/scope /dependency子工程引入依赖!--DashScope (Qwen)接入阿里云百炼平台 https://docs.langchain4j.dev/integrations/language-models/dashscope -- dependency groupIddev.langchain4j/groupId artifactIdlangchain4j-community-dashscope-spring-boot-starter/artifactId /dependency修改配置类package com.langchain.study.config; import dev.langchain4j.community.model.dashscope.WanxImageModel; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; /** * auther xulk * Date 2026-06-30 11:24 * Description: 知识出处 * https://docs.langchain4j.dev/tutorials/chat-and-language-models/#image-content */ Configuration public class LLMConfig { Value(${llm.config.aliQwenApiKey}) private String aliQwenApiKey; /** * Description: 测试通义万象来实现图片生成 * 知识出处https://help.aliyun.com/zh/model-studio/text-to-image * Auther: xulk */ Bean public WanxImageModel wanxImageModel() { return WanxImageModel.builder() .apiKey(aliQwenApiKey) .modelName(wanx2.1-t2i-turbo) //图片生成 https://help.aliyun.com/zh/model-studio/text-to-image .build(); } }controller 测试1import com.alibaba.dashscope.aigc.imagesynthesis.ImageSynthesis; import com.alibaba.dashscope.aigc.imagesynthesis.ImageSynthesisParam; import com.alibaba.dashscope.aigc.imagesynthesis.ImageSynthesisResult; import com.alibaba.dashscope.exception.ApiException; import com.alibaba.dashscope.exception.NoApiKeyException; import com.alibaba.dashscope.utils.JsonUtils; import dev.langchain4j.community.model.dashscope.WanxImageModel; import dev.langchain4j.data.image.Image; import dev.langchain4j.model.output.Response; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; import java.io.IOException; /** * auther xulk * Date 2026-06-30 11:57 * Description: TODO */ RestController Slf4j public class WanxImageModelController { Autowired private WanxImageModel wanxImageModel; // http://localhost:9006/image/create2 GetMapping(value /image/create2) public String createImageContent2() throws IOException { System.out.println(wanxImageModel); ResponseImage imageResponse wanxImageModel.generate(美女); System.out.println(imageResponse.content().url()); return imageResponse.content().url().toString(); } }controller测试2import com.alibaba.dashscope.aigc.imagesynthesis.ImageSynthesis; import com.alibaba.dashscope.aigc.imagesynthesis.ImageSynthesisParam; import com.alibaba.dashscope.aigc.imagesynthesis.ImageSynthesisResult; import com.alibaba.dashscope.exception.ApiException; import com.alibaba.dashscope.exception.NoApiKeyException; import com.alibaba.dashscope.utils.JsonUtils; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Value; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; import java.io.IOException; /** * auther xulk * Date 2026-06-30 11:57 * Description: TODO */ RestController Slf4j public class WanxImageModelController { Value(${llm.config.aliQwenApiKey}) private String aliQwenApiKey; // http://localhost:9006/image/create3 GetMapping(value /image/create3) public String createImageContent3() throws IOException { String prompt 近景镜头18岁的中国女孩古代服饰圆脸正面看着镜头 民族优雅的服装商业摄影室外电影级光照半身特写精致的淡妆锐利的边缘。; ImageSynthesisParam param ImageSynthesisParam.builder() .apiKey(aliQwenApiKey) .model(ImageSynthesis.Models.WANX_V1) .prompt(prompt) .style(watercolor) .n(1) .size(1024*1024) .build(); ImageSynthesis imageSynthesis new ImageSynthesis(); ImageSynthesisResult result null; try { System.out.println(---sync call, please wait a moment----); result imageSynthesis.call(param); } catch (ApiException | NoApiKeyException e) { throw new RuntimeException(e.getMessage()); } System.out.println(JsonUtils.toJson(result)); return JsonUtils.toJson(result); } }
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进