找回密码
 立即注册
首页 业界区 业界 9. LangChain4j + 整合 Spring Boot

9. LangChain4j + 整合 Spring Boot

摹熹 5 小时前
9. LangChain4j + 整合 Spring Boot

@
目录

  • 9. LangChain4j + 整合 Spring Boot

    • LangChain4j + 整合 Spring Boot 实操

  • 最后:

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

浅谈—下:LangChain4j twolevels of abstraction
2.png

低阶 APi 和 高阶 API
3.png

4.png

Spring Boot整合底阶API所需POM:
5.png
  1. <dependency>
  2.     <groupId>dev.langchain4j</groupId>
  3.     langchain4j-open-ai-spring-boot-starter</artifactId>
  4.     <version>1.2.0-beta8</version>
  5. </dependency>
复制代码
  1. langchain4j.open-ai.chat-model.api-key=${OPENAI_API_KEY}
  2. langchain4j.open-ai.chat-model.model-name=gpt-4o
  3. langchain4j.open-ai.chat-model.log-requests=true
  4. langchain4j.open-ai.chat-model.log-responses=true
  5. ...
复制代码
Spring Boot整合高阶API所需POM:
6.png

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

LangChain4J 原生整合:
8.png

LangChain4J + Spring Boot 整合:
9.png

10.png

小总结:
11.png

