LangChain4j概述与基本使用

LangChain4j概述与基本使用

LangChain4j等价于LangChain For java,即为你的java应用赋能大模型能力

1

LangChain4j概述

LangChain4j的目标是简化LLM集成到Java应用程序中的过程

LangChain4j简化LLM集成到java的方式

  1. 统一API: LLM提供商和嵌入(向量)存储使用专有API。LangChain4j提供统一的API,避免了学习和实现每个特定API的需求。
  2. 全面的工具箱: 社区一直在构建众多LLM驱动应用程序,识别常见的抽象、模式、技术。LangChain4j将这些提炼成一个即用依赖包。工具箱(依赖包)包含从低级提示模版、聊天记忆管理和函数调用到高级模式如代理和RAG工具。
  3. 丰富的示例: 官方文档中展示了如何开始创建各种LLM驱动的应用程序,提供灵感并使你快速开始构建。

LangChain4j技术引入后对java框架的影响

相较于之前java微服务框架与大模型框架是相对独立的,java调用大模型应用需要编写很多粘合代码,LangChain4j和SpringAI的出现降低了java集成大模型的开发成本,提供了统一的API

2.LangChain4j技术引入Java框架的变化

大语言模型(LLM)应用技术架构

大语言言模型应用技术架构分为4层

  • 应用层(Application Layer): 直接面向用户的产品形态,将前三层的能力包装成解决实际问题的具体应用
  • 框架与工具层(Framework&Tool Layer): 连接"大脑"和"手脚"的神经系统,负责编排、增强、控制模型的能力,使其能完成复杂任务。
  • 模型层(Model Layer): 提供核心智能的"大脑本身",包括各种大模型及其服务形式
  • 基础设施层(Infrastructure Layer): 整个技术栈的基石,提供大模型和应用所需的底层计算、存储和网络资源

3.LLM应用技术框架

自上而下是"调用"关系,自下而上是"支撑"关系,大多数应用开发者和创业者主要聚焦在最上面两层,利用下层提供的强大能力,结合垂直领域的数据和场景,构建创新的AI应用。

LangChain4j的功能

具体功能详情参见官网,这里只列出功能点

  • 集成15+个LLM提供商

  • 集成20+个嵌入(向量)存储

  • 集成15+个嵌入模型

  • 集成5个图像生成模型

  • 集成2个评分(重排序)模型

  • 集成一个审核模型(OpenAI)

  • 支持文本和图像作为输入(多模态)

  • AI服务(高阶LLM API)

  • 提示模版

  • 实现持久化和内容中的聊天记忆算法: 消息窗口和令牌窗口

  • 从LLM流式传输响应

  • 用于常见Java类型和自定义POJO的输出解析器

  • 工具(函数调用)

  • 动态工具(执行动态生成的LLM代码)

  • RAG(检索增强生成)

    • 提取:
      • 从多个来源导入各种类型的文档
      • 使用多种分割算法将文档分割成更小的段落
      • 文档和短路的后处理
      • 使用嵌入模型嵌入段落
      • 在嵌入(向量)存储中存储嵌入
    • 检索:
      • 查询转换
      • 查询路由
      • 从向量存储或任意自定义源检索
      • 重排序
      • 倒数排名融合
      • 自定义RAG流程中的每个步骤
  • 文本分类

  • 用于分词和估算token数的工具

  • Kotlin扩展: 使用Kotlin的协程功能异步非阻塞处理聊天交换

LangChain4j的两个抽象层次

  • 低层次(基础层次): 在这个层次上,开发者拥有最大的自由度和访问所有低级(基础)组件的权限。如ChatLanguageModel、UserMessage、AIMessage、EmbeddingStore、Embedding等。这些是LLM驱动应用程序的"原语"。开发者可以完全控制如何组合,但需要编写更多的粘合代码
  • 高层次: 在这个层次上,开发者使用高级API(如API服务)与LLM交互,它隐藏了所有复杂性和样板代码。开发者仍然可以灵活性地调整和微调,但是需要以声明式方式完成

4

LangChain4j的使用场景

  • 自定义的AI驱动的聊天机器人,访问自身数据并按照预期行事。eg:客户支持聊天机器人,教育类助手
  • 从非结构化数据(文件、网页)中提取结构化信息。eg:从客户评论和支持聊天历史中提取见解,从竞争对手的网址提取有趣信息,从求职者简历中提取见解
  • 生成信息。eg:为每个用户定制电子邮件,为网站生成内容
  • 转换信息。eg:总结、校对和重写、翻译

