LangChain4 初体验

https://juejin.cn/post/7606183276773146687

介绍

LangChain4j 的目标是简化将 LLMs 集成到 Java 应用中。

LangChain4j 支持很多大语言模型:https://docs.langchain4j.dev/integrations/language-models/

最低版本支持:JDK 17

快速入门(调用阿里百炼)

【1】准备依赖

以调用 Qwen(阿里-通义千问)模型为例,引入 LangChain4j 的 OpenAI 依赖。(Low-level API 级别)

xml 复制代码
<dependency>
    <groupId>dev.langchain4j</groupId>
    <artifactId>langchain4j-open-ai</artifactId>
    <version>1.11.0</version>
</dependency>

为什么调用 Qwen 模型却要引入 OpenAI 依赖?这貌似看起来好像没什么关系。

答案:因为 Qwen 兼容了 OpenAI 的 API,因此可以使用 OpenAI 依赖。

如果你想使用 High-level API 可以引入下面的依赖

xml 复制代码
<dependency>
    <groupId>dev.langchain4j</groupId>
    <artifactId>langchain4j</artifactId>
    <version>1.11.0</version>
</dependency>

如果你不想管理版本号,那么可以在父工程配置如下依赖

xml 复制代码
<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>dev.langchain4j</groupId>
            <artifactId>langchain4j-bom</artifactId>
            <version>1.11.0</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

【2】登录百炼平台,获取 API_KEY

在本地环境配置好 API_KEY 之后,Java 中通过如下方式获取:

java 复制代码
String apiKey = System.getenv("ALI_QWEN_API_KEY");

【3】获取模型信息

获取你要调用的模型名称,如 qwen-plus 就是这个模型的名称:

往下滑可以看到代码示例,其中有一个 base_url,这就是你的请求地址。

【4】配置模型信息

配置模型至少需要知道三个信息:

  • API_KEY 调用 API 的凭证
  • model_name 模型名称
  • base_url 调用模型的地址
java 复制代码
@Configuration
public class LLMConfig {
    @Bean
    public ChatModel chatModelQwen() {
        return OpenAiChatModel.builder()
                .apiKey(System.getenv("ALI_QWEN_API_KEY"))
                .modelName("qwen-plus")
                .baseUrl("https://dashscope.aliyuncs.com/compatible-mode/v1")
                .build();
    }
}

【5】调用模型

java 复制代码
@RestController
public class DemoController {
    @Resource
    private ChatModel chatModel;

    @GetMapping("/langchain4j/hello")
    public String hello(@RequestParam(value = "question", defaultValue = "你是谁?") String question) {
        String result = chatModel.chat(question);
        return result;
    }
}

【了解】第三方 AI 平台整合

LangChain4j 集成了很多 LLM 提供商:https://docs.langchain4j.dev/integrations/language-models/

阿里百炼平台(DashScope)便在其中:https://docs.langchain4j.dev/integrations/language-models/dashscope

普通

xml 复制代码
<dependency>
    <groupId>dev.langchain4j</groupId>
    <artifactId>langchain4j-community-dashscope</artifactId>
    <version>${latest version here}</version>
</dependency>

整合 SpringBoot

xml 复制代码
<dependency>
    <groupId>dev.langchain4j</groupId>
    <artifactId>langchain4j-community-dashscope-spring-boot-starter</artifactId>
    <version>${latest version here}</version>
</dependency>

BOM 统一管理

如果你不想自己管理版本号,在父工程配置 BOM 依赖即可:

xml 复制代码
<dependencyManagement>
    <dependency>
        <groupId>dev.langchain4j</groupId>
        <artifactId>langchain4j-community-bom</artifactId>
        <version>${latest version here}</version>
        <type>pom</type>
        <scope>import</scope>
    </dependency>
</dependencyManagement>

模型参数设置

日志、监控、重试机制、超时机制

java 复制代码
@Configuration
public class LLMConfig {
    @Bean("qwen")
    public ChatModel chatModelQwen() {
        return OpenAiChatModel.builder()
                .apiKey(System.getenv("ALI_QWEN_API_KEY"))
                .modelName("qwen-plus")
                .baseUrl("https://dashscope.aliyuncs.com/compatible-mode/v1")
                .logRequests(true) // request 日志
                .logResponses(true) // response 日志
                .listeners(List.of(new TestChatModelListener()))
                .timeout(Duration.ofSeconds(2)) // 超时时间
                .maxRetries(2) // 超时次数
                .build();
    }
}
java 复制代码
@Slf4j
public class TestChatModelListener implements ChatModelListener {
    @Override
    public void onRequest(ChatModelRequestContext requestContext) {
        String uuid = UUID.randomUUID().toString();
        requestContext.attributes().put("TraceId", uuid);
        log.info("请求 ID: {}", uuid);
        log.info("requestContext: {}", requestContext);
    }

    @Override
    public void onResponse(ChatModelResponseContext responseContext) {
        String traceId = responseContext.attributes().get("TraceId").toString();
        log.info("请求 ID: {}", traceId);
        log.info("响应结果: {}", responseContext);
    }

    @Override
    public void onError(ChatModelErrorContext errorContext) {
        log.error("{}", errorContext);
    }
}
相关推荐
devilnumber几秒前
springboot的保护机制怎么实现的,为何能做到服务不宕机
java·spring boot·后端
未秃头的程序猿2 分钟前
一次重复扣款的复盘:分布式锁加错了维度,比不加锁更危险
java·redis·后端
估值探索者4 分钟前
【Python量化技术指标实战 02】MACD金叉也分强弱?手工算一次 DIF/DEA 就懂了
java·开发语言·python·股票数据·股票数据api接口
m0_6399069415 分钟前
MyBatis 核心体系:核心接口、动态 SQL 原理、插件底层机制
java·sql·mybatis
XiYang-DING41 分钟前
P5528.带过期时间的 LRU 缓存
java·开发语言·缓存
SimonKing44 分钟前
DeepSeek 新模型免费白嫖,夯夯夯,赶紧用起来
java·后端·程序员
SabrinaW7111 小时前
基于 C++17 与 RTTR 的注册式对象工厂:配置驱动的动态对象创建
java·前端·数据库
zhangx1234_1 小时前
javaEE 多线程4
java·开发语言
BD_Marathon1 小时前
【RAG开发】LangChain调用大语言模型
人工智能·语言模型·langchain
中电金信2 小时前
从业务调优到分层缓存:DeepSeek V4 Flash的PPU实践
java·开发语言