Java+AI
本文介绍了LangChain4J框架在Java项目中集成AI模型的实践方法。主要内容包括:1. LangChain4J理论概述,说明其基于Transformer架构的文本处理能力;2. 详细开发流程,从环境准备(阿里百炼/DeepSeek API申请)到Maven父工程搭建;3. 实现两种调用方式:低阶API(ChatModel直接调用)和高阶API(通过@AiService注解自动生成实现类);
一、 LangChain4J理论概述
1.1 AI理论入门
ChatGPT G:Generative 可以生成符合语法和语义规则的自然语言文本
P:Pre-trained, 基于大规模文本数据的预训练,使得它更聪明
T:Transformer机构有序的处理文本
1.2 java+Ai

随着人工智能(AI)技术的迅猛发展,越来越多的开发者开始将目光投向AI应用的开发。然而,目前市场上大多数AI框架和工具如LangChain、PyTorch等主要支持Python,而Java开发者常常面临工具缺乏和学习门槛较高的问题,但是不用担心,谁让Java/Spring群体强大那?,O(∩_∩)O
任何一个框架/XXX云服务器,想要大面积推广,应该不会忘记庞大的Spring社区和Java程序员
LangChain4j 官网: https://docs.langchain4j.dev/

二、LangChain4J之永远的HelloWorld
本次以阿里百炼平台(通义千问)为主并辅以DeepSeek模型,当然,通过后续讲解配置规则,同时也适用于其他模型。
2.1 永远的HelloWorldV1---零基础入门
2.1.1阿里云百炼平台入口官网
a. 接入阿里百炼平台的通义模型
https://bailian.console.aliyun.com/
b. 大模型调用三件套
①获取API key

② 大模型调用三件套


模型名:qwen-plus
③ 获得baseUrl开发地址

总结:需要切换别的模型时:
三件套:API key
模型名:qwen-plus
调用地址:base_url

