【大模型API调用初尝试二】星火认知大模型 百度千帆大模型

大模型API调用初尝试二

  • 科大讯飞—星火认知大模型
    • 单论会话调用
    • 多轮会话调用
  • 百度—千帆大模型
    • 获取access_token
    • 单轮会话
    • 多轮会话

科大讯飞—星火认知大模型

星火认知大模型是科大讯飞开发的,直接使用可以点击星火认知大模型,要调用API的话在讯飞开发平台注册,之后点击进入控制台。
在这里插入图片描述
在这里插入图片描述

注册后完成实名认证,以及各种新人礼包,白嫖一些tokens! 之后就去找官方API调用文档,星火大模型的API是通过websocket建立连接然后实现调用的,和通义千问通过HTTP协议调用、智谱AI直接用封装好的python包调用不同。

单论会话调用

单论会话就是用户提一个问题,大模型回答,这一轮就结束了。下一轮会话用户向模型发送的信息中不包括上一轮的信息。
官方给的python调用实例,修改一下on_close()函数(需要三个参数),以及将服务器端和用户端代码分离开:SparkAPI.py—服务器端口的代码👇

# coding: utf-8
import _thread as thread
import os
import time
import base64

import base64
import datetime
import hashlib
import hmac
import json
from urllib.parse import urlparse
import ssl
from datetime import datetime
from time import mktime
from urllib.parse import urlencode
from wsgiref.handlers import format_date_time

import websocket
import openpyxl
from concurrent.futures import ThreadPoolExecutor, as_completed
import os


class Ws_Param(object):
    # 初始化
    def __init__(self, APPID, APIKey, APISecret, gpt_url):
        self.APPID = APPID
        self.APIKey = APIKey
        self.APISecret = APISecret
        self.host = urlparse(gpt_url).netloc
        self.path = urlparse(gpt_url).path
        self.gpt_url = gpt_url

    # 生成url
    def create_url(self):
        # 生成RFC1123格式的时间戳
        now = datetime.now()
        date = format_date_time(mktime(now.timetuple()))

        # 拼接字符串
        signature_origin = "host: " + self.host + "\n"
        signature_origin += "date: " + date + "\n"
        signature_origin += "GET " + self.path + " HTTP/1.1"

        # 进行hmac-sha256进行加密
        signature_sha = hmac.new(self.APISecret.encode('utf-8'), signature_origin.encode('utf-8'),
                                 digestmod=hashlib.sha256).digest()

        signature_sha_base64 = base64.b64encode(signature_sha).decode(encoding='utf-8')

        authorization_origin = f'api_key="{self.APIKey}", algorithm="hmac-sha256", headers="host date request-line", signature="{signature_sha_base64}"'

        authorization = base64.b64encode(authorization_origin.encode('utf-8')).decode(encoding='utf-8')

        # 将请求的鉴权参数组合为字典
        v = {
            "authorization": authorization,
            "date": date,
            "host": self.host
        }
        # 拼接鉴权参数,生成url
        url = self.gpt_url + '?' + urlencode(v)
        # 此处打印出建立连接时候的url,参考本demo的时候可取消上方打印的注释,比对相同参数时生成的url与自己代码生成的url是否一致
        return url


# 收到websocket错误的处理
def on_error(ws, error):
    print("### error:", error)


# 收到websocket关闭的处理
def on_close(ws, close_status_code, close_msg):  
    print("### closed ###")



# 收到websocket连接建立的处理
def on_open(ws):
    thread.start_new_thread(run, (ws,))


def run(ws, *args):
    data = json.dumps(gen_params(appid=ws.appid, messages=ws.messages, domain=ws.domain))
    ws.send(data)


# 收到websocket消息的处理
def on_message(ws, message):
    # print(message)
    data = json.loads(message)
    code = data['header']['code']
    if code != 0:
        print(f'请求错误: {code}, {data}')
        ws.close()
    else:
        choices = data["payload"]["choices"]
        status = choices["status"]
        content = choices["text"][0]["content"]
        # 保存一轮对话的回答
        global answer
        answer += content
        print(content,end='')
        if status == 2:
            print("\n#### 关闭会话")
            ws.close()


def gen_params(appid, messages, domain):
    """
    通过appid和用户的提问来生成请参数
    """
    data = {
        "header": {
            "app_id": appid,
            "uid": "1234",           
            # "patch_id": []    #接入微调模型,对应服务发布后的resourceid          
        },
        "parameter": {
            "chat": {
                "domain": domain,
                "temperature": 0.5,
                "max_tokens": 4096,
                "auditing": "default",
            }
        },
        "payload": {
            "message": {
                "text": messages
            }
        }
    }
    return data


