星火大模型 function calling Python 调用思路

讯飞星火大模型虽说开发文档上写着支持 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
### 使用 Python 调用千文大模型 API 的方法 为了使用 Python 调用千文大模型 API,通常需要遵循特定的认证流程并发送 HTTP 请求来交互。下面是一个简化版的例子展示如何实现这一过程。 #### 准备工作 确保安装了必要的库,比如 `requests` 库用于发起网络请求: ```bash pip install requests ``` #### 初始化配置与导入模块 定义一些常量变量如 API 地址、应用 ID 和密钥等,并引入所需的 Python 模块。 ```python import json import requests appid = 'your_app_id' # 替换成自己的 app id api_key = 'your_api_key' api_secret = 'your_api_secret' qwen_url = "https://dashscope-api.aigc.baidu.com/api/v1/qwen/generation" headers = { 'Content-Type': 'application/json', } params = ( ('app_id', appid), ) data = {"messages": [{"role": "user", "content": ""}], "stream": False} # 设置消息体结构 ``` #### 构建请求函数 创建一个名为 `call_qwen_api` 的函数用来封装向千文大模型发出请求的过程。 ```python def call_qwen_api(user_input): data["messages"][0]["content"] = user_input response = requests.post(qwen_url, headers=headers, params=params, data=json.dumps(data), auth=(api_key, api_secret)) if response.status_code == 200: result = response.json() return result['result'] else: raise Exception(f"Error calling Qwen API: {response.text}") ``` #### 主程序逻辑 编写一段简单的命令行界面让用户输入问题并通过上述构建好的函数获取来自千文的回答。 ```python if __name__ == '__main__': try: while True: user_question = input("\n我:") answer = call_qwen_api(user_question) print("千文:", answer) except KeyboardInterrupt: print('\n退出') ``` 此段代码展示了基本框架[^1],具体细节可能依据官方文档有所变化,请参照最新的 API 文档调整相应部分。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值