LangChain4j + 整合 Spring Boot 实操


  • 创建对应项目的 module 模块内容:
  • 导入相关的 pom.xml 的依赖,这里我们采用流式输出的方式,导入 整合 Spring Boot ,`langchain4j-open-ai-spring-boot-starter,langchain4j-spring-boot-starter 这里我们不指定版本,而是通过继承的 pom.xml 当中获取。
12.png
  1.         <dependency>
  2.             <groupId>org.springframework.boot</groupId>
  3.             spring-boot-starter-web</artifactId>
  4.         </dependency>
  5.         
  6.         
  7.         <dependency>
  8.             <groupId>dev.langchain4j</groupId>
  9.             langchain4j-open-ai-spring-boot-starter</artifactId>
  10.         </dependency>
  11.         
  12.         <dependency>
  13.             <groupId>dev.langchain4j</groupId>
  14.             langchain4j-spring-boot-starter</artifactId>
  15.         </dependency>
复制代码

  • 设置 applcation.yaml / properties 配置文件,其中指明我们的输出响应的编码格式,因为如果不指定的话,存在返回的中文,就是乱码了。
  1. server.port=9008
  2. spring.application.name=langchain4j-08boot-integration
  3. # 设置响应的字符编码,避免流式返回输出乱码
  4. server.servlet.encoding.charset=utf-8
  5. server.servlet.encoding.enabled=true
  6. server.servlet.encoding.force=true
  7. # https://docs.langchain4j.dev/tutorials/spring-boot-integration
  8. #langchain4j.open-ai.chat-model.api-key=${aliQwen-api}
  9. #langchain4j.open-ai.chat-model.model-name=qwen-plus
  10. #langchain4j.open-ai.chat-model.base-url=https://dashscope.aliyuncs.com/compatible-mode/v1
  11. # 大模型调用不可以明文配置,你如何解决该问题
  12. # 1 yml:                ${aliQwen-api},从环境变量读取
  13. # 2 config配置类:      System.getenv("aliQwen-api")从环境变量读取
复制代码

  • 编写大模型三件套(大模型 key,大模型 name,大模型 url) 三件套的大模型配置类。
这里我们测试操作两个大模型:DeepSeek,通义千问。
13.png
  1. import com.rainbowsea.langchain4jbootintegration.service.ChatAssistantQwen;
  2. import com.rainbowsea.langchain4jbootintegration.service.ChatAssistantDeepSeek;
  3. import dev.langchain4j.model.chat.ChatModel;
  4. import dev.langchain4j.model.openai.OpenAiChatModel;
  5. import dev.langchain4j.service.AiServices;
  6. import org.springframework.beans.factory.annotation.Qualifier;
  7. import org.springframework.context.annotation.Bean;
  8. import org.springframework.context.annotation.Configuration;
  9. /**
  10. * @Description: 知识出处 https://docs.langchain4j.dev/get-started
  11. */
  12. @Configuration
  13. public class LLMConfig {
  14.     @Bean(name = "qwen")
  15.     public ChatModel chatModelQwen() {
  16.         return OpenAiChatModel.builder()
  17.                 .apiKey(System.getenv("aliQwen_api"))
  18.                 .modelName("qwen-plus")
  19.                 .baseUrl("https://dashscope.aliyuncs.com/compatible-mode/v1")
  20.                 .build();
  21.     }
  22.     /**
  23.      * @Description: 知识出处,https://api-docs.deepseek.com/zh-cn/
  24.      */
  25.     @Bean(name = "deepseek")
  26.     public ChatModel chatModelDeepSeek() {
  27.         return
  28.                 OpenAiChatModel.builder()
  29.                         .apiKey(System.getenv("deepseek_api"))
  30.                         .modelName("deepseek-chat")
  31.                         //.modelName("deepseek-reasoner")
  32.                         .baseUrl("https://api.deepseek.com/v1")
  33.                         .build();
  34.     }
  35. }
复制代码

  • 编写我们操作两个大模型的将接口类,同时通过在我们的配置类上 + 通过 @AiService 进行一个对接口的实现。
@AiService 注解的源码如下:
14.png
  1. //
  2. // Source code recreated from a .class file by IntelliJ IDEA
  3. // (powered by FernFlower decompiler)
  4. //
  5. package dev.langchain4j.service.spring;
  6. import java.lang.annotation.ElementType;
  7. import java.lang.annotation.Retention;
  8. import java.lang.annotation.RetentionPolicy;
  9. import java.lang.annotation.Target;
  10. import org.springframework.stereotype.Service;
  11. @Service
  12. @Target({ElementType.TYPE})
  13. @Retention(RetentionPolicy.RUNTIME)
  14. public @interface AiService {
  15.     AiServiceWiringMode wiringMode() default AiServiceWiringMode.AUTOMATIC;
  16.     String chatModel() default "";
  17.     String streamingChatModel() default "";
  18.     String chatMemory() default "";
  19.     String chatMemoryProvider() default "";
  20.     String contentRetriever() default "";
  21.     String retrievalAugmentor() default "";
  22.     String moderationModel() default "";
  23.     String[] tools() default {};
  24. }
复制代码
15.png
  1. package com.rainbowsea.langchain4jbootintegration.service;
  2. import dev.langchain4j.service.spring.AiService;
  3. import static dev.langchain4j.service.spring.AiServiceWiringMode.EXPLICIT;
  4. /**
  5. */
  6. @AiService(wiringMode = EXPLICIT, chatModel = "qwen")
  7. public interface ChatAssistantQwen
  8. {
  9.     String chat(String prompt);
  10. }
复制代码
16.png
  1. import com.rainbowsea.langchain4jbootintegration.service.ChatAssistantQwen;
  2. import com.rainbowsea.langchain4jbootintegration.service.ChatAssistantDeepSeek;
  3. import dev.langchain4j.model.chat.ChatModel;
  4. import dev.langchain4j.model.openai.OpenAiChatModel;
  5. import dev.langchain4j.service.AiServices;
  6. import org.springframework.beans.factory.annotation.Qualifier;
  7. import org.springframework.context.annotation.Bean;
  8. import org.springframework.context.annotation.Configuration;
  9. /**
  10. * @Description: 知识出处 https://docs.langchain4j.dev/get-started
  11. */
  12. @Configuration
  13. public class LLMConfig {
  14.     @Bean(name = "qwen")
  15.     public ChatModel chatModelQwen() {
  16.         return OpenAiChatModel.builder()
  17.                 .apiKey(System.getenv("aliQwen_api"))
  18.                 .modelName("qwen-plus")
  19.                 .baseUrl("https://dashscope.aliyuncs.com/compatible-mode/v1")
  20.                 .build();
  21.     }
  22.     // 你使用第2种类,高阶API    AiService
  23.     @Bean(name = "qwenAssistant")
  24.     public ChatAssistantQwen chatAssistantQwen(@Qualifier("qwen") ChatModel chatModelQwen) {
  25.         return AiServices.create(ChatAssistantQwen.class, chatModelQwen);
  26.     }
  27. }
复制代码
同理我们添加上 DeepSeek 操作的接口类,以及对应大模型的实现类
17.png
  1. package com.rainbowsea.langchain4jbootintegration.service;
  2. import dev.langchain4j.service.spring.AiService;
  3. import static dev.langchain4j.service.spring.AiServiceWiringMode.EXPLICIT;
  4. /**
  5. */
  6. @AiService(wiringMode = EXPLICIT, chatModel = "deepseek")
  7. public interface ChatAssistantDeepSeek
  8. {
  9.     String chat(String prompt);
  10. }
复制代码
  1. package com.rainbowsea.langchain4jbootintegration.config;
  2. import com.rainbowsea.langchain4jbootintegration.service.ChatAssistantQwen;
  3. import com.rainbowsea.langchain4jbootintegration.service.ChatAssistantDeepSeek;
  4. import dev.langchain4j.model.chat.ChatModel;
  5. import dev.langchain4j.model.openai.OpenAiChatModel;
  6. import dev.langchain4j.service.AiServices;
  7. import org.springframework.beans.factory.annotation.Qualifier;
  8. import org.springframework.context.annotation.Bean;
  9. import org.springframework.context.annotation.Configuration;
  10. /**
  11. * @Description: 知识出处 https://docs.langchain4j.dev/get-started
  12. */
  13. @Configuration
  14. public class LLMConfig {
  15.     /**
  16.      * @Description: 知识出处,https://api-docs.deepseek.com/zh-cn/
  17.      */
  18.     @Bean(name = "deepseek")
  19.     public ChatModel chatModelDeepSeek() {
  20.         return
  21.                 OpenAiChatModel.builder()
  22.                         .apiKey(System.getenv("deepseek_api"))
  23.                         .modelName("deepseek-chat")
  24.                         //.modelName("deepseek-reasoner")
  25.                         .baseUrl("https://api.deepseek.com/v1")
  26.                         .build();
  27.     }
  28.     @Bean(name = "deepseekAssistant")
  29.     public ChatAssistantDeepSeek chatAssistantDeepSeek(@Qualifier("deepseek") ChatModel chatModelDeepSeek) {
  30.         return AiServices.create(ChatAssistantDeepSeek.class, chatModelDeepSeek);
  31.     }
  32. }
复制代码
DeepSeek + 通义千问
  1. package com.rainbowsea.langchain4jbootintegration.config;
  2. import com.rainbowsea.langchain4jbootintegration.service.ChatAssistantQwen;
  3. import com.rainbowsea.langchain4jbootintegration.service.ChatAssistantDeepSeek;
  4. import dev.langchain4j.model.chat.ChatModel;
  5. import dev.langchain4j.model.openai.OpenAiChatModel;
  6. import dev.langchain4j.service.AiServices;
  7. import org.springframework.beans.factory.annotation.Qualifier;
  8. import org.springframework.context.annotation.Bean;
  9. import org.springframework.context.annotation.Configuration;
  10. /**
  11. * @Description: 知识出处 https://docs.langchain4j.dev/get-started
  12. */
  13. @Configuration
  14. public class LLMConfig {
  15.     @Bean(name = "qwen")
  16.     public ChatModel chatModelQwen() {
  17.         return OpenAiChatModel.builder()
  18.                 .apiKey(System.getenv("aliQwen_api"))
  19.                 .modelName("qwen-plus")
  20.                 .baseUrl("https://dashscope.aliyuncs.com/compatible-mode/v1")
  21.                 .build();
  22.     }
  23.     // 你使用第2种类,高阶API    AiService
  24.     @Bean(name = "qwenAssistant")
  25.     public ChatAssistantQwen chatAssistantQwen(@Qualifier("qwen") ChatModel chatModelQwen) {
  26.         return AiServices.create(ChatAssistantQwen.class, chatModelQwen);
  27.     }
  28.     /**
  29.      * @Description: 知识出处,https://api-docs.deepseek.com/zh-cn/
  30.      */
  31.     @Bean(name = "deepseek")
  32.     public ChatModel chatModelDeepSeek() {
  33.         return
  34.                 OpenAiChatModel.builder()
  35.                         .apiKey(System.getenv("deepseek_api"))
  36.                         .modelName("deepseek-chat")
  37.                         //.modelName("deepseek-reasoner")
  38.                         .baseUrl("https://api.deepseek.com/v1")
  39.                         .build();
  40.     }
  41.     @Bean(name = "deepseekAssistant")
  42.     public ChatAssistantDeepSeek chatAssistantDeepSeek(@Qualifier("deepseek") ChatModel chatModelDeepSeek) {
  43.         return AiServices.create(ChatAssistantDeepSeek.class, chatModelDeepSeek);
  44.     }
  45. }
复制代码

  • 编写操作两大,大模型的 Controller 类,使用我们自己编写的接口类操作大模型。
操作访问通义千问。
18.png
  1. import com.rainbowsea.langchain4jbootintegration.service.ChatAssistantDeepSeek;
  2. import com.rainbowsea.langchain4jbootintegration.service.ChatAssistantQwen;
  3. import jakarta.annotation.Resource;
  4. import lombok.extern.slf4j.Slf4j;
  5. import org.springframework.web.bind.annotation.GetMapping;
  6. import org.springframework.web.bind.annotation.RequestParam;
  7. import org.springframework.web.bind.annotation.RestController;
  8. /**
  9. * @Description: https://docs.langchain4j.dev/tutorials/spring-boot-integration
  10. */
  11. @RestController
  12. @Slf4j
  13. public class DeclarativeAIServiceController
  14. {
  15.     @Resource(name = "qwenAssistant")
  16.     private ChatAssistantQwen chatAssistantQwen;
  17.     // http://localhost:9008/chatapi/highapi
  18.     @GetMapping(value = "/chatapi/highapi")
  19.     public String highApi(@RequestParam(value = "prompt", defaultValue = "你是谁") String prompt)
  20.     {
  21.         return chatAssistantQwen.chat(prompt);
  22.     }
  23. }
复制代码
19.png

操作访问 DeepSeek
20.png
  1. package com.rainbowsea.langchain4jbootintegration.controller;
  2. import com.rainbowsea.langchain4jbootintegration.service.ChatAssistantDeepSeek;
  3. import com.rainbowsea.langchain4jbootintegration.service.ChatAssistantQwen;
  4. import jakarta.annotation.Resource;
  5. import lombok.extern.slf4j.Slf4j;
  6. import org.springframework.web.bind.annotation.GetMapping;
  7. import org.springframework.web.bind.annotation.RequestParam;
  8. import org.springframework.web.bind.annotation.RestController;
  9. /**
  10. * @Description: https://docs.langchain4j.dev/tutorials/spring-boot-integration
  11. */
  12. @RestController
  13. @Slf4j
  14. public class DeclarativeAIServiceController
  15. {
  16.    
  17.     @Resource(name = "deepseekAssistant")
  18.     private ChatAssistantDeepSeek chatAssistantDeepSeek;
  19.     // http://localhost:9008/chatapi/highapi02
  20.     @GetMapping(value = "/chatapi/highapi02")
  21.     public String highApi02(@RequestParam(value = "prompt", defaultValue = "你是谁") String prompt)
  22.     {
  23.         return chatAssistantDeepSeek.chat(prompt);
  24.     }
  25. }
复制代码
21.png

最后:

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


来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

相关推荐

您需要登录后才可以回帖 登录 | 立即注册