百度文心一言文心千帆大模型 ERNIE-Bot-turbo调用示例(golang版本)

news2024/12/22 19:11:47

百度的文心一言推出来也有一段时间了,但是接口部分一直没有公开,需要进行申请

最近,有朋友提供了文心千帆大模型的api权限,拿到了必须的参数,现在就来测试一下

下面是使用golang封装的文心千帆 ERNIE-Bot-turbo模型的调用示例

ERNIE-Bot-turbo.go

package lib

import (
    "bufio"
    "bytes"
    "encoding/json"
    "errors"
    "fmt"
    "github.com/tidwall/gjson"
    "io/ioutil"
    "net/http"
    "strings"
)

//百度文心一言ERNIE-Bot-turbo
type ErnieBotTurbo struct {
    AppId       string
    ApiKey      string
    SecretKey   string
    AccessToken string
}

func NewErnieBotTurbo(appId, apiKey, secretKey string) (*ErnieBotTurbo, error) {

    m := &ErnieBotTurbo{
        AppId:     appId,
        ApiKey:    apiKey,
        SecretKey: secretKey,
    }
    var err error
    m.AccessToken, err = m.GenerateAccessToken()
    if err != nil {
        return m, err
    }
    return m, nil
}

//获取access_token
func (this *ErnieBotTurbo) GenerateAccessToken() (string, error) {
    url := fmt.Sprintf("https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id=%s&client_secret=%s",
        this.ApiKey,
        this.SecretKey)
    // 创建POST请求
    req, err := http.NewRequest("GET", url, nil)
    if err != nil {
        fmt.Println("创建请求失败:", err)
        return "", err
    }
    // 发送请求
    client := http.Client{}
    response, err := client.Do(req)
    if err != nil {
        fmt.Println("发送请求失败:", err)
        return "", err
    }
    defer response.Body.Close()

    // 读取响应
    responseBody, err := ioutil.ReadAll(response.Body)
    if err != nil {
        return "", err
    }
    accessToken := gjson.Get(string(responseBody), "access_token").String()
    if accessToken == "" {
        return "", errors.New("获取access_token失败")
    }
    this.AccessToken = accessToken
    return accessToken, nil
}

//流式请求接口
func (this *ErnieBotTurbo) StreamChat(messages []map[string]string) (*bufio.Reader, error) {
    url := fmt.Sprintf("https://aip.baidubce.com/rpc/2.0/ai_custom/v1/wenxinworkshop/chat/eb-instant?access_token=" + this.AccessToken)

    // 构建请求参数
    params := map[string]interface{}{
        "messages": messages,
        "stream":   true,
    }

    // 创建HTTP请求的body
    jsonParams, err := json.Marshal(params)
    requestBody := bytes.NewBuffer(jsonParams)

    // 创建POST请求
    req, err := http.NewRequest("POST", url, requestBody)
    if err != nil {
        fmt.Println("创建请求失败:", err)
        return nil, err
    }
    // 设置请求头
    //req.Header.Set("Access", "text/event-stream")
    // 发送请求
    client := http.Client{}
    response, err := client.Do(req)
    if err != nil {
        fmt.Println("发送请求失败:", err)
        return nil, err
    }

    //defer response.Body.Close()

    // 读取响应
    // 读取响应体数据
    reader := bufio.NewReader(response.Body)
    return reader, nil
}
func (this *ErnieBotTurbo) StreamRecv(reader *bufio.Reader) (string, error) {
waitForData:
    line, err := reader.ReadString('\n')
    if err != nil {
        return "", err
    }
    // 处理每行数据
    line = strings.TrimSpace(line)
    if line == "" {
        goto waitForData
    }

    // 根据冒号分割每行数据的键值对
    parts := strings.SplitN(line, ":", 2)
    if len(parts) != 2 {
        return "", errors.New("数据格式错误")
    }

    key := strings.TrimSpace(parts[0])
    value := strings.TrimSpace(parts[1])

    // 根据键的不同处理不同的字段
    switch key {
    case "data":
        // 设置Event的数据
        return value, nil
        //case "meta":
        //    // 解析JSON格式的元数据
        //    return value, nil
    }
    goto waitForData
    //return "", errors.New("finish")
}

//流式请求接口
func (this *ErnieBotTurbo) Embedding(input []string) (string, error) {
    url := fmt.Sprintf("https://aip.baidubce.com/rpc/2.0/ai_custom/v1/wenxinworkshop/embeddings/embedding-v1?access_token=" + this.AccessToken)

    // 构建请求参数
    params := map[string]interface{}{
        "input": input,
    }

    // 创建HTTP请求的body
    jsonParams, err := json.Marshal(params)
    requestBody := bytes.NewBuffer(jsonParams)

    // 创建POST请求
    req, err := http.NewRequest("POST", url, requestBody)
    if err != nil {
        fmt.Println("创建请求失败:", err)
        return "", err
    }
    // 设置请求头
    //req.Header.Set("Access", "text/event-stream")
    // 发送请求
    client := http.Client{}
    response, err := client.Do(req)
    if err != nil {
        fmt.Println("发送请求失败:", err)
        return "", err
    }

    defer response.Body.Close()

    // 读取响应
    responseBody, err := ioutil.ReadAll(response.Body)
    if err != nil {
        return "", err
    }
    return string(responseBody), nil
}

