langchain4j笔记、tools

文章目录

langchain4j和openai都可以实现ai功能,侧重点不同,定制化程度高就用langchain4j。

版本选择:

jdk17

langchain4j # 0.34.0,要求boot3.x以上,最好3.2以上

springboot # 3.3.5,和上述langchain4j的版本要求匹配

langchain4j

引入依赖
xml 复制代码
属性标签里面添加版本:
<langchain4j.version>0.34.0</langchain4j.version>

<!-- LangChain4j 核心库 -->
        <dependency>
            <groupId>dev.langchain4j</groupId>
            <artifactId>langchain4j</artifactId>
            <version>${langchain4j.version}</version>
        </dependency>

        <!-- LangChain4j 对 Spring Boot 的自动装配支持 (可选,但推荐) -->
        <dependency>
            <groupId>dev.langchain4j</groupId>
            <artifactId>langchain4j-spring-boot-autoconfigure</artifactId>
            <version>${langchain4j.version}</version>
        </dependency>

        <!-- 如果你使用 OpenAI 模型,添加对应的 Model 连接器 -->
        <dependency>
            <groupId>dev.langchain4j</groupId>
            <artifactId>langchain4j-open-ai</artifactId>
            <version>${langchain4j.version}</version>
        </dependency>
配置文件

注:和springai的配置有些区别。

yaml 复制代码
# LangChain4j 官方支持的 OpenAI 兼容模式配置前缀
langchain4j:
  open-ai:
    chat-model:
      base-url: https://dashscope.aliyuncs.com/compatible-mode # 百炼兼容模式地址
      api-key: ${AI_DASHSCOPE_API_KEY} # 读取环境变量
      model-name: qwen-max # 模型名称
      temperature: 0.3 # 温度参数
LangChain4jConfig配置类

主要就是为了装配ChatLanguageModel,类似于数据库的session。

按道理应该会自动装配,实测报错了,所以手写了个配置类。

java 复制代码
import dev.langchain4j.model.chat.ChatLanguageModel;
import dev.langchain4j.model.openai.OpenAiChatModel;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class LangChain4jConfig {


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

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

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

    @Bean
    public ChatLanguageModel chatLanguageModel() {
        // 1. 请替换为你自己的 OpenAI API Key
        // 2. 如果你使用的是国内的反向代理(如阿里云百炼、Azure等),请修改 baseUrl
        return OpenAiChatModel.builder()
                .apiKey(apiKey)
                .baseUrl(baseUrl) // 如果是国内代理,请修改这里的地址
                .modelName(modelName)
                .build();
    }
}
controller代码
java 复制代码
package com.example.demo.web;

import dev.langchain4j.data.message.ChatMessage;
import dev.langchain4j.data.message.UserMessage;
import dev.langchain4j.model.chat.ChatLanguageModel;
import dev.langchain4j.model.chat.request.ChatRequest;
import dev.langchain4j.model.chat.response.ChatResponse;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;

import java.util.Collections;
import java.util.Map;

@RestController
@RequestMapping("/api")
public class LangChain4jController {


    // 注入 LangChain4j 的核心对话模型接口
    private final ChatLanguageModel chatLanguageModel;


    // 通过构造器注入(Spring Boot 会自动装配你在配置文件中配置的模型)
    public LangChain4jController(ChatLanguageModel chatLanguageModel) {
        this.chatLanguageModel = chatLanguageModel;
    }

    /**
     * POST 请求:/api/langchain4j/chat
     */
    @PostMapping("/langchain4j/chat")
    public ResponseEntity<String> chat(@RequestBody Map<String, String> request) {
        try {
            String message = request.getOrDefault("message", "你好");
            // 调用统一的内部处理方法
            String answer = processChat(message);
            return ResponseEntity.ok(answer);
        } catch (Exception e) {
            return ResponseEntity.internalServerError().body("Error: " + e.getMessage());
        }
    }

    /**
     * GET 请求:/api/langchain4j/chat?message=xxx
     */
    @GetMapping("/langchain4j/chat")
    public ResponseEntity<String> chatGet(@RequestParam String message) {
        try {
            // 调用统一的内部处理方法
            String answer = processChat(message);
            return ResponseEntity.ok(answer);
        } catch (Exception e) {
            return ResponseEntity.internalServerError().body("Error: " + e.getMessage());
        }
    }

