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端口,大家玩的时候以代码里面的端口为准。

相关推荐
qq_43350218几秒前
Codex cli 飞书文档创建进阶实用命令 + Skill 创建&使用 小白完整教程
java·前端·飞书
ManageEngineITSM4 分钟前
IT服务台为什么越忙越低效?
人工智能·自动化·excel·itsm·工单系统
程砚成5 分钟前
小微美业的数字化突围:一款轻量工具,如何让小店告别经营焦虑?
人工智能
IT_陈寒6 分钟前
为什么我的Vite热更新老是重新加载整个页面?
前端·人工智能·后端
safestar201217 分钟前
ES批量写入性能调优:BulkProcessor 参数详解与实战案例
java·大数据·运维·jenkins
还在忙碌的吴小二24 分钟前
Harness 最佳实践:Java Spring Boot 项目落地 OpenSpec + Claude Code
java·开发语言·spring boot·后端·spring
风吹迎面入袖凉25 分钟前
【Redis】Redis的五种核心数据类型详解
java·redis
zhaoshuzhaoshu27 分钟前
人工智能(AI)发展史:详细里程碑
人工智能·职场和发展
Luke~28 分钟前
阿里云计算巢已上架!3分钟部署 Loki AI 事故分析引擎,SRE 复盘时间直接砍掉 80%
人工智能·阿里云·云计算·loki·devops·aiops·sre
weixin_1562415757628 分钟前
基于YOLOv8深度学习花卉识别系统摄像头实时图片文件夹多图片等另有其他的识别系统可二开
大数据·人工智能·python·深度学习·yolo