Java接入文心一言

这篇具有很好参考价值的文章主要介绍了Java接入文心一言。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

文心一言应用创建

首先需要先申请文心千帆大模型,申请地址:文心一言 (baidu.com),点击加入体验,等通过审核之后就可以进入文心千帆大模型后台进行应用管理了。

在百度智能云首页即可看到文心千帆大模型平台

然后进入后台管理之后,点击应用接入,创建应用即可

创建完应应用之后,便可以调用文心一言的http开发接口进行交互了。

接口对接

接口文档

首先要看一下接口文档:API调用指南 - 文心千帆WENXINWORKSHOP | 百度智能云文档 (baidu.com)

这里我用的是ERNIE-Bot-turbo API,主要是由于它响应更快。

下面介绍一下具体接入的代码

代码示例

依赖

依赖安装

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>baidu</artifactId>
        <groupId>com.walter</groupId>
        <version>1.0</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <version>1.0</version>
    <artifactId>baidumodel</artifactId>
    <description>百度大模型</description>

    <repositories>
        <repository>
            <id>public</id>
            <name>aliyun nexus</name>
            <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
            <releases>
                <enabled>true</enabled>
            </releases>
            <snapshots>
                <enabled>false</enabled>
            </snapshots>
        </repository>
    </repositories>

    <dependencies>

        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
	    <version>2.11.1</version>
        </dependency>
        <dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-http</artifactId>
            <version>5.8.11</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-json</artifactId>
            <version>5.8.11</version>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
	    <version>1.18.12</version>
        </dependency>
        <dependency>
            <groupId>com.squareup.okhttp3</groupId>
            <artifactId>okhttp-sse</artifactId>
	    <version>3.14.9</version>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-log4j12</artifactId>
	    <version>1.7.30</version>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>1.7.30</version>
        </dependency>
    </dependencies>
</project>

常量类

ApiConstant.java

@Slf4j
public class ApiConstant {

    /**
     * ERNIE_BOT_TURBO 发起会话接口
     */
    public static final String ERNIE_BOT_TURBO_INSTANT = "https://aip.baidubce.com/rpc/2.0/ai_custom/v1/wenxinworkshop/chat/eb-instant?access_token=";

    public static String getToken(String appKey, String secretKey) {
        String url = "https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id=" + appKey + "&client_secret=" + secretKey;
        String s = HttpUtil.get(url);
        Token bean = JSONUtil.toBean(s, Token.class);
        return bean.getAccess_token();
    }
}

实体类

BaiduChatMessage.java

@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class BaiduChatMessage implements Serializable {
    private String role;
    private String content;
}

ErnieBotTurboResponse.java

@Data
public class ErnieBotTurboResponse implements Serializable {
    private String id;
    private String object;
    private Integer created;

    private String sentence_id;
    private Boolean is_end;
    private Boolean is_truncated;
    private String result;
    private Boolean need_clear_history;

    private Usage usage;

    @Data
    public static class Usage implements Serializable {
        private Integer prompt_tokens;
        private Integer completion_tokens;
        private Integer total_tokens;

    }
}

ErnieBotTurboStreamParam.java

@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class ErnieBotTurboStreamParam implements Serializable {

    private List<BaiduChatMessage> messages;
    private Boolean stream;
    private String user_id;

    public boolean isStream() {
        return Objects.equals(this.stream, true);
    }
}

Token.java

@Data
public class Token implements Serializable {
    private String access_token;
    private Integer expires_in;
    private String error;
    private String error_description;
}

BaiduEventSourceListener.java

// 这个类主要是为了与文心一言API建立流式连接,实现数据的实时返回,而不是等完整的数据生成之后才将数据返回
// 可以减少用户等待时间,实现更好的交互体验
@Slf4j
public class BaiduEventSourceListener extends EventSourceListener {

    @Override
    public void onOpen(EventSource eventSource, Response response) {
        log.info("baidu建立sse连接...");
    }

    @Override
    public void onEvent(EventSource eventSource, String id, String type, String data) {
        log.info("baidu返回数据:{}", data);
    }

    @Override
    public void onClosed(EventSource eventSource) {
        log.info("baidu关闭sse连接...");
    }

