Correction de l'erreur ToolCallingAgentOutputParser de Langchain.js avec Ollama LLM et un outil personnalisé

Temp mail SuperHeros
Correction de l'erreur ToolCallingAgentOutputParser de Langchain.js avec Ollama LLM et un outil personnalisé
Correction de l'erreur ToolCallingAgentOutputParser de Langchain.js avec Ollama LLM et un outil personnalisé

Comprendre et corriger les erreurs ToolCallingAgentOutputParser dans Langchain.js

Lorsqu'ils travaillent avec Langchain.js v2, les développeurs visent souvent à créer des agents efficaces à l'aide d'outils personnalisés et de modèles de langage comme Ollama. Cependant, l’intégration de ces composants peut parfois conduire à des erreurs difficiles à déboguer.

L'une de ces erreurs est « parseResult on ToolCallingAgentOutputParser ne fonctionne que sur la sortie ChatGeneration », qui peut se produire lors de la création d'un outil personnalisé dans la structure de l'agent. Comprendre la cause première de ce problème est crucial pour garantir le bon fonctionnement de l'agent et de l'outil.

Cet article explore une implémentation simple d'un outil personnalisé qui ajoute 2 à une entrée numérique, en utilisant createToolCallingAgent de Langchain et le modèle Ollama. En analysant l'erreur et son contexte, nous pouvons mieux comprendre comment la résoudre.

Les sections suivantes vous guideront à travers le code, expliqueront l'erreur et fourniront des solutions pour résoudre ce problème. Que vous soyez nouveau sur Langchain.js ou expérimenté, ce guide vous aidera à surmonter efficacement ce problème.

Commande Exemple d'utilisation
tool() Cette fonction de Langchain.js définit un outil personnalisé qui effectue une opération. Dans cet article, il est utilisé pour créer un outil qui ajoute 2 à un nombre d'entrée, enveloppant la logique dans une structure facilement appelable.
z.object() Une partie de la bibliothèque Zod, utilisée pour la validation de schéma dans Langchain. Cela garantit que l'entrée dans l'outil personnalisé est un nombre, fournissant une validation d'entrée solide pour éviter les erreurs lors de l'exécution.
createToolCallingAgent() Cette commande crée un agent capable d'appeler les outils définis en réponse aux requêtes des utilisateurs. C'est la clé de l'intégration d'outils avec des modèles de langage comme Ollama, permettant d'invoquer des outils pendant la conversation.
ChatPromptTemplate.fromMessages() Utilisé pour générer un modèle d'invite de discussion avec des espaces réservés. Ce modèle organise différents types de messages (système, humain, espaces réservés) que l'agent peut utiliser, améliorant ainsi son flux conversationnel.
MessagesPlaceholder Agit comme un espace réservé dans le modèle d'invite pour le contenu dynamique, tel que l'historique des discussions ou le bloc-notes de l'agent. Cela permet d’injecter dynamiquement le contexte de conversation lors de l’exécution.
AgentExecutor() Cette classe gère l'exécution des agents et des outils. Dans l'exemple, cela aide à exécuter la requête via l'agent et à collecter le résultat de la sortie de l'outil.
await agentExecutor.invoke() Utilisé pour exécuter la requête via l'agent et attendre le résultat de manière asynchrone. Ceci est crucial pour interagir avec les modèles et outils de langage, car cela garantit que le code attend la fin de l’opération avant de continuer.
try-catch Cette structure de gestion des erreurs est utilisée dans l'outil personnalisé pour détecter les types d'entrée non valides. En détectant les exceptions, il garantit que le système renvoie des messages d'erreur utiles sans interrompre le flux d'exécution.
expect() À partir de la bibliothèque d'assertions Chai, expect() est utilisé dans le test unitaire pour vérifier la sortie de l'outil personnalisé. C’est essentiel pour tester si l’outil fonctionne comme prévu.

Comprendre la gestion des erreurs des outils personnalisés et des agents dans Langchain.js

Dans l'exemple fourni, nous travaillons avec Langchain.js v2 pour créer un outil personnalisé qui s'intègre au Ollama modèle de langage. L'objectif principal de l'outil est d'effectuer une opération mathématique simple : ajouter 2 à la valeur d'entrée. L'outil est construit à l'aide de Langchain outil function, qui définit des fonctions réutilisables pouvant être invoquées par un agent. Pour garantir le bon fonctionnement de l'outil, le schéma d'entrée est validé avec la bibliothèque Zod, garantissant que l'entrée est un nombre valide. Cela garantit une gestion appropriée des erreurs et empêche l’outil d’échouer en raison d’entrées non valides.

