Spring AI实现用户意图识别和功能模块智能调用

1. 引言

随着人工智能技术的发展,自然语言处理(NLP)在各类智能系统中得到了广泛应用。其中,用户意图识别是构建智能交互系统的关键步骤之一,它决定了系统如何响应用户的请求。传统的系统开发通常依赖于硬编码的规则或有限的模式匹配,难以适应不断变化的用户需求和功能场景。

本系统基于 Spring AI 框架,结合 Java 编程语言,提出一种基于 注册中心机制 的用户意图识别与功能模块智能调用方案。该方案通过动态注册功能模块,利用大语言模型(LLM)进行意图识别,并根据识别结果自动调用相应的功能服务,从而提升系统的智能性与可维护性。

2. 框架设计与实现

2.1 框架架构

本框架采用 类MVC发的分层架构设计,主要包括以下几个模块:

  • 系统对外接口(对应MVC中的Controller和View之间):用户接受用户请求和响应系统处理结果。

  • 功能调用层(对应MVC中的Controller层):用户意图识别,并通过用户意图推断该调用的系统已注册的功能。

  • 功能实现层(对应MVC架构中的service层):实际的系统功能模块实现,可将这层的功能实现继续通过AI大模型进行智能化适配,如:通过大模型推断用户请求转化成系统内的实体对象进行进一步的使用等高级用法。

  • 注册中心:保存系统功能模块信息,提供动态注册,实现框架的高拓展性和代码重用率。

系统总体结构如下图所示:

2.1.1 系统对外接口

由于用户的意图判断和系统内的功能调用交给大语言模型(LLM)处理,当前解决方案中只有一个REST API暴露,极大的简化了用户的交互难度和流程,只需要将用户需求作为请求参数发起GET请求,后端就会自行处理。

传统的spring boot应用一般会设置众多的REST API进行功能划分,将不同的功能划分给不同的API处理,系统运行准确无误,而我提出的解决方案中,将后端spring boot的接口削减到只剩唯一一个,而且调用方式更加宽泛,前端调用是仅需要发送用户需求即可,极大降低了API的数量,便于提高开发效率。

核心实现代码如下

 /**
  * 系统唯一Web Controller,用于接收用户输入并调用对应功能
  */
 @RestController
 public class SwitchController {
     
     // 功能调用服务对象
     private final FunctionService functionService;
     
     public SwitchController(FunctionService functionService) {
         this.functionService = functionService;
     }
     
     /**
      * 系统唯一REST API处理,实现仅一个API和一个参数就能调用系统全部功能模块
      * @param query 用户输入
      * @return 处理结果
      */
     @GetMapping("/function/query")
     public String query(String query) {
         return functionService.processQuery(query);
     }
 }

通过将用户需求传递到下层,减少了本层的代码量。

2.1.2 注册中心

注册中心是我的这套框架最精髓的设计,通过注册中心存储系统的功能模块,对功能模块进行统一管理和统一调用。并且注册中心以spring单例的形式存在,确保注册中心的唯一性和全局性。

在注册中心内有两个Map集合,一个用于存储功能方法Map<String, Function<String, String>> functions,另一个用于存放具体功能模块的描述Map<String, String> description

核心代码如下:

/**
  * 注册中心
  */
 @Component
 public class FunctionRegister {
     
     /// function
     private final Map<String, Function<String, String>> functions;
     /// function description
     private final Map<String, String> descriptions;
     
     public FunctionRegister() {
         functions = new HashMap<>();
         descriptions = new HashMap<>();
     }
     
     /**
      * 向注册中心注册一个方法
      * @param name 功能名称
      * @param description 功能描述
      * @param function 功能方法
      * @return 是否注册成功
      */
     public boolean register(String name, String description, Function<String, String> function) {
         if (functions.containsKey(name)) return false;
         functions.put(name, function);
         descriptions.put(name, description);
         return true;
     }
     
     /**
      * 根据功能名称调用对应的方法
      * @param operation 要调用的功能的名称
      * @param message 用户输入信息
      * @return 方法执行结果
      */
     public String invoke(String operation, String message) {
         Function<String, String> function = functions.get(operation);
         if (function != null) {
             return function.apply(message);
         }
         return "未找到对应的功能";
     }
     
     /**
      * 获取功能方法描述的markdown列表
      * @return 以markdown语法中列表的格式返回方法功能描述字符串
      */
     public String getFunctionListDescriptions() {
         StringBuilder sb = new StringBuilder();
         descriptions.forEach((key, value) ->
                 sb.append("- ").append(key).append(": ").append(value).append("\n"));
         return sb.toString();
     }
 }

