LangChain4J-(1)-Hello World

一、LangChain4J是什么?

LangChain4J 是一个专为 Java 生态系统设计的开源框架,用于简化与大语言模型(LLM,如 OpenAI 的 GPT 系列、Google 的 Gemini、Anthropic 的 Claude 等)的集成和交互。它借鉴了 Python 生态中 LangChain 的核心思想,但专为 Java 开发者优化,提供了更符合 Java 编程习惯的 API 和功能。

1.1 核心定位与价值

LangChain4J 的核心目标是降低开发基于大语言模型的应用的门槛,帮助开发者快速实现以下功能:

  • 与各类大语言模型(LLM)进行交互(发送提示词、处理响应);
  • 管理对话记忆(保存上下文,实现多轮对话);
  • 集成外部工具(如数据库查询、API 调用、计算器等,让 LLM 具备实际操作能力);
  • 处理提示词模板(动态生成结构化提示);
  • 构建复杂的 AI 工作流(如链(Chain)、代理(Agent)等)。

1.2 主要特性

  1. 多模型支持
    内置对主流大语言模型的支持,包括 OpenAI、Gemini、Anthropic、LLaMA、通义千问等,开发者无需关注不同模型的 API 差异,通过统一接口调用。
  2. 对话记忆管理
    提供多种记忆组件(如基于窗口的记忆、持久化记忆),自动保存对话上下文,让 LLM 能够 "记住" 历史对话内容,支持多轮交互。
  3. 工具调用能力
    允许 LLM 根据需求需求自动调用外部工具(如查询数据库、调用 REST API、执行代码等),扩展 LLM 的实际应用能力(例如让 AI 查天气、查股票、操作数据)。
  4. 提示词工程支持
    提供提示词模板、格式化工具,帮助开发者构建结构化提示,提升 LLM 响应质量。
  5. 轻量灵活
    可与 Java 原生项目集成,也可通过 Spring Boot Starter 与 Spring 生态无缝结合,支持从小型工具到大型应用的各种场景。
  6. 扩展性
    支持自定义组件(如自定义记忆存储、工具适配器),满足个性化需求。

1.3 典型使用场景

  • 构建聊天机器人(带上下文记忆的多轮对话);
  • 开发 AI 驱动的问答系统(结合知识库);
  • 实现智能助手(自动调用工具完成任务,如生成报告、数据分析);
  • 集成 LLM 到现有 Java 应用(如在企业系统中添加 AI 客服、自动文档处理功能)。

1.4 与 Python LangChain 的关系

LangChain4J 受 Python 版 LangChain 启发,目标类似,但专为 Java 生态设计,API 风格更符合 Java 开发者习惯,且与 Spring Boot 等主流 Java 框架有更好的集成性。两者均致力于解决 LLM 应用开发中的共性问题(如记忆、工具调用、流程编排),但分属不同编程语言生态。

1.5 总结

LangChain4J 是 Java 开发者集成大语言模型的得力工具,它抽象了与 LLM 交互的复杂性,提供了标准化的组件和流程,让开发者可以更专注于业务逻辑,而非底层交互细节。无论是简单的提示词调用,还是复杂的 AI 代理系统,都能通过 LangChain4J 快速实现。

二、Hello World

2.1 获取阿里百炼API KEY

1、获取APIKEY

2、把APIKEY配置到环境变量中

3、模型名与BASE_URL

点红色箭头进去看模型名,点绿色箭头进去看BASE_URL

2.2 建项目

新建maven聚合工程,父工程pom如下:

XML 复制代码
<?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.bbchat.demo</groupId>
    <artifactId>langchain4j-demo</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>pom</packaging>
    <name>langchain4j-demo父工程pom配置</name>

    <properties>
        <maven.compiler.source>17</maven.compiler.source>
        <maven.compiler.target>17</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <!-- 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 建Module

新建子工程,pom文件内容如下:

XML 复制代码
<?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>
    <parent>
        <groupId>com.bbchat.demo</groupId>
        <artifactId>langchain4j-demo</artifactId>
        <version>1.0-SNAPSHOT</version>
    </parent>

    <artifactId>langchain4j-0101-helloword</artifactId>

    <properties>
        <maven.compiler.source>17</maven.compiler.source>
        <maven.compiler.target>17</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

    <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>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

2.4 写properties

为子工程新建application.properties,内容如下:

bash 复制代码
server.port=9001 ​ 

spring.application.name=langchain4j-0101-helloword

2.5 写主启动类

java 复制代码
package com.bbchat.demo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;



@SpringBootApplication
public class Main {
    public static void main(String[] args) {

        System.out.printf("Hello and welcome!");
        SpringApplication.run(Main.class,args);
    }
}

2.6 写配置类

java 复制代码
package com.bbchat.demo.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;

@Configuration
public class LLMConfig {
    @Bean
    public ChatModel chatModelQwen()
    {
        return OpenAiChatModel.builder()
                .apiKey(System.getenv("aliqwen-apikey"))
                .modelName("qwen-plus")
                .baseUrl("https://dashscope.aliyuncs.com/compatible-mode/v1")
                .build();
    }
}

2.7 写controller

java 复制代码
package com.bbchat.demo.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 HelloLangChain4JController {
    @Resource
    private ChatModel chatModelQwen;

    // http://localhost:9001/langchain4j/hello?prompt=如何学习大模型应用开发
    @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;
    }
}

2.8 测试

三、Sprngboot整合LangChain4J

