【大模型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 base64import 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_timeimport websocket
import openpyxl
from concurrent.futures import ThreadPoolExecutor, as_completed
import osclass Ws_Param(object):# 初始化def __init__(self, APPID, APIKey, APISecret, gpt_url):self.APPID = APPIDself.APIKey = APIKeyself.APISecret = APISecretself.host = urlparse(gpt_url).netlocself.path = urlparse(gpt_url).pathself.gpt_url = gpt_url# 生成urldef 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}# 拼接鉴权参数,生成urlurl = 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 answeranswer += contentprint(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 datadef 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 = appidws.messages = messagesws.domain = domainws.run_forever(sslopt={"cert_reqs": ssl.CERT_NONE})

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

import sparkAPI as LLM_APIif __name__ == "__main__":# 准备用户API信息 以及访问的模型urlappid="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_APImessages =[]# length = 0
# 并入一条新的message,可以是用户的问题,也可以是大模型的回答
def getText(role,content):jsoncon = {}jsoncon["role"] = rolejsoncon["content"] = contentmessages.append(jsoncon)return messages# 获取messages的长度,向大模型发送的问题token数量是有限制的
def getlength(messages):length = 0for content in messages:temp = content["content"]leng = len(temp)length += lengreturn length
# 检查token数量
def checklen(messages):while (getlength(messages) > 8000):del messages[0]return messages        if __name__ == "__main__":# 准备用户API信息 以及访问的模型urlappid="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.clearwhile 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()

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

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

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

相关文章

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

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

虚幻4 | 制作游戏——学习记录(一)

1. 启动Epic后下载虚幻4,打开虚幻4后新建一个第三人称游戏项目,效果如下: (1)内容/ThirdPersonBP/Blueprints中的ThirdPersonCharacter(左下角人物) 这是模板中使用的主要蓝图类,它…

ABAP接口部分-C#调用RFC

目录 ABAP接口部分-C#调用RFC创建表结构创建RFC函数创建C#项目引用SAP .Net Connector包绘制窗口的控件最终布局代码 项目配置报错SAP.Middleware.Connector.RfcDestinationManager报错SAP.Middleware.Connector.RfcLoginexception报错SAP.Middleware.Connector.RfcInvalidStat…

集合实现类研究底层(部分):手撕ArrayList底层源码、手撕LinkedList底层源码、手写单向链表和双向链表

day26上 集合框架图 标绿已经学习底层,深入底层主要是研究实现类底层 继承关系图 手撕ArrayList底层源码 ps:研究添加元素的过程 思路: 1.研究继承关系 2.研究属性 3.理解创建集合的过程 – 构造方法的底层原理 4.研究添加元素的过程 提升&#xff1a…

BUGKU-WEB ezbypass

题目描述 题目截图如下: 进入场景看看: 解题思路 代码审计题目发现需要构造一个字符串,使得它不包含字母、数字、特殊字符的PHP代码片段,长度小于105,然后传递给$codepost提交参数,eval(&…

数仓基础理论(一)

数据仓库概念 数据库 vs 数据仓库 从数据来源进行区分 数据库:企业中基础核心的业务数据 数据仓库:数据库中的数据 从数据存储进行区分 数据库:核心作用就是查找业务数据,基本上行式存储(带有索引),基本上无法存…

大模型学习笔记六:Semantic Kernel

文章目录 一、Semantic Kernel介绍和发展1)SK 的语言开发进展2)SK的生态位3)SK基础架构 二、环境搭建1)初始化2)Semantic Functions(不用编写代码,用配置实现回调函数)3)…

js的异常处理

1、throw抛异常 throw抛出异常信息,程序也会终止执行; throw后面跟的是错误提示信息; new Error() 配个throw使用,能设置更详细的错误信息。 function counter(x,y) {if (!x || !y) {throw new Error(参数不能为空)}retu…

Kotlin 数据解析(Gson)

一、添加依赖 build.gradle.kts(:app) // gson数据解析implementation("com.google.code.gson:gson:2.8.6") 对象类: // 对象类 class Account {var uid:String "00001"var userName:String "Freeman"var password:String &quo…

k8s+wordpress+zabbix+elastic+filebeat+kibana服务搭建以及测试

一,环境:docker,k8s,zabbix,以及搭建worpdress,elasticsearch,filebeat,kibana 二,主机分配: 名称host详述个人博客3192.168.142.133 搭配mysql8.0.36的数据…

DVWA靶场-暴力破解

DVWA是一个适合新手锻炼的靶机,是由PHP/MySQL组成的 Web应用程序,帮助大家了解web应用的攻击手段 DVWA大致能分成以下几个模块,包含了OWASP Top 10大主流漏洞环境。 Brute Force——暴力破解 Command Injection——命令注入 CSRF——跨站请…

SublimeText4 安装

Sublime Text 可以编写html,css,js,php等等,是一个轻量、简洁、高效、跨平台的编辑器。 图1:SublimeText官网 Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件&#…

Java的编程之旅41——字符流

目录 1.字符流的简介 2.字符的编码与解码 3.字符流读写操作 1.字符流写入 2.字符流复制文件 4.FileWriter&FileReader 5.缓冲区高效读写 6.序列化与反序列化 1.字符流的简介 在Java中,字符流是用于处理字符数据的输入输出流。它是以字符为单位进行处理&a…

读取txt文件并统计每行最长的单词以及长度

读取txt文件并统计每行最长的单词以及长度 题目 在 D:\\documant.txt 文本中,文件中有若干行英文文本,每行英文文本中有若干个单词,每个单词不会跨行出现每行至多包含100个字符,要求编写一个程序,处理文件,分析各行中的单词,找到每行中的最长单词,分别…

群晖docker安装sql server

安装步骤 开启群晖 SSH,通过 SSH 工具连接到群晖,运行下面的命令拉取mssql 2019 镜像 sudo docker pull mcr.microsoft.com/mssql/server:2019-latest然后在 docker 中就可以看到该镜像: 在群晖 docker 共享文件夹中创建 mssql2009 文件夹 …

ABAP - cl_gui_alv_grid cl_salv_table的各种处理

这篇文章主要是记录一下cl_gui_alv_grid 和 cl_salv_table 两种方式的ALV的字段,事件等的处理 举例,下面这个是用一个screen,显示2个ALV;上面这一个是用alv grid的;下面那一个是用salv去实现的 alv grid 主要涉及&am…

神舟通用-神通MPP

1、国产MPP 神通MPP是以多年大型通用数据库领域的研发实力为基础,集深厚的航天信息化建设经验,集成多项先进技术,为满足航天、政府、金融、电信等行业的海量数据分析统计应用需求而打造的分布式数据库软件,具有负载衡、在线扩展、…

基于ssm的志愿者招募系统的设计与实现(程序+文档+数据库)

** 🍅点赞收藏关注 → 私信领取本源代码、数据库🍅 本人在Java毕业设计领域有多年的经验,陆续会更新更多优质的Java实战项目,希望你能有所收获,少走一些弯路。🍅关注我不迷路🍅** 一、研究背景…

nginx有几种启动方式

Nginx 通常可以以两种主要的方式启动:作为前台进程运行或作为守护进程(后台)运行。 前台运行: 当Nginx以前台模式运行时,它会在命令行保持活动状态,所有的日志输出都会直接显示在命令行上。这种模式通常用于…

Redis底层数据结构之List

文章目录 1. Redis 6的list源码分析1. Redis 7的list源码分析 1. Redis 6的list源码分析 首先我们查看一下redis 6关于list的相关配置: config get list*可以看见redis 6的quicklist底层使用的数据结构是ziplist list-compress-depth:表示一个quicklis…