L'outil personnalisé est ensuite incorporé à un agent à l'aide du createToolCallingAgent fonction. Cette commande permet à l'agent d'appeler l'outil en cas de besoin, et l'agent est alimenté par le modèle Ollama, qui est configuré avec des paramètres spécifiques tels que la température pour contrôler la créativité des réponses. Pour faciliter une interaction fluide entre l'agent et l'outil, un modèle d'invite de discussion est utilisé. Ce modèle organise la conversation en définissant différents types de messages, tels que les messages système, les entrées humaines et les espaces réservés. Les espaces réservés, tels que MessagesPlaceholder, permettez à la conversation d'être dynamique, avec des éléments tels que l'historique des discussions inclus.

L'un des problèmes clés abordés dans cet exemple est la gestion des erreurs liées à l'analyse de la sortie de l'agent Langchain. Le message d'erreur « parseResult on ToolCallingAgentOutputParser ne fonctionne que sur la sortie ChatGeneration » provient d'une inadéquation entre le type de sortie attendu par l'analyseur et la sortie réelle générée. Pour gérer cette erreur, l'outil personnalisé est enveloppé dans une logique robuste, garantissant que toutes les entrées et sorties sont conformes aux formats attendus. Ceci est en outre géré par le AgentExécuteur classe, qui coordonne l’exécution de l’agent et des outils, en s’assurant que la sortie de la requête et de l’outil est correctement synchronisée.

Enfin, les scripts implémentent une exécution asynchrone en utilisant attendre, permettant au système de gérer les opérations sans bloquer d'autres processus. L'agent attend que l'outil renvoie son résultat avant de continuer, garantissant ainsi que la réponse est à la fois précise et opportune. De plus, des tests unitaires sont inclus pour valider la fonctionnalité de l'outil, garantissant ainsi qu'il produit systématiquement le résultat correct. Ces tests confirment non seulement le fonctionnement mathématique de l’outil, mais vérifient également dans quelle mesure il gère les entrées non valides, améliorant ainsi la fiabilité globale de la solution. Cette conception modulaire et résistante aux erreurs rend les scripts réutilisables et efficaces pour diverses applications au sein de Langchain.js.

Correction de l'erreur Langchain.js avec une approche modulaire

Solution 1 : JavaScript avec approche modulaire et gestion des erreurs à l'aide de Langchain.js et Ollama LLM

import { tool } from "@langchain/core/tools";
import { z } from "zod";
import { Ollama } from "@langchain/ollama";
import { ChatPromptTemplate } from "@langchain/core/prompts";
import { createToolCallingAgent } from "langchain/agents";
import { AgentExecutor } from "langchain/agents";
// Initialize LLM with Ollama
const llm = new Ollama({
    model: "llama3",
    temperature: 0.7,
});
// Custom tool to add 2 to the input number
const magicTool = tool(
    async (input) => {
        return input + 2;
    },
    {
        name: "magic_function",
        description: "Applies a magic function to an input",
        schema: z.object({ input: z.number() }),
    };
);
const tools = [magicTool];
// Setup ChatPromptTemplate with placeholders
const prompt = ChatPromptTemplate.fromMessages([
    ["system", "You are a helpful assistant called iHelp"],
    ["placeholder", "{chat_history}"],
    ["human", "{input}"],
    ["placeholder", "{agent_scratchpad}"],
]);
// Agent configuration
const agent = createToolCallingAgent({ llm, tools, prompt });
// Execute agent query
const agentExecutor = new AgentExecutor({ agent, tools });
const query = "What is the value of magic_function(3)?";
await agentExecutor.invoke({ input: query });

Gestion améliorée des erreurs pour l'agent Langchain.js

Solution 2 : gestion des erreurs avec les tests unitaires pour valider la sortie de l'outil personnalisé dans Langchain.js

import { tool } from "@langchain/core/tools";
import { z } from "zod";
import { Ollama } from "@langchain/ollama";
import { createToolCallingAgent } from "langchain/agents";
import { AgentExecutor } from "langchain/agents";
// Initialize LLM with Ollama
const llm = new Ollama({ model: "llama3", temperature: 0.7 });
// Custom tool with added error handling
const magicTool = tool(
    async (input) => {
        try {
            if (typeof input !== "number") throw new Error("Invalid input type!");
            return input + 2;
        } catch (err) {
            return err.message;
        }
    },
    {
        name: "magic_function",
        description: "Adds 2 to input and handles errors",
        schema: z.object({ input: z.number() }),
    }
);
const tools = [magicTool];
// Agent and execution
const agent = createToolCallingAgent({ llm, tools });
const agentExecutor = new AgentExecutor({ agent, tools });
const query = "magic_function('abc')"; // Test with invalid input
await agentExecutor.invoke({ input: query });
// Unit test example
import { expect } from "chai";
it("should return 5 when input is 3", async () => {
    const result = await magicTool(3);
    expect(result).to.equal(5);
});