测试用例,获取access_token是需要进行缓存的,过期时间是二十多天,但是如果使用流式调用聊天接口,接口里获取不到access_token过期的错误码

所以,先每次都调取access_token,目前没看到有频率限制

package lib

import (
    "log"
    "testing"
)

//测试获取access_token
func TestErnieBotTurboGenerateAccessToken(t *testing.T) {
    AppID := "35662533"
    APIKey := "Iq1FfkOQIGtMtZqRFxOrvq6T"
    SecretKey := "qbzsoFAUSl8UGt1GkGSDSjENtqsjrOTC"
    m, err := NewErnieBotTurbo(AppID, APIKey, SecretKey)
    log.Println(m.AccessToken, err)
}

//测试流式输出
func TestErnieBotTurboStreamChat(t *testing.T) {
    AppID := "xxxx"
    APIKey := "xxxxxxx"
    SecretKey := "xxxxxxxxxjrOTC"
    m, _ := NewErnieBotTurbo(AppID, APIKey, SecretKey)
    system := "假设你是一个程序员,你是程序员老狼的数字分身,你擅长计算机互联网程序开发,你的微信:llike620,官网:gofly.v1kf.com。你开发了唯一客服系统,你了解唯一客服系统的各种问题,你的回答应该是简洁的、不要超过50字。你只能根据知识信息回答问题。你绝对不能暴露自己是个“人工智能、大模型、AI、机器人、GPT”。如果用户问题里有自己联系方式,请回复“稍等,我们马上联系您”。请检测问题语种,并用该语种回答问题."
    prompt := []map[string]string{{"role": "user", "content": system + "我的问题是:你是谁"}}
    res, _ := m.StreamChat(prompt)
    for {
        str, err := m.StreamRecv(res)
        if err != nil {
            log.Println(err)
            break
        }
        log.Println(str, err)
    }
}

