正如我过去提到的,由大型语言模型(LLM)驱动的自主人工智能代理最近成为研究的重点,推动了代理应用、代理检索增强生成(RAG)和代理发现等概念的发展。
然而,根据Salesforce AI Research 的研究,开源社区在构建专门针对这些任务的模型方面仍然面临重大挑战。
一个主要的障碍是缺乏高质量的、特定于代理的数据集,再加上缺乏标准化的协议,这使得开发过程变得复杂。
为了弥补这一差距,Salesforce 的研究人员推出了xLAM,这是一系列专为 AI 代理任务设计的大型动作模型。
xLAM 系列包含五种模型,其架构范围从密集到混合专家,参数大小从 10 亿开始。
这些模型旨在通过提供针对代理任务的复杂需求而定制的解决方案来提高自主代理的能力。
函数调用
函数调用已成为人工智能代理环境中的一个关键元素,特别是从模型能力的角度来看,因为它显著扩展了大型语言模型 (LLM) 的功能,超越了静态文本生成。
因此,大型动作模型出现的原因之一就是其主要特征之一就是擅长函数调用的能力。
人工智能代理通常需要根据用户输入执行操作,例如检索信息、安排任务或执行计算。
函数调用允许模型为这些任务生成参数,使代理能够触发外部进程,如数据库查询或 API 调用。
这使得代理不仅仅是被动的,而且是面向行动的,将被动响应转变为动态交互。
与外部系统的互操作性
对于 AI 代理,子任务涉及与各种工具的交互。工具又链接到外部系统(CRM 系统、财务数据库、天气 API 等)。
通过函数调用,LAM 可以充当代理,为这些系统提供必要的数据或操作,而无需模型本身直接访问。这样可以与其他软件环境和工具无缝集成。
通过从 LLM 转向 LAM,模型实用性也得到了扩展,因此 LAM 可以被看作是专门构建的,作为代理实现的核心部分。
大型语言模型 (LLM) 旨在处理非结构化 输入和输出,擅长生成类似人类的文本、总结内容和回答开放式问题等任务。
LLM 具有高度灵活性,可以处理多种形式的自然语言,而无需预定义的格式。
然而,它们的输出可能含糊不清或结构松散,这会限制它们执行特定任务的有效性。使用 LLM 进行代理实现并没有错,而且效果很好。
但是大型动作模型 (LAM)可以被视为专门构建的,专注于通过为特定动作生成精确的参数或指令来构建输出,使其适合需要清晰和可操作结果的任务,例如函数调用或 API 交互。
虽然 LLM 非常适合理解和生成非结构化内容,但 LAM 旨在通过将语言转化为结构化的可执行操作来弥补差距。
总体而言,在人工智能代理的背景下,函数调用允许 LLM 充当自然语言理解和数字系统内可操作任务之间的桥梁,从而实现更为稳健、更强大和更实用的应用程序。
函数调用在很多用例中都很有价值,其中包括:
助手的数据检索:当用户询问“我的交货日期是什么时候?”时,人工智能助手可以从内部系统获取最新的客户信息,然后再做出答复。
助手的可操作任务:人工智能助手可以通过将用户偏好与日历可用性相结合来执行安排会议等任务。
执行计算:数学辅导助手可以执行实时计算,为用户解决数学问题。在下面的示例代码中,我展示了这一点。
构建复杂的工作流程:在数据处理中,管道可以检索原始文本,将其转换为结构化数据,并将其存储在数据库中。
修改应用程序 UI:函数调用可以动态更新用户界面,例如根据用户输入在地图上放置图钉。
在函数调用方面需要注意的是,当使用带有函数调用的 OpenAI API 时,模型不会直接执行函数。
相反,在步骤 3 中,模型会生成调用函数所需的参数,并由代码决定如何处理它们 — 通常通过调用指定的函数。您的应用程序在整个过程中保持完全控制。
下面是来自 OpenAI 的有关函数调用的图片……
OpenAI 函数调用示例
该模型gpt-4-0613
建立了函数调用能力。
创建了两个非常简单的工具(add_numbers
& subtract_numbers
),分别用于加法和减法数字。
该模型监听请求并决定何时调用其中一个函数,然后根据函数名称和参数调用适当的工具。
这清楚地演示了如何使用 GPT 模型进行函数调用……
pip install openai== 0.28
import openai
import json
# 提示用户输入 API 密钥
api_key = input ( "请输入您的 OpenAI API 密钥:" )
openai.api_key = api_key
# 定义工具:一个加法函数和一个减法函数
def add_numbers ( a, b ):
return { "result" : a + b}
def subtract_numbers ( a, b ):
return { "result" : a - b}
# 定义函数模式以供 OpenAI 函数调用
functions = [
{
"name" : "add_numbers" ,
"description" : "将两个数字相加" ,
"parameters" : {
"type" : "object" ,
"properties" : {
"a" : {
"type" : "number" ,
"description" : "要相加的第一个数字"
},
"b" : {
"type" : "number" ,
"description" : "要相加的第二个数字"
}
},
"required" : [ "a" , "b" ]
}
},
{
"name" : "subtract_numbers" ,
"description" : "从另一个数字中减去一个数字" ,
"parameters" : {
"type" : "object" ,
"properties" : {
"a" : {
"type" : "number" ,
"description" : "要减去的数字"
},
"b" : {
"type" : "number" ,
"description" : "要减去的数字"
}
},
"required" : [ "a" ,"b" ]
}
}
]
# 定义一个函数,根据函数名处理函数调用
def handle_function_call ( function_name,arguments ):
if function_name == "add_numbers":
return add_numbers(arguments[ 'a' ],arguments[ 'b' ])
elif function_name == "subtract_numbers" :
return subtract_numbers(arguments[ 'a' ],arguments[ 'b' ])
else :
raise ValueError( f"Unknown function: {function_name} " )
# 通过函数调用提示模型
def call_gpt ( prompt ):
response = openai.ChatCompletion.create(
model= "gpt-4-0613" , # gpt-4-0613 支持函数调用
messages=[
{ "role" : "system" , "content" : "You are a helpful assistant." },
{ "role" : "user" , "content" : prompt}
],
functions=functions,
function_call= "auto" # 这允许模型决定调用哪个函数
)
# 检查模型是否要调用函数
message = response[ "choices" ][ 0 ][ "message" ]
如果消息 中的“function_call” : function_name = message[ "function_call" ][ "name" ] 参数 = json.loads(message[ "function_call" ][ "arguments" ]) result = handle_function_call(function_name,arguments) return f"函数调用:{function_name},结果:{result[ 'result' ]} " else : return message[ "content" ] # 测试应用程序while True : user_input = input ( "输入一道数学题(加法或减法)或输入'exit'退出:" ) if user_input.lower() == "exit" : break response = call_gpt(user_input) print (response)
RA/SD 衍生者AI训练营。发布者:chris,转载请注明出处:https://www.shxcj.com/archives/6087