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調用與提問示例
-