Java转大模型开发 SpringBoot整合LangChain4j实现AI对话

593 阅读3分钟

1 LangChain4j

1.1 简介

LangChain4j的目标是简化将大模型语言(LLM - Large - Language - Model)集成到 Java的过程。4就是for的意思,j就是java。所以LangChain4j就是LangChain For java

官网:docs.langchain4j.info/

进入官网后,下图就是LangChain4j的三大功能,总结就是:

  • 与大语言模型和向量数据库进行交互
  • 转为Java打造,从此AI不再是Python的专属
  • 智能代理、工具、检索增长生成(RAG)

image-20250615152803959

1.2 LangChain4j库结构

LangChain4j具有模块化设计,包括:

  • LangChain4j-core模块,它定义了核心抽象概念(如聊天语言模型和嵌入存储)及其API
  • 主LangChain4j模块,包含有用的工具,如文档加载器、聊天记忆实现,以及诸如人工智能服务等高层功能
  • 大量的langchain4j-{集成}模块,每个模块都将各种大语言模型提供商和嵌入存储集成到LangChain4j中。你可以独立使用langchain4j-{集成}模块。如需更多功能,只需要导入主langchain4j即可

1.3 接入大模型

参考官方文档:docs.langchain4j.info/get-started

文档中介绍了2个依赖:

  • 一个是集成OpenAI的依赖,如果我们要接入DeepSeek,也可以使用这个依赖,因为DeepSeek就是基于OpenAI标准的
  • 第二个是提供高级服务API的依赖。所谓高级服务,比如Function Calling(函数调用)、RAG(检索增强生成)等

image-20250615155049697

有些人可能会好奇,下图中的这个langchain4j-bom是干嘛的。为什么放在dependencyManagement里。

首先dependencyManagement是依赖管理的意思,比如在里面写了langchain4j-bom这个依赖和版本号(1.0.0-beta3),那么在dependency中引入的所有langchain的依赖都是都是这个版本(1.0.0-beta3),且在dependency中引入langchain依赖时,就不需要再写版本号了。这就达到了版本管理的效果

再者,langchain4j-bom是一个清单,包含langchain4j所有依赖。后面会在代码实战中再次讲解

image-20250615160854328

文档中也介绍了,要使用OpenAI,需要使用apiKey(秘钥)和modelName(模型名称),最后调用chat方法就可以聊天了。看上去相当简单。

如果没有apiKey,又不想申请怎么办?LangChain4j提供了免费的apiKey,但模型名称仅限于 gpt-4o-mini

image-20250615162639021

2 SpringBoot整合LangChain4j代码实战

2.1 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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>3.5.0</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    
    
    <groupId>com.example</groupId>
    <artifactId>AI-langchain4j</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>AI-langchain4j</name>
    <description>AI-langchain4j</description>


    <properties>
        <java.version>21</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        
        <dependency>
            <groupId>dev.langchain4j</groupId>
            <artifactId>langchain4j-open-ai</artifactId>
        </dependency>
    </dependencies>

    <dependencyManagement>
        <!--langchain4j的依赖清单-->
        <dependencies>
            <dependency>
                <groupId>dev.langchain4j</groupId>
                <artifactId>langchain4j-bom</artifactId>
                <version>1.0.0-beta3</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
</project>

可以看到,在引入langchain4j-open-ai依赖时,并没有写版本号。因为dependencyManagement中引入了langchain4j-bom,版本号为1.0.0-beta3,所以在引入langchain4j-open-ai依赖时,版本号固定为1.0.0-beta3,不再需要额外再写一次版本号了,这就是依赖控制管理

2.2 yml配置

server:
  port: 8007    #端口号

2.3 controller接口

package com.huqing.icu.controller;

import dev.langchain4j.model.openai.OpenAiChatModel;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * @Description openApi接口
 * @Author huqing
 * @Date 2025/6/15 16:30
 **/
@RestController
@RequestMapping("/open/api/")
public class OpenAIController {

	# 这里使用langchain4j官方提供的免费的apikey和modelName,注意apikey的值就是demo
    @GetMapping(value = "/chat/v1", produces = "application/json")
    public String addPost() {
        OpenAiChatModel model = OpenAiChatModel.builder()
                .baseUrl("http://langchain4j.dev/demo/openai/v1")
                .apiKey("demo")
                .modelName("gpt-4o-mini")
                .build();
        String result = model.chat("你好,穷人要怎么才能翻身");
        return result;

    }
}

2.4 测试

项目整体结构如下:

image-20250615180708014

代码跑起来,浏览器输入:http://localhost:8007/open/api/chat/v1,可以看到大模型确实做出了回答,接口调用成功

image-20250615164131934