当前位置: 首页 > news >正文

Python 如何调用讯飞星火大模型API

1 讯飞星火简介

讯飞星火是科大讯飞推出的一款先进的人工智能大模型,它具备强大的语言理解和知识问答能力,能够在多种场景中提供智能化服务。2024年6月27日,科大讯飞发布了讯飞星火大模型V4.0版本,全面对标GPT-4 Turbo。现有的模型类型如下:
模型类型
Spark Lite是完全免费的,无限量Token,Spark Pro、Spark3.5 Max、Spark 4.0 Ultra目前是有免费额度的。

2 开发者快速指引

2.1 注册账号

打开讯飞星火大模型官方网站:
官网
注册账号:
登录页面

2.2 创建应用,获取接口认证信息

登录后,点击左下角的“API接入”:
API接入
点击“在线调试”:
星火API
右上角下拉菜单的「我的应用」进入控制台。若您的账户未曾创建过应用,系统会引导您创建您的第一个应用。
我的应用
填写应用名称、应用分类、应用功能描述:
创建应用
应用创建完成之后,就可以通过左侧的服务列表,选择您要使用的服务。在服务管理面板中,您将看到这个服务对应的可用量、历史用量、服务接口的认证信息(后面Python 调用API需要用到这3个参数)。
服务接口认证信息
讯飞开放平台支持一个账户创建多个应用。当您需要返回应用列表页切换应用,可以点击页面左上角应用名称上方的返回按钮,或顶部右侧个人菜单中的「我的应用」。进入应用列表后,选择一个应用点击应用名称,即可进入这个应用对应的服务管理页。

同一个应用APPID可以用在多个业务上,这个没有限制,但考虑到多个业务共用一个APPID无法分业务统计用量,建议一个业务对应一个应用APPID。

2.3 获取Token

接口采用tokens方式计费。tokens与词表、分词方案相关,没有精确的计算方式,但是接口会返回本次计费的tokens数(详见接口文档响应参数描述)。接口计费会将请求text字段下所有的content内容均计费,开发者需要酌情考虑保留的历史对话信息数量,避免浪费tokens(最大的输入tokens见接口文档参数描述)。
以最新的Spark 4.0 Ultra为例,在左侧的列表中选中Spark 4.0 Ultra,点击“立即购买”按钮:
购买token
选择应用,完成身份认证及设置支付密码的个人可以免费领取200万的token,有效期为1年。
免费token
0元下单:
确认下单

3 Python 调用 API

3.1 获取Web API 文档

点击链接:星火认知大模型Web API文档
API文档
详细阅读说明文档,重点看下请求参数:
请求参数
role 参数的取值为[system,user,assistant],system用于设置对话背景,user表示是用户的问题,assistant表示AI的回复。其中 system 只有Spark 4.0Ultra/Max支持,比如一些定制化的需求,使用Spark Lite 版本是无法实现的。

3.2 获取示例代码

下拉接口文档到最后,下面会有一些不同语言的调用示例以供参考,我们以 Python 为例:
调用示例
第一个示例文件是单次对话,第二个则可以连续对话。这里我们先介绍第一个的使用方法。下载后解压,可以得到一个“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):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, query=ws.query, 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"]print(content,end='')if status == 2:print("#### 关闭会话")ws.close()def gen_params(appid, query, 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": [{"role": "user", "content": query}]}}}return datadef main(appid, api_secret, api_key, gpt_url, domain, query):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.query = queryws.domain = domainws.run_forever(sslopt={"cert_reqs": ssl.CERT_NONE})if __name__ == "__main__":main(appid="",api_secret="",api_key="",#appid、api_secret、api_key三个服务认证信息请前往开放平台控制台查看(https://console.xfyun.cn/services/bm35)gpt_url="wss://spark-api.xf-yun.com/v3.5/chat",      # Max环境的地址   # Spark_url = "ws://spark-api.xf-yun.com/v3.1/chat"  # Pro环境的地址# Spark_url = "ws://spark-api.xf-yun.com/v1.1/chat"  # Lite环境的地址domain="generalv3.5",     # Max版本# domain = "generalv3"    # Pro版本# domain = "general"      # Lite版本址query="给我写一篇100字的作文")

这段代码定义了一个名为Ws_Param的类,用于处理WebSocket请求。以下是代码中各个方法的解释:

  • _init_(self, APPID, APIKey, APISecret, gpt_url):初始化方法,用于设置类的实例变量。其中,APPID、APIKey、APISecret分别表示讯飞开放平台的应用ID、API Key和API Secret;gpt_url表示星火大模型的请求地址。
  • create_url(self):生成请求的URL。根据当前时间生成RFC1123格式的时间戳;然后,拼接签名字符串,包括host、date和GET请求行;接着,使用hmac-sha256算法对签名字符串进行加密;将加密后的签名字符串进行Base64编码,并将其添加到鉴权参数中,生成完整的URL。
  • on_error(ws, error):收到WebSocket错误的处理方法。当WebSocket连接发生错误时,会调用此方法。
  • on_close(ws):收到WebSocket关闭的处理方法。当WebSocket连接关闭时,会调用此方法。
  • on_open(ws):收到WebSocket连接建立的处理方法。当WebSocket连接建立时,会调用此方法。在此处,会启动一个新的线程来运行run函数。
  • run(ws, *args):运行函数,用于向讯飞星火大模型服务发送请求。根据WebSocket实例的appid和question属性生成请求参数,然后将请求参数转换为JSON字符串并通过WebSocket发送。
  • on_message(ws, message):收到WebSocket消息的处理方法。当从讯飞星火大模型服务接收到消息时,会调用此方法。解析接收到的消息,然后根据消息中的code判断请求是否成功;如果成功,则将返回的内容打印出来;如果code不为0,表示请求失败,此时关闭WebSocket连接。

