1、获取api接口的ID和key
这里我们可以获取星火免费赠送的200万个token使用和测试,获取方法如下:
打卡网站讯飞星火认知大模型-AI大语言模型-星火大模型-科大讯飞,登录用户点击免费使用
1.1 创建应用
点击购买首次应该会让创建一个应用, 如下图,按要求内容随意填写,然后提交
1.2购买token
创建完成应用,回去购买,我这里选择个人的(这些都是在完成认证及设置了支付密码的基础)
1.3 获取 ID和key
在工单中心这个大模型3.0,页面就是,appid这三个我们会用到
2、 Python调用api
我的Python版本是在3.8左右的
创建一个名为SparkApi.py的Python文件,将下面代码粘进去
下面官方的代码有个坑,就是answer = “”是个全局变量,这个会将所有的提问拼接在一起,不过这个影响不大,就是打印answer的结果不好看,只要我们输入时text列表清除历史输入,token还是不带历史
import _thread as threadimport base64import datetimeimport hashlibimport hmacimport jsonfrom urllib.parse import urlparseimport sslfrom datetime import datetimefrom time import mktimefrom urllib.parse import urlencodefrom wsgiref.handlers import format_date_timeimport websocket# 使用websocket_clientanswer = ""class Ws_Param(object):# 初始化def __init__(self, APPID, APIKey, APISecret, Spark_url):self.APPID = APPIDself.APIKey = APIKeyself.APISecret = APISecretself.host = urlparse(Spark_url).netlocself.path = urlparse(Spark_url).pathself.Spark_url = Spark_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.Spark_url + '" />
在随便建一个py文件,将下面代码粘进去,这个是调用客户端,上面文件是服务端
import SparkApi#以下密钥信息从控制台获取appid = "XXXXXXXX" #填写控制台中获取的 APPID 信息api_secret = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" #填写控制台中获取的 APISecret 信息api_key ="XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"#填写控制台中获取的 APIKey 信息domain = "general3" # v3版本#云端环境的服务地址Spark_url = "ws://spark-api.xf-yun.com/v3.1/chat"# v3环境的地址("wss://spark-api.xf-yun.com/v3.1/chat)text =[]# length = 0def getText(role,content):jsoncon = {}jsoncon["role"] = rolejsoncon["content"] = contenttext.append(jsoncon)return textdef getlength(text):length = 0for content in text:temp = content["content"]leng = len(temp)length += lengreturn lengthdef checklen(text):while (getlength(text) > 8000):del text[0]return textif __name__ == '__main__':text.clearwhile(1):Input = input("\n" +"我:")question = checklen(getText("user",Input))SparkApi.answer =""print("星火:",end = "")SparkApi.main(appid,api_key,api_secret,Spark_url,domain,question)getText("assistant",SparkApi.answer)# print(str(text))
这里就需要把刚才控制台的信息替换掉那些xxxx
ps:这里就是一个python的简易问答,如果想掉用接口,在这个调用文件里加一个调用函数
def spark_api(question):""":param question::return:"""question = checklen(getText("user",question))SparkApi.answer =""SparkApi.main(appid,api_key,api_secret,Spark_url,domain,question)text.clear()return SparkApi.answer
建议在使用接口函数调用是加上text.clear(),清除历史对话,否则在一个长的连接调用时历史的token会加越来越长,十分消耗token,不需要历史的建议clear
3 、应用分享
最近作者在做项目是使用到了api辅助数据处理,其中发现在在提示词中加入一个历史对话可能会让结果更标准。下面是测试样例:
def getText(role,content):jsoncon = {}history_put = """['工程','货物',]\n请从上面选项中选择一个属于下面文本的分类\n左侧边坡宣传标语 ,结果只输出1,2 ,如果都不属于输出0"""text.append({'role':'user','content':history_put })text.append({'role': 'assistant', 'content': '0'})jsoncon["role"] = rolejsoncon["content"] = contenttext.append(jsoncon)return text
上面代码是作者在函数中加入一串历史对话,这种思路就是每次调用都是一次历史和本次调用,这样在输出的结果上大部分都是一致的。在我测试7000条数据中仅有10条是有解释性话术。
4、bug问题
bug:如下图:
这个是缺少包安装这个即可:websocket-client==1.4.2
如下图:
这个我认为是spark_url="ws(s)://spark-api.xf-yun.com/v3.1/chat" # 错误案例
正确的spark_url="wss://spark-api.xf-yun.com/v3.1/chat" 或者ws://spark-api.xf-yun.com/v3.1/chat