JS Agent: 用JavaScript构建智能AI代理的强大框架
在人工智能快速发展的今天,如何高效地构建和部署AI代理(Agent)已成为开发者们关注的焦点。JS Agent作为一个专为JavaScript和TypeScript设计的AI代理开发框架,为开发者提供了一套强大而灵活的工具,帮助他们更快速、更可靠地构建智能AI应用。本文将深入介绍JS Agent的核心特性、设计理念以及使用方法,帮助读者全面了解这个创新框架。
JS Agent简介
JS Agent是一个用于创建AI代理的可组合和可扩展的框架,专为JavaScript和TypeScript开发者设计。它提供了一系列健壮的构建模块和工具,帮助开发者更快地开发出可靠的AI代理。
值得注意的是,JS Agent目前已不再积极开发,作者建议检查ModelFusion——一个更通用的TypeScript AI库,它吸收了JS Agent的经验教训。尽管如此,JS Agent仍然是一个学习和理解AI代理开发原理的优秀资源。
主要特性
JS Agent提供了丰富的功能,使得AI代理的开发变得更加简单和高效:
-
代理定义和执行:
- 可配置的代理运行属性,可通过提示访问
- 观察代理运行(支持控制台输出、UI、服务器运行、Web应用等)
- 记录代理运行的所有LLM调用
- 计算LLM调用和代理运行的成本
- 根据特定条件停止代理运行,例如限制步骤数
- 在一个代理中使用多个不同的LLM模型
-
代理HTTP服务器:
- 通过HTTP API启动、停止和观察代理运行
- 可以托管多个代理
-
支持的LLM模型和API:
- OpenAI文本补全模型(如
text-davinci-003
) - OpenAI聊天补全模型(
gpt-4
,gpt-3.5-turbo
) - OpenAI嵌入模型(
text-embedding-ada-002
)
- OpenAI文本补全模型(如
-
动作和工具:
- 读取和写入文件
- 运行CLI命令
- 使用可编程搜索引擎
- 从网页提取特定主题的信息
- 请求用户输入
- 写入字符串属性
- 调用子代理(循环)
- 可选的代理/执行器分离(例如,在Docker容器等沙盒环境中运行执行器)
-
代理循环:
- BabyAGI风格的更新任务规划循环
- 生成下一步循环
-
聊天和文本提示的模板:
- 内置模板以快速启动
- 用于组合和转换提示的实用函数
-
文本函数:
- 提取信息(提取和重写;递归提取)
- 分割器:将文本分割成块
- 辅助函数:加载、生成
-
数据源和转换器:
- 网页HTML文本
- 文件ArrayBuffer
- HTML到文本,PDF到文本的转换
设计原则
JS Agent的设计遵循了一系列核心原则,这些原则确保了框架的易用性、灵活性和可扩展性:
- 类型安全: 提供尽可能多的类型定义,以支持代码发现和确保安全性。
- 直接函数调用: 所有实用函数都可以直接调用,无需通过代理或创建复合函数。
- 可组合性: 各个组件之间关注点分离清晰,易于组合。
- 可扩展性: 用户可以轻松添加自己的工具、提供者、动作和代理步骤等。
- 函数式编程: 对于不可变对象,使用函数式编程进行组装。面向对象编程仅用于具有可变状态的对象。
- 支持代理规范的渐进式细化: 代理规范应易于编写,每个构建块都应提供良好的默认值。同时,也应该能够轻松覆盖默认设置。
- 为生产环境而构建: JS Agent提供一流的日志记录支持,可以将LLM调用和成本跟踪与代理运行关联等。
快速安装和使用
要开始使用JS Agent,您可以查看examples目录中的示例代码,以及官方文档来学习如何创建代理。
示例代理: Wikipedia问答
让我们来看一个具体的例子,展示如何使用JS Agent创建一个Wikipedia问答代理:
import * as $ from "js-agent";
const openai = $.provider.openai;
export async function runWikipediaAgent({
wikipediaSearchKey,
wikipediaSearchCx,
openAiApiKey,
task,
}: {
openAiApiKey: string;
wikipediaSearchKey: string;
wikipediaSearchCx: string;
task: string;
}) {
// 定义搜索Wikipedia的动作
const searchWikipediaAction = $.tool.programmableGoogleSearchEngineAction({
id: "search-wikipedia",
description: "Search wikipedia using a search term. Returns a list of pages.",
execute: $.tool.executeProgrammableGoogleSearchEngineAction({
key: wikipediaSearchKey,
cx: wikipediaSearchCx,
}),
});
// 定义读取Wikipedia文章的动作
const readWikipediaArticleAction = $.tool.extractInformationFromWebpage({
id: "read-wikipedia-article",
description: "Read a wikipedia article and summarize it considering the query.",
inputExample: {
url: "https://en.wikipedia.org/wiki/Artificial_intelligence",
topic: "{query that you are answering}",
},
execute: $.tool.executeExtractInformationFromWebpage({
extract: $.text.extractRecursively.asExtractFunction({
split: $.text.splitRecursivelyAtToken.asSplitFunction({
tokenizer: openai.tokenizer.forModel({
model: "gpt-3.5-turbo",
}),
maxChunkSize: 2048,
}),
extract: $.text.generateText.asFunction({
prompt: $.prompt.extractChatPrompt(),
model: openai.chatModel({
apiKey: openAiApiKey,
model: "gpt-3.5-turbo",
}),
}),
}),
});
// 运行代理
return $.runAgent<{ task: string }>({
properties: { task },
agent: $.step.generateNextStepLoop({
actions: [searchWikipediaAction, readWikipediaArticleAction],
actionFormat: $.action.format.flexibleJson(),
prompt: $.prompt.concatChatPrompts(
async ({ runState: { task } }) => [
{
role: "system",
content: `## ROLE
You are an knowledge worker that answers questions using Wikipedia content. You speak perfect JSON.
## CONSTRAINTS
All facts for your answer must be from Wikipedia articles that you have read.
## TASK
${task}`,
},
],
$.prompt.availableActionsChatPrompt(),
$.prompt.recentStepsChatPrompt({ maxSteps: 6 })
),
model: openai.chatModel({
apiKey: openAiApiKey,
model: "gpt-3.5-turbo",
}),
}),
controller: $.agent.controller.maxSteps(20),
observer: $.agent.observer.showRunInConsole({ name: "Wikipedia Agent" }),
});
}
这个例子展示了如何创建一个Wikipedia问答代理。它使用Google可编程搜索引擎来搜索Wikipedia,然后读取和总结相关的Wikipedia文章来回答问题。代理使用OpenAI的GPT-3.5-turbo模型来理解任务、生成搜索查询和总结文章内容。
其他示例项目
JS Agent还提供了多个其他示例项目,展示了框架的多样性和灵活性:
-
JavaScript/TypeScript开发者代理: 一个自动化的开发者代理,可以在Docker容器中工作。它能够读取文件、写入文件和执行命令。
-
BabyAGI实现: JS Agent版本的BabyAGI实现,展示了如何创建自主任务管理和执行系统。
-
PDF转Twitter线程: 将PDF文档转换为与特定主题相关的Twitter线程。
-
文本分割和嵌入: 演示如何将文本分割成块并生成嵌入。
这些示例充分展示了JS Agent在不同场景下的应用潜力,从简单的文本处理到复杂的AI代理系统。
结论
JS Agent为JavaScript和TypeScript开发者提供了一个强大的工具集,用于构建复杂的AI代理系统。通过其灵活的设计、丰富的功能和清晰的设计原则,JS Agent使得创建高度定制化和可靠的AI应用变得更加简单。
尽管JS Agent目前已不再积极开发,但它仍然是学习和理解AI代理开发原理的宝贵资源。对于那些希望深入探索AI代理开发的开发者来说,JS Agent提供了一个优秀的起点。
随着AI技术的不断发展,像JS Agent这样的框架将继续推动创新,使得更多开发者能够参与到AI应用的创建中来。无论您是AI领域的新手,还是经验丰富的开发者,JS Agent都为您提供了一个探索和实现AI代理潜力的绝佳平台。
🔗 相关链接:
通过深入学习和实践JS Agent,开发者可以获得构建AI代理的宝贵经验,为未来更复杂的AI应用开发做好准备。让我们一起探索AI的无限可能,用JavaScript和TypeScript构建更智能的未来!