//测试Embedding
func TestErnieBotTurboEmbedding(t *testing.T) {
    AppID := "xxxxxxx"
    APIKey := "xxxxxxxxxxq6T"
    SecretKey := "qxxxxxxxsoFAxxxxxxxxxxxxxxxxxxxC"
    m, _ := NewErnieBotTurbo(AppID, APIKey, SecretKey)
    prompt := []string{"我的问题是:你是谁"}
    res, err := m.Embedding(prompt)
    log.Println(res, err)
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/777777.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2023.7新版Pycharm没有Manager Repository(消失)下载镜像源问题

一、旧版本操作无法找到Manager Repository 二、解决方法---点击左侧键 三、点击添加设置小按钮 四、点击号复制进去镜像源网站即可 五、给大家推荐的镜像源网站 这里清华大学的镜像速度是最快的 https://pypi.tuna.tsinghua.edu.cn/simple/ 清华大学镜像http://pypi.douban…

天然气管道压力监测系统:管网安全守护者

随着我国工业的不断发展和能源需求的日益紧缺,天然气作为一种清洁能源正被广泛地开发和利用。然而。每年因天然气泄漏爆炸而造成的事故层出不穷,不仅威胁着人民的生命安全,还会对环境造成严重污染。面对这样的安全隐患,及时采取措…

Orangepi docker Home Assistant部署

手册上多数应用在树莓派用过,发现一个Home Assistant之前没搞过 按照手册先安装docker,使用enable_docker.sh 然后使用 docker run hello-world 来测试docker是否成功,如果hello from docker,即正常 通过以下docker命令搜索hom…

css - display属性

display属性有四个取值:block inline inline-block none 1、block display是类似于h和p标签在网页中默认显示方式,占据整整一行,所以不会与其他元素共同显示在一行之内。常见的block-display元素还有div、ol ul li、form等。如果想对某个blo…

【PHP面试题80】Redis消息发布与订阅功能怎么用的?

文章目录 🚀一、前言🚀二、PHP中安装Redis扩展🚀三、Redis消息发布与订阅🔎3.1 创建发布者🔎3.2 创建订阅者:🔎3.3 运行发布者和订阅者: 🚀四、总结 🚀一、前…

tomcat 使用部署

--烛光照亮了晚餐,照不出个答案。 不BB。 --部署web项目(无 maven 纯web项目) 直接把整个项目放到tomcat的webapps目录的下面然后重启tomcat即可 --部署html静态项目 直接把静态html放到tomcat的webapps目录下面即可,不要重命…

spring中bean实例化的三种方式 -- Spring入门(二)

文章目录 前言1.Bean实例化简介2.bean的实例化 -- 构造方法3.bean的实例化 -- 静态工厂实例化4.bean实例化 -- 实例工厂和FactoryBean5.三种bean实例化方式的区别 总结 前言 为了巩固所学的知识,作者尝试着开始发布一些学习笔记类的博客,方便日后回顾。…

JDBC之用IDEA连接SQLServer数据库实用教程

目录 前言 一、数据库准备 1.通过SQLServer配置管理器打开TCP/IP协议,设置状态为已启用 2.数据库登录模式设置为身份验证登录(如果已经设置可忽略此步骤) 3.下载SQLServer驱动jar包 二、IDEA准备 1.导入SQLServer驱动jar包 2.编写测试代…

【UE5 多人联机教程】02-开始游戏菜单控件

目录 步骤 一、完善开始游戏菜单控件 二、控件功能实现 2.1 “开始游戏”按钮切换界面 2.2 “创建房间”、“加入房间”按钮切换界面 2.3 “创建房间”按钮 步骤 一、完善开始游戏菜单控件 打开“UMG_Main” 首先在控件切换器外层包裹一个画布面板 然后调整控件切换器全…

Docker-volume【基础使用】

目录 【1】将本地的目录挂载到容器中 【2】volume卷,持久化 【3】volume数据共享 【4】volume持久化的作用 【5】volume - 随机卷的使用方式 【6】 启动nginx容器访问80出现HELLO,访问81出现WORLD 【1】将本地的目录挂载到容器中 1、容器的数据目录…

第112天:免杀对抗-加载器分离无文件落地图片隐写SOCK管道参数协议化

知识点 #知识点: 1、无文件落地&分离拆分-将shellcode从文本中提取-file 2、无文件落地&分离拆分-将shellcode与加载器分离-argv 3、无文件落地&分离拆分-将shellcode远程协议加载-http 4、无文件落地&分离拆分-将shellcode通过管道传输-socket 5、…

设计模式与技术场景面试题详解

工厂方法模式 简单工厂模式 工厂方法模式 抽象工厂模式 策略模式 工厂模式策略模式(登录案例) 责任链模式 技术场景 单点登录怎么实现 权限认证是如何实现的 上传数据的安全性你们怎么控制 你负责的项目遇到了哪些棘手的问题?怎么解决的 你们…

Vue系列第二篇:初识Vue项目

上一篇我搭建了Vue开发环境,创建了一个demo项目,借助nginx将Vue项目编译部署。这一篇来看一下Vue项目的结构。如下图所示: 我就创建一个空项目,结果Vue脚手架就帮我自动生成了这么多文件,看着挺吓人的。不用怕&#xf…

第十一章、【Linux】正则表达式与文件格式化处理

正则表达式 (Regular Expression, RE, 或称为常规表达式)是通过一些特殊字符的排列,用以“搜寻/取代/删除”一列或多列文字字串, 简单的说,正则表达式就是用在字串的处理上面的一项“表示式”。正则表达式并不是一个工…

「网络编程」传输层协议_ TCP协议学习_及原理深入理解(一)[万字详解]

「前言」文章内容大致是传输层协议,TCP协议讲解,续上篇UDP协议。 「归属专栏」网络编程 「主页链接」个人主页 「笔者」枫叶先生(fy) 目录 一、TCP协议介绍二、TCP协议2.1 解包与分用2.2 谈谈可靠性2.3 TCP的工作模式2.4 确认应答(ACK)机制2.5 16位序号与…

【基于CentOS 7 的SSH服务】

目录 一、概念 二、特点 三、身份验证机制 1.密码验证 2.密钥对验证 四、验证过程 五、加密机制 1.单向加密 2.对称加密 3.非对称加密 六、基本参数 1.服务名 2.端口号 3.配置文件 3.1 服务器端 3.2 客户端 4.配置文件解析 4.1 /etc/ssh/sshd_config 4.2 /e…

机器学习 day29(高偏差、高方差,参数d对模型的影响)

1. 高偏差、高方差、拟合能力、泛化能力 偏差和方差分别代表拟合能力和泛化能力若给左图数据集拟合一阶多项式(d取1),则该模型有很高的偏差(欠拟合)。因为它对训练集和验证集的表现均不好,所以Jtrain很高…

使用STM32 再实现循迹/跟随/摇头避障小车

循迹小车 硬件介绍和接线 TCRT5000 使用方法和原理见89C52时期的介绍。 循迹小车需要使用两个TCRT5000,左侧的DO接到PB3;右侧的DO接到PB4 CubeMX 1. 在上节的基础上进行修改 配置两个传感器的GPIO 2. 惯例配置更新代码 Keil 注意,如果…

Linux 学习记录54(ARM篇)

Linux 学习记录54(ARM篇) 本文目录 Linux 学习记录54(ARM篇)一、框图分析1. 芯片手册内部框图2. 操作GPIO过程 二、通过汇编完成GPIO操作1. 常用的汇编指令2. GPIO初始化流程3. 查找相关寄存器(1. RCC寄存器(2. GPIO寄存器>1. 模式配置寄存器>2. 输出模式配置寄存器>3…

【云原生】Prometheus之部署 Alertmanager 发送告警

前言 1. Alertmanager 发送告警的介绍 Prometheus 对指标的收集、存储与告警能力分属于 Prometheus Server 和 AlertManager 两个独立的组件,前者仅负责定义告警规则生成告警通知, 具体的告警操作则由后者完成。 Alertmanager 负责处理由 Prometheus…