当前位置: 首页 > news >正文

9. LangChain4j + 整合 Spring Boot

9. LangChain4j + 整合 Spring Boot

文章目录

  • 9. LangChain4j + 整合 Spring Boot
    • 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=9008spring.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() {returnOpenAiChatModel.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() {returnOpenAiChatModel.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() {returnOpenAiChatModel.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);}
}

最后:

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

在这里插入图片描述


文章转载自:

http://UqSvCxqU.pjbhk.cn
http://TYYq2TM5.pjbhk.cn
http://N9aS6uvr.pjbhk.cn
http://umWw4D3B.pjbhk.cn
http://5kQCEoYj.pjbhk.cn
http://8O02hSJJ.pjbhk.cn
http://L9YuHRxG.pjbhk.cn
http://vywdP7Hm.pjbhk.cn
http://rKppd0Kq.pjbhk.cn
http://CMyyOfcO.pjbhk.cn
http://0hgBVqH4.pjbhk.cn
http://J2lnBHXL.pjbhk.cn
http://dP4mZ6sW.pjbhk.cn
http://Tx0cgmXs.pjbhk.cn
http://ttBCc0FM.pjbhk.cn
http://fTYtU3w1.pjbhk.cn
http://gqZt53Cc.pjbhk.cn
http://mkZiCnJ0.pjbhk.cn
http://v4lQy8yl.pjbhk.cn
http://agbCY4m3.pjbhk.cn
http://D4eJneIo.pjbhk.cn
http://Xg01jg81.pjbhk.cn
http://0VmrBn95.pjbhk.cn
http://VVXM6NHh.pjbhk.cn
http://5wQPzgau.pjbhk.cn
http://aq3zppim.pjbhk.cn
http://Tip0OCNy.pjbhk.cn
http://ZEeE9nCP.pjbhk.cn
http://u9brtXiX.pjbhk.cn
http://xO7qkGfq.pjbhk.cn
http://www.dtcms.com/a/383103.html

相关文章:

  • 返利app的消息队列架构:基于RabbitMQ的异步通信与解耦实践
  • React Native架构革命:从Bridge到JSI性能飞跃
  • Qt---描述网络请求QNetworkRequest
  • XLua教程之Lua调用C#
  • 第七章:AI进阶之------条件语句(if-elif-else)(一)
  • 从希格斯玻色子到QPU:C++在高能物理与量子计算领域的跨界征程与深度融合
  • 二、vue3后台项目系列——安装相关依赖、项目常用辅助开发工具
  • Knockout.js 备忘录模块详解
  • VS2022下载+海康SDK环境配置实现实时预览
  • 前端基础 —— C / JavaScript基础语法
  • 手搓一个 DELL EMC Unity存储系统健康检查清单
  • 字节M3-Agent:如何实现一个支持多模态长期记忆与推理的Agent
  • TCL华星计划投建第8.6代印刷OLED产线
  • Qt学习:moc生成的元对象信息
  • Java—JDBC 和数据库连接池
  • 软件工程实践四:MyBatis-Plus 教程(连接、分页、查询)
  • 用 Go 快速上手 Protocol Buffers
  • Java Stream 流学习笔记
  • Linux线程id与简易封装线程实现
  • 公链分析报告 - Secret Network
  • JavaScript 简单链表题目试析
  • 【ZYNQ开发篇】Petalinux和电脑端的静态ip地址配置
  • 电商AI导购系统的模型部署架构:TensorFlow Serving在实时推荐中的实践
  • 光射三缝实验
  • K8s部署 Redis 主从集群
  • Android点击桌面图库应用启动流程trace分析
  • 【抗量子安全】全球视角下 PQC 与 QKD 技术洞察:政策引领与产业演进
  • 代码随想录学习摘抄day9(回溯1-11)
  • 数据处理指令
  • SpringBoot 中 ZK 与 Kafka 节点选择逻辑:底层原理与实践解析