介绍
大型语言模型(LLM)驱动的自主人工智能代理(Autonomous AI Agents)最近已成为研究的重点,推动了代理应用、代理检索增强生成(RAG)和代理发现等概念的发展。
然而,根据 Salesforce AI Research 的研究,开源社区在为这些任务建立专门模型方面仍然面临着巨大挑战。
其中一个主要障碍是高质量的代理专用数据集稀缺,再加上标准化协议的缺失,使得开发过程变得更加复杂。
为了弥补这一差距,Salesforce 的研究人员推出了 xLAM,这是一系列专为人工智能代理任务设计的大型动作模型。
xLAM 系列包括五个模型,其架构从密集型到专家混合型不等,参数大小从 10 亿到更多不等。
这些模型旨在通过提供专为满足代理任务复杂需求而定制的解决方案,提高自主代理的能力。
函数调用
函数调用已成为人工智能代理的一个关键要素,尤其是从模型能力的角度来看,因为它大大扩展了大型语言模型(LLM)的功能,使其超越了静态文本生成的范畴。
因此,大型行动模型(Large Action Models)出现的原因之一,就是其主要特征之一就是擅长函数调用。
人工智能代理经常需要根据用户输入执行操作,如检索信息、安排任务或执行计算。
函数调用允许模型为这些任务生成参数,使代理能够触发外部进程,如数据库查询或 API 调用。
这样,代理就不仅仅是被动反应,而是以行动为导向,将被动反应转变为动态交互。
与外部系统的互操作性
对于人工智能代理来说,子任务涉及与各种工具的交互。工具反过来又与外部系统(客户关系管理系统、金融数据库、天气 API 等)相连接。
通过功能调用,LAM 可以充当中介,为这些系统提供必要的数据或操作,而无需模型本身直接访问。这就实现了与其他软件环境和工具的无缝集成。
通过从 LLM 到 LAM 的转变,模型的实用性也得到了扩展,因此 LAM 可以被视为专门为作为代理实施的核心部件而构建的。
大型语言模型(LLM)旨在处理非结构化的输入和输出,在生成类人文本、总结内容和回答开放式问题等任务中表现出色。
LLM 高度灵活,可以处理各种形式的自然语言,而无需预定义格式。
不过,它们的输出可能含糊不清或结构松散,这可能会限制它们在执行具体任务时的有效性。使用 LLM 进行代理实施并没有错,而且也能很好地达到目的。
但是,大型行动模型(LAM)可以说是专门为特定目的而构建的,它侧重于通过为特定行动生成精确的参数或指令来构建输出结构,因此适用于需要明确和可操作结果的任务,如函数调用或 API 交互。
总之,在人工智能代理的背景下,函数调用可以让 LLM 在自然语言理解和数字系统中的可执行任务之间架起一座桥梁,从而实现更强大、更有能力和更实用的应用。
功能调用在各种用例中都很有价值,包括:
助理数据检索: 当用户询问 “我的交货日期是什么时候?”时,人工智能助理可以从内部系统中获取最新的客户信息,然后再给出答复。
助理的可执行任务: 人工智能助理可以根据用户的偏好和日历的可用性来执行会议安排等任务。
执行计算: 数学辅导助手可以执行实时计算,为用户解决数学问题。在下面的示例代码中,我展示了这一点。
构建复杂的工作流: 在数据处理中,管道可以检索原始文本,将其转换为结构化数据,并存储到数据库中。
修改应用程序用户界面: 函数调用可以动态更新用户界面,例如根据用户输入在地图上放置图钉。
在函数调用方面需要注意的是,在使用带有函数调用功能的 OpenAI API 时,模型不会直接执行函数。
相反,在步骤 3 中,模型会生成调用你的函数所需的参数,然后由你的代码决定如何处理这些参数--通常是调用指定的函数。在整个过程中,你的应用程序保留了完全的控制权。
以下是 OpenAI 提供的有关函数调用的图片...
OpenAI 函数调用示例
modelgpt-4-0613 具备函数调用功能。
创建了两个非常简单的工具(add_numbers 和 subtract_numbers),分别用于数字的加法和减法。
模型监听请求并决定何时调用其中一个函数,然后根据函数名和参数调用相应的工具。
这清楚地演示了如何使用 GPT 模型调用函数...
pip install openai==0.28
import openai
import json
# Prompt user to input API key
api_key = input("Please enter your OpenAI API key: ")
openai.api_key = api_key
# Define the tools: an addition function and a subtraction function
def add_numbers(a, b):
return {"result": a + b}
def subtract_numbers(a, b):
return {"result": a - b}
# Define the function schema for OpenAI function calling
functions = [
{
"name": "add_numbers",
"description": "Add two numbers together",
"parameters": {
"type": "object",
"properties": {
"a": {
"type": "number",
"description": "The first number to add"
},
"b": {
"type": "number",
"description": "The second number to add"
}
},
"required": ["a", "b"]
}
},
{
"name": "subtract_numbers",
"description": "Subtract one number from another",
"parameters": {
"type": "object",
"properties": {
"a": {
"type": "number",
"description": "The number to subtract from"
},
"b": {
"type": "number",
"description": "The number to subtract"
}
},
"required": ["a", "b"]
}
}
]
# Define a function to handle the function calling based on the function name
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}")
# Prompting the model with function calling
def call_gpt(prompt):
response = openai.ChatCompletion.create(
model="gpt-4-0613", # gpt-4-0613 supports function calling
messages=[
{"role": "system", "content": "You are a helpful assistant."},
{"role": "user", "content": prompt}
],
functions=functions,
function_call="auto" # This allows the model to decide which function to call
)
# Check if the model wants to call a function
message = response["choices"][0]["message"]
if "function_call" in message:
function_name = message["function_call"]["name"]
arguments = json.loads(message["function_call"]["arguments"])
result = handle_function_call(function_name, arguments)
return f"Function called: {function_name}, Result: {result['result']}"
else:
return message["content"]
# Test the app
while True:
user_input = input("Enter a math problem (addition or subtraction) or 'exit' to quit: ")
if user_input.lower() == "exit":
break
response = call_gpt(user_input)
print(response)
以及下面与笔记本的互动,注意到