2.2 IDEA工具中建project父工程
langchain4j 新建一个父工程,大概有十几个左右的demo
初始化总pom
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.llyb</groupId>
<artifactId>langchain4j</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>pom</packaging>
<name>langchain4j-Maven父工程POM配置</name>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>17</java.version>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
<!-- Spring Boot -->
<spring-boot.version>3.5.0</spring-boot.version>
<!-- Spring AI -->
<spring-ai.version>1.0.0</spring-ai.version>
<!-- Spring AI Alibaba -->
<spring-ai-alibaba.version>1.0.0-M6.1</spring-ai-alibaba.version>
<!-- langchain4j -->
<langchain4j.version>1.0.1</langchain4j.version>
<!--langchain4j-community 引入阿里云百炼平台依赖管理清单-->
<langchain4j-community.version>1.0.1-beta6</langchain4j-community.version>
<!-- maven plugin -->
<maven-deploy-plugin.version>3.1.1</maven-deploy-plugin.version>
<flatten-maven-plugin.version>1.3.0</flatten-maven-plugin.version>
<maven-compiler-plugin.version>3.8.1</maven-compiler-plugin.version>
</properties>
<dependencyManagement>
<dependencies>
<!-- Spring Boot -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>${spring-boot.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!-- Spring AI -->
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-bom</artifactId>
<version>${spring-ai.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!-- Spring AI Alibaba -->
<dependency>
<groupId>com.alibaba.cloud.ai</groupId>
<artifactId>spring-ai-alibaba-starter</artifactId>
<version>${spring-ai-alibaba.version}</version>
</dependency>
<!--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>
<!--引入阿里云百炼平台依赖管理清单
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>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>${spring-boot.version}</version>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-deploy-plugin</artifactId>
<version>${maven-deploy-plugin.version}</version>
<configuration>
<skip>true</skip>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>${maven-compiler-plugin.version}</version>
<configuration>
<release>${java.version}</release>
<compilerArgs>
<compilerArg>-parameters</compilerArg>
</compilerArgs>
</configuration>
</plugin>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>flatten-maven-plugin</artifactId>
<version>${flatten-maven-plugin.version}</version>
<inherited>true</inherited>
<executions>
<execution>
<id>flatten</id>
<phase>process-resources</phase>
<goals>
<goal>flatten</goal>
</goals>
<configuration>
<updatePomFile>true</updatePomFile>
<flattenMode>ossrh</flattenMode>
<pomElements>
<distributionManagement>remove</distributionManagement>
<dependencyManagement>remove</dependencyManagement>
<repositories>remove</repositories>
<scm>keep</scm>
<url>keep</url>
<organization>resolve</organization>
</pomElements>
</configuration>
</execution>
<execution>
<id>flatten.clean</id>
<phase>clean</phase>
<goals>
<goal>clean</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
<repositories>
<repository>
<id>spring-milestones</id>
<name>Spring Milestones</name>
<url>https://repo.spring.io/milestone</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
<repository>
<id>spring-snapshots</id>
<name>Spring Snapshots</name>
<url>https://repo.spring.io/snapshot</url>
<releases>
<enabled>false</enabled>
</releases>
</repository>
<repository>
<id>aliyunmaven</id>
<name>aliyun</name>
<url>https://maven.aliyun.com/repository/public</url>
</repository>
</repositories>
<pluginRepositories>
<pluginRepository>
<id>public</id>
<name>aliyun nexus</name>
<url>https://maven.aliyun.com/repository/public</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>false</enabled>
</snapshots>
</pluginRepository>
</pluginRepositories>
</project>
2.3 开发5步骤
2.3.1 建Module
langchain4j-01helloworld
2.3.2 改pom
<dependencies>
<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>
<!--test-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
LangChain4J配置Maven整合官网参考 : https://docs.langchain4j.dev/get-started
2.3.3 写yml
server.port=9001 spring.application.name=langchain4j-01helloworld
2.3.4 主启动
2.3.5 业务类
API key 配置到环境变量中:(尽量不要明文),配置好环境变量后:切记 重启idea

配置类:
@Configuration
public class LLMConfig
{
@Bean
public ChatModel chatModelQwen()
{
return OpenAiChatModel.builder()
.apiKey(System.getenv("aliQwen-api"))
.modelName("qwen-plus")
.baseUrl("https://dashscope.aliyuncs.com/compatible-mode/v1")
.build();
}
}
Controller类:
@RestController
@Slf4j
public class HelloLangChain4JController
{
@Resource
private ChatModel chatModelQwen;
// http://localhost:9001/langchain4j/hello?prompt=如何学习java
@GetMapping(value = "/langchain4j/hello")
public String hello(@RequestParam(value = "prompt", defaultValue = "你是谁") String prompt)
{
String result = chatModelQwen.chat(prompt);
System.out.println("通过langchain4j调用模型返回结果:\n"+result);
return result;
}
}
测试成功
localhost:9001/langchain4j/hello?prompt=如何学习java

2.4 多模型同时使用
2.4.1接入Deepseek
官网:https://platform.deepseek.com/usage 申请API

2.4.2 代码开发:
2.4.2.1 建model
langchain4j-02multi-model-together
2.4.2.2 改pom
<dependencies>
<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>
<!--test-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
2.4.2.3 写yml
server.port=9002
spring.application.name=langchain4j-02multi-model-together
2.4.2.4 主启动
2.4.2.5 业务类
a.配置类
@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")
.build();
}
/**
* @Description: 知识出处,https://api-docs.deepseek.com/zh-cn/
*/
@Bean(name = "deepseek")
public ChatModel chatModelDeepSeek()
{
return OpenAiChatModel.builder()
.apiKey(System.getenv("deepseek-api"))
.modelName("deepseek-chat")
//.modelName("deepseek-reasoner")
.baseUrl("https://api.deepseek.com/v1")
.build();
}
}
b.Controller
@RestController
@Slf4j
public class MultiModelController
{
@Resource(name = "qwen")
private ChatModel chatModelQwen;
@Resource(name = "deepseek")
private ChatModel chatModelDeepSeek;
// http://localhost:9002/multimodel/qwen
@GetMapping(value = "/multimodel/qwen")
public String qwenCall(@RequestParam(value = "prompt", defaultValue = "你是谁") String prompt)
{
String result = chatModelQwen.chat(prompt);
System.out.println("通过langchain4j调用模型返回结果:\n"+result);
return result;
}
// http://localhost:9002/multimodel/deepseek
@GetMapping(value = "/multimodel/deepseek")
public String deepseekCall(@RequestParam(value = "prompt", defaultValue = "你是谁") String prompt)
{
String result = chatModelDeepSeek.chat(prompt);
System.out.println("通过langchain4j调用模型返回结果:\n"+result);
return result;
}
}
三、 LangChain4j之整合SpringBoot
3.1 代码开发:
3.1.1 建model
langchain4j-03boot-integration
3.1.2改POM
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--langchain4j原生 基础-->
<dependency>
<groupId>dev.langchain4j</groupId>
<artifactId>langchain4j-open-ai</artifactId>
</dependency>
<!--langchain4j原生 高阶-->
<dependency>
<groupId>dev.langchain4j</groupId>
<artifactId>langchain4j</artifactId>
</dependency>
<!--1 LangChain4j 整合boot底层支持-->
<!-- https://docs.langchain4j.dev/tutorials/spring-boot-integration -->
<dependency>
<groupId>dev.langchain4j</groupId>
<artifactId>langchain4j-open-ai-spring-boot-starter</artifactId>
</dependency>
<!--2 LangChain4j 整合boot高阶支持-->
<dependency>
<groupId>dev.langchain4j</groupId>
<artifactId>langchain4j-spring-boot-starter</artifactId>
</dependency>
<!--lombok-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<!--test-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
3.1.3 写YML
server.port=9003
spring.application.name=langchain4j-12boot-integration
# https://docs.langchain4j.dev/tutorials/spring-boot-integration
langchain4j.open-ai.chat-model.api-key=${aliQwen-api}
langchain4j.open-ai.chat-model.model-name=qwen-plus
langchain4j.open-ai.chat-model.base-url=https://dashscope.aliyuncs.com/compatible-mode/v1
3.1.4 主启动
3.1.5 业务类
低阶api:
@RestController
public class PopularIntegrationController
{
@Resource
private ChatModel chatModel;
// http://localhost:9003/lc4j/boot/chat
@GetMapping(value = "/lc4j/boot/chat")
public String chat(@RequestParam(value = "prompt", defaultValue = "你是谁") String prompt)
{
return chatModel.chat(prompt);
}
}
高阶API
@AiService
public interface ChatAssistant
{
String chat(String prompt);
}
@RestController
public class DeclarativeAIServiceController
{
@Resource
private ChatAssistant chatAssistantQwen;
// http://localhost:9003/lc4j/boot/declarative
@GetMapping(value = "/lc4j/boot/declarative")
public String declarative(@RequestParam(value = "prompt", defaultValue = "你是谁") String prompt)
{
return chatAssistantQwen.chat(prompt);
}
}
两种级别对比:

