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调用与提问示例
-