函数调用
函数调用允许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的交易状态为“已支付”。还有什么我可以帮你的吗?