架构4. 工具只是结构化的输出
工具不需要很复杂。它们的核心只是来自LLM的结构化输出,用于触发确定性代码。

例如,假设你有两个工具:CreateIssue 和 SearchIssues。要求LLM“使用多个工具之一”实际上就是要求它输出我们可以解析成代表这些工具的对象的JSON。
class Issue:
title: str
description: str
team_id: str
assignee_id: str
class CreateIssue:
intent: "create_issue"
issue: Issue
class SearchIssues:
intent: "search_issues"
query: str
what_youre_looking_for: str
模式很简单:
- LLM输出结构化的JSON
- 确定性代码执行相应的操作(例如调用外部API)
- 结果被捕获并反馈回上下文中
这在LLM的决策和应用程序的操作之间创建了清晰的分离。LLM决定做什么,但你的代码控制如何做。仅仅因为LLM“调用了一个工具”并不意味着你必须每次都完全相同地执行一个特定的对应函数。
如果你还记得我们上面的switch语句:
if nextStep.intent == 'create_payment_link':
stripe.paymentlinks.create(nextStep.parameters)
return # or whatever you want, see below
elif nextStep.intent == 'wait_for_a_while':
# do something monadic idk
else: #... the model didn't call a tool we know about
# do something else
“下一步”可能并不像“运行一个纯函数并返回结果”那样原子化。当你将“工具调用”仅仅视为模型输出描述确定性代码应做什么的JSON时,你就解锁了大量的灵活性。将这一点与架构8:掌控你的控制流结合起来。