1. 关于LangChain4j

  • 简单说,LangChain 的 Java 版本(langchain4j)把 AI 开发的核心步骤 ——“写提示模板 → 调用大模型 → 解析回答结果 → 调用工具 → 保存聊天记忆”,全都封装成了 Java 接口。你用它就像写 MyBatis Mapper 一样简单,不用自己从头写复杂的 AI 调用逻辑。
  • 核心模块说明:
模块 说明 通俗类比(懂 Java/Spring 就秒懂)
langchain4j-core 提供通用的 AI 开发接口(比如调用模型、处理消息、解析结果) 像 JDBC:定好了通用规则,不管连哪个数据库都按这套来
langchain4j-openai / langchain4j-zhipu 对接 OpenAI、智谱等不同大模型的 “专属驱动” 像 mysql-driver:连 MySQL 就得用这个专属驱动,连不同模型用不同包
langchain4j-spring-boot-starter 自动配置 + 配置项(比如在 yml 里配模型密钥) 像 SpringBoot 的各种 starter:引入即能用,不用手动配一堆东西
langchain4j-easy-rag 几行代码就能给自家文档建索引、做问答 像 Spring Data JPA:不用写复杂 SQL,简单操作就能操作数据
langchain4j-tools 让大模型直接调用你写的 @Service 方法 像 FeignClient:简单配置就能调用其他服务
langchain4j-memory 保存聊天记录、缓存对话内容 像 Spring-Session:专门管会话数据存储

2. LangChain4j 能做什么

  1. “搭架子” 省时间:比如你想做一个 “能查公司内部文档的问答机器人”,不用从零写流程,LangChain4j 给你现成的 “模块”:

    • 一个模块负责把公司文档拆成小块、存起来(叫 “向量存储”,不用懂啥意思,用就行);
    • 一个模块负责接收用户的问题,去文档里找相关内容;
    • 一个模块负责把 “问题 + 相关文档” 传给大模型;
    • 一个模块负责把大模型的回答返回给用户。

    你只要像拼积木一样把这些模块连起来,几行代码就能搞定,不用自己写全流程。

  2. 解决大模型的 “短板”

    • 大模型默认记不住上一轮对话?LangChain4j 有 “记忆模块”,帮你存上下文,让机器人能跟你 “聊下去”;
    • 大模型不知道你公司的私密数据?LangChain4j 能把你的数据 “喂” 给大模型,让它只基于你的数据回答,还不会泄露;
    • 想让大模型做完回答再执行个操作(比如生成 Excel、调用公司接口)?它有 “工具调用模块”,能让大模型 “指挥” 其他程序干活。

3. 准备工作

3.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/>
    </parent>

    <groupId>cn.cjc</groupId>
    <artifactId>springboot-ai</artifactId>
    <version>1.0-SNAPSHOT</version>

    <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>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>


        <!-- https://mvnrepository.com/artifact/dev.langchain4j/langchain4j -->
        <!--  LangChain4j 核心库 -->
        <dependency>
            <groupId>dev.langchain4j</groupId>
            <artifactId>langchain4j</artifactId>
            <version>1.9.1</version>
        </dependency>
        <!-- AiService依赖 -->
        <dependency>
            <groupId>dev.langchain4j</groupId>
            <artifactId>langchain4j-spring-boot-starter</artifactId>
            <version>1.0.1-beta6</version>
        </dependency>

        <dependency>
            <groupId>dev.langchain4j</groupId>
            <artifactId>langchain4j-core</artifactId>
            <version>1.9.1</version>
        </dependency>
        <!-- LangChain4j OpenAI支持(可用于通义千问的OpenAI兼容接口) -->
        <dependency>
            <groupId>dev.langchain4j</groupId>
            <artifactId>langchain4j-open-ai-spring-boot-starter</artifactId>
            <version>1.9.1-beta17</version>
        </dependency>
        <!--  导入响应式编程依赖包-->
        <dependency>
            <groupId>dev.langchain4j</groupId>
            <artifactId>langchain4j-reactor</artifactId>
            <version>1.9.1-beta17</version>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.22</version>
        </dependency>
    </dependencies>
</project>
3.2. 配置文件
spring:
  application:
    name: springboot-ai

langchain4j:
  open-ai:
    chat-model:
      api-key: sk-04fafb1bbbbd45e39dc8f44a64672c17
      model-name: qwen-plus
      base-url: https://dashscope.aliyuncs.com/compatible-mode/v1

4. 大模型相关API

