1官网链接
- 比赛官网:2024 iFLYTEK A.I.开发者大赛-讯飞开放平台 (xfyun.cn);
- 控制台官网:控制台-讯飞开放平台 (xfyun.cn);
2星火模型python调用示例
- 示例链接:https://xfyun-doc.xfyun.cn/lc-sp-PythonDemo-1716370485358.zip;
- 使用上述示例时,执行到
on_close时报参数数量不匹配的错误;因此将def on_close(ws):改为def on_close(ws,*args):;以接收剩余的多个参数;
- 修改之后的补充了一些备注的示例文件链接:1-websocket调用星火大模型-简单示例-无上下文.py;
- 注意:要换成自己的
appid、api_secret、api_key;
2.1步骤总结
-
初始化参数对象,包括设置自己的api、连接的大模型的接口地址等;对应
Ws_Param.__init__函数; -
将连接地址与自己的鉴权信息进行拼接,生成最终的请求用的
url【详细解释见官网WebSocket协议通用鉴权URL生成说明 | 讯飞开放平台文档中心 (xfyun.cn)】;对应Ws_Param.create_url方法; -
使用上面的
url创建一个WebSocketApp对象,其中传入了自己实现了的四个回调函数(on_message,on_error,on_close,on_open);接着就可以通过run_forever方法启动一个websocket客户端;-
虽然这个方法可以建立永久的连接,但是在官网说了星火认知大模型接口默认采用短链接的模式,即接口每次将结果完整返回给用户后会主动断开链接,用户在下次发送请求的时候需要重新握手链接。
-
收到websocket连接建立时会先调用
on_open方法:- 该方法先开启一个新的线程,将使用
WebSocket对象的send方法将消息发送到服务器 - 消息是一个
json格式的字符串,由gen_params方法生成并返回; - 关于消息的各个部分的含义,详见星火认知大模型Web API文档 | 讯飞开放平台文档中心 (xfyun.cn)的
1.3.1 请求参数部分的解释;
- 该方法先开启一个新的线程,将使用
-
之后将收到来自服务器的消息,因此将调用
on_message方法:-
通过debug可以发现,这里收到的消息是类似流式输出的方式,每次只接收完整回复的一小部分内容,如下图所示;因此
on_message方法将被多次调用,直到所有的回复都被接收;
-
关于模型回复的消息各个部分的含义详见星火认知大模型Web API文档 | 讯飞开放平台文档中心 (xfyun.cn)的
1.4 接口响应部分; -
当最后一部分消息返回之后,上图中的
status=2; -
之后会直接调用
WebSocketApp对象的close()方法关闭连接; -
下图为一次连接请求完成之后收到的完整回复:

-
-
最后,收到websocket关闭时将调用
on_close方法打印一些信息;
-
3星火模型python调用示例-带上下文
- 示例链接:https://xfyun-doc.xfyun.cn/lc-sp-PythonDemo(content)-1716370504832.zip;
- 加入注释之后的示例代码链接:2-PythonDemo(content);注意:要换成自己的
appid、api_secret、api_key;
3.1步骤总结
-
这个示例将
2星火模型python调用示例章节的代码作为类进行引用;仅额外在SparkPythondemo.py中增加了几个用于处理上下文的函数和代码; -
PythonDemo(content)\SparkApi.py文件与2星火模型python调用示例章节的代码的区别主要有以下几点:- 增加了
answer、sid全局变量;并在on_message方法中将模型返回的结果存放到了answer中;当然,on_message方法中对模型返回的结果依旧做了输出; gen_params方法生成请求参数时,payload.message.text参数不是直接指定了,而是由变量代替;这样可以从控制台输入问题,并经过处理后传入;- 再就是,有一些变量的名称发生了变化;
- 增加了
-
再来看
PythonDemo(content)\SparkPythondemo.py文件:-
原先在
PythonDemo(content)\SparkApi.py文件中的密钥、主机地址等信息都在这里; -
上下文列表
text作为全局变量;后续在调用getText方法时上下文列表将不断得到扩充;从而实现具有连续上下文调用大模型进行回答的功能; -
使用
getlength、checklen方法计算当前上下文列表中所有content的长度之和,判断有无超出长度上限;若超过上限,则将上下文列表中最早的消息删除掉; -
通过执行下述语句,将控制台输入的信息封装成符合格式要求的带上下文的
text列表,并使用之前的socket方法与模型交流,得到的答案存在SparkApi.answer中;while(1):Input = input("\n" +"我:") # 控制台读入问题question = checklen(getText("user",Input))SparkApi.answer ="" # 每次循环都将答案置为空,这样每次输出的答案就是当前问题的答案了print("星火:",end ="")SparkApi.main(appid,api_key,api_secret,Spark_url,domain,question)# print(SparkApi.answer)getText("assistant",SparkApi.answer)讯飞星火大模型带上下文的API调用与提问示例
-