def main(appid, api_secret, api_key, gpt_url, domain, messages):
    wsParam = Ws_Param(appid, api_key, api_secret, gpt_url)
    websocket.enableTrace(False)
    wsUrl = wsParam.create_url()

    ws = websocket.WebSocketApp(wsUrl, on_message=on_message, on_error=on_error, on_close=on_close, on_open=on_open)
    ws.appid = appid
    ws.messages = messages
    ws.domain = domain
    ws.run_forever(sslopt={"cert_reqs": ssl.CERT_NONE})

客户端去调用API的代码:spark_wenda.py👇

import sparkAPI as LLM_API

if __name__ == "__main__":
    # 准备用户API信息 以及访问的模型url
    appid="xxxx"
    api_secret="xxxx"
    api_key="xxxxx"
    gpt_url="wss://spark-api.xf-yun.com/v3.5/chat"
    # Spark_url = "ws://spark-api.xf-yun.com/v3.1/chat"  # v3.0环境的地址
    # Spark_url = "ws://spark-api.xf-yun.com/v2.1/chat"  # v2.0环境的地址
    # Spark_url = "ws://spark-api.xf-yun.com/v1.1/chat"  # v1.5环境的地址
    domain="generalv3.5"
    # domain = "generalv3"    # v3.0版本
    # domain = "generalv2"    # v2.0版本
    # domain = "general"    # v2.0版本

    # 用户的问题
    query = input("\nUser:")
    question =[{'role':'user', 'content':query}]
    LLM_API.answer =""
    print("\nAssistant:",end = "")
    # 调用api得到输出
    LLM_API.main(appid, api_secret, api_key, gpt_url, domain, question)

运行结果如下,获取到了大模型的回答,并只输出了其content:
在这里插入图片描述

多轮会话调用

多轮会话需要注意前面几轮对话用户user的问题和大模型assistant的回答都要记录下来,通过websocket访问大模型时,将之前的问答信息一同发送,因此需要记录下每轮大模型的回答,即global answer,并将其附加在messages中。具体的Spark_wenda.py内容如下👇

import sparkAPI as LLM_API

messages =[]
 
# length = 0
# 并入一条新的message,可以是用户的问题,也可以是大模型的回答
def getText(role,content):
    jsoncon = {}
    jsoncon["role"] = role
    jsoncon["content"] = content

    messages.append(jsoncon)
    return messages

# 获取messages的长度,向大模型发送的问题token数量是有限制的
def getlength(messages):
    length = 0
    for content in messages:
        temp = content["content"]
        leng = len(temp)
        length += leng
    return length
# 检查token数量
def checklen(messages):
    while (getlength(messages) > 8000):
        del messages[0]
    return messages        

if __name__ == "__main__":
    # 准备用户API信息 以及访问的模型url
    appid="xxxxxx"
    api_secret="xxxxxxx"
    api_key="xxxxxxxx"
    gpt_url="wss://spark-api.xf-yun.com/v3.5/chat"
    # Spark_url = "ws://spark-api.xf-yun.com/v3.1/chat"  # v3.0环境的地址
    # Spark_url = "ws://spark-api.xf-yun.com/v2.1/chat"  # v2.0环境的地址
    # Spark_url = "ws://spark-api.xf-yun.com/v1.1/chat"  # v1.5环境的地址
    domain="generalv3.5"
    # domain = "generalv3"    # v3.0版本
    # domain = "generalv2"    # v2.0版本
    # domain = "general"    # v2.0版本
    
    messages.clear
    while True:  # 循环进行会话
        query = input("\nUser:")
        # 将用户新的问题加入历史问答messages中
        question = checklen(getText("user",query))
        LLM_API.answer =""
        print("\nAssistant:",end = "")
        LLM_API.main(appid, api_secret, api_key, gpt_url, domain, messages)
        # 将星火大模型的输出附加到历史问答messages中
        getText("assistant",LLM_API.answer)

运行观察大模型确实能够对每次的问题进行回答,且能够有效利用之前问答的信息。
在这里插入图片描述
messages记录的是多轮问答的内容以及最新一次会话用户的问题,messages确实是等于question的。在vscode中调试代码,观察messages和question中的信息,确实是有前面两轮问答的问题+答案,以及最新一轮用户的问题:
在这里插入图片描述
在这里插入图片描述

百度—千帆大模型

首先注册登录百度千帆大模型平台;然后在控制台添加应用,后续会用到API_KEY,SECRET_KEY;然后在文档中找到官方API调用文档,其中包括了不同模型的调用代码。
这里需要注意,后续要调用API大模型,需要在在线服务中开通服务,否则会报错{"error_code":17,"error_msg":"Open api daily request limit reached"}
在这里插入图片描述
千帆大模型平台中的大模型api是通过http的方式去请求-响应的,步骤包括1、通过api-key和secret-key获取access-token;2、利用access-token向大模型发起请求;3、获取大模型的响应。

获取access_token

