在构建智能体时,最常见的模式之一就是将自然语言转换为结构化的工具调用。这是一个强大的模式,它允许您构建能够对任务进行推理并执行它们的智能体。
这个模式在原子化应用时,就是将一个短语 (例如)
你能为 Terri 创建一个 750 美元的支付链接,用于赞助二月份的 AI tinkerers (AI 爱好者) 聚会吗?
转换为一个描述 Stripe API 调用的结构化对象,如下所示
{
"function": {
"name": "create_payment_link",
"parameters": {
"amount": 750,
"customer": "cust_128934ddasf9",
"product": "prod_8675309",
"price": "prc_09874329fds",
"quantity": 1,
"memo": "嗨 Jeff - 请查看下方为赞助二月份 ai tinkerers (AI 爱好者) 聚会而创建的支付链接"
}
}
}
注意:实际上,Stripe API 要复杂一些,一个 真正执行此操作的智能体 会通过列出客户、列出产品、列出价格等方式,用正确的 ID 来构建这个负载 (payload),或者将这些 ID 包含在提示/上下文窗口中 (我们稍后会看到这两者在某种程度上是相同的!)。
然后,确定性代码可以接收这个负载 (payload) 并对其进行处理。(更多相关内容请参见 要素 3)
# 大语言模型接收自然语言并返回一个结构化对象
nextStep = await llm.determineNextStep(
"""
为 Jeff 创建一个 750 美元的支付链接
用于赞助二月份的 AI tinkerers (AI 爱好者) 聚会
"""
)
# 根据其功能处理结构化输出
if nextStep.function == 'create_payment_link':
stripe.paymentlinks.create(nextStep.parameters)
return # 或者任何你想要的操作,见下文
elif nextStep.function == 'something_else':
# ... 更多情况
pass
else: # 模型没有调用我们已知的工具
# 执行其他操作
pass
注意:一个完整的智能体会接收 API 调用的结果并用它进行循环,最终返回类似下面的内容
我已经成功为 Terri 创建了一个 750 美元的支付链接,用于赞助二月份的 AI tinkerers (AI 爱好者) 聚会。链接如下:https://buy.stripe.com/test_1234567890
然而,我们实际上将在此处跳过该步骤,并将其留到另一个要素中讨论,你也可以选择是否要整合该要素 (由你决定!)。