模型开发和常规开发层级对比
- Prompt:好比UI层,进行用户交互
- Langchain4j, Spring AI:好比Controller,调用AI大模型
- 各类AI大模型:好比Service,提供人工智能服务
- 向量数据库:好比Mapper,进行数据存储
大模型调用三件套

导入依赖
导入 Lanchain4j 依赖
导入 BOM 包管理版本
参考文档: 快速开始
xml
<properties>
<!-- langchain4j -->
<langchain4j.version>1.0.1</langchain4j.version>
</properties>
<dependencyManagement>
<dependencies>
<!--langchain4j的依赖清单,加载BOM后所有langchain4j版本号可以被统一管理起来
https://docs.langchain4j.dev/get-started -->
<dependency>
<groupId>dev.langchain4j</groupId>
<artifactId>langchain4j-bom</artifactId>
<version>${langchain4j.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependencies>
</dependencyManagement>
导入原生依赖包
- 导入 Low-Level API 和 High-Level API 的依赖包
xml
<!--langchain4j-open-ai 基础-->
<dependency>
<groupId>dev.langchain4j</groupId>
<artifactId>langchain4j-open-ai</artifactId>
</dependency>
<!--langchain4j 高阶-->
<dependency>
<groupId>dev.langchain4j</groupId>
<artifactId>langchain4j</artifactId>
</dependency>
导入SpringBoot 集成依赖包
参考文档: SprintBoot 集成
- 导入和 SpringBoot 的整合包
xml
<dependency>
<groupId>dev.langchain4j</groupId>
<artifactId>langchain4j-open-ai-spring-boot-starter</artifactId>
<version>1.0.0-beta3</version>
</dependency>
<dependency>
<groupId>dev.langchain4j</groupId>
<artifactId>langchain4j-spring-boot-starter</artifactId>
<version>1.0.0-beta3</version>
</dependency>
第三方集成 (通义千问为例)
参考文档:通义千问
导入 BOM 包管理版本
xml
<properties>
<!--langchain4j-community 引入阿里云百炼平台依赖管理清单-->
<langchain4j-community.version>1.0.1-beta6</langchain4j-community.version>
</properties>
<dependencyManagement>
<dependencies>
<!--引入阿里云百炼平台依赖管理清单
https://docs.langchain4j.dev/integrations/language-models/dashscope
-->
<dependency>
<groupId>dev.langchain4j</groupId>
<artifactId>langchain4j-community-bom</artifactId>
<version>${langchain4j-community.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
导入 SpringBoot 集成依赖包
xml
<dependency>
<groupId>dev.langchain4j</groupId>
<artifactId>langchain4j-community-dashscope-spring-boot-starter</artifactId>
</dependency>
创建 ChatModel
APIKey 要从环境变量中获取。 设置方法:百炼平台文档
java
@Bean
public ChatModel chatModelQwen()
{
System.out.println("ALIQWEN_API: "+System.getenv("ALIQWEN_API"));
return OpenAiChatModel.builder()
.apiKey(System.getenv("ALIQWEN_API"))
.modelName("qwen-plus")
.baseUrl("https://dashscope.aliyuncs.com/compatible-mode/v1")
.build();
}
创建 AI Service
原生整合:手动创建 AI Service
java
// ChatAssistant.java
public interface ChatAssistant
{
String chat(String prompt);
}
// Config.java
@Bean
public ChatAssistant chatAssistant(@Qualifier("qwen") ChatModel chatModelQwen)
{
return AiServices.create(ChatAssistant.class, chatModelQwen);
}
// Controller.java
@RestController
@Slf4j
public class HighApiController
{
@Resource
private ChatAssistant chatAssistant;
@GetMapping(value = "/highapi/highapi")
public String highApi(@RequestParam(value = "prompt", defaultValue = "你是谁") String prompt)
{
return chatAssistant.chat(prompt);
}
}
- 和 SpringBoot 整合:声明式创建 AI Service
java
// ChatAssiatant.java
@AiService
public interface ChatAssistant
{
String chat(String prompt);
}
// Controller.java
@RestController
public class DeclarativeAIServiceController
{
@Resource
private ChatAssistant chatAssistant;
@GetMapping(value = "/lc4j/boot/chatAssistant")
public String deepseekAI(@RequestParam(value = "prompt", defaultValue = "你是谁") String prompt)
{
return chatAssistant.chat(prompt);
}
}
@AIService(wiringMode = EXPLICIT, chatModel = "chatModelQwen")
可以指定改 AI Service 使用的是 chatModelQwen 模型。
模型参数
java
// Config.java
@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) // 最大重试次数
.timeout(Duration.ofSeconds(5)) // 请求大模型的超时时间
.build();
}
}
// Linstener.java
@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);
}
}
图片生产模型
使用 qwen-vl-max
模型
java
// Config.java
@Configuration
public class LLMConfig
{
@Bean
public ChatModel ImageModel() {
return OpenAiChatModel.builder()
.apiKey(System.getenv("ALIQWEN_API"))
//qwen-vl-max 是一个多模态大模型,支持图片和文本的结合输入,适用于视觉-语言任务。
.modelName("qwen-vl-max")
.baseUrl("https://dashscope.aliyuncs.com/compatible-mode/v1")
.build();
}
}
发送用户消息:
- 图片转 Base 64 编码
- 构造请求消息
UserMessage
:包含文字和转码后的图片 - 调用
.chat
接口 - 打印请求结果
java
// ImageModeController.java
@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: zzyybs@126.com
* *测试地址: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;
}
}