import requests
import json
# 填入自己申请的api应用的信息
API_KEY = "xxxxxxx"
SECRET_KEY = "xxxxxxx"

# 参考网址👉 https://cloud.baidu.com/doc/WENXINWORKSHOP/s/Ilkkrb0i5
# access_token
def get_access_token():
    """
    使用 AK,SK 生成鉴权签名(Access Token)
    :return: access_token,或是None(如果错误)
    """
    url = "https://aip.baidubce.com/oauth/2.0/token"
    params = {"grant_type": "client_credentials", "client_id": API_KEY, "client_secret": SECRET_KEY}
    return str(requests.post(url, params=params).json().get("access_token"))

单轮会话


# 单轮会话
def Single_Round_Session():
    # 访问的模型的url 
    url = "https://aip.baidubce.com/rpc/2.0/ai_custom/v1/wenxinworkshop/chat/completions?access_token=" + get_access_token()
    # 用户输入问题
    query = input("\nUser:")
    payload = json.dumps({
        "disable_search": False,
        "enable_citation": False,
        # 添加问题 发送请求
        "messages": [
            {
                "role": "user",
                "content": query,
            }
        ]
    })

    headers = {
        'Content-Type': 'application/json'
    }
    
    # 获取大模型的响应
    response = requests.request("POST", url, headers=headers, data=payload)
    # 获取响应的内容
    print(response.text)
if __name__ == '__main__':
    Single_Round_Session()
    

例子:
在这里插入图片描述

多轮会话

多轮会话需要注意保存之前对话的问答,代码如下:


# 多轮会话  
def Multi_Round_Session():
    # 访问的模型的url 
    url = "https://aip.baidubce.com/rpc/2.0/ai_custom/v1/wenxinworkshop/chat/completions?access_token=" + get_access_token()
    # 用户的问题
    messages = []
    while True :
        # 构造访问的问题
        question = {"role": "user",
                    "content":input("\nUser:")}
        messages.append(question)

        payload = json.dumps({
            "disable_search": False,
            "enable_citation": False,
            # 添加问题 发送请求
            "messages": messages
        })

        headers = {
            'Content-Type': 'application/json'
        }

        # 获取大模型的响应
        response = requests.request("POST", url, headers=headers, data=payload)
        # 获取响应的内容
        print("\n",response.json()["result"]  )

        # 将响应内容添加到会话历史中
        answer = {"role": "assistant",
                  "content":response.json()["result"]}
        messages.append(answer)


if __name__ == '__main__':
    Multi_Round_Session()

结果:
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于YOLOv8/YOLOv7/YOLOv6/YOLOv5的交通信号灯识别系统(深度学习+UI界面+训练数据集+Python代码)

摘要:本研究详细介绍了一种采用深度学习技术的交通信号灯识别系统,该系统集成了最新的YOLOv8算法,并与YOLOv7、YOLOv6、YOLOv5等早期算法进行了性能评估对比。该系统能够在各种媒介——包括图像、视频文件、实时视频流及批量文件中——准确地…

Xilinx 7系列FPGA的配置流程

目录 1.4配置流程 1.4.1 设备上电 ​编辑1.4.2 清除配置寄存器 1.4.3 采样模式引脚 1.4.4 同步 ​编辑1.4.5 检测设备ID ​编辑1.4.6 加载配置数据 1.4.7 CRC校验 1.4.8 启动序列 1.4配置流程 对于所有配置模式,7系列的基本配置流程都是相同的&…

算法练习:二分查找

目录 1. 朴素二分查找2. 在排序数组中查找元素的第一个和最后一个位置3. 搜索插入位置4. x的平方根5. 山脉数组的峰值索引6. 寻找峰值7. 寻找旋转排序数组中的最小值8. 点名 1. 朴素二分查找 题目信息: 题目链接: 二分查找二分查找的使用前提为数据具有&…

leetcode精选算法刷题训练篇 之 链表OJ(包含题目链接以及详细讲解)

好好学习,giao哥给你补🥚 1、移除链表元素 难度等级:⭐ 题目链接:移除链表元素 2、链表的中间节点 难度等级:⭐⭐ 题目链接:链表的中间节点 3、反转链表 难度等级:⭐⭐⭐ 题目链接&#x…

C#版开源免费的Bouncy Castle密码库

前言 今天大姚给大家分享一款C#版开源、免费的Bouncy Castle密码库:BouncyCastle。 项目介绍 BouncyCastle是一款C#版开源、免费的Bouncy Castle密码库,开发人员可以通过该项目在他们的 C# 应用程序中使用 Bouncy Castle 提供的各种密码学功能&#x…

git提交代码描述时如何换行(更新时间24/3/12)

问题复现(信心满满使用转义字符换行) 解决方法: 写多个-m字符串的结构可以实现自动换行 注意空格 git commit -m"第一行描述" -m"第二行描述" 效果演示:(强迫症福利)

