所有文章 > 日积月累 > Java 接口文档大模型:实现高效的多模型调用
Java 接口文档大模型:实现高效的多模型调用

Java 接口文档大模型:实现高效的多模型调用

在现代互联网应用中,人工智能模型的使用已经变得越来越普遍。然而,由于合规性和技术限制,在国内使用国外大模型如 ChatGPT 可能存在诸多问题。因此,我们需要转而对接国内已备案的大模型,如讯飞星火、智谱 AI 等。然而,简单地将每个大模型对接为一个接口,不仅增加了开发和维护的复杂性,还会导致大量重复代码。为了克服这些挑战,我们可以采用工厂策略模式来实现多模型的高效对接。

业务流程概述

用户在网站中与 AI 进行对话的过程通常包括以下步骤:

  1. 用户输入消息并按下回车键。
  2. 建立 SSE(Server-Sent Events)连接。
  3. 发送请求并处理。
  4. 请求结束后关闭 SSE 连接。

在这些步骤中,最为重要的是如何处理请求,并无缝切换不同的大模型,以保证用户体验和系统的高效运行。

Java 接口文档大模型

处理请求的逻辑

在请求处理过程中,我们需要遵循以下步骤:

信息校验

  1. 判断是否使用付费模型:确保用户有相应的权限使用高级模型。
  2. 校验提问额度:确保用户在使用模型时没有超过提问限额。
  3. 检查敏感词:自建敏感词系统,通过 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;

   @ApiModelProperty(value = "对话机器人ID")
   private String robotModelId;

   @ApiModelProperty("最大 token 数量")
   private int maxTokens = 2048;

   @ApiModelProperty("密钥集合")
   private List apiKeys = new ArrayList();

   @ApiModelProperty("上下文消息")
   private List chatMessageList;

   @ApiModelProperty("请求路径")
   private String apiHost;

   @ApiModelProperty("SSE")
   private EventSourceListener eventSourceListener;

   @ApiModelProperty("上传图片")
   private List imageList;
}

工厂实现

@Service
@Slf4j
public class AiModelFactory {

   @Autowired
   private Map 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 = "https://example.com/api"; // 替换为实际的 API URL
private static final String API_KEY = "your_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

  1. 问:什么是工厂策略模式?

    • 答:工厂策略模式是设计模式中的一种,它通过工厂类和策略接口的结合,动态选择合适的算法或策略来处理问题,减少代码重复,提高系统的扩展性。
  2. 问:为什么需要对接多个大模型?

    • 答:对接多个大模型可以提高系统的灵活性和鲁棒性,不同模型在不同场景下有不同的优势,通过多模型对接,可以更好地满足用户需求。
  3. 问:如何确保接口调用的安全性?

    • 答:可以通过使用 HTTPS 协议、API Key、JWT 令牌等方式来保证接口调用的安全性,防止数据泄露和未经授权的访问。
  4. 问:什么是 SSE 连接?

    • 答:SSE(Server-Sent Events)是一种允许服务器向客户端推送更新的技术,通常用于实现实时数据更新,如股票行情、聊天消息等。
  5. 问:如何处理接口文档中的敏感词?

    • 答:可以通过自建敏感词系统,在发送请求前进行敏感词过滤,或者在响应后进行检查,确保对用户的输入和输出进行适当的处理。
#你可能也喜欢这些API文章!