    /**
     * 统一使用 ChatRequest 处理聊天逻辑
     */
    private String processChat(String message) {
        // 1. 将字符串封装为 UserMessage
        ChatMessage userMessage = UserMessage.from(message);

        // 2. 构建 ChatRequest
        ChatRequest chatRequest = ChatRequest.builder()
                .messages(Collections.singletonList(userMessage))
                // 未来如果需要自定义参数,可在此处添加:
                // .parameters(ChatRequestParameters.builder().temperature(0.7).build())
                .build();

        // 3. 调用模型,获取 ChatResponse
        ChatResponse chatResponse = chatLanguageModel.chat(chatRequest);

        // 4. 从响应中提取 AI 的回复文本
        return chatResponse.aiMessage().text();
    }
}

tools

定义工具类
java 复制代码
import dev.langchain4j.agent.tool.Tool;
import org.springframework.stereotype.Component;

@Component
public class AssistantTools {

    @Tool("查询指定城市的当前天气和温度")
    public String getWeather(String city) {
        // 实际业务中这里会调用真实的天气 API
        return city + "当前天气晴,气温 28℃";
    }

    @Tool("查询用户今天的日程安排")
    public String getSchedule(String date) {
        // 实际业务中这里会查询数据库
        if ("今天".equals(date)) {
            return "14:00 参加产品需求评审会议,16:00 与研发团队同步进度";
        }
        return "今天暂无其他安排";
    }
}
定义AiAgentConfig
java 复制代码
@Configuration
public class AiAgentConfig {

    // 定义一个 AI 助理的接口(LangChain4j 会自动实现这个接口)
    public interface SmartAssistant {
        String chat(String userMessage);
    }

    @Bean
    public SmartAssistant smartAssistant(ChatLanguageModel chatLanguageModel, AssistantTools tools) {
        return AiServices.builder(SmartAssistant.class)
                .chatLanguageModel(chatLanguageModel)
                .tools(tools) // 将包含动作的 Tools 注入给 AI
                .chatMemory(MessageWindowChatMemory.withMaxMessages(10))
                .build();
    }
}
controller中引入
java 复制代码
注入:
@Autowired
private AiAgentConfig.SmartAssistant smartAssistant;

具体方法:
@PostMapping("/langchain4j/agent")
    public String chat(@RequestBody String message) {
        return smartAssistant.chat(message);
    }

实测果然实现了类似skill的功能。

相关推荐
陆陆陆六7 分钟前
# 五个AI引擎的答案采集:反爬、去重与时间窗对齐的三个工程细节
python·net·ai答案采集
缘来是你远去是我19 分钟前
本地个人笔记exe
笔记
FakeOccupational1 小时前
【电路笔记 STM32】RTC配置:晶振选择+闹钟Configuration+中断设置
笔记·stm32·实时音视频
迪康coolmu1 小时前
企业U盘管控落地实战:基于迪康端点安全一体化管理系统的移动存储安全实践
运维·人工智能·经验分享·笔记·安全·电脑
小小张说故事3 小时前
Python 的 a[1:5:2] 到底切出了什么?拆开 slice 对象、__getitem__ 与负步长那次反向
python
wuyk5553 小时前
PyQt6-第15讲-数据可视化QChart
python·ui·信息可视化·pyqt
天天被压力3 小时前
【A股分钟级高频数据完全手册 #04】指数分钟级行情数据接口:沪深指数Pro版最新分时取数
java·人工智能·python
日日大王学编程3 小时前
2026主流AI Agent产品分类、核心差异与技术特性全解析
人工智能·后端·python
天天被压力3 小时前
【A股分钟级高频数据完全手册 #03】股票历史1分钟K线数据接口怎么用:Pro版批量拉取与本地缓存
java·人工智能·python
Z21-X4 小时前
云原生运维学习笔记:容器技术的演进、底层原理与 Docker 全生命周期管理
运维·笔记·学习·云原生