Introducendo Agents.js Dai strumenti ai tuoi LLMs utilizzando JavaScript

Introducendo Agents.js per LLMs con JavaScript

Abbiamo recentemente lavorato su Agents.js su huggingface.js. È una nuova libreria per dare accesso agli LLM da JavaScript sia nel browser che nel server. Viene fornita con alcuni strumenti multi-modalità già pronti all’uso e può essere facilmente estesa con i propri strumenti e modelli linguistici.

Installazione

Iniziare è molto facile, puoi ottenere la libreria da npm con il seguente comando:

npm install @huggingface/agents

Utilizzo

La libreria espone l’oggetto HfAgent che è il punto di ingresso alla libreria. Puoi istanziarlo in questo modo:

import { HfAgent } from "@huggingface/agents";

const HF_ACCESS_TOKEN = "hf_..."; // ottieni il tuo token su https://huggingface.co/settings/tokens

const agent = new HfAgent(HF_ACCESS_TOKEN);

In seguito, utilizzare l’agente è semplice. Gli si fornisce un comando in testo semplice e restituirà alcuni messaggi.

const code = await agent.generateCode(
  "Disegna una foto di un'anatra di gomma con un cappello a cilindro, poi descrivi questa foto."
);

che in questo caso ha generato il seguente codice

// codice generato dal LLM
async function generate() {
  const output = await textToImage("anatra di gomma con un cappello a cilindro");
  message("Generiamo l'immagine dell'anatra", output);
  const caption = await imageToText(output);
  message("Ora descriviamo l'immagine", caption);
  return output;
}

Quindi il codice può essere valutato come segue:

const messages = await agent.evaluateCode(code);

I messaggi restituiti dall’agente sono oggetti con la seguente struttura:

export interface Update {
    message: string;
    data: undefined | string | Blob;

dove message è un testo informativo e data può contenere una stringa o un blob. Il blob può essere utilizzato per visualizzare immagini o audio.

Se ti fidi del tuo ambiente (vedi avviso), puoi anche eseguire il codice direttamente dall’invito con run :

const messages = await agent.run(
  "Disegna una foto di un'anatra di gomma con un cappello a cilindro, poi descrivi questa foto."
);

Avviso sull’utilizzo

Attualmente utilizzare questa libreria significherà valutare codice arbitrario nel browser (o in Node). Questo è un rischio per la sicurezza e non dovrebbe essere fatto in un ambiente non attendibile. Consigliamo di utilizzare generateCode e evaluateCode invece di run per verificare quale codice si sta eseguendo.

LLM personalizzati 💬

Per impostazione predefinita, HfAgent utilizzerà OpenAssistant/oasst-sft-4-pythia-12b-epoch-3.5 come LLM ospitato nell’API di inferenza. Tuttavia, questo può essere personalizzato.

Quando istanzi il tuo HfAgent, puoi passare un LLM personalizzato. Un LLM in questo contesto è qualsiasi funzione asincrona che prende un input di tipo stringa e restituisce una promise per una stringa. Ad esempio, se hai una chiave API di OpenAI, puoi utilizzarla in questo modo:

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);

Strumenti personalizzati 🛠️

Agents.js è stato progettato per essere facilmente espandibile con strumenti e esempi personalizzati. Ad esempio, se volessi aggiungere uno strumento che traducesse il testo dall’inglese al tedesco, potresti farlo in questo modo:

import type { Tool } from "@huggingface/agents/src/types";

const englishToGermanTool: Tool = {
  name: "englishToGerman",
  description:
    "Prende una stringa di input in inglese e restituisce una traduzione in tedesco. ",
  examples: [
    {
      prompt: "traduci la stringa 'hello world' in tedesco",
      code: `const output = englishToGerman("hello world")`,
      tools: ["englishToGerman"],
    },
    {
      prompt:
        "traduci la stringa 'The quick brown fox jumps over the lazy dog` in tedesco",
      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("L'input deve essere una stringa");
    }
    const result = await inference.translation({
      model: "t5-base",
      inputs: input,
    });
    return result.translation_text;
  },
};

Ora questo strumento può essere aggiunto alla lista degli strumenti durante l’inizializzazione dell’agente.

import { HfAgent, LLMFromHub, defaultTools } from "@huggingface/agents";

const HF_ACCESS_TOKEN = "hf_...";

const agent = new HfAgent(HF_ACCESS_TOKEN, LLMFromHub("hf_..."), [
  englishToGermanTool,
  ...defaultTools,
]);

Passaggio dei file di input all’agente 🖼️

L’agente può anche prendere file di input da passare agli strumenti. Puoi passare un parametro opzionale FileList a generateCode e evaluateCode come segue:

Se hai il seguente html:

<input id="fileItem" type="file" />

Allora puoi fare:

const agent = new HfAgent(HF_ACCESS_TOKEN);
const files = document.getElementById("fileItem").files; // Tipo FileList
const code = agent.generateCode(
  "Aggiungi una didascalia all'immagine e poi leggi il testo ad alta voce.",
  files
);

Che genera il seguente codice quando viene passata un’immagine:

// codice generato dal LLM
async function generate(image) {
  const caption = await imageToText(image);
  message("Prima aggiungiamo una didascalia all'immagine", caption);
  const output = await textToSpeech(caption);
  message("Poi leggiamo la didascalia ad alta voce", output);
  return output;
}

Demo 🎉

Abbiamo lavorato su una demo per Agents.js che puoi provare qui. Attualmente, per ottenere i migliori risultati, dovresti passare una chiave API di OpenAI da utilizzare come tuo LLM. Stiamo lavorando per aggiungere migliori LLM open source a questa demo per dimostrare appieno la potenza del software open source. 🚀