9. LangChain4j + 整合 Spring Boot

@


LangChain4j 整合 SpringBoot 官方文档:https://docs.langchain4j.dev/tutorials/spring-boot-integration/

浅谈—下:LangChain4j twolevels of abstraction

低阶 APi 和 高阶 API

Spring Boot整合底阶API所需POM:

<dependency>
<groupId>dev.langchain4j</groupId>
<artifactId>langchain4j-open-ai-spring-boot-starter</artifactId>
<version>1.2.0-beta8</version>
</dependency>
langchain4j.open-ai.chat-model.api-key=${OPENAI_API_KEY}
langchain4j.open-ai.chat-model.model-name=gpt-4o
langchain4j.open-ai.chat-model.log-requests=true
langchain4j.open-ai.chat-model.log-responses=true
...

Spring Boot整合高阶API所需POM:

截至目前,存在两种整合 Spring Boot 的方式:

LangChain4J 原生整合:

LangChain4J + Spring Boot 整合:

小总结:

LangChain4j + 整合 Spring Boot 实操

  1. 创建对应项目的 module 模块内容:
  2. 导入相关的 pom.xml 的依赖,这里我们采用流式输出的方式,导入 整合 Spring Boot ,`langchain4j-open-ai-spring-boot-starter,langchain4j-spring-boot-starter 这里我们不指定版本,而是通过继承的 pom.xml 当中获取。

        <dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--1 LangChain4j 整合boot底层支持-->
<!-- https://docs.langchain4j.dev/tutorials/spring-boot-integration -->
<dependency>
<groupId>dev.langchain4j</groupId>
<artifactId>langchain4j-open-ai-spring-boot-starter</artifactId>
</dependency>
<!--2 LangChain4j 整合boot高阶支持-->
<dependency>
<groupId>dev.langchain4j</groupId>
<artifactId>langchain4j-spring-boot-starter</artifactId>
</dependency>
  1. 设置 applcation.yaml / properties 配置文件,其中指明我们的输出响应的编码格式,因为如果不指定的话,存在返回的中文,就是乱码了。
server.port=9008

spring.application.name=langchain4j-08boot-integration

# 设置响应的字符编码,避免流式返回输出乱码
server.servlet.encoding.charset=utf-8
server.servlet.encoding.enabled=true
server.servlet.encoding.force=true # https://docs.langchain4j.dev/tutorials/spring-boot-integration
#langchain4j.open-ai.chat-model.api-key=${aliQwen-api}
#langchain4j.open-ai.chat-model.model-name=qwen-plus
#langchain4j.open-ai.chat-model.base-url=https://dashscope.aliyuncs.com/compatible-mode/v1 # 大模型调用不可以明文配置,你如何解决该问题
# 1 yml: ${aliQwen-api},从环境变量读取
# 2 config配置类: System.getenv("aliQwen-api")从环境变量读取
  1. 编写大模型三件套(大模型 key,大模型 name,大模型 url) 三件套的大模型配置类。

这里我们测试操作两个大模型:DeepSeek,通义千问。


import com.rainbowsea.langchain4jbootintegration.service.ChatAssistantQwen;
import com.rainbowsea.langchain4jbootintegration.service.ChatAssistantDeepSeek;
import dev.langchain4j.model.chat.ChatModel;
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; /**
* @Description: 知识出处 https://docs.langchain4j.dev/get-started
*/
@Configuration
public class LLMConfig { @Bean(name = "qwen")
public ChatModel chatModelQwen() {
return OpenAiChatModel.builder()
.apiKey(System.getenv("aliQwen_api"))
.modelName("qwen-plus")
.baseUrl("https://dashscope.aliyuncs.com/compatible-mode/v1")
.build();
} /**
* @Description: 知识出处,https://api-docs.deepseek.com/zh-cn/
*/
@Bean(name = "deepseek")
public ChatModel chatModelDeepSeek() {
return
OpenAiChatModel.builder()
.apiKey(System.getenv("deepseek_api"))
.modelName("deepseek-chat")
//.modelName("deepseek-reasoner")
.baseUrl("https://api.deepseek.com/v1")
.build();
} }

  1. 编写我们操作两个大模型的将接口类,同时通过在我们的配置类上 + 通过 @AiService 进行一个对接口的实现。

@AiService 注解的源码如下:

//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by FernFlower decompiler)
// package dev.langchain4j.service.spring; import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import org.springframework.stereotype.Service; @Service
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface AiService {
AiServiceWiringMode wiringMode() default AiServiceWiringMode.AUTOMATIC; String chatModel() default ""; String streamingChatModel() default ""; String chatMemory() default ""; String chatMemoryProvider() default ""; String contentRetriever() default ""; String retrievalAugmentor() default ""; String moderationModel() default ""; String[] tools() default {};
}

package com.rainbowsea.langchain4jbootintegration.service;

import dev.langchain4j.service.spring.AiService;

import static dev.langchain4j.service.spring.AiServiceWiringMode.EXPLICIT;

/**
*/
@AiService(wiringMode = EXPLICIT, chatModel = "qwen")
public interface ChatAssistantQwen
{
String chat(String prompt);
}


import com.rainbowsea.langchain4jbootintegration.service.ChatAssistantQwen;
import com.rainbowsea.langchain4jbootintegration.service.ChatAssistantDeepSeek;
import dev.langchain4j.model.chat.ChatModel;
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; /**
* @Description: 知识出处 https://docs.langchain4j.dev/get-started
*/
@Configuration
public class LLMConfig { @Bean(name = "qwen")
public ChatModel chatModelQwen() {
return OpenAiChatModel.builder()
.apiKey(System.getenv("aliQwen_api"))
.modelName("qwen-plus")
.baseUrl("https://dashscope.aliyuncs.com/compatible-mode/v1")
.build(); } // 你使用第2种类,高阶API AiService
@Bean(name = "qwenAssistant")
public ChatAssistantQwen chatAssistantQwen(@Qualifier("qwen") ChatModel chatModelQwen) {
return AiServices.create(ChatAssistantQwen.class, chatModelQwen);
}
}

同理我们添加上 DeepSeek 操作的接口类,以及对应大模型的实现类

package com.rainbowsea.langchain4jbootintegration.service;

import dev.langchain4j.service.spring.AiService;
import static dev.langchain4j.service.spring.AiServiceWiringMode.EXPLICIT;
/**
*/
@AiService(wiringMode = EXPLICIT, chatModel = "deepseek")
public interface ChatAssistantDeepSeek
{
String chat(String prompt);
}
package com.rainbowsea.langchain4jbootintegration.config;

import com.rainbowsea.langchain4jbootintegration.service.ChatAssistantQwen;
import com.rainbowsea.langchain4jbootintegration.service.ChatAssistantDeepSeek;
import dev.langchain4j.model.chat.ChatModel;
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; /**
* @Description: 知识出处 https://docs.langchain4j.dev/get-started
*/
@Configuration
public class LLMConfig { /**
* @Description: 知识出处,https://api-docs.deepseek.com/zh-cn/
*/
@Bean(name = "deepseek")
public ChatModel chatModelDeepSeek() {
return
OpenAiChatModel.builder()
.apiKey(System.getenv("deepseek_api"))
.modelName("deepseek-chat")
//.modelName("deepseek-reasoner")
.baseUrl("https://api.deepseek.com/v1")
.build();
} @Bean(name = "deepseekAssistant")
public ChatAssistantDeepSeek chatAssistantDeepSeek(@Qualifier("deepseek") ChatModel chatModelDeepSeek) {
return AiServices.create(ChatAssistantDeepSeek.class, chatModelDeepSeek);
}
}

DeepSeek + 通义千问

package com.rainbowsea.langchain4jbootintegration.config;

import com.rainbowsea.langchain4jbootintegration.service.ChatAssistantQwen;
import com.rainbowsea.langchain4jbootintegration.service.ChatAssistantDeepSeek;
import dev.langchain4j.model.chat.ChatModel;
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; /**
* @Description: 知识出处 https://docs.langchain4j.dev/get-started
*/
@Configuration
public class LLMConfig { @Bean(name = "qwen")
public ChatModel chatModelQwen() {
return OpenAiChatModel.builder()
.apiKey(System.getenv("aliQwen_api"))
.modelName("qwen-plus")
.baseUrl("https://dashscope.aliyuncs.com/compatible-mode/v1")
.build(); } // 你使用第2种类,高阶API AiService
@Bean(name = "qwenAssistant")
public ChatAssistantQwen chatAssistantQwen(@Qualifier("qwen") ChatModel chatModelQwen) {
return AiServices.create(ChatAssistantQwen.class, chatModelQwen);
} /**
* @Description: 知识出处,https://api-docs.deepseek.com/zh-cn/
*/
@Bean(name = "deepseek")
public ChatModel chatModelDeepSeek() {
return
OpenAiChatModel.builder()
.apiKey(System.getenv("deepseek_api"))
.modelName("deepseek-chat")
//.modelName("deepseek-reasoner")
.baseUrl("https://api.deepseek.com/v1")
.build();
} @Bean(name = "deepseekAssistant")
public ChatAssistantDeepSeek chatAssistantDeepSeek(@Qualifier("deepseek") ChatModel chatModelDeepSeek) {
return AiServices.create(ChatAssistantDeepSeek.class, chatModelDeepSeek);
}
}
  1. 编写操作两大,大模型的 Controller 类,使用我们自己编写的接口类操作大模型。

操作访问通义千问。


import com.rainbowsea.langchain4jbootintegration.service.ChatAssistantDeepSeek;
import com.rainbowsea.langchain4jbootintegration.service.ChatAssistantQwen;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController; /**
* @Description: https://docs.langchain4j.dev/tutorials/spring-boot-integration
*/
@RestController
@Slf4j
public class DeclarativeAIServiceController
{
@Resource(name = "qwenAssistant")
private ChatAssistantQwen chatAssistantQwen; // http://localhost:9008/chatapi/highapi
@GetMapping(value = "/chatapi/highapi")
public String highApi(@RequestParam(value = "prompt", defaultValue = "你是谁") String prompt)
{
return chatAssistantQwen.chat(prompt);
} }

操作访问 DeepSeek

package com.rainbowsea.langchain4jbootintegration.controller;

import com.rainbowsea.langchain4jbootintegration.service.ChatAssistantDeepSeek;
import com.rainbowsea.langchain4jbootintegration.service.ChatAssistantQwen;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController; /**
* @Description: https://docs.langchain4j.dev/tutorials/spring-boot-integration
*/
@RestController
@Slf4j
public class DeclarativeAIServiceController
{ @Resource(name = "deepseekAssistant")
private ChatAssistantDeepSeek chatAssistantDeepSeek; // http://localhost:9008/chatapi/highapi02
@GetMapping(value = "/chatapi/highapi02")
public String highApi02(@RequestParam(value = "prompt", defaultValue = "你是谁") String prompt)
{
return chatAssistantDeepSeek.chat(prompt);
}
}

最后:

“在这个最后的篇章中,我要表达我对每一位读者的感激之情。你们的关注和回复是我创作的动力源泉,我从你们身上吸取了无尽的灵感与勇气。我会将你们的鼓励留在心底,继续在其他的领域奋斗。感谢你们,我们总会在某个时刻再次相遇。”

9. LangChain4j + 整合 Spring Boot的更多相关文章

  1. Spring Kafka整合Spring Boot创建生产者客户端案例

    每天学习一点点 编程PDF电子书.视频教程免费下载:http://www.shitanlife.com/code 创建一个kafka-producer-master的maven工程.整个项目结构如下: ...

  2. Security整合spring boot

    Security整合spring boot 1.基础概念 Spring Security是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架.它提供了一组可以在Spri ...

  3. idea整合 spring boot jsp mybatis

    spring  boot  开发起来确实要简单许多 ,spring boot  包含了 spring mvc ;内置tomcat   ;启动只需要主方法即可 1.使用idea新建一个spring bo ...

  4. 面试官:小伙子,你给我简单说一下RocketMQ 整合 Spring Boot吧

    前言 在使用SpringBoot的starter集成包时,要特别注意版本.因为SpringBoot集成RocketMQ的starter依赖是由Spring社区提供的,目前正在快速迭代的过程当中,不同版 ...

  5. 整合spring boot时操作数据库时报错Caused by: java.lang.InstantiationException: tk.mybatis.mapper.provider.base.B

    原文:https://blog.csdn.net/u__f_o/article/details/82756701 一般出现这种情况,应该是没有扫描到对应的mapper包,即在启动类下配置MapperS ...

  6. Echarts整合spring boot进行开发

    一.开始前的准备 Echarts官网下载: https://echarts.baidu.com/download.html

  7. Spring Kafka和Spring Boot整合实现消息发送与消费简单案例

    本文主要分享下Spring Boot和Spring Kafka如何配置整合,实现发送和接收来自Spring Kafka的消息. 先前我已经分享了Kafka的基本介绍与集群环境搭建方法.关于Kafka的 ...

  8. Spring boot整合Mybatis

    时隔两个月的再来写博客的感觉怎么样呢,只能用“棒”来形容了.闲话少说,直接入正题,之前的博客中有说过,将spring与mybatis整个后开发会更爽,基于现在springboot已经成为整个业界开发主 ...

  9. spring boot 整合freemaker

    前端最好使用vue.js 这里是freemaker 整合spring boot 1.编写pom文件: <dependencies> <dependency> <group ...

  10. spring boot 与 Mybatis整合(*)

    在pom.xml文件中加入数据库.spring-mybatis整合 <!-- spring boot 整合mybatis --> <dependency> <groupI ...

随机推荐

  1. 自学stm32,需要会到什么程度能找到一份工作?

    自学STM32,需要会到什么程度能找到一份工作?一个十年老兵的真心话 前言:一个改变命运的选择 每次有人问我"自学STM32到什么程度能找工作"这个问题,我都会想起十年前那个迷茫的 ...

  2. Windows 系统 局域网文件夹共享无法访问的终极解决方法

    先介绍 Win10 无法访问其他电脑的解决方法 首先,Win10 能成功访问共享文件夹,必须有安装 SMB1 协议,否则会提示找不到网络名称的提示. 方法很简单,点击 微软小娜 Cortana 输入  ...

  3. macos安装三方windows镜像

    intel芯 m芯片貌似不支持windows系统,甚至以虚拟机的方式安装支持都不算友好! 准备好鼠标 在windows安装界面 或 首次进入系统时,此时因尚未驱动,macbook笔记本自带的键盘和触摸 ...

  4. 安装Microsoft Visio 2016,激活的报错

    Microsoft Visio 2016安装激活教程 我在安装序列号的时候出现了报错. The Software Licensing Service reported that the product ...

  5. 5分钟带你搞懂从0打造一个ChatGPT

    前言 欧阳上一次写文章还是4个月前,之所以断更有两个原因:换工作和业余时间ALL IN AI了.不管你是否承认,AI时代已经来了,依然埋头研究前端的那一亩三分地和源码在未来可能就是蒸汽时代被淘汰的纺织 ...

  6. 记录React echart demo实践

    最近在了解学习React,找了个demo Echarts-based-on-React:基于react技术栈,使用Echarts,实现地图深钻.柱状图.折线图.散点图 Echarts-based-on ...

  7. 一个遵循 Material Design 设计规范、开源免费的 Blazor 组件库

    前言 今天大姚给大家分享一个遵循 Material Design 设计规范.开源免费(MIT License)的 Blazor 组件库:MASA Blazor. Blazor 介绍 Blazor 是基 ...

  8. 谷云科技发布业内首份 Oracle OSB 迁移到 iPaaS 技术白皮书

    随着企业数字化转型的加速推进,从传统企业服务总线ESB向现代化集成平台iPaaS迁移已成为行业发展的必然趋势.Oracle Service Bus(OSB)在ESB产品市场中长期以来一直占据着较高的市 ...

  9. iPaaS平台是什么?通过IDC报告推荐iPaaS排名靠前厂商!

    一.什么是iPaaS平台? iPaaS(Integration Platform as a Service)即集成平台即服务,是一种基于云计算的集成解决方案,旨在帮助企业实现不同系统.应用程序.数据源 ...

  10. ETLCloud+Doris组合:数据集成,更简单更高效

    在现代数据驱动的业务环境中,高效的数据集成与处理是企业成功的关键.随着数据量的快速增长和多样化需求的增加,传统的数据处理工具已经无法满足企业的需求.ETLCloud与Doris的组合为企业提供了一种简 ...