    @SneakyThrows
    @Override
    public void onFailure(EventSource eventSource, Throwable t, Response response) {
        if(Objects.isNull(response)){
            log.error("baidu  sse连接异常:{}", t);
            eventSource.cancel();
            return;
        }
        ResponseBody body = response.body();
        if (Objects.nonNull(body)) {
            log.error("baidu  sse连接异常data:{},异常:{}", body.string(), t);
        } else {
            log.error("baidu  sse连接异常data:{},异常:{}", response, t);
        }
        eventSource.cancel();
    }
}

BaiduService.java

// 该类主要是处理接口请求,处理接口响应逻辑
@Slf4j
@Data
public class BaiduService {

    private static final long TIME_OUT = 30;

    private OkHttpClient okHttpClient;
    private String appKey;
    private String secretKey;

    public BaiduService(@NonNull String appKey, @NonNull String secretKey) {
        this.appKey = appKey;
        this.secretKey = secretKey;
        this.okHttpClient(30, 30, 30, null);
    }

    public BaiduService(@NonNull String appKey, @NonNull String secretKey, long connectTimeout, long writeTimeout, long readTimeout, Proxy proxy) {
        this.appKey = appKey;
        this.secretKey = secretKey;
        this.okHttpClient(connectTimeout, writeTimeout, readTimeout, proxy);
    }


    private void okHttpClient(long connectTimeout, long writeTimeout, long readTimeout, Proxy proxy) {
        OkHttpClient.Builder client = new OkHttpClient.Builder();
        client.connectTimeout(connectTimeout, TimeUnit.SECONDS);
        client.writeTimeout(writeTimeout, TimeUnit.SECONDS);
        client.readTimeout(readTimeout, TimeUnit.SECONDS);
        if (Objects.nonNull(proxy)) {
            client.proxy(proxy);
        }
        this.okHttpClient = client.build();
    }

    // 该方法是同步请求API,会等大模型将数据完全生成之后,返回响应结果,可能需要等待较长时间,视生成文本长度而定
    public ErnieBotTurboResponse ernieBotTurbo(ErnieBotTurboStreamParam param) {
        if (param == null) {
            log.error("参数异常:param不能为空");
            throw new RuntimeException("参数异常:param不能为空");
        }
        if (param.isStream()) {
            param.setStream(false);
        }
        String post = HttpUtil.post(ApiConstant.ERNIE_BOT_TURBO_INSTANT + ApiConstant.getToken(appKey, secretKey), JSONUtil.toJsonStr(param));
        return JSONUtil.toBean(post, ErnieBotTurboResponse.class);
    }

    // 该方法是通过流的方式请求API,大模型每生成一些字符,就会通过流的方式相应给客户端,
    // 我们是在 BaiduEventSourceListener.java 的 onEvent 方法中获取大模型响应的数据,其中data就是具体的数据,
    // 我们获取到数据之后,就可以通过 SSE/webscocket 的方式实时相应给前端页面展示
    public void ernieBotTurboStream(ErnieBotTurboStreamParam param, EventSourceListener eventSourceListener) {
        if (Objects.isNull(eventSourceListener)) {
            log.error("参数异常:EventSourceListener不能为空");
            throw new RuntimeException("参数异常:EventSourceListener不能为空");
        }
        if (param == null) {
            log.error("参数异常:param不能为空");
            throw new RuntimeException("参数异常:param不能为空");
        }
        if (!param.isStream()) {
            param.setStream(true);
        }
        try {
            EventSource.Factory factory = EventSources.createFactory(this.okHttpClient);
            ObjectMapper mapper = new ObjectMapper();
            String requestBody = mapper.writeValueAsString(param);
            Request request = new Request.Builder()
                    .url(ApiConstant.ERNIE_BOT_TURBO_INSTANT + ApiConstant.getToken(appKey, secretKey))
                    .post(RequestBody.create(MediaType.parse(ContentType.JSON.getValue()), requestBody))
                    .build();
            //创建事件
            EventSource eventSource = factory.newEventSource(request, eventSourceListener);
        } catch (JsonProcessingException e) {
            log.error("请求参数解析是失败!", e);
            throw new RuntimeException("请求参数解析是失败!", e);
        }

    }
}

结束语

以上就是通过文心一言的OpenAPI与大模型交互的整体逻辑,等代码功能再做完善之后,改代码会以SDK的方式开源到Gitee,欢迎一起探讨。文章来源地址https://www.toymoban.com/news/detail-694038.html

