Java 接口文档大模型:实现高效的多模型调用
在现代互联网应用中,人工智能模型的使用已经变得越来越普遍。然而,由于合规性和技术限制,在国内使用国外大模型如 ChatGPT 可能存在诸多问题。因此,我们需要转而对接国内已备案的大模型,如讯飞星火、智谱 AI 等。然而,简单地将每个大模型对接为一个接口,不仅增加了开发和维护的复杂性,还会导致大量重复代码。为了克服这些挑战,我们可以采用工厂策略模式来实现多模型的高效对接。
业务流程概述
用户在网站中与 AI 进行对话的过程通常包括以下步骤:
- 用户输入消息并按下回车键。
- 建立 SSE(Server-Sent Events)连接。
- 发送请求并处理。
- 请求结束后关闭 SSE 连接。
在这些步骤中,最为重要的是如何处理请求,并无缝切换不同的大模型,以保证用户体验和系统的高效运行。
处理请求的逻辑
在请求处理过程中,我们需要遵循以下步骤:
信息校验
- 判断是否使用付费模型: 确保用户有相应的权限使用高级模型。
- 校验提问额度: 确保用户在使用模型时没有超过提问限额。
- 检查敏感词: 自建敏感词系统,通过 SSE 通知用户检查到敏感内容,并在稍后进行调查。
获取模型 API Key
根据用户选择的模型获取相应的 API Key 列表,以确保请求可以正确发送到目标模型。
获取聊天记录
在处理新请求时,查看用户的历史聊天记录,以提供更准确的上下文信息。
构建对象并发送给策略工厂处理
策略工厂负责根据前期处理的信息,使用对应模型的 SDK 处理请求,并发送请求和响应。
策略工厂的实现
策略工厂的设计主要包括以下几个包:
- factory(工厂):
AiModelFactory
(工厂类)AiModelStrategy
(工厂策略接口)- strategy(工厂策略实现):
AmChatGptStrategy
(ChatGPT 策略实现)AmXfxhStrategy
(讯飞星火 策略实现)AmZhipuStrategy
(智谱 AI策略实现)AmWxyyStrategy
(文心一言 策略实现)
@Slf4j
public abstract class AiModelStrategy {
/**
* SSE 流式对话
*/
public abstract void contextStreamChat(AiModeChatParams aiModeChatParams);
}
AiModeChatParams
的实现如下:
@Data
@NoArgsConstructor
public class AiModeChatParams {
@ApiModelProperty("用户发送消息")
private String prompt;
@ApiModelProperty("会话 ID")
private String chatDialogueId;
@ApiModelProperty("模型选择")
private String chatModel = ChatCompletion.Model.GPT_3_5_TURBO_16K.getName();
@ApiModelProperty(value = "对话机器人ID")
private String robotModelId;
@ApiModelProperty("最大 token 数量")
private int maxTokens = 2048;
@ApiModelProperty("密钥集合")
private List<String> apiKeys = new ArrayList<>();
@ApiModelProperty("上下文消息")
private List<ChatMessage> chatMessageList;
@ApiModelProperty("请求路径")
private String apiHost;
@ApiModelProperty("SSE")
private EventSourceListener eventSourceListener;
@ApiModelProperty("上传图片")
private List<String> imageList;
}
工厂实现
@Service
@Slf4j
public class AiModelFactory {
@Autowired
private Map<String, AiModelStrategy> map = new ConcurrentHashMap<>();
public AiModelStrategy getStrategy(String componentName) {
LogPrintUtils.info(log, "进入外部产品工厂方法 : {}", componentName);
AiModelStrategy strategy = map.get(componentName);
if (strategy == null) {
strategy = map.get("stdNullStrategy");
}
LogPrintUtils.info(log, "带走了:{}", strategy);
return strategy;
}
}
策略实现
@Service
public class AmXfxhStrategy extends AiModelStrategy {
@Override
public void contextStreamChat(AiModeChatParams aiModeChatParams) {
// 构建参数
// 发送请求
}
}
通过这种设计,我们可以将各个大模型的请求构建和发送逻辑放入策略工厂中,减少代码重复,提高系统的可扩展性。
通过 HTTP 封装实现网络模型 API
在对接大模型时,接口文档是非常重要的参考资料。它描述了软件组件或系统中的接口,包括接口名称、方法、参数、返回值和异常等信息。通过接口文档,我们可以了解如何调用大模型的 API。
规范实现接口文档
以智谱 AI 的 GLM-4 模型为例,以下是通过 HTTP 调用该模型的示例代码:
private static final String API_URL = ""; // 替换为实际的 API URL
private static final String API_KEY = ""; // 填写您的 API Key
public static void main(String[] args) throws IOException {
OkHttpClient client = new OkHttpClient.Builder()
.connectTimeout(60, TimeUnit.SECONDS)
.writeTimeout(60, TimeUnit.SECONDS)
.readTimeout(60, TimeUnit.SECONDS)
.build();
JSONObject requestBodyJson = new JSONObject();
requestBodyJson.put("model", "glm-4-plus");
JSONArray messages = new JSONArray();
messages.put(new JSONObject().put("role", "system")
.put("content", "你是一个乐于解答各种问题的助手,你的任务是为用户提供专业、准确、有见地的建议。"));
messages.put(new JSONObject().put("role", "user")
.put("content", "如何实现重定向"));
requestBodyJson.put("messages", messages);
RequestBody body = RequestBody.create(
requestBodyJson.toString(),
MediaType.parse("application/json")
);
Request request = new Request.Builder()
.url(API_URL)
.addHeader("Authorization", "Bearer " + API_KEY)
.post(body)
.build();
try (Response response = client.newCall(request).execute()) {
if (!response.isSuccessful()) {
throw new IOException("Unexpected code " + response);
}
String responseBody = response.body().string();
JSONObject jsonResponse = new JSONObject(responseBody);
String assistantReply = jsonResponse.getJSONArray("choices")
.getJSONObject(0)
.getJSONObject("message")
.getString("content");
System.out.println(assistantReply);
}
}
通过以上代码,我们可以看到如何创建 HTTP 请求,发送请求并解析响应。
结论
通过工厂策略模式,我们能够高效地对接多家国内已备案的大模型,减少代码重复,提升系统的可扩展性。同时,通过规范的接口文档和 HTTP 调用,我们能够更好地实现大模型的功能应用。这种方法不仅适用于 AI大模型,也可以应用于其他需要多策略、多接口对接的场景。
FAQ
- 问:什么是工厂策略模式?
- 答:工厂策略模式是设计模式中的一种,它通过工厂类和策略接口的结合,动态选择合适的算法或策略来处理问题,减少代码重复,提高系统的扩展性。
- 问:为什么需要对接多个大模型?
- 答:对接多个大模型可以提高系统的灵活性和鲁棒性,不同模型在不同场景下有不同的优势,通过多模型对接,可以更好地满足用户需求。
- 问:如何确保接口调用的安全性?
- 问:什么是 SSE 连接?
- 答:SSE(Server-Sent Events)是一种允许服务器向客户端推送更新的技术,通常用于实现实时数据更新,如股票行情、聊天消息等。
- 问:如何处理接口文档中的敏感词?
- 答:可以通过自建敏感词系统,在发送请求前进行敏感词过滤,或者在响应后进行检查,确保对用户的输入和输出进行适当的处理。