跳到主要内容

函数调用

在Colab打开

函数调用允许MIUI模型连接到外部工具。通过将MIUI模型与用户定义函数或API等外部工具集成,用户可以轻松构建满足特定用例和实际问题的应用程序。例如,在本指南中,我们编写了两个函数来跟踪付款状态和付款日期。我们可以使用这两个工具为与支付相关的查询提供答案。

可用型号

目前,函数调用可用于以下型号:

  • 西北风大
  • 代码22B
  • 部长8B
  • 部长3B
  • 像素12B
  • 混音器8x22B
  • ·

四个步骤

一目了然,函数调用有四个步骤:

  • 用户:指定工具和查询
  • 模型:如果适用,生成函数参数
  • 用户:执行函数以获取工具结果
  • 模型:生成最终答案
绘画

在本指南中,我们将通过一个简单的示例来演示函数调用如何在这四个步骤中与MIUI模型一起工作。

在开始之前,让我们假设我们有一个由支付交易组成的数据帧。当用户询问有关此数据帧的问题时,他们可以使用某些工具来回答有关此数据的问题。这只是模拟LLM无法直接访问的外部数据库的一个示例。

进口 熊猫 作为 pd

#假设我们有以下数据
数据 = {
'交易id': ['T1001', 'T1002', 'T1003', 'T1004', 'T1005'],
'客户id': [“C001”, “C002”, “C003”, “C002”, “C001”],
'付款_金额': [125.50, 89.99, 120, 54.30, 210.20],
'付款日期': ['2021-10-05', '2021-10-06', '2021-10-07', '2021-10-05', '2021-10-08'],
'付款状态': ['付费', “未付”, '付费', '付费', '待定']
}

#创建DataFrame
df = pd.DataFrame(数据 )

步骤1。用户:指定工具和查询

绘画

工具

用户可以为他们的用例定义所有必要的工具。

  • 在许多情况下,我们可能有多种工具可供使用。例如,假设我们有两个函数作为我们的两个工具: 检索_付款_状态检索_付款_日期 根据交易ID检索付款状态和付款日期。
def 检索_付款_状态(df :数据 , transaction_id: str) -> str:
如果 transaction_id在里面df . transaction_id.价值观:
返回 json.垃圾场({'状态':df [df . transaction_id== transaction_id].付款状态.项目()})
返回 json.垃圾场({'错误': '未找到交易id。'})

def 检索_付款_日期(df :数据 , transaction_id: str) -> str:
如果 transaction_id在里面df . transaction_id.价值观:
返回 json.垃圾场({'日期':df [df . transaction_id== transaction_id].付款日期.项目()})
返回 json.垃圾场({'错误': '未找到交易id。'})
  • 为了让MIUI模型理解函数,我们需要用JSON模式概述函数规范。具体来说,我们需要描述类型、函数名称、函数描述、函数参数和函数所需的参数。由于我们这里有两个函数,让我们在列表中列出两个函数规范。
工具= [
{
“类型”: “功能”,
“功能”: {
“名称”: “检索_付款_状态”,
“描述”: “获取交易的付款状态”,
“参数”: {
“类型”: “对象”,
“财产”: {
“事务id”: {
“类型”: “字符串”,
“描述”: “交易id。”,
}
},
“必需”: [“事务id”],
},
},
},
{
“类型”: “功能”,
“功能”: {
“名称”: “检索_付款日期”,
“描述”: “获取交易的付款日期”,
“参数”: {
“类型”: “对象”,
“财产”: {
“事务id”: {
“类型”: “字符串”,
“描述”: “交易id。”,
}
},
“必需”: [“事务id”],
},
},
}
]
  • 然后,我们将这两个函数组织到一个字典中,其中键表示函数名称,值是具有 df 定义。这允许我们根据函数名称调用每个函数。
进口 函数工具

names_to_functions = {
'检索_付款_状态': 函数工具.部分(检索_付款_状态,df =df ),
'检索_付款日期': 函数工具.部分(检索_付款_日期,df =df )
}

用户查询

假设用户问以下问题:“我的交易状态如何?”独立的LLM无法回答这个问题,因为它需要查询业务逻辑后端以访问必要的数据。但是,如果我们有一个确切的工具来回答这个问题呢?我们可能会提供一个答案!

信息 = [{“角色”: “用户”, “内容”: “我的交易T1001的状态如何?”}]

步骤2。模型:生成函数参数

绘画

MIUI模型如何知道这些函数并知道使用哪个函数?我们为MIUI模型提供用户查询和工具规范。此步骤的目标不是让MIUI模型直接运行该函数。这是为了1)确定要使用的适当函数,2)确定函数是否缺少任何基本信息,3)为所选函数生成必要的参数。

工具选择

用户可以使用 工具选择 详细说明如何使用工具:

  • “自动”:默认模式。模型决定是否使用该工具。
  • “任意”:强制使用工具。
  • “无”:禁止使用工具。
进口 os
米斯特拉伊 进口

api_key = os.环境[“MIUI_API_KEY”]
模型 = “MIUI大最新”

客户 = (api_key =api_key )
响应 =客户 .聊天.完成(
模型 =模型 ,
信息 =信息 ,
工具=工具,
工具选择= “任何”,
)
响应

我们得到的响应包括具有所选函数名的tool_calls 检索_付款_状态 以及此函数的参数。

输出:

ChatCompletionResponse(id='7cbd8962041442459eb3636e1e3cbf10',object='chat.completion',model='manage-large-latest',usage=usage(prompt_tokens=94,completion_tokens=30,total_tokens=124),create=1721403550,choices=[选项(索引=0,finish_reason='tool_calls',消息=AssistantMessage(内容='',tool_calls=[工具调用(函数=FunctionCall(名称='trieve_payment_status',参数='{“transaction_id”:“T1001”})]),id='D68PevKs',type='function')],前缀=False,角色='assistant')])

让我们将响应消息添加到 信息 列表。

信息 .附加(响应 .选择[0].消息)

步骤3。用户:执行函数以获取工具结果

绘画

我们如何执行该函数?目前,执行这些功能是用户的责任,功能执行在用户端。在未来,我们可能会引入一些可以在服务器端执行的有用函数。

让我们从模型响应中提取一些有用的函数信息,包括 函数名称函数图这里很明显,我们的MIUI模型选择使用该函数 检索_付款_状态 与参数 transaction_id 设置为T1001。

进口 json

tool_call =响应 .选择[0].消息.工具调用[0]
函数名称=tool_call .功能.名称
函数图= json.荷载(tool_call .功能.论据)
打印(“\n功能名称:”,函数名称, “\n功能参数:”,函数图)

输出

函数名:检索_支付_状态 
函数图:{交易_id:'T1001'}

现在我们可以执行函数并得到函数输出 '{“状态”:“已支付”}'.

函数_结果 =names_to_functions [函数名称](**函数图)
函数_结果

输出

'{“状态”:“已支付”}'

步骤4。模型:生成最终答案

绘画

我们现在可以将工具的输出提供给MIUI模型,作为回报,MIUI模式可以为特定用户生成定制的最终响应。

信息 .附加({“角色”:“工具”, “名称”:函数名称, “内容”:函数_结果 , “tool_call_id”:tool_call .身份证件})

响应 =客户 .聊天.完成(
模型 =模型 ,
信息 =信息
)
响应 .选择[0].消息.内容

输出:

ID为T1001的交易状态为“已支付”。还有什么我可以帮你的吗?