SpringBoot集成LangChain4j(二)AiService进行功能增强

目录

介绍

AiService的作用

AiService使用方法

一、注解型

自动装配模式

自动组件装配的列表

手动装配模式

@AiService源码

二、装配型

结语


介绍

我们提出了另一种为 Java 量身定制的解决方案,称为 AI 服务。 其思想是将与 LLM 和其他组件交互的复杂性隐藏在简单的 API 后面。

AiService有两种使用方式,一种是注解型,一种装配型

AiService的作用

AI 服务处理最常见的操作:

  • 为 LLM 格式化输入

  • 解析 LLM 的输出

它们还支持更高级的功能:

  • 聊天记忆

  • 工具

  • RAG

这里我们先介绍如何使用@AiService,接下来的博客将逐一介绍相应的功能

AiService使用方法

项目结构如下

img

这里主要是需要使用config和service这两个包进行使用

一、注解型

自动装配模式

1.在Assistant接口下(接口名称可以修改)

/**
 * 整体增强接口
 */
@AiService
public interface Assistant {
​
    //普通聊天接口
    String chat(String question);
​
    //流式聊天接口
    Flux<String> steam(String message);
}

2.在AssistantConfiguartion配置类下(配置类名称可以修改)

@Configuration
public class AssistantConfiguration {
​
    @Bean
    ChatLanguageModel qwen() {
        return QwenChatModel.builder()
                .apiKey("YOUR_KEY")//这里修改为自己的api-key
                .modelName("qwen-max")
                .build();
    }
}

注:使用@AiService后最好不要使用配置文件的方式进行注入,而使用@Bean的方式进行模型的选择,可以更好的定制化系统

3.最后编写AiController的请求

@RestController
public class AiController {
​
    //注入assistant
    @Autowired
    Assistant assistant;
​
    /**
     * 普通返回接口
     */
    @GetMapping("/chat")
    public String getAi(@RequestParam String question){
        String answer= assistant.chat(question);
        return  answer;
    }
​
}

这样这个接口就可以对外使用了

自动组件装配的列表

这里补充一下可以自动装配的组件(在后面发布的博客将一一介绍)

如果以下组件在应用程序上下文中可用,它们将自动装配到 AI 服务中:

  • ChatLanguageModel:普通聊天LLM模型

  • StreamingChatLanguageModel:流式返回聊天模型

  • ChatMemory:聊天记忆

  • ChatMemoryProvider:聊天记忆隔离

  • ContentRetriever:内容检索器

  • RetrievalAugmentor:检索增强器

  • 任何 @Component@Service 类中带有 @Tool 注解的所有方法

手动装配模式

自动装配模式会将所有可装配的组件全部注入,那么就会有两个问题

  1. 多个相同类别的组件导致冲突,例如:我系统中想要使用两个模型,注入两个ChatLanguageModel会导致冲突问题

  2. 该接口不希望使用这个组件,但是由于自动注入的原因注入进去了

因此@AiService推出了手动装配功能

使用方式如下,还是以上面的项目结构为例子进行编写demo

1.编写AssistantConfiguration配置类

@Configuration
public class AssistantConfiguration {
​
    //@Bean中设置组件名称
    @Bean("qwen-max")
    ChatLanguageModel qwen() {
        return QwenChatModel.builder()
                .apiKey("YOUR_KEY")//这里修改为自己的api-key
                .modelName("qwen-max")
                .build();
    }
}

注:使@AiSerivce手动装配后不建议使用自动装配,可能会发生冲突

2.编写Assistant接口

//先设置装配类型为EXPLICIT根据对应的组件名称("qwen-max")和类型(chatModel)进行注入
@AiService(wiringMode = EXPLICIT,chatModel = "qwen-max")
public interface Assistant {
​
    String chat(String message);
​
}

3.最后编写AiController的请求

@RestController
public class AiController {
​
    //注入assistant
    @Autowired
    Assistant assistant;
​
    /**
     * 普通返回接口
     */
    @GetMapping("/chat")
    public String getAi(@RequestParam String question){
        String answer= assistant.chat(question);
        return  answer;
    }
​
}
​
@AiService源码
@Service//这里有service注释所以可以自动装配
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface AiService {
    //@AiService装配类型,默认是AUTOMATIC(自动装配),另一种就是EXPLICIT(手动装配)
    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 {};
}

二、装配型

1.编写Assistant接口

public interface Assistant {
​
    String chat(String message);
​
}

2.编写AssistantConfiguration配置类

@Configuration
public class AssistantConfiguration {

    /**
     * 增强方法的方式-->一个接口只能增强一次,多次增强会报错
     * @param chatLanguageModel
     * @param questionAnsweringModel
     * @return
     */
    @Bean
    Assistant Memorization(ChatLanguageModel chatLanguageModel, StreamingChatLanguageModel questionAnsweringModel){
        ChatMemory chatMemory= MessageWindowChatMemory.withMaxMessages(10);
        Assistant assistant= AiServices.builder(Assistant.class)
        .chatLanguageModel(chatLanguageModel)
        .streamingChatLanguageModel(questionAnsweringModel)
        .chatMemory(chatMemory)
        .build();
        return assistant;
    }

}

这里chatLanguageModel, questionAnsweringModel两个变量是使用了application.yml的配置,正常来说需要自行编写(编写方式和注解型一致)

例如:将chatLanguageModel替换为

QwenChatModel.builder()
                .apiKey("YOUR_KEY")//这里修改为自己的api-key
                .modelName("qwen-max")
                .build();

即可

3.最后编写AiController的请求(和注解型一样)

结语

这些博客均为博主学习过程中的一些学习心得,欢迎大家进行纠错,接下来会继续带来一些有关LangChain4j的相关内容,也在学习这方面的内容,如有希望交流可以添加QQ:2720289676

### 集成 LangChain4J 库到 Spring Boot 2 项目 为了在 Spring Boot 2 中集成 LangChain4J 库,需遵循一系列配置步骤来确保两者能够无缝协作。虽然官方文档可能未提供直接针对此组合的具体教程,但可以借鉴其他库的集成方式并应用于此场景。 #### 添加依赖项 首先,在 `pom.xml` 文件中加入 LangChain4J 的 Maven 依赖项。假设当前最新版本为 X.Y.Z: ```xml <dependency> <groupId>com.langchain4j</groupId> <artifactId>langchain4j-core</artifactId> <version>X.Y.Z</version> </dependency> ``` 请注意替换上述代码中的 `<version>` 值为实际发布的稳定版号[^1]。 #### 初始化配置类 创建一个新的 Java 类用于初始化 LangChain4J 组件和服务实例化逻辑。这通常涉及到设置必要的参数以及定义应用程序启动时所需的任何特定行为。 ```java @Configuration public class LangChainConfig { @Bean public ChainService chainService() { return new DefaultChainService(); } } ``` 这段简单的例子展示了如何通过 Spring 的 Bean 定义机制注册一个名为 `chainService` 的服务对象[^2]。 #### 控制器层实现 最后一步是在控制器层面编写业务逻辑处理程序,以便于接收 HTTP 请求并将它们转发给相应的 LangChain4J 方法执行具体操作。 ```java @RestController @RequestMapping("/api/langchains") public class LangChainController { private final ChainService chainService; public LangChainController(ChainService chainService) { this.chainService = chainService; } @PostMapping("/process") public ResponseEntity<String> processRequest(@RequestBody String inputJson) throws Exception { // 调用 LangChain4J 处理请求... String result = chainService.process(inputJson); return ResponseEntity.ok(result); } } ``` 以上是一个基本框架示例,可以根据项目的特殊需求进一步扩展和完善功能特性[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值