SpringBoot 接入 豆包 火山方舟大模型

火山方舟控制台 开通模型推理、知识库 应用入口;

文档中心 各类接口说明及SDK 获取;

向量数据库VikingDB 文档 下翻找到有java操作案例;

实现目标功能效果:

  1. 通过SDK调用 豆包大模型,在代码内实现问答的效果
    官方示例

  2. 通过使用知识库,自己上传文档。让豆包大模型可以回答 你文档中的内容数据(即自定义属于你自己(自身业务领域)的大模型);

前置步骤:

  • 点击右上角头像处去创建 API 访问密钥;
  • 控制台内 模型推理 - 在线推理 创建一个推理接入点(按提示操作即可);
  • 控制台内 知识库 - 创建知识库;

代码

package com.example.demo.service.doubao;

import com.volcengine.ark.runtime.model.completion.chat.ChatCompletionRequest;
import com.volcengine.ark.runtime.model.completion.chat.ChatMessage;
import com.volcengine.ark.runtime.model.completion.chat.ChatMessageRole;
import com.volcengine.ark.runtime.service.ArkService;
import com.volcengine.auth.ISignerV4;
import com.volcengine.auth.impl.SignerV4Impl;
import com.volcengine.model.Credentials;
import com.volcengine.service.SignableRequest;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.HttpClient;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.utils.URIBuilder;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;

import java.util.ArrayList;
import java.util.List;

/**
 * @Author:wwf
 * @Package:com.example.demo.service
 * @Project:demo
 * @name:CreateArkClientExample
 * @Date:2024/11/28 15:32
 * @Filename:CreateArkClientExample
 */
public class CreateArkClientExample {

	//模型推理 - 在线推理 - API 调用 内查看获取
    private static final String API_KEY = "ea9fxxxxxxxxx49c";

    
    //这里获取 https://console.volcengine.com/iam/keymanage
    private static final String AK = "AKLTZDI2Yxxxxxxxxx2U2NGZmMzA";
    private static final String SK = "Tnpjd0xxxxxxxxxOa1pXRQ";