img

  • 高级API和低级API的区别(手动 or 全自动)

    • 高级API: 自定义接口,LangChain4将接口实现成聊天功能实例,该实例具备模型、记忆、数据库

    • 低级API:消息、模型、存储,写代码用好它们

  • LanguageModel和ChatModel的区别(一次性对话 or 多轮对话)

  • ChatMessage和ChatRequest的区别(单条消息 or 多次对话的消息+设置)

5. 演示代码

5.1.高级API演示代码
@Configuration
public class LangChain4jConfig {

    @Value("${langchain4j.open-ai.chat-model.api-key}")
    private String apiKey;

    @Value("${langchain4j.open-ai.chat-model.model-name}")
    private String modelName;

    @Value("${langchain4j.open-ai.chat-model.base-url}")
    private String baseUrl;

    /**
     * 创建并配置OpenAiChatModel实例(使用通义千问的OpenAI兼容接口)
     * @return OpenAiChatModel实例
     */
    @Bean("qwen")
    public OpenAiChatModel chatModel() {
        return OpenAiChatModel.builder()
                .apiKey(apiKey)
                .modelName(modelName)
                .baseUrl(baseUrl)
                .build();
    }

    // 1. 用@Bean注解,再用AiServices.create来生成实例
    @Bean
    public ChatAssistant chatAssistant(@Qualifier("qwen") ChatModel model) {
        return AiServices.create(ChatAssistant.class, model);
    }
}

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

// 2. 此时ChatAssistant实例已经可以注入使用了
@RestController
public class HighApiController {
    @Resource
    private ChatAssistant assistant;

    @GetMapping("/highapi/chat")
    public String chat(@RequestParam String q) {
        return assistant.chat(q);   // 封装消息、调用模型、取回复等操作都在chat中了,个人无需编码实现
    }
}
  • 另外涉及到记忆、外挂知识库等能力,也都可以通过声明式来实现(MemoryId、ContentRetriever)
5.2.低级API演示代码
  • 调用LangChain4j的各项能力,通过各种方法调用来完成聊天参数设置和聊天操作
@Configuration
public class LangChain4jConfig {

    @Value("${langchain4j.open-ai.chat-model.api-key}")
    private String apiKey;

    @Value("${langchain4j.open-ai.chat-model.model-name}")
    private String modelName;

    @Value("${langchain4j.open-ai.chat-model.base-url}")
    private String baseUrl;

    @Bean
    public OpenAiChatModel chatModel() {
        return OpenAiChatModel.builder()
                .apiKey(apiKey)
                .modelName(modelName)
                .baseUrl(baseUrl)
                .build();
    }
}

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

    @GetMapping("/lowapi/chat")
    public String chat() {
        ChatResponse resp = chatModel.chat(
                ChatRequest.builder()
                        .messages(UserMessage.from("讲个故事"),
                                AiMessage.from("好的,来一个……"))
                        .temperature(0.7)
                        .build());
        return resp.aiMessage().text();
    }
}
5.3. 低级API的模型对象

先搞懂两个核心模型的区别

  • LanguageModel:最基础的 “一问一答” 模式,你输入一句话,模型直接返回一个回答。这个方式已经过时了,官方文档也说它会被 ChatModel 取代,不用再学了。
  • ChatModel:现在主流的聊天模式,支持多轮对话。它能接收多个ChatMessages对象作为输入,返回是AiMessage对象,ChatMessages可以是文字、图片、音频这些内容,返回的是模型的最终回复。

ChatMessage和ChatRequest的区别

如果用 ChatModel 的基础功能对话,会发现可以传两种参数:ChatMessage 集合,或者 ChatRequest。其实很好理解:

  • 只用ChatMessage:适合简单聊天,比如直接发 “你好” 就行,不用额外设置。
  • 用ChatRequest:适合需要精细控制的情况,比如想让模型回答更理性 / 更灵活(调 temperature 参数),或者需要调用外部工具(比如查天气),这些额外要求都能通过 ChatRequest 来设置。(简单说:ChatMessage 是 “纯聊天内容”,ChatRequest 是 “聊天内容 + 额外控制规则”)

ChatMessage的消息类型

  • UserMessage:你(用户)发的内容,不管是文字、图片、音频、PDF。

  • AiMessage:大模型给用户的响应

  • ToolExecutionResultMessage:调用外部工具的结果(比如问模型 “今天天气”,模型调用天气工具后,工具返回的天气数据就存在这里)。

  • SystemMessage:给模型定规矩的消息(比如告诉模型 “你要扮演客服,回复要简洁”)。

  • CustomMessage:自定义消息,目前只有 Ollama 模型支持。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