四:LangChain4j之低阶和高阶API
4.1 low level
low-level模型api,提供chat方法用于对话,可以接收单个或多个消息
ChatModel提供的一种极其简便的方法
@GetMapping(value = "/langchain4j/hello")
public String hello(@RequestParam(value = "prompt", defaultValue = "你是谁") String prompt)
{
String result = chatModel.chat(prompt);
System.out.println("通过langchain4j调用模型返回结果:\n"+result);
return result;
}
4.2 high level
程序员自己定义接口,通过AiServices类里面的方法实现,优点是api封装度比较高,减少了代码的复杂性,但仍可以进行灵活的微调。
4.3 代码开发
4.3.1建module
langchain4j-04low-high-api
4.3.2 改pom
<dependencies>
<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>
<!--test-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
4.3.3 写yml
server.port=9004
spring.application.name=langchain4j-04low-high-api
4.3.4. 主启动
4.3.5 业务类
@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")
.build();
}
@Bean(name = "deepseek")
public ChatModel chatModelDeepSeek()
{
return
OpenAiChatModel.builder()
.apiKey(System.getenv("deepseek-api"))
.modelName("deepseek-chat")
//.modelName("deepseek-reasoner")
.baseUrl("https://api.deepseek.com/v1")
.build();
}
}
低阶调用
@RestController
@Slf4j
public class LowApiController
{
@Resource(name = "qwen")
private ChatModel chatModelQwen;
@Resource(name = "deepseek")
private ChatModel chatModelDeepSeek;
@GetMapping(value = "/lowapi/api01")
public String api01(@RequestParam(value = "prompt", defaultValue = "你是谁") String prompt)
{
String result = chatModelQwen.chat(prompt);
System.out.println("通过langchain4j调用模型返回结果:"+result);
return result;
}
// http://localhost:9004/lowapi/api02
@GetMapping(value = "/lowapi/api02")
public String api02(@RequestParam(value = "prompt", defaultValue = "你是谁") String prompt)
{
ChatResponse chatResponse = chatModelDeepSeek.chat(UserMessage.from(prompt));
String result = chatResponse.aiMessage().text();
System.out.println("通过langchain4j调用模型返回结果:"+result);
TokenUsage tokenUsage = chatResponse.tokenUsage();
System.out.println("本次调用消耗Token:"+tokenUsage);
result = result +"\t\n"+ tokenUsage;
return result;
}
}
高阶调用:
/**
* @Description: 我们知道,按照Java开发一般习惯,有接口就要有实现类
* 比如接口ChatAssistant,就会有实现类ChatAssistantImpl
* 现在用高阶api-AIServics不用你自己写impl实现类,交给langchain4j给你搞定
*/
public interface ChatAssistant{
String chat(String prompt);
}
@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")
.build();
}
@Bean
public ChatAssistant chatAssistant(@Qualifier("qwen") ChatModel chatModelQwen)
{
return AiServices.create(ChatAssistant.class, chatModelQwen);
}
@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);
}
}

更多推荐


所有评论(0)