    public static void main(String[] args) throws Exception {
        // 以华北 2 (北京) 为例,<ARK_DOMAIN> 处应改为 ark.cn-beijing.volces.com
        ArkService service = ArkService.builder()
                .apiKey(API_KEY)
                .baseUrl("https://ark.cn-beijing.volces.com/api/v3")
                .build();
        System.out.println("
----- standard request -----");
        String host = "api-knowledgebase.mlp.cn-beijing.volces.com";
        String path = "/api/knowledge/collection/search_knowledge";
        String method = "POST";
        String body = "{"name":"wwfTest","query":"总结介绍下王清"}";

        SignableRequest request = prepareRequest(host, path, method, null, body, AK, SK);
        System.out.println(request.getURI());

        HttpClient client = HttpClients.createDefault();
        HttpResponse response = client.execute(request);
        int statusCode = response.getStatusLine().getStatusCode();
        String content = EntityUtils.toString(response.getEntity());
        System.out.println(statusCode);
        System.out.println(content);

        final List<ChatMessage> streamMessages = new ArrayList<>();
        final ChatMessage streamSystemMessage = ChatMessage.builder().role(ChatMessageRole.SYSTEM).content("你是豆包,是由字节跳动开发的 AI 人工智能助手")
                .content(content)
                .build();
        final ChatMessage streamUserMessage = ChatMessage.builder().role(ChatMessageRole.USER).content("总结介绍下王清").build();
        streamMessages.add(streamSystemMessage);
        streamMessages.add(streamUserMessage);

        ChatCompletionRequest streamChatCompletionRequest = ChatCompletionRequest.builder()
                .model("ep-20241128155250-zlbd8")
                //回调函数
//                .tools()
                .messages(streamMessages)
                .build();

        service.streamChatCompletion(streamChatCompletionRequest)
                .doOnError(Throwable::printStackTrace)
                .blockingForEach(
                        choice -> {
                            if (choice.getChoices().size() > 0) {
                                System.out.print(choice.getChoices().get(0).getMessage().getContent());
                            }
                        }
                );


        // shutdown service
        service.shutdownExecutor();
    }


    /**
     * 构建请求
     *
     * @param host
     * @param path
     * @param method
     * @param params
     * @param body
     * @param ak
     * @param sk
     * @return
     * @throws Exception
     */
    public static SignableRequest prepareRequest(String host, String path, String method, List<NameValuePair> params, String body, String ak, String sk) throws Exception {
        SignableRequest request = new SignableRequest();
        request.setMethod(method);
        request.setHeader("Accept", "application/json");
        request.setHeader("Content-Type", "application/json");
        request.setHeader("Host", "api-knowledgebase.mlp.cn-beijing.volces.com");
        request.setEntity(new StringEntity(body, "utf-8"));

        URIBuilder builder = request.getUriBuilder();
        builder.setScheme("https");
        builder.setHost(host);
        builder.setPath(path);
        if (params != null) {
            builder.setParameters(params);
        }

        RequestConfig requestConfig = RequestConfig.custom().setSocketTimeout(5000).setConnectTimeout(2000).build();
        request.setConfig(requestConfig);

        Credentials credentials = new Credentials("cn-north-1", "air");
        credentials.setAccessKeyID(ak);
        credentials.setSecretAccessKey(sk);

        // 签名
        ISignerV4 ISigner = new SignerV4Impl();
        ISigner.sign(request, credentials);

        return request;
    }
}

示例代码说明:

本人随意使用gpt 编写了一篇短片小说,通过平台内知识库,以文档形式上传进去。小说内有个人物叫 王清,于是问 豆包模型 介绍下王清的信息,此时 模型可以准确快速的响应 关于王清的信息;

,,,,,,,,,
本文为个人操作接入记录,官方文档示例还是比较全的。仅记录大致接入流程;

### Spring Boot 中集成豆包 SSE (Server-Sent Events) 在Spring Boot应用程序中实现服务器发送事件(SSE),可以采用如下方法: #### 使用 `SseEmitter` 实现 通过创建并返回一个 `SseEmitter` 对象来处理客户端连接请求。这允许服务器向浏览器推送更新而无需每次都需要新的HTTP请求。 ```java import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; import org.springframework.http.MediaType; import java.io.IOException; @RestController public class SseController { @GetMapping(value = "/streamFlux", produces = MediaType.TEXT_EVENT_STREAM_VALUE) public SseEmitter handleSse() { final var emitter = new SseEmitter(); // 设置超时时间,防止长时间不活跃被关闭 emitter.onCompletion(() -> System.out.println("Connection closed")); try { for(int i=0; i<10 ;i++) { Thread.sleep(1000); // 模拟延迟 emitter.send(String.valueOf(i)); } emitter.complete(); } catch(IOException e) { emitter.completeWithError(e); } return emitter; } } ``` 此代码片段展示了如何配置控制器以响应来自前端的订阅请求,并每隔一秒发送一次消息直到计数结束[^3]。 对于更复杂的场景,比如当数据源不是固定的而是动态变化时,则可能需要用到Reactor库中的 Flux 来简化异步编程模型下的流式传输操作。 #### 利用 WebFlux 和 Reactor 的 Flux 进行优化 如果希望进一步提升性能以及更好地管理资源,在现代Web应用开发中推荐使用基于反应式的框架如Spring WebFlux配合Reactor核心组件——`Flux<T>`来进行广播通知等功能扩展。 ```java import reactor.core.publisher.Flux; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; import org.springframework.http.MediaType; @RestController public class ReactiveSseController { private static final int MAX_MESSAGES = 9; @GetMapping("/reactiveStream") Flux<String> streamMessages(){ return Flux.<String>generate(sink -> sink.next(Integer.toString((int)(Math.random()*MAX_MESSAGES)))) .take(MAX_MESSAGES).delayElements(Duration.ofSeconds(1L)) .log(); } } ``` 上述例子利用了`Flux.generate()`函数生成随机整数值序列作为模拟的消息体;并通过`.take(n)`限制最大输出数量,最后加上日志记录以便调试观察[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值