3.3 调试代码

注:项目仅支持 Python3.8+

  1. 安装PyPI上的包,在 Python 环境中执行命令:
pip install --upgrade spark_ai_python
  1. 安装 websocket 库:
pip install websocket-client
  1. 填入参数:
    填入星火大模型的URL值和domain值(根据不同版本对应的值),以及接口认证信息(开放平台控制台查看):
    填入参数

  2. 运行示例代码:

python [sparkAPI.py路径]

提示“ModuleNotFoundError: No module named ‘openpyxl’”:
缺少openpyxl
openpyxl 是用于读写Excel文件的库,这里没用到,可以删除导包的这行代码“import openpyxl”。
然后继续运行,又提示on_close()函数参数错误:
参数错误
这里on_close()方法少传两个参数,实际在传参时需要有三个参数,这里补齐另外两个参数:

def on_close(ws, close_code, close_reason):print("### closed ###")

再次运行,成功!!!
运行成功

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 【前端】ES6:Promise对象和Generator函数
  • 深度学习自编码器 - 自编码器的应用篇
  • 木舟0基础学习Java的第二十九天(Spring,Spring的属性注入(xml,注解))
  • 编译成功!QT/6.7.2/Creator编译Windows64 MySQL驱动(MinGW版)
  • leetcode第十四题:最长公共前缀
  • CTC loss 博客转载
  • 鸿蒙【项目打包】- .hap 和 .app;(测试如何安装发的hap包)(应用上架流程)
  • 【机器学习】--- 自然语言推理(NLI)
  • 巨人网络参展云栖大会,两款“游戏+AI”自研大模型应用首发
  • docker之自定义镜像上传至阿里云
  • 山体滑坡检测系统源码分享
  • 力扣(leetcode)每日一题 2374 边积分最高的节点
  • Godot游戏如何提升触感体验
  • 大佬,简单解释下“嵌入式软件开发”和“嵌入式硬件开发”的区别
  • Mistral AI 又又又开源了闭源企业级模型——Mistral-Small-Instruct-2409
  • 【comparator, comparable】小总结
  • 08.Android之View事件问题
  • 5分钟即可掌握的前端高效利器:JavaScript 策略模式
  • 78. Subsets
  • Android Volley源码解析
  • Angular 响应式表单之下拉框
  • angular2开源库收集
  • AzureCon上微软宣布了哪些容器相关的重磅消息
  • go语言学习初探(一)
  • iOS动画编程-View动画[ 1 ] 基础View动画
  • JavaScript-Array类型
  • Js基础知识(四) - js运行原理与机制
  • js正则,这点儿就够用了
  • 关于Flux,Vuex,Redux的思考
  • 基于组件的设计工作流与界面抽象
  • 记录:CentOS7.2配置LNMP环境记录
  • 坑!为什么View.startAnimation不起作用?
  • 买一台 iPhone X,还是创建一家未来的独角兽?
  • 深入浅出Node.js
  • 使用Gradle第一次构建Java程序
  • 通过npm或yarn自动生成vue组件
  • 一个SAP顾问在美国的这些年
  • “十年磨一剑”--有赞的HBase平台实践和应用之路 ...
  • FaaS 的简单实践
  • NLPIR智能语义技术让大数据挖掘更简单
  • 格斗健身潮牌24KiCK获近千万Pre-A轮融资,用户留存高达9个月 ...
  • ​​​【收录 Hello 算法】10.4 哈希优化策略
  • ​Java并发新构件之Exchanger
  • ​七周四次课(5月9日)iptables filter表案例、iptables nat表应用
  • #ifdef 的技巧用法
  • (2)MFC+openGL单文档框架glFrame
  • (C++)栈的链式存储结构(出栈、入栈、判空、遍历、销毁)(数据结构与算法)
  • (iPhone/iPad开发)在UIWebView中自定义菜单栏
  • (Java数据结构)ArrayList
  • (ZT)薛涌:谈贫说富
  • (二)十分简易快速 自己训练样本 opencv级联lbp分类器 车牌识别
  • (附源码)springboot车辆管理系统 毕业设计 031034
  • (免费领源码)python#django#mysql公交线路查询系统85021- 计算机毕业设计项目选题推荐
  • (一)Spring Cloud 直击微服务作用、架构应用、hystrix降级
  • (已更新)关于Visual Studio 2019安装时VS installer无法下载文件,进度条为0,显示网络有问题的解决办法