Pickaxe: 开发 AI 代理的利器
在这个 AI 风起云涌的时代,开发一个强大的 AI 代理绝非易事。不仅要关注核心算法,还得操心任务调度、错误处理、资源分配等等一系列复杂的系统性问题。今天,我要给大家介绍一个能让你在开发 AI 代理时如虎添翼的工具 ——Pickaxe。
想象一下,你正在构建一个复杂的 AI 代理系统,它需要处理各种任务、调用不同的工具,还要在出现故障时能够自动恢复,同时保证高并发下的稳定运行。这听起来是不是有点让人头大?没关系,Pickaxe 就是来帮你解决这些棘手问题的。
一、Pickaxe 是什么?
Pickaxe 是一个简洁的 TypeScript 库,专门用于构建具备容错性和可扩展性的 AI 代理。它就像是你手上的瑞士军刀,帮你处理那些繁琐的执行复杂性,比如持久化执行、队列管理和任务调度,让你可以心无旁骛地专注于编写核心业务逻辑。
Pickaxe 的理念非常清晰:一切都是你写的函数,易于集成到现有的代码库和业务逻辑中。你可以用它来构建调用工具、其他代理或者任何你定义的函数的 AI 代理。
二、Pickaxe 的核心优势
-
持久化执行 :Pickaxe 利用一个叫 Hatchet 的持久化任务队列,为代理创建自动检查点。这意味着即使遇到故障或者需要长时间等待外部事件,代理也能轻松恢复,而不会消耗资源。就像你有一个贴心的助手,帮你记录下所有重要的步骤,随时可以接续工作。 -
代码优先 :代理是用代码定义的,并且设计用来与你的业务逻辑相融合。你不需要去适应奇怪的框架规则,而是按照自己的业务需求来编写代码。 -
分布式运行 :所有代理和工具都在多台机器上运行,Pickaxe 能优雅地处理调度问题。即使一台机器挂了,它也能在另一台机器上重新调度和恢复代理,你的系统稳定性大大提升。 -
高度可配置 :提供了简单易用的配置选项,比如重试机制、速率限制、并发控制等等,你可以根据实际需求灵活调整。 -
随处可运行 :Pickaxe 代理可以在任何基于容器的平台上运行,无论是 Hatchet、Railway、Fly.io、Porter、Kubernetes、AWS ECS 还是 GCP Cloud Run,都难不倒它。
三、快速上手 Pickaxe
开始使用 Pickaxe 只需要两条简单的命令:
pnpm i -g @hatchet-dev/pickaxe-cli
pickaxe create first-agent
执行完这两条命令后,系统会提示你从一个模板创建一个新的 Pickaxe 项目,这样你就能看到一个完整的 Pickaxe 运行示例,快速了解它是如何工作的。
为了让大家更直观地感受 Pickaxe 的魅力,我来展示一个简单的代码示例:
import { pickaxe } from "@hatchet-dev/pickaxe";
import z from "zod";
import { myTool1, myTool2 } from "@/tools";
const MyAgentInput = z.object({
message: z.string(),
});
const MyAgentOutput = z.object({
message: z.string(),
});
export const myToolbox = pickaxe.toolbox({
tools: [myTool1, myTool2],
});
export const myAgent = pickaxe.agent({
name: "my-agent",
executionTimeout: "15m",
inputSchema: MyAgentInput,
outputSchema: MyAgentOutput,
description: "Description of what this agent does",
fn: async (input, ctx) => {
const result = await myToolbox.pickAndRun({
prompt: input.message,
});
switch (result.name) {
case "myTool1":
return {
message: `Result: ${result.output}`,
};
case "myTool2":
return {
message: `Another result: ${result.output}`,
};
default:
return myToolbox.assertExhaustive(result);
}
},
});
在这个示例中,我们首先导入了 Pickaxe 的核心模块和必要的工具。然后定义了代理的输入和输出结构,接着创建了一个工具箱,里面包含了一些工具。最后,我们定义了一个代理,设置了它的名称、执行超时时间、输入输出结构以及描述信息,并在代理的函数中调用了工具箱中的工具,根据不同工具的返回结果进行相应的处理。
四、Pickaxe 的可扩展性与哲学理念
Pickaxe 的设计理念是不成为一个框架,它不会限制你如何设计工具、调用大型语言模型(LLM)或者实现代理记忆等功能。它只对代理的基础设施层有自己的见解,而对于代理的实现细节,给你充分的自由。
这种设计理念让 Pickaxe 具有极高的可扩展性。你可以根据自己的需求,选择或构建最适合的内存、知识、推理或集成方案。例如,你可以在这个基础上构建自己的代理库,以满足特定的业务需求。
五、Pickaxe 的应用场景与模式
Pickaxe 适用于多种场景和模式,以下是一些常见的例子:
-
提示链式调用(Prompt chaining) :你可以让多个提示依次调用,形成一个链式的工作流程,每个提示的输出作为下一个提示的输入,实现复杂的任务处理。 -
路由(Routing) :根据不同的条件和输入,将任务路由到不同的工具或代理,实现灵活的任务分配。 -
并行化(Parallelization) :同时执行多个任务,大大提高处理效率,尤其适用于那些可以并行处理的任务场景。 -
评估 – 优化器(Evaluator – optimizer) :先评估任务的结果,然后根据评估结果进行优化,不断迭代改进任务处理的效果。 -
多代理(Multi – agent) :多个代理协同工作,共同完成复杂的任务,就像一个团队一样,每个代理负责不同的部分。 -
人工干预循环(Human – in – the – loop) :在任务处理过程中引入人工干预,让人类的智慧与 AI 的能力相结合,处理一些需要人类判断和决策的关键环节。
六、Pickaxe 与现有工具的比较
与一些类似的工具相比,Pickaxe 有其独特的优势:
-
与框架(如 Mastra、Voltagent)对比 :Pickaxe 不是一个框架,它不会对你如何组织大型语言模型调用、业务逻辑、提示或上下文提出任何意见。它允许你编写这些内容,甚至可以在 Pickaxe 的基础上构建自己的代理库。 -
与 Temporal 对比 :Pickaxe 的执行模型与 Temporal 类似,但在某些方面更胜一筹。例如,Pickaxe 支持全局速率限制、基于事件的触发、事件流处理、DAG(有向无环图)支持、优先级队列以及粘性分配 / 复杂路由逻辑等功能,而 Temporal 则不支持这些。
七、开发代理的最佳实践
在使用 Pickaxe 开发代理时,遵循以下最佳实践可以让你的开发过程更加顺利:
-
无副作用的无状态归约器 :代理应该是无副作用的无状态归约器,它们不应该依赖于外部 API 调用、数据库调用或本地磁盘调用。代理的整个状态应该由其工具调用的结果确定。这样可以确保代理的稳定性和可预测性。 -
将所有工作单元作为任务或工具调用 :将每一个小的工作单元都封装成一个任务或工具调用,这样便于管理和调度,也能更好地利用 Pickaxe 的功能。 -
将大型语言模型调用视为库,自主拥有数据查询 :不要允许无约束的代理工具调用进行数据查询。所有的工具调用都应该验证用户权限,并将数据查询与大型语言模型调用分开,以确保安全性和数据的正确性。
八、Pickaxe 的技术深度剖析
Pickaxe 是建立在 Hatchet 之上的一个工具层。Hatchet 的核心概念是持久化任务队列,这意味着在 Hatchet 中调用的每一个任务都会被存储在数据库中。这种设计使得任务可以轻松地被重放,并且能够从故障中恢复,即使底层硬件崩溃也是如此。
对于代理来说,这种持久化执行模型至关重要。代理通常会长时间运行,因此需要对硬件故障具有弹性。同时,代理还需要管理第三方的速率限制,并且需要并发控制以防止系统过载。
Pickaxe 的执行模型允许代理自动 “检查” 其状态。例如,一个代理已经调用了 search_documents
、get_document
工具,并且正在处理 extract_from_document
。如果运行该代理的机器在最后一个步骤中崩溃,Pickaxe 会自动重放执行历史中的所有步骤,直到执行到崩溃的那一步。这种机制确保了代理可以从故障中优雅地恢复。
此外,Pickaxe 还借鉴了以下两个概念:
-
12 – factor 代理 :这是 Pickaxe 提倡拥有控制流、上下文窗口和提示的基础。 -
Anthropic 的 “构建有效代理” :Pickaxe 确保 Anthropic 文章中记录的每一个模式都与之兼容。
Pickaxe 的出现,就像是为 AI 代理开发打开了一扇新的大门。它以其独特的优势和灵活的架构,为开发者提供了一个强大的工具,帮助我们在这个 AI 时代更好地构建智能、可靠和高效的系统。
希望这篇博客文章能让你对 Pickaxe 有一个清晰的了解,如果你在开发 AI 代理的过程中遇到了复杂的问题,不妨考虑一下这个强大的工具。它可能会成为你开发道路上的得力助手,让你的项目更加顺利地推进。