到了这里,关于Java接入文心一言的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Java对接百度文心一言,Java发送POST请求,类似前端AJAX

    这是项目中使用的对接百度文心一言后端代码

    2024年02月15日
    浏览(30)
  • Java初级程序员与ChatGPT(文心一言)使用感受

            随着23年三月初开始ChatGPT迅速发展,爆红网络。也有不少人说这个东西会顶替程序员。刚好身边同事有一个需要是读取word文档中的内容,保存到数据库。         我们就用百度的文心一言试下吧。             总的来说从提问到问题的反馈,都是比较流畅的。代

    2023年04月26日
    浏览(38)
  • AI百度文心一言大语言模型接入使用(中国版ChatGPT)

    基于百度文心一言语言大模型的智能文本对话AI机器人API,支持聊天对话、行业咨询、语言学习、代码编写等功能. 重要提示:建议使用https协议,当https协议无法使用时再尝试使用http协议 请求方式: POST 序号 参数 是否必须 说明 1 ques 是 你的问题 2 appKey 是 唯一验证AppKey, 可前往官

    2024年02月12日
    浏览(43)
  • GBASE首批接入中国版ChatGPT“文心一言“ 打造DB+AI全系服务

    3月 9日,GBASE南大通用宣布成为百度文心一言(英文名:ERNIE Bot)首批生态合作伙伴。后续, GBASE将通过百度智能云全面体验并集成“文心一言”的AI能力,聚焦DB+AI全栈技术及服务。 文心一言是基于百度智能云技术打造出来的大模型。百度在人工智能领域深耕十余年,拥有产

    2024年02月11日
    浏览(76)
  • 数字人系列四:Motionverse 接入chatgpt、文心一言等国内外大语言模型

    1. 下载插件:motionverse官网地址:概述 · Motionverse 接口文档 (deepscience.cn) 2. 按照官方文档新建Unity工程:对接说明 · Motionverse 接口文档 (deepscience.cn) 3. 通过我们自己的ASR,将语音转换为文本,文本通过大语言模型(chatgpt、文心一言以及其他大语言模型)生成的结果,直

    2024年02月10日
    浏览(57)
  • 文心一言接入Promptulate,开发复杂LLM应用程序

    最近在尝试将文心一言的LLM能力接入Promptulate,故写了一篇博客记录一下,Promptulate 是 Promptulate AI 旗下的大语言模型自动化与应用开发框架,旨在帮助开发者通过更小的成本构建行业级的大模型应用,其包含了LLM领域应用层开发的大部分常用组件,如外部工具组件、模型组件

    2024年02月10日
    浏览(42)
  • 如何用文心一言开发前端代码

    随着chatGPT的火爆,大家越来越认识到到语言大模型的潜力,国内的类chatGPT的生成式语言大模型(LLM)也如雨后春笋般冒出来。 如今大家都在探索各种prompt的技巧,其实从我个人看来,LLM其实也是一种检索模型,只不过它的检索粒度更加细致,更加语义化,尽管如此,现如今

    2024年02月12日
    浏览(29)
  • 文心一言api接入如何在你的项目里使用文心一言

    基于百度文心一言语言大模型的智能文本对话AI机器人API,支持聊天对话、行业咨询、语言学习、代码编写等功能. 重要提示:建议使用https协议,当https协议无法使用时再尝试使用http协议 请求方式: POST 序号 参数 是否必须 说明 1 ques 是 你的问题 2 appKey 是 唯一验证AppKey, 可前往官

    2024年02月09日
    浏览(43)
  • nodejs文心一言API接入

    需求 在nodejs里面接入文心一言API,官方调用步骤API介绍 - 千帆大模型平台 | 百度智能云文档 大致流程 创建应用——API授权——获取访问凭证——调用接口 创建应用 注册账号创建应用 首先注册百度云智能账号,登录进入百度智能云千帆控制台 ,然后进入控制台创建应用 。

    2024年02月03日
    浏览(30)
  • Java 接入文心一格(Ai绘画)

    首先进入百度云的智能创作平台 百度云创作平台 先购买对应的版本,各版本的价格为: 在购买完成后,点击创建应用 创建完成后,就可以开始进行代码编写了 鉴权 首先需要鉴权,需要通过传入上面的apikey和secretkey获取token 在获取了token后就可以使用他发起申请了 文心一格

    2024年01月16日
    浏览(32)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包