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中,关于工厂类的实现,也可以通过反射方式实现。