近700所高校,2024年预算出炉!

办学经费,是高校发展的核心与基石。学校人才培养、科学研究等各项事业的开展,都有赖于教育经费的支持。 近日,全国已有北京、上海、江苏、浙江等20多个省(市、自治区)的高校对外公布了2024年预算经费,小编…

L2-035 完全二叉树的层序遍历(Python)

L2-035 完全二叉树的层序遍历 分数 25 全屏浏览 切换布局 作者 陈越 单位 浙江大学 一个二叉树,如果每一个层的结点数都达到最大值,则这个二叉树就是完美二叉树。对于深度为 D 的,有 N 个结点的二叉树,若其结点对应于相同深度…

深入联合文件系统

Union File System(联合文件系统,UnionFS)是一种轻量级的高性能分层文件系统,它支持将文件系统中的修改信息作为一次提交,并层层叠加,同时可以将不同目录挂载到同一个虚拟文件系统下,应用看到的…

C# 8.0+版本项目 string不可为空

1.在某一次新建项目的时候发现,新建的项目,写的测试接口,接口的入参有string的参数, 但是调用接口的时候string的参数没有传报了400,很奇怪,也没有语法错误之类的。 2.解决办法 在项目上右键->属性->…

计算机毕业设计-springboot+vue前后端分离电竞社交平台管理系统部分成果分享

4.5系统结构设计 本系统使用的角色主要有系统管理员、顾客、接单员,本系统为后台管理系统,游客用户可以经过账号注册,管理员审核通过后,用账号密码登录系统,查看后台首页,模块管理(顾客信息&am…

Covalent Network (CQT) 通过统一 API 集成,为 Gnosis Chain 的 AI 潜力赋能

作为一个为超 225 个链提供服务的领先多链索引器,Covalent Network (CQT) 正在与知名的 EVM 区块链基础设施提供者 Gnosis Chain 展开一项激动人心的合作。这一战略合作象征着先进的实时数据索引技术的集成,包括 Covalent Network (CQT) 的统一 API 和 G…

前端入职配置新电脑!!!

前端岗位入职第一天到底应该做些什么呢?又该怎样高效的认识、融入团队?并快速进入工作状态呢?这篇文章就来分享一下,希望对即将走向或初入前端职场的你,能够有所帮助。内含大量链接,欢迎点赞收藏&#xff0…

解决gpt无法发送对话的问题

问题描述 如图,今天登上去发现怎么无法发送消息 解决 可能是cookie问题,重新删除了就行了 cookie删除后,需要重新登录,主题色也重置为原来的白色了

MQTT Topic通配符

🌹作者主页:青花锁 🌹简介:Java领域优质创作者🏆、Java微服务架构公号作者😄 🌹简历模板、学习资料、面试题库、技术互助 🌹文末获取联系方式 📝 往期热门专栏回顾 专栏…

简单了解一下Linux的文件系统和目录结构

前言 这篇技术文章简单探讨了Linux的文件系统和目录结构,通过详细介绍Linux文件系统的组织方式和各个目录的作用,读者将能够更好地理解Linux系统的运作机制,从而提升对系统管理和优化的能力。无论您是初学者还是有经验的Linux用户&#xff0…

100元就不能投资吗?不可能,WeTrade1招激活

100元就不能投资吗?当然能进行投资了,尤其是现在投资方式多样化,又灵活,简单来说放在支付宝中就行,但是在可以承担风险的前提下想获得更获得更多的收益,WeTrade认为可以通过杠杆实现这个目的。 如果用1:1的杠杆交易&…

【Python爬虫神器揭秘】手把手教你安装配置Scrapy,高效抓取网络数据

1、 引言 在大数据时代,网络上的信息犹如海洋般浩瀚。想要在这片海洋里挖掘宝藏,一款强大的工具必不可少。今天我们要带大家深入探索的就是Python界鼎鼎大名的爬虫框架——Scrapy。无论你是数据分析师、研究员还是开发者,学会利用Scrapy来自…

郑州大学2024年3月招新赛题解

1.两重二for循环维护次大值 这里我就直接用map维护了&#xff0c;多了个logn复杂度还是可以的&#xff0c;下面是AC代码&#xff1a; #include<bits/stdc.h> using namespace std; int n,a[1010]; map<int,int> mp; int main(){cin>>n;int sum0;map<int,…

惬意了解 —— 前端发展史

下拉底部&#xff0c;参与投票&#xff5e;&#xff5e; 前端发展史&#xff1a;从洪荒时代到现代 前端开发已经走过了将近20年的历程&#xff0c;从最早的纯静态页面到如今的现代前端框架&#xff0c;我们见证了前端技术的蓬勃发展。让我们一起回顾这段历史。 洪荒时代&…