首页 时政热点 科技头条 智能AI 安全攻防 数码硬件 开发者生态 归档 标签 关于

Agentic Loop:风衣中的三个环

2026-07-14 1 阅读 约8分钟阅读 btables
分享:
字号:
代理循环:风衣中的三个循环 自主代理的构建模块并不像看起来那么简单。 Robert Ross 2026 年 7 月 14 日 共享代理循环通常过于简单化。它们以单个环的形式呈现,而实际上是风衣中的三个环,为客户带来了“代理”体验。我在这里写(是的,我写了这个,疯了吧?)另一个关于代理循环的博客。示例代码块也是伪代码,用于说明这些想法。另外,我省略了流媒体,这使帖子变得复杂,但它们的形状保持不变。我什至制作了这张图片!推理循环 解释大型语言模型的最简单的方法是它们获取文本,并预测下一个字符...呃...标记。与你的前任不同,他们确实会完成你的句子。这是通过推理循环实现的。您的推理循环具有三个职责: 进行聊天完成 API 调用(推理接下来的单词) 将工具使用请求传递到工具循环(稍后详细介绍) 管理聊天历史记录持久性(工具结果或更多用户消息) 当您构建代理时,您创建的第一个“外部”循环是推理循环。这是向 LLM 的“聊天完成”端点发送系统提示、用户和助理消息以及可用工具的循环。人择有一个。 OpenAI 有一个 . OpenRouter 使所有这些都易于使用。一旦法学硕士返回其消息,您就有责任将其附加到“聊天历史记录”中,以便可以继续对话。这可以是数组、数据库表、Redis 键等等。你的特权。 chatMessages = [ { role: "system", content: "你是一名夫妻治疗师。你帮助人们要么让它成功,要么让他们意识到它永远不会成功。与你交谈的用户名叫汤姆。" }, { role: "user", content: "我有点想念兰妮,我应该给她写点什么?" } ] continueInferenceLoop = true while continueInferenceLoop inferred = aiClient.completeChat(messages: chatMessages) chatMessages.push({ role: "assistant", content: inferred.message.content, toolCalls: inferred.toolCalls, }) if inferred.toolCalls.length == 0 continueInferenceLoop = false else # 处理工具(稍后会详细介绍) end end FinalResult = chatMessages.last.content 放置“助理响应:#{finalResult}”(大多数)大型语言模型提供商的 API 设计是无状态设计。这意味着模型提供者不知道您之前与其进行的对话。您每次都需要提供整个对话。这就是为什么你会看到“大型对话使用令牌更快”的警告——是的,我输入了一个破折号——因为你正在发送你已经积累的关于是否应该联系你的前任的消息。别这样做,汤姆。工具循环法学硕士就像罐子里的大脑。它们本身不提供功能价值。您为法学硕士提供的工具使其成为代理人。当您在外部推理循环中告诉模型“这是您拥有的工具”时,模型可能会尝试在其推理(响应)中“使用”它们。这与大脑发送电信号告诉你的食指将鼠标悬停在你迫切想发送莱尼的电子邮件的回车键上是一样的。汤姆,我们需要设定界限,伙计。您在 API 请求中包含的单独工具定义通常会序列化到模型处理的令牌流的系统提示字段中。并且它可能会一次性推断出多种工具的使用情况。 (因此:工具循环)。 chatMessages = [ { role: "system", content: "你是一名夫妻治疗师。你帮助人们要么让它成功,要么让他们意识到它永远不会成功。与你交谈的用户名叫汤姆。" }, { role: "user", content: "我有点想念兰妮,我应该给她写点什么?" } ] 工具 = [ { 类型:“函数”,函数:{ 名称:“send_ex_girlfriend_an_email”,参数:{ 类型:“对象”,属性:{ email_message:{类型:“字符串”} },必需:[“email_message”] } } } ] continueInferenceLoop = true while continueInferenceLoop inferred = aiClient.completeChat( messages: chatMessages, tools: tools ) chatMessages.push({ role: "assistant", content: inferred.message.content, toolCalls: inferred.toolCalls, }) if inferred.toolCalls.length == 0 continueInferenceLoop = false else # 看...工具循环! while tool = inferred.toolCalls.shift # 在这里执行工具操作,例如发送电子邮件 # 您可能有一个 switch/case 语句来根据名称控制 # 哪个工具。 # 工具调用也有一个 ID toolResult = "...参见下一节..." # 工具结果形状因提供者的 API 而异 chatMessages.push({ role: "user", content: [{ type: "tool_result", toolCallId: tool.toolCallId, content: toolResult }] }) end end end 您的工具循环必须查找模型推断应使用的工具,并使用模型提供的参数调用您自己的函数。但请记住以下几点:因为工具调用也是推断文本 - 这意味着工具名称或函数参数可能是幻觉的。你应该
这篇文章对您有帮助吗?

订阅66必读

每日精选科技资讯,直达你的邮箱