1 DeepSeek大模型

DeepSeek 是一家专注实现AGI的中国公司,如果你还想了解更多关于DeepSeek的信息,可以前往【官方网站】查询

2 集成DeepSeek大模型

2.1 获取API-KEY

获取DeepSeek API-KEY,请参考DeepSeek官网「获取DeepSeek API-KEY

在这里插入图片描述

2.2 集成对话模型(Chat Model)

public class DeepSeekChatModelServiceImpl implements ChatModelService {

    private final DeepSeekStorageProperties deepSeekStorageProperties;

    @Override
    public PlatformEnum getPlatform() {
        return PlatformEnum.DEEP_SEEK;
    }

    @Override
    public Flux<Result<ConversationReplyVO>> conversationStream(ConversationParam param) {
        return conversationStream(param, List.of());
    }

    @Override
    public Flux<Result<ConversationReplyVO>> conversationStream(ConversationParam param, List<ChatSessionRecordVO> contextMessageList) {
        OkHttpClient client = new OkHttpClient();
        MediaType mediaType = MediaType.get("application/json");
        ChatCompletionsParam reqBody = generateChatRequestBody(param, contextMessageList);

        Request request = new Request.Builder()
                .url(deepSeekStorageProperties.getChatUrl())
                .addHeader(SecurityConstant.AUTHORIZATION, "Bearer " + deepSeekStorageProperties.getToken())
                .post(RequestBody.create(JSONUtil.toJsonStr(reqBody), mediaType))
                .build();


        return Flux.create(emitter -> {
            EventSourceListener listener = new EventSourceListener() {
                @Override
                public void onOpen(@NotNull EventSource eventSource, @NotNull Response response) {
                    System.out.println("SSE connection opened");
                }

                @Override
                public void onClosed(@NotNull EventSource eventSource) {
                    emitter.complete();
                    System.out.println("SSE connection closed");
                }

                @Override
                public void onEvent(@NotNull EventSource eventSource, String id, String type, @NotNull String data) {
                    if (log.isDebugEnabled()) {
                        log.debug("data:{}", data);
                    }
                    if (StrUtil.isBlank(data) || DeepSeekContent.DONE.equalsIgnoreCase(data)) {
                        emitter.complete();
                        return;
                    }
                    ChatCompletionsResponse response = JSONUtil.toBean(data, ChatCompletionsResponse.class);
                    StringBuilder content = new StringBuilder();
                    for (ChatCompletionsResponse.ChoiceItem choice : response.getChoices()) {
                        content.append(choice.getDelta().getContent());
                    }
                    emitter.next(ResultWrapper.ok(ConversationReplyVO.builder().content(content.toString()).build()));
                }

                @Override
                public void onFailure(@NotNull EventSource eventSource, Throwable t, Response response) {
                    System.err.println("Error occurred: " + t);
                }
            };
            EventSource.Factory factory = EventSources.createFactory(client);
            factory.newEventSource(request, listener);
        });
    }

    private ChatCompletionsParam generateChatRequestBody(ConversationParam param, List<ChatSessionRecordVO> contextMessageList) {
        List<MessageItem> messages = new ArrayList<>();
        if (CollUtil.isNotEmpty(contextMessageList)) {
            for (ChatSessionRecordVO record : contextMessageList) {
                if (MessageTypeEnum.USER.equals(record.getMessageType())) {
                    messages.add(MessageItem.builder().role(MessageType.USER.getValue()).content(record.getContent()).build());
                    continue;
                }
                if (MessageTypeEnum.ASSISTANT.equals(record.getMessageType())) {
                    messages.add(MessageItem.builder().role(MessageType.ASSISTANT.getValue()).content(record.getContent()).build());
                }
            }
        }
        messages.add(MessageItem.builder().role(MessageType.USER.getValue()).content(param.getPrompt()).build());

        return ChatCompletionsParam.builder()
                .model(param.getModelCode())
                .messages(messages)
                .stream(Boolean.TRUE)
                .build();
    }

}

2.3 在线体验

3 项目体验

注:前端项目设计灵活,能够同时兼容后端的单体架构和微服务架构

4 相关文档

Logo

欢迎加入我们的广州开发者社区,与优秀的开发者共同成长!

更多推荐