通过注册中心,可以实现不修改原有逻辑的情况下的系统功能拓展,确保系统的高拓展性和可用性,极大程度提高代码重用率。

2.1.3 用户意图识别和功能调用层

该层的核心功能依赖王冲构建的“融合敏感词规则和字符级RCNN的双层意图识别模型。”1

在大语言模型的加成下实现用户意图识别,将识别出来的用户意图用于对系统内的功能模块进行调用。简化开发步骤并提高系统内智能程度。

功能调用核心代码实现如下:

 /**
  * 对接controller层的分发调用的service服务
  */
 @Service
 public class FunctionService {
     
     // 调用ai的对象
     private final ChatClient client;
     // 注册中心
     private final FunctionRegister functionRegister;
     
     public FunctionService(
             ChatClient.Builder builder,
             FunctionRegister functionRegister) {
         this.functionRegister = functionRegister;
         this.client = builder
 //                .defaultSystem("""
 //                此处可用于向AI介绍系统功能
 //                """)
                 .defaultAdvisors(new MessageChatMemoryAdvisor(new InMemoryChatMemory()))
                 .defaultAdvisors(new SimpleLoggerAdvisor())
                 .defaultOptions(DashScopeChatOptions.builder().withTopP(0.5).build())
                 .build();
     }
     
     /**
      * 响应用户输入信息对应的系统执行结果
      * @param query 用户输入信息
      * @return 系统执行结果
      */
     public String processQuery(String query) {
         // 根据用户输入和功能注册时的描述,借助大语言模型推断用户需求类型和应该调用的方法
         String operation = client
                 .prompt(query)
                 .system("""
                     根据用户输入推断用户意图,当前系统支持的意图如下:
                     %s
                     如果用户输入不在当前系统功能内则返回“其他”
                     """.formatted(functionRegister.getFunctionListDescriptions()))
                 .call()
                 .content();
         
         // 根据用户意图智能选择需要调用功能
         return (!"其他".equals(operation)) ?
                 functionRegister.invoke(operation, query) :
                 client.prompt(query)
                         .system("用户发送的需求当前系统不支持,请告知用户。")
                         .call()
                         .content();
     }
 }

让用户意图识别推断的部分交给AI,在知道用户意图后将要调用的功能和用户原需求传递给注册中心的调用方法,实现系统功能智能调用。

2.1.4 系统功能模块实现

在了解了调用机制后可以进行具体的功能模块开发,在编写service时将用户的需求进行处理,返回处理结果,以下是一个简单的实现示例:

     // 模拟支付功能的示例方法
     public String pay(String message) {
         // 模拟的功能内,调用AI进行支付功能模拟
         return client.prompt(message)
                 .system("""
                         模拟支付功能,告诉用户是否支付成功,当前系统模拟的支付成功率为90%。""")
                 .call()
                 .content();
     }

将用户需求处理完后,返回处理结果。

但写完这个方法后需要在构造方法中添加该方法的注册,即添加以下一行:

 functionRegister.register("pay", "根据用户输入的额度,调用支付接口", this::pay);

注意:

在编写时确保在构造方法中注入了注册中心对象functionRegister

当前方法仅作为演示的模拟,在实际业务场景中请尽可能向AI描述清楚要注册的方法的功能,提高识别准确率。

3. 框架特点与优势

3.1 动态注册功能模块

本框架支持功能模块的动态注册,开发者只需在服务类中通过 FunctionRegister 注册功能,即可被系统识别和调用,无需修改核心逻辑。

3.2 智能意图识别

利用 Spring AI 框架 提供的 大语言模型(LLM),系统能够对用户的自然语言输入进行意图识别,判断其是否属于已注册的功能模块。这提升了系统的智能化水平和用户体验。

3.3 代码简洁性与可维护性

  • 采用模块化设计,便于后续功能扩展。

  • 通过统一的注册中心管理功能模块,提升代码复用性和可维护性。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值