Pickaxe: 开发 AI 代理的利器

在这个 AI 风起云涌的时代,开发一个强大的 AI 代理绝非易事。不仅要关注核心算法,还得操心任务调度、错误处理、资源分配等等一系列复杂的系统性问题。今天,我要给大家介绍一个能让你在开发 AI 代理时如虎添翼的工具 ——Pickaxe。

想象一下,你正在构建一个复杂的 AI 代理系统,它需要处理各种任务、调用不同的工具,还要在出现故障时能够自动恢复,同时保证高并发下的稳定运行。这听起来是不是有点让人头大?没关系,Pickaxe 就是来帮你解决这些棘手问题的。

一、Pickaxe 是什么?

Pickaxe 是一个简洁的 TypeScript 库,专门用于构建具备容错性和可扩展性的 AI 代理。它就像是你手上的瑞士军刀,帮你处理那些繁琐的执行复杂性,比如持久化执行、队列管理和任务调度,让你可以心无旁骛地专注于编写核心业务逻辑。

Pickaxe 的理念非常清晰:一切都是你写的函数,易于集成到现有的代码库和业务逻辑中。你可以用它来构建调用工具、其他代理或者任何你定义的函数的 AI 代理。

Pickaxe Logo

二、Pickaxe 的核心优势

  1. 持久化执行 :Pickaxe 利用一个叫 Hatchet 的持久化任务队列,为代理创建自动检查点。这意味着即使遇到故障或者需要长时间等待外部事件,代理也能轻松恢复,而不会消耗资源。就像你有一个贴心的助手,帮你记录下所有重要的步骤,随时可以接续工作。
  2. 代码优先 :代理是用代码定义的,并且设计用来与你的业务逻辑相融合。你不需要去适应奇怪的框架规则,而是按照自己的业务需求来编写代码。
  3. 分布式运行 :所有代理和工具都在多台机器上运行,Pickaxe 能优雅地处理调度问题。即使一台机器挂了,它也能在另一台机器上重新调度和恢复代理,你的系统稳定性大大提升。
  4. 高度可配置 :提供了简单易用的配置选项,比如重试机制、速率限制、并发控制等等,你可以根据实际需求灵活调整。
  5. 随处可运行 :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 适用于多种场景和模式,以下是一些常见的例子:

  1. 提示链式调用(Prompt chaining) :你可以让多个提示依次调用,形成一个链式的工作流程,每个提示的输出作为下一个提示的输入,实现复杂的任务处理。
  2. 路由(Routing) :根据不同的条件和输入,将任务路由到不同的工具或代理,实现灵活的任务分配。
  3. 并行化(Parallelization) :同时执行多个任务,大大提高处理效率,尤其适用于那些可以并行处理的任务场景。
  4. 评估 – 优化器(Evaluator – optimizer) :先评估任务的结果,然后根据评估结果进行优化,不断迭代改进任务处理的效果。
  5. 多代理(Multi – agent) :多个代理协同工作,共同完成复杂的任务,就像一个团队一样,每个代理负责不同的部分。
  6. 人工干预循环(Human – in – the – loop) :在任务处理过程中引入人工干预,让人类的智慧与 AI 的能力相结合,处理一些需要人类判断和决策的关键环节。

六、Pickaxe 与现有工具的比较

与一些类似的工具相比,Pickaxe 有其独特的优势:

  • 与框架(如 Mastra、Voltagent)对比 :Pickaxe 不是一个框架,它不会对你如何组织大型语言模型调用、业务逻辑、提示或上下文提出任何意见。它允许你编写这些内容,甚至可以在 Pickaxe 的基础上构建自己的代理库。
  • 与 Temporal 对比 :Pickaxe 的执行模型与 Temporal 类似,但在某些方面更胜一筹。例如,Pickaxe 支持全局速率限制、基于事件的触发、事件流处理、DAG(有向无环图)支持、优先级队列以及粘性分配 / 复杂路由逻辑等功能,而 Temporal 则不支持这些。

七、开发代理的最佳实践

在使用 Pickaxe 开发代理时,遵循以下最佳实践可以让你的开发过程更加顺利:

  1. 无副作用的无状态归约器 :代理应该是无副作用的无状态归约器,它们不应该依赖于外部 API 调用、数据库调用或本地磁盘调用。代理的整个状态应该由其工具调用的结果确定。这样可以确保代理的稳定性和可预测性。
  2. 将所有工作单元作为任务或工具调用 :将每一个小的工作单元都封装成一个任务或工具调用,这样便于管理和调度,也能更好地利用 Pickaxe 的功能。
  3. 将大型语言模型调用视为库,自主拥有数据查询 :不要允许无约束的代理工具调用进行数据查询。所有的工具调用都应该验证用户权限,并将数据查询与大型语言模型调用分开,以确保安全性和数据的正确性。

八、Pickaxe 的技术深度剖析

Pickaxe 是建立在 Hatchet 之上的一个工具层。Hatchet 的核心概念是持久化任务队列,这意味着在 Hatchet 中调用的每一个任务都会被存储在数据库中。这种设计使得任务可以轻松地被重放,并且能够从故障中恢复,即使底层硬件崩溃也是如此。

对于代理来说,这种持久化执行模型至关重要。代理通常会长时间运行,因此需要对硬件故障具有弹性。同时,代理还需要管理第三方的速率限制,并且需要并发控制以防止系统过载。

Pickaxe 的执行模型允许代理自动 “检查” 其状态。例如,一个代理已经调用了 search_documentsget_document 工具,并且正在处理 extract_from_document。如果运行该代理的机器在最后一个步骤中崩溃,Pickaxe 会自动重放执行历史中的所有步骤,直到执行到崩溃的那一步。这种机制确保了代理可以从故障中优雅地恢复。

此外,Pickaxe 还借鉴了以下两个概念:

  • 12 – factor 代理 :这是 Pickaxe 提倡拥有控制流、上下文窗口和提示的基础。
  • Anthropic 的 “构建有效代理” :Pickaxe 确保 Anthropic 文章中记录的每一个模式都与之兼容。

Pickaxe 的出现,就像是为 AI 代理开发打开了一扇新的大门。它以其独特的优势和灵活的架构,为开发者提供了一个强大的工具,帮助我们在这个 AI 时代更好地构建智能、可靠和高效的系统。

希望这篇博客文章能让你对 Pickaxe 有一个清晰的了解,如果你在开发 AI 代理的过程中遇到了复杂的问题,不妨考虑一下这个强大的工具。它可能会成为你开发道路上的得力助手,让你的项目更加顺利地推进。