LangChain4J官方文档: Spring Boot Integration | LangChain4j
按照官网上的说法是:

LangChain4J 作为 Java 生态中集成大语言模型(LLM)的框架,其 "原生整合" 和 "Boot 整合" 是两种主流使用方式,核心差异在于是否依赖 Spring Boot 生态,适用于不同场景。

3.1 原生整合的特点

  • 优点
    :轻量(无额外框架依赖)、灵活度高(可完全控制组件生命周期)、适合嵌入非 Spring 项目(如传统 Java 桌面应用)。
  • 缺点
    :配置分散在代码中、需手动管理依赖和组件(如记忆、工具调用)、缺乏自动配置和依赖注入能力。

3.2 Boot整合的特点

  • 优点
    :配置集中化(通过 application.yml)、依赖注入简化组件管理、与 Spring 生态无缝集成(如结合 Spring MVC 暴露 API、Spring Security 处理权限)、自动支持高级功能(如记忆、工具调用)。
  • 缺点
    :引入 Spring Boot 依赖,增加项目体积,不适合纯轻量 Java 项目。

3.3 手敲两种整合

1、POM文件

在maven聚合工程中新建一个module,我们在子工程的pom文件中把两种集成方式所需要的依赖都写上,其中红框是原生整合、绿框是boot整合。

附完整Module的POM文件

XML 复制代码
<?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>
    <parent>
        <groupId>com.bbchat.demo</groupId>
        <artifactId>langchain4j-demo</artifactId>
        <version>1.0-SNAPSHOT</version>
    </parent>

    <artifactId>langchain4j-0102-boot</artifactId>

    <properties>
        <maven.compiler.source>17</maven.compiler.source>
        <maven.compiler.target>17</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>


    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!--langchain4j-open-ai 基础-->
        <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>
        <dependency>
            <groupId>dev.langchain4j</groupId>
            <artifactId>langchain4j-core</artifactId>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

2、application.properties

其中的apiqwen-apikey环境变量是本文第二章节中配置的

XML 复制代码
server.port=9002

spring.application.name=langchain4j-0102-boot

langchain4j.open-ai.chat-model.api-key=${aliqwen-apikey}
langchain4j.open-ai.chat-model.model-name=qwen-plus
langchain4j.open-ai.chat-model.base-url=https://dashscope.aliyuncs.com/compatible-mode/v1

3、写主启动类

java 复制代码
package com.bbchat.demo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;


@SpringBootApplication
public class Main {
    public static void main(String[] args) {

        System.out.printf("welcome langchain4j-0102-boot!");
        SpringApplication.run(Main.class,args);

        }
    }

4、编写原生整合

新建PopularIntegrationController,代码如下:

java 复制代码
package com.bbchat.demo.controller;

import dev.langchain4j.model.chat.ChatModel;
import jakarta.annotation.Resource;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;


@RestController
public class PopularIntegrationController {
    @Resource
    private ChatModel chatModel;

    // http://localhost:9002/lc4j/boot/chat
    @GetMapping(value = "/lc4j/boot/chat")
    public String chat(@RequestParam(value = "prompt", defaultValue = "你是谁") String prompt)
    {
        return chatModel.chat(prompt);
    }
}

5、编写boot整合

新建service接口类,代码如下:

java 复制代码
package com.bbchat.demo.service;

import dev.langchain4j.service.spring.AiService;

@AiService
public interface ChatAssistant {
    String chat(String prompt);
}

新建DeclarativeAIServiceController,代码如下:

java 复制代码
package com.bbchat.demo.controller;

import com.bbchat.demo.service.ChatAssistant;
import jakarta.annotation.Resource;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class DeclarativeAIServiceController {
    @Resource
    private ChatAssistant chatAssistantQwen;

    // http://localhost:9002/lc4j/boot/declarative
    @GetMapping(value = "/lc4j/boot/declarative")
    public String declarative(@RequestParam(value = "prompt", defaultValue = "你是谁") String prompt)
    {
        return chatAssistantQwen.chat(prompt);
    }
}

6、验证

作者验证时用的9003端口,大家玩的时候以代码里面的端口为准。

相关推荐
AI Echoes2 分钟前
一款为开发者而生的开源全栈LLMOps平台
人工智能·python·langchain·agent
玉木子4 分钟前
机器算法(五)模型选择与调优
人工智能·python·深度学习·算法·机器学习
Shang1809893572615 分钟前
HI3519DRFCV500/HI3519DV500海思核心板IPC算力2.5T图像ISP超高清智能视觉应用提供SDK软件开发包
人工智能·嵌入式硬件·fpga开发·智能视频处理器·hi3519drfcv500·hi3519dv500
vvilkim16 分钟前
深入解析 PyTorch 核心类:从张量到深度学习模型
人工智能·pytorch·深度学习
奔跑吧邓邓子28 分钟前
【Java实战⑨】Java集合框架实战:List集合深度剖析
java·实战·list·集合
小菜全32 分钟前
使用Java获取本地PDF文件并解析数据
java·开发语言·python
小傅哥35 分钟前
互联网大厂Java面试宝典:Spring Boot与微服务全栈提问实战解析
java·spring boot·微服务·面试·技术栈
yangchanghua1111 小时前
Caused by: java.net.SocketTimeoutException: Read timed out;
java·开发语言·spring
Baihai_IDP1 小时前
系统梳理 RAG 系统的 21 种分块策略
人工智能
school20231 小时前
贵州在假期及夏天结束后保持旅游活力的策略分析
人工智能·美食