介绍Agents.js:使用JavaScript为您的LLMs提供工具
介绍Agents.js:为您的LLMs提供工具的JavaScript
我们最近在 huggingface.js 上开发了 Agents.js。这是一个新的库,可以通过 JavaScript 在浏览器或服务器上访问 LLMs。它预装了一些多模态工具,并且可以轻松扩展自己的工具和语言模型。
安装
开始非常简单,您可以使用以下命令从 npm 获取库:
npm install @huggingface/agents
用法
该库公开了 HfAgent
对象,它是库的入口点。您可以像这样实例化它:
import { HfAgent } from "@huggingface/agents";
const HF_ACCESS_TOKEN = "hf_..."; // 在 https://huggingface.co/settings/tokens 获取您的令牌
const agent = new HfAgent(HF_ACCESS_TOKEN);
之后,使用代理很简单。您给它一个纯文本命令,它会返回一些消息。
const code = await agent.generateCode(
"画一只带礼帽的橡皮鸭子的图片,然后给这张图片加上标题。"
);
在这种情况下,生成了以下代码:
// LLM 生成的代码
async function generate() {
const output = await textToImage("rubber duck with a top hat");
message("我们生成了鸭子图片", output);
const caption = await imageToText(output);
message("现在我们给图片加标题", caption);
return output;
}
然后可以这样评估代码:
const messages = await agent.evaluateCode(code);
代理返回的消息是具有以下结构的对象:
export interface Update {
message: string;
data: undefined | string | Blob;
其中,message
是信息文本,data
可以是字符串或 Blob。Blob 可用于显示图像或音频。
如果您信任您的环境(请参阅警告),您还可以直接从提示符运行代码,使用 run
:
const messages = await agent.run(
"画一只带礼帽的橡皮鸭子的图片,然后给这张图片加上标题。"
);
使用警告
目前使用该库将意味着在浏览器(或 Node.js)中评估任意代码。这是一种安全风险,不应在不受信任的环境中执行。我们建议您使用 generateCode
和 evaluateCode
代替 run
,以检查您正在运行的代码。
自定义 LLMs 💬
默认情况下,HfAgent
将使用 OpenAssistant/oasst-sft-4-pythia-12b-epoch-3.5 托管的推理 API 作为 LLM。但您可以自定义它。
在实例化您的 HfAgent
时,您可以传递一个自定义的 LLM。在这个上下文中,LLM 是一个接受字符串输入并返回字符串的异步函数的泛型。例如,如果您有一个 OpenAI API 密钥,您可以像这样使用它:
import { Configuration, OpenAIApi } from "openai";
const HF_ACCESS_TOKEN = "hf_...";
const api = new OpenAIApi(new Configuration({ apiKey: "sk-..." }));
const llmOpenAI = async (prompt: string): Promise<string> => {
return (
(
await api.createCompletion({
model: "text-davinci-003",
prompt: prompt,
max_tokens: 1000,
})
).data.choices[0].text ?? ""
);
};
const agent = new HfAgent(HF_ACCESS_TOKEN, llmOpenAI);
自定义工具 🛠️
Agents.js 设计成可以轻松扩展自定义工具和示例。例如,如果您想添加一个将英文文本翻译为德文的工具,您可以这样做:
import type { Tool } from "@huggingface/agents/src/types";
const englishToGermanTool: Tool = {
name: "englishToGerman",
description:
"接受英文输入字符串并返回德文翻译。",
examples: [
{
prompt: "将字符串 'hello world' 翻译成德文",
code: `const output = englishToGerman("hello world")`,
tools: ["englishToGerman"],
},
{
prompt:
"将字符串 'The quick brown fox jumps over the lazy dog` 翻译成德文",
code: `const output = englishToGerman("The quick brown fox jumps over the lazy dog")`,
tools: ["englishToGerman"],
},
],
call: async (input, inference) => {
const data = await input;
if (typeof data !== "string") {
throw new Error("输入必须是字符串");
}
const result = await inference.translation({
model: "t5-base",
inputs: input,
});
return result.translation_text;
},
};
现在可以在初始化代理时将此工具添加到工具列表中。
import { HfAgent, LLMFromHub, defaultTools } from "@huggingface/agents";
const HF_ACCESS_TOKEN = "hf_...";
const agent = new HfAgent(HF_ACCESS_TOKEN, LLMFromHub("hf_..."), [
englishToGermanTool,
...defaultTools,
]);
将输入文件传递给代理 🖼️
代理还可以接受输入文件并传递给工具。您可以将可选的FileList
传递给generateCode
和evaluateCode
,如下所示:
如果您有以下HTML:
<input id="fileItem" type="file" />
那么您可以这样做:
const agent = new HfAgent(HF_ACCESS_TOKEN);
const files = document.getElementById("fileItem").files; // FileList类型
const code = agent.generateCode(
"给图像加标题,然后朗读文本。",
files
);
在传递图像时,生成了以下代码:
// LLM生成的代码
async function generate(image) {
const caption = await imageToText(image);
message("首先给图像加标题", caption);
const output = await textToSpeech(caption);
message("然后我们朗读标题", output);
return output;
}
演示 🎉
我们一直在为Agents.js开发一个演示,您可以在这里尝试。目前,为了获得最佳结果,您应该传递一个OpenAI API密钥作为您的LLM。我们正在努力向此演示中添加更好的开源LLM,希望能展示开源的全部威力。🚀