Skip to main content
Version: Next

架构4. 工具只是结构化的输出

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

140-tools-are-just-structured-outputs

例如,假设你有两个工具:CreateIssueSearchIssues。要求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

模式很简单:

  1. LLM输出结构化的JSON
  2. 确定性代码执行相应的操作(例如调用外部API)
  3. 结果被捕获并反馈回上下文中

这在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:掌控你的控制流结合起来。

← 掌控你的上下文窗口 | 统一执行状态与业务状态 →