讯飞星火大模型虽说开发文档上写着支持 function calling,但是只给了参数构造示例,没有给Python代码,只给了api调用的代码。本以为把两者融合挺容易,没想到坑太多了,连借助gpt都不能很快写好。星火的还是太冷门了,在网上一个可行的例子,哪怕是其他语言的都找不到。
这里按照接口说明“缝合”了起来,但是星火对返回结果的拼接使用实在是找不到方案,所以这块的处理还有待完善。
目前的处理是把函数调用的情况添加到用户的发言中。但是模型经常不考虑调用结果,还是自顾自地回答,输出一堆细节。
[{
'role': 'user', 'content': "2024.7.6北京什么天气\n请参考这个函数调用情况回答:函数调用 天气查询 ,输入参数是:{'date': '2024.7.6', 'location': '北京'},返回结果是: 高温,同时有冰雹"}]
不过刚才的是Max版本,Pro版本可能会好点,看来模型越蠢,越容易被忽悠。
Max版本: 目前我只能提供昨天的历史天气数据。北京昨天的天气状况为多云转雾,温度范围在22℃~31℃,风向风力为南风微风。
具体天气情况如下:
天气:多云转雾。 - 最高温度:31℃。 - 最低温度:22℃。 - 日出时间:04:51。 - 日落时间:19:46。 - 风向风力:南风微风。 - 相对湿度:52%。 - 空气质量:良。
Pro版本:在2024年7月6日,北京的天气预计会非常炎热,同时可能会有冰雹出现。请注意防暑降温并关注气象预报,做好冰雹防范措施。
代码导入SparkApi的包,重写了 on_message和gen_params方法。
# coding: utf-8
import SparkApi
import time
import os
import json
from dotenv import load_dotenv, find_dotenv
load_dotenv()
appid=os.getenv("SPARKAI_APP_ID")
api_secret=os.getenv("SPARKAI_API_SECRET")
api_key=os.getenv("SPARKAI_API_KEY")
domain = "generalv3.5" # Max版本
# domain = "generalv3" # Pro版本
# domain = "general" # Lite版本
Spark_url = "wss://spark-api.xf-yun.com/v3.5/chat" # Max服务地址
# Spark_url = "wss://spark-api.xf-yun.com/v3.1/chat" # Pro服务地址
# Spark_url = "wss://spark-api.xf-yun.com/v1.1/chat" # Lite服务地址
#初始上下文内容,当前可传system、user、assistant 等角色
text =[
# {"role": "system", "content": "你现在扮演李白,你豪情万丈,狂放不羁;接下来请用李白的口吻和用户对话。"} , # 设置对话背景或者模型角色
# {"role": "user", "content": "你是谁"}, # 用户的历史问题
# {"role": "assistant", "content": "....."} , # AI的历史回答结果
# # ....... 省略的历史对话
# {"role": "user", "content": "你会做什么"} # 最新的一条问题,如无需上下文,可只传最新一条问题
]
def getText(role,content):
jsoncon = {
}
jsoncon["role"] = role
jsoncon["content"] = content
text.append(jsoncon)
return text
def getlength(text):
length = 0
for content in text:
temp = content["content"]
leng = len(temp)
length += leng
return length
def checklen(text):
while (getlength(text) > 8000):
del text[0]
return text
# 定义示例函数
def add_numbers(a, b):
return a + b
def get_weather(location, date=None):
# return f"正在调用示例函数:查询{location}的天气信息,日期: {date}"
return '高温,同时有冰雹'
# 提取 query 中的参数
def extract_parameters(query):
function_call = query["payload"]["choices"]["text"][0]["function_call"]
function_name = function_call.get("name")
function_args = json.loads(function_call.get("arguments", "{}"))
return function_name, function_args
#重写on_message以支持function_call