LangChain4j的基本使用

基本使用主要以代码示例为主,演示LangChain4j原生整合与Langchain4j与springboot集成两种整合方式,分成两个模块

使用前提

大模型选择与配置API-KEY环境变量

由于需要大模型的能力,因此需要选择模型并设置API-KEY,这里以阿里云百炼平台、DeepSeek开发平台为例

大模型平台网址

这里提供阿里云百炼平台与DeepSeek开发平台的网址,自行进行用户开通与API-KEY的构建

阿里云百炼平台:https://bailian.console.aliyun.com/

DeepSeek开发平台:https://platform.deepseek.com/

环境变量中添加API-KEY

由于API-KEY属于敏感信息不应该出现在代码中,因此配置到环境变量中

此电脑右键属性->高级系统设置->环境变量

在系统变量中新建一个API-KEY变量,用于后需java程序读环境变量进行API-KEY值获取

5

引入物料清单

在父项目中引入物料清单,用于子模块中引入相关依赖时的版本号识别,避免两个依赖因版本问题导致不兼容的问题

    <properties>
        <maven.compiler.source>21</maven.compiler.source>
        <maven.compiler.target>21</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>21</java.version>
        <!--Spring Boot-->
        <spring-boot.version>3.5.3</spring-boot.version>
        <!--LangChain4J-->
        <langchain4j.version>1.0.0-beta3</langchain4j.version>
    </properties>
    <!--    <dependencyManagement> 是一个声明和集中管理依赖版本和配置的机制(物料清单)。它本身并不引入实际的依赖,而是为依赖提供一个“模板”或“蓝图”-->
    <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>
            <!--LangChain4J-->
            <dependency>
                <groupId>dev.langchain4j</groupId>
                <artifactId>langchain4j-bom</artifactId>
                <version>${langchain4j.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

LangChain4j原生整合的基本使用

提供两种抽象层次的API调用即高低阶调用API,高阶API调用需要声明AI服务

引用依赖

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

    <dependencies>
        <!--快速构建一个基于 Spring MVC 的 Web 应用程序而预置的一组依赖项的集合-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!--LangChain4J openAI集成依赖-->
        <dependency>
            <groupId>dev.langchain4j</groupId>
            <artifactId>langchain4j-open-ai</artifactId>
        </dependency>
        <!--LangChain4J 高级AI服务API依赖-->
        <dependency>
            <groupId>dev.langchain4j</groupId>
            <artifactId>langchain4j</artifactId>
        </dependency>
        <!--一个通过注解在编译时自动生成 Java 样板代码的库-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
        <!--对 Spring Boot 应用程序进行全面测试而预置的一组测试相关依赖项的集合-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
        </dependency>
    </dependencies>

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

配置类

import com.shen.langchain4j.service.ChatAssistant;
import dev.langchain4j.model.chat.ChatLanguageModel;
import dev.langchain4j.model.openai.OpenAiChatModel;
import dev.langchain4j.service.AiServices;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * 大模型配置类
 */

@Configuration
public class LLMConfig {
    @Bean(value = "qwen")
    public ChatLanguageModel chatLanguageModelQwen() {
        return OpenAiChatModel.builder()
                .apiKey(System.getenv("aliyunQwen-apiKey"))
                .modelName("qwen-plus-2025-04-28")
                .baseUrl("https://dashscope.aliyuncs.com/compatible-mode/v1")
                .build();
    }

    @Bean(value = "deepseek")
    public ChatLanguageModel chatLanguageModelDeepseek() {
        return OpenAiChatModel.builder()
                .apiKey(System.getenv("DeepSeek-apiKey"))
                .modelName("deepseek-chat")
                .baseUrl("https://api.deepseek.com/v1")
                .build();
    }

    @Bean
    public ChatAssistant chatAssistant(@Qualifier(value = "qwen") ChatLanguageModel chatLanguageModel) {
        return AiServices.create(ChatAssistant.class, chatLanguageModel);
    }

}

低阶API控制层接口

/**
 * 低价API使用控制层接口
 */
@Slf4j
@RestController
@RequestMapping(value = "/lowApi")
public class LowApiController {
    @Autowired
    @Qualifier(value = "qwen")
    private ChatLanguageModel qwenModel;

    @Autowired
    @Qualifier(value = "deepseek")
    private ChatLanguageModel deepseekModel;

    /**
     * 常规提问大模型
     *
     * @param prompt 提示词
     * @return 大模型回答
     */
    @GetMapping(value = "/one")
    public String lowApiOne(@RequestParam(value = "prompt", defaultValue = "你是谁") String prompt) {
        return qwenModel.chat(prompt);
    }

    /**
     * 返回token消耗量
     *
     * @param prompt 提示词
     * @return token销毁
     */
    @GetMapping(value = "/two")
    public String lowApiTwo(@RequestParam(value = "prompt", defaultValue = "你是谁") String prompt) {
        ChatResponse chatResponse = qwenModel.chat(UserMessage.from(prompt));
        log.info("大模型输出结果为: {}", chatResponse.aiMessage().text());
        return chatResponse.metadata().tokenUsage().toString();
    }
}

声明式AI(高阶API)服务接口

/**
 * 声明式AI服务业务接口
 */
public interface ChatAssistant {
    String chat(String prompt);
}

高阶API(声明式AI)控制层接口

import com.shen.langchain4j.service.ChatAssistant;
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.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

/**
 * 高阶API使用控制层接口
 */
@Slf4j
@RestController
@RequestMapping(value = "/highApi")
public class HighApiController {
    @Autowired
    private ChatAssistant chatAssistant;

    @GetMapping("/one")
    public String highApiOne(@RequestParam(value = "prompt", defaultValue = "你是谁") String prompt) {
        return chatAssistant.chat(prompt);
    }
}

LangChain4j与springboot集成的基本使用

springboot启动器通过属性配置帮助创建和配置语言模型、嵌入模型、嵌入存储和其他LangChain4j核心组件,相比原生整合的配置类,使用配置文件的方式更具便捷性

引用依赖

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

    <dependencies>
        <!--快速构建一个基于 Spring MVC 的 Web 应用程序而预置的一组依赖项的集合-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!--一个通过注解在编译时自动生成 Java 样板代码的库-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
        <!--对 Spring Boot 应用程序进行全面测试而预置的一组测试相关依赖项的集合-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
        </dependency>
        <!--LangChain4J 与springboot集成依赖 流行的集成(低阶依赖)-->
        <dependency>
            <groupId>dev.langchain4j</groupId>
            <artifactId>langchain4j-open-ai-spring-boot-starter</artifactId>
        </dependency>
        <!--LangChain4J 与springboot集成依赖 声明式AI服务(高阶依赖)-->
        <dependency>
            <groupId>dev.langchain4j</groupId>
            <artifactId>langchain4j-spring-boot-starter</artifactId>
        </dependency>
    </dependencies>

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

配置文件

# 不必新增配置类,直接在配置文件中添加参数
langchain4j:
  open-ai:
    chat-model:
      api-key: ${aliyunQwen-apiKey}
      model-name: qwen-plus-2025-04-28
      base-url: https://dashscope.aliyuncs.com/compatible-mode/v1

低阶API控制层接口

import dev.langchain4j.model.chat.ChatLanguageModel;
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.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

/**
 * 与springboot集成,流行集成的控制层接口
 */
@Slf4j
@RestController
@RequestMapping(value = "/popular")
public class PopularIntegrationsController {
    @Autowired
    private ChatLanguageModel chatLanguageModel;

    @GetMapping("/chat")
    public String chatModel(@RequestParam(value = "prompt", defaultValue = "你是谁") String prompt) {
        return chatLanguageModel.chat(prompt);
    }
}

声明式AI(高阶API)服务接口

import dev.langchain4j.service.spring.AiService;

/**
 * 声明式AI服务业务接口
 */
@AiService
public interface ChatAssistant {
    String chat(String prompt);
}

高阶API(声明式AI)控制层接口

import com.shen.langchain4j.service.ChatAssistant;
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.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

/**
 * 与springboot集成,声明式AI服务的控制层接口
 */
@Slf4j
@RestController
@RequestMapping("/declarative")
public class DeclarativeAIServicesController {
    @Autowired
    private ChatAssistant chatAssistant;

    @GetMapping("/chat")
    public String chatModel(@RequestParam(value = "prompt", defaultValue = "你是谁") String prompt) {
        return chatAssistant.chat(prompt);
    }
}

参考资料

https://docs.langchain4j.dev/

https://docs.langchain4j.info/

posted @ 2025-08-30 21:04  柯南。道尔  阅读(13)  评论(0)    收藏  举报