SenseNova 商汤日日新大模型 Function Call(函数调用)功能讲解和应用示例

文章介绍了如何在商汤日日新大模型SenseNova中使用FunctionCall功能,通过函数调用来连接LLM与外部工具,如查询天气和学生成绩,展示了如何定义和使用函数调用以增强AI应用的交互能力。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

考虑到使用 magic 申请 OpenAPI 的账号挺麻烦的,这里以商汤日日新大模型 SenseNova 介绍 Function Call 的功能。

 

官方链接:日日新开放平台

一、Function Call 是个啥?

LLM(Large Language Model) 语言大模型时代,Function Call(函数调用)是指可靠地连接 LLM 与外部工具的能力。让用户能够使用高效的外部工具、与外部 API 进行交互。

GPT-4 和国内 SenseNova 等经过微调的 LLM,能够检测函数是否被调用,随后输出包含调用函数参数的 JSON。通过这一过程被调用的函数能够作为工具添加到您的 AI 应用中,并且您可以在单个请求中定义多个函数。

函数调用是一项重要能力。它对于构建 LLM 驱动的聊天机器人或代理至关重要。这些聊天机器人或代理需要为 LLM 检索上下文。它们还与外部工具交互。这种交互是通过将自然语言转换为 API 调用来完成的。

函数调用使开发者能够创建:

  • 能够高效使用外部工具回答问题的对话代理。例如,查询「上海的天气如何?」将被转换为类似 get_current_weather(location: string, unit: 'celsius' | 'fahrenheit') 的函数调用。
  • 用于提取和标记数据的 LLM 驱动解决方案(例如,从维基百科文章中提取人名)。
  • 可以帮助将自然语言转换为 API 调用或有效数据库查询的应用程序。
  • 能够与知识库交互的对话式知识检索引擎。
  • 从文本中提取结构化数据。

二、使用 SenseNova 进行函数调用

假设一个用户向模型提出以下问题:

上海今天的天气怎么样?

看大部分的教程都是用这个示例来说明函数调用,但这里想说商汤的 SenseNova 其实已经支持联网功能了,API 层面设置对应的参数即可自动从网络上实时获取天气信息!!!

这里对比一下 ChatGPT 和 SenseChat(基于 SenseNova 大模型的聊天机器人),看下他们的回答分别是什么?

商汤通过 search_enable 参数将是否开启在线检索开放出来了,以下是配置参数:

所以用天气怎么样,无法作为函数调用示例代码了。下面我们通过「查询学生成绩」来讲解如何使用函数调用。

功能:我们有一个数据库其中有学生表,记录每个学生的成绩,我现在需要和 SenseNova 交流问它其中某个学生的成绩怎么样。

要使用函数调用处理此请求,第一步是定义一个查询学生成绩的函数。您将作为 SenseNova API 请求的一部分传递这些函数:

tools = [
    {
        "type": "function",
        "function": {
            "name": "get_score",
            "description": "通过学生的姓名查询学生的成绩",  # 这个描述对 LLM 非常重要
            "parameters": {
                "type": "object",
                "properties": {
                    "name": {
                        "type": "string",
                        "description": "学生姓名"
                    }
                },
                "required": [
                    "name"
                ]
            }
        }
    }
]
tool_choice = {
    "mode": "auto"
}

get_score 函数能够返回指定学生的成绩信息。当您将这个函数定义作为请求的一部分传递时,它实际上并不执行函数,只是返回一个包含调用函数所需参数的 JSON 对象。

以下是实现这一需求的函数调用整个代码片段,读者可自行复制粘贴执行一下,前提是申请了 SenseNova 的试用账号。

import json
import os

import sensenova

ak = os.environ['SENSENOVA_AK']
sk = os.environ['SENSENOVA_SK']

sensenova.access_key_id = ak
sensenova.secret_access_key = sk
model_id = "SenseChat-FunctionCall"

tools = [
    {
        "type": "function",
        "function": {
            "name": "get_score",
            "description": "通过学生的姓名查询学生的成绩",  # 这个描述对 LLM 非常重要
            "parameters": {
                "type": "object",
                "properties": {
                    "name": {
                        "type": "string",
                        "description": "学生姓名"
                    }
                },
                "required": [
                    "name"
                ]
            }
        }
    }
]
tool_choice = {
    "mode": "auto"
}


def get_response(question):
    resp = sensenova.ChatCompletion.create(
        model=model_id,
        messages=[{"role": "user", "content": question}],
        max_new_tokens=1024,
        temperature=0.8,
        tools=tools,
        tool_choice=tool_choice,
    )
    return resp['data']['choices'][0]


question = "帮我查询张三的考试成绩"
# 1. 第一次 LLM 调用
message = get_response(question)


def get_score(name):
    """
    模拟读取数据库中的学生表
    :param name:
    :return:
    """

    # 用一个字典存储姓名和成绩对应关系, 实际这里是查询数据库
    scores = {"小明": 90, "小红": 80, "小白": 59, "张三": 99}
    score = {
        "name": name,
        "score": scores[name]
    }
    return json.dumps(score)


# 2. 解析第一次LLM调用结果,构建参数进行第二次LLM调用,获取最终结果
if message.get("tool_calls"):

    # 函数调用ID,下一次调用需要传入
    tool_call_id = message['tool_calls'][0]['id']
    # 我们定义的函数参数值,这里是经过 LLM 解析后,将"帮我查询张三的考试成绩"这种非结构化数据转为了结构化数据,这里的name=张三
    name = json.loads(message['tool_calls'][0]['function']['arguments']).get("name")
    # 调用我们定义的函数:get_score
    function_response = get_score(name=name)

    # 将用户的原始输入、第一次LLM返回的message、还有tool_call_id/function_response一起组成第二次调用的messages,发起LLM第二次调用
    second_response = sensenova.ChatCompletion.create(
        model=model_id,
        messages=[{"role": "user", "content": question},
                  message,
                  {"role": "tool", "content": function_response, "tool_call_id": tool_call_id}
                  ],
        tools=tools,
        tool_choice=tool_choice,
    )
    # 输出想要的结果
    print(second_response['data']['choices'][0]['message'])

输出:

张三的考试成绩是99分。

三、小结

通过上面的示例,相信你应该对 Function Call(函数调用)的用法和作用有了初步了解,如有不明白的地方,欢迎留言或私聊联系我。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Hyatt1024

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值