策略与工厂模式应用



1.需求

● 最近在集成多家的大模型应用,不同的厂商的大模型各有区别。需针对厂商的模型分别判断,然后实现对接,完成相应的业务需求开发等。例如对openAi,minimax,千问集成,在开发中,会出现多次的if else 判断等场景,然后再到具体的实现逻辑。

2.技术方案

● 这里用策略与工厂模式及枚举来实现,针对每个大模型厂商列出枚举,根据枚举的路由到不同的具体实现

● 各厂商的秘钥,接入方式各有区别,根据枚举进行区分,分别实现接入逻辑等

● 在上下文应用时,采用工厂模式(Spring)+枚举

3.UML图

● 设计即实现。根据UML图来实现,同时便于看图知道背后的大致实现逻辑与流程。

4.代码实现逻辑

● controller层代码

@Operation(description = "大模型")
@RequestMapping(value = "/test", method = RequestMethod.POST)
public ResultVo<OpenAiResponseVO> getAiResult(@RequestBody @Valid OpenAiRequestVO request) {
    AiService strategy = AiServiceStrategyFactory.getByAiType(request.getAiType());
    return strategy.getAiResult(request);
}

● AiServiceStrategyFactory 工厂类的代码

● AiType aiType 枚举, AiService 是定义的接口

public class AiServiceStrategyFactory {

    private static Map<String, AiService> services = new ConcurrentHashMap<String,AiService>();

    public  static AiService getByAiType(String type){
        return services.get(type);
    }
    public static void register(String aiType,AiService aiService){
        Assert.notNull(aiType,"aiType can't be null");
        services.put(aiType,aiService);
    }
}

● AiService 接口

public interface AiService {

    /***
     * Ai大模型实现接口
     * @param request
     * @return
     */
    ResultVo getAiResult(OpenAiRequestVO request);

}

● openAi(azure)具体实现

@Slf4j
@Service
public class AzureOpenAiServiceImpl implements AiService, InitializingBean {


    @Override
    public ResultVo getAiResult(OpenAiRequestVO request) {
          // 省略......
        return null;
         
    }


     /***
     *  策略枚举封装
     * @throws Exception
     */
    @Override
    public void afterPropertiesSet() throws Exception {
        AiServiceStrategyFactory.register(AiTypeEnum.AZURE_OPEN_AI.getCode(), this);

    }
}

● minimax大模型具体实现

@Slf4j
@Service
public class MiniMaxAiServiceImpl implements AiService, InitializingBean {


    @Override
    public ResultVo getAiResult(OpenAiRequestVO request) {
         //  省略......
        return null;
         
    }


     /***
     *  策略枚举封装
     * @throws Exception
     */
    @Override
    public void afterPropertiesSet() throws Exception {
        AiServiceStrategyFactory.register(AiTypeEnum.AZURE_OPEN_AI.getCode(), this);

    }
   
}

5.测试效果

图片为:

● minimax

● openAi(azure)

6.归纳

● 这里主要是策略模式与枚举实现代码较多(没有贴出来),工厂模式采用的Spring

● 关于工厂类中的register方法,该方法会在spring容器启动初始化bean,即不同厂商的大模型的策略类完成后调用afterPropertiesSet方法里面调用register。容器启动完成后,spring容器中便有key:type,value: aiService策略类的map,对不同厂商大模型调用时,可以根据type来获取对应的策略类

● 在工厂类里面,策略存在map中,关于工厂类的实现,也可以通过反射方式实现。


文章作者: coderpwh
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 coderpwh !
  目录