Explorer le rôle des agents dans l'intégration de Langchain.js et Ollama LLM

Lorsque vous travaillez avec Langchain.js, l'intégration agents avec des outils et des modèles de langage comme Ollama est un aspect essentiel de la création d'applications dynamiques. Un agent vous permet de connecter un outil personnalisé, qui effectue des tâches spécifiques, à un modèle de langage, qui gère des tâches plus conversationnelles ou génératives. En utilisant des agents, les développeurs peuvent automatiser les flux de travail dans lesquels un modèle génère non seulement des réponses, mais appelle également des outils pour effectuer des calculs ou un traitement de données.

L'élément clé de cette intégration est le createToolCallingAgent fonction. Cette fonction permet à l'agent de déclencher des outils spécifiques lorsque cela est nécessaire, garantissant ainsi que les tâches sont exécutées avec précision et efficacité. Même si l'accent est souvent mis sur la création de l'outil lui-même, il est tout aussi important de comprendre comment gérer le flux de travail de l'agent et éviter les erreurs d'analyse. Des erreurs telles que « parseResult on ToolCallingAgentOutputParser ne fonctionne que sur la sortie ChatGeneration » se produisent généralement lorsque la sortie de l'agent n'est pas compatible avec le système d'analyse, soulignant la nécessité d'un alignement approprié entre la sortie de l'agent et le format attendu.

L'utilisation de modèles d'invite, tels que Modèle d'invite de chat, enrichit encore l'interaction en autorisant des messages dynamiques et des espaces réservés de contexte. Cela permet à l’agent d’ajuster ses réponses en fonction de l’historique des discussions ou du bloc-notes de l’agent. L'optimisation des modèles d'invite et la garantie que les sorties de l'agent sont correctement analysées peuvent éviter de nombreuses erreurs courantes, rendant ainsi vos applications Langchain.js plus fiables et efficaces.

Questions fréquemment posées sur Langchain.js, les agents et les outils

  1. Qu’est-ce qu’un agent dans Langchain.js ?
  2. Un agent est un composant qui interagit avec des outils et des modèles de langage pour effectuer des tâches spécifiques basées sur une requête utilisateur. Il utilise le createToolCallingAgent fonction pour déclencher des outils.
  3. Comment résoudre l’erreur « parseResult on ToolCallingAgentOutputParser » ?
  4. Cette erreur se produit lorsque la sortie de l'agent est incompatible avec l'analyseur. Assurez-vous que la sortie correspond à ce que l'analyseur attend et utilisez un ChatGeneration format de sortie.
  5. Quel est le but du AgentExecutor?
  6. Le AgentExecutor gère l'exécution de l'agent et de ses outils, vous permettant d'exécuter des workflows complexes dans les applications Langchain.js.
  7. Comment ChatPromptTemplate travail?
  8. ChatPromptTemplate organise les messages de discussion dans un format structuré, permettant d'insérer du contenu dynamique tel que l'historique des discussions et le bloc-notes des agents dans le flux de conversation.
  9. Pourquoi Zod utilisé dans l'outil ?
  10. Zod est utilisé pour la validation des entrées, garantissant que l'entrée dans l'outil personnalisé est du type correct (par exemple, un nombre), ce qui réduit les risques d'erreurs.

Réflexions finales sur la gestion des erreurs dans Langchain.js

La résolution de l'erreur « parseResult on ToolCallingAgentOutputParser ne fonctionne que sur la sortie ChatGeneration » nécessite un alignement minutieux entre la sortie de votre agent et ses attentes d'analyse. Avec la bonne approche, cette erreur peut être évitée.

En utilisant des outils appropriés comme Zod pour la validation et en garantissant que les agents, tels que ceux construits avec Ollama, gèrent correctement les entrées et les sorties, vous pouvez créer des solutions robustes dans Langchain.js sans rencontrer de problèmes d'analyse.

Sources et références pour la résolution des erreurs Langchain.js
  1. Élabore sur la documentation officielle de Langchain, qui fournit des informations sur la création d'outils et les configurations d'agents. Documentation Langchain À l'intérieur.
  2. Explique plus en détail l'utilisation de Zod pour la validation des entrées et son application dans Langchain.js. Documentation Zod À l'intérieur.
  3. Décrit le modèle de langage Ollama et son implémentation au sein des agents personnalisés. Ollama LLM À l'intérieur.