了解并修复 Langchain.js 中的 ToolCallingAgentOutputParser 错误
在使用 Langchain.js v2 时,开发人员通常旨在使用自定义工具和 Ollama 等语言模型来创建高效的代理。然而,集成这些组件有时会导致难以调试的错误。
其中一个错误是“ToolCallingAgentOutputParser 上的 parseResult 仅适用于 ChatGeneration 输出”,在代理框架内构建自定义工具时可能会发生这种情况。了解此问题的根本原因对于确保代理和工具正常工作至关重要。
本文探讨了使用 Langchain 的 createToolCallingAgent 和 Ollama 模型对数字输入加 2 的自定义工具的简单实现。通过分析错误及其上下文,我们可以更好地掌握如何排除故障。
以下部分将指导您完成代码、解释错误并提供解决此问题的解决方案。无论您是 Langchain.js 的新手还是经验丰富的人,本指南都将帮助您有效地解决此问题。
命令 | 使用示例 |
---|---|
tool() | Langchain.js 中的此函数定义了执行操作的自定义工具。在本文中,它用于创建一个将输入数字加 2 的工具,将逻辑包装在易于调用的结构中。 |
z.object() | Zod 库的一部分,用于 Langchain 中的模式验证。这确保了自定义工具的输入是数字,提供强大的输入验证以防止执行期间出现错误。 |
createToolCallingAgent() | 此命令创建一个代理,可以调用定义的工具来响应用户查询。将工具与 Ollama 等语言模型集成的关键,使得在对话期间调用工具成为可能。 |
ChatPromptTemplate.fromMessages() | 用于生成带有占位符的聊天提示模板。该模板组织不同类型的消息(系统消息、人工消息、占位符)供代理使用,从而改进其对话流程。 |
MessagesPlaceholder | 充当动态内容提示模板中的占位符,例如聊天历史记录或代理便笺本。这允许在执行期间动态注入对话上下文。 |
AgentExecutor() | 此类管理代理和工具的执行。在示例中,它有助于通过代理运行查询并从工具的输出中收集结果。 |
await agentExecutor.invoke() | 用于通过代理运行查询并异步等待结果。这对于与语言模型和工具交互至关重要,因为它确保代码等待操作完成后再继续。 |
try-catch | 此错误处理结构在自定义工具中用于捕获无效的输入类型。通过捕获异常,它可以确保系统在不中断执行流程的情况下返回有用的错误消息。 |
expect() | 在 Chai 断言库中,expect() 用于在单元测试中验证自定义工具的输出。这对于测试该工具是否按预期运行至关重要。 |
了解 Langchain.js 中的自定义工具和代理错误处理
在提供的示例中,我们正在使用 Langchain.js v2 创建一个与 奥拉玛 语言模型。该工具的主要用途是执行简单的数学运算:将输入值加 2。该工具是使用 Langchain 构建的 工具 function,它定义可由代理调用的可重用函数。为了确保该工具正常工作,输入模式通过 Zod 库进行验证,确保输入是有效数字。这可确保正确的错误处理并防止工具因无效输入而失败。
然后使用以下方法将自定义工具合并到代理中: 创建工具调用代理 功能。该命令允许代理在需要时调用该工具,该代理由 Ollama 模型提供支持,该模型配置了温度等特定参数来控制响应的创造力。为了促进座席和工具之间的顺利交互,使用了聊天提示模板。该模板通过定义不同类型的消息(例如系统消息、人工输入和占位符)来组织对话。占位符,例如 消息占位符,允许对话是动态的,其中包含聊天历史记录等元素。
本示例解决的关键问题之一是围绕 Langchain 代理输出解析的错误处理。错误消息“ToolCallingAgentOutputParser 上的 parseResult 仅适用于 ChatGeneration 输出”源于解析器预期的输出类型与生成的实际输出类型之间的不匹配。为了处理此错误,自定义工具被封装在强大的逻辑中,确保所有输入和输出符合预期格式。这进一步由 代理执行者 类,它协调代理和工具的执行,确保查询和工具输出正确同步。
最后,脚本使用以下方法实现异步执行 等待,允许系统处理操作而不阻塞其他进程。代理等待工具返回结果后再继续,以确保响应准确且及时。此外,还包括单元测试来验证工具的功能,确保它始终产生正确的输出。这些测试不仅可以确认该工具的数学运算,还可以检查它处理无效输入的效果,从而提高解决方案的整体可靠性。这种模块化且防错的设计使脚本可重用且对 Langchain.js 中的各种应用程序有效。
使用模块化方法修复 Langchain.js 错误
解决方案 1:使用 Langchain.js 和 Ollama LLM 进行模块化方法和错误处理的 JavaScript
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 });
Langchain.js 代理的增强错误处理
解决方案 2:使用单元测试进行错误处理,以验证 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);
});
探索代理在 Langchain.js 和 Ollama LLM 集成中的作用
使用 Langchain.js 时,集成 代理人 使用像 Ollama 这样的工具和语言模型是构建动态应用程序的一个关键方面。代理允许您将执行特定任务的自定义工具连接到处理更多会话或生成任务的语言模型。通过使用代理,开发人员可以自动化工作流程,其中模型不仅生成响应,还调用工具来执行计算或数据处理。
该集成的关键组件是 创建工具调用代理 功能。该功能可以让座席在必要时触发特定工具,确保任务准确高效地完成。虽然主要焦点通常是创建工具本身,但了解如何管理代理的工作流程并避免解析错误也同样重要。当代理的输出与解析系统不兼容时,通常会出现“ToolCallingAgentOutputParser 上的 parseResult 仅适用于 ChatGeneration 输出”之类的错误,这突出表明代理的输出与预期格式之间需要正确对齐。
使用提示模板,例如 聊天提示模板,通过允许动态消息和上下文占位符进一步丰富交互。这允许代理根据聊天历史记录或代理的便笺簿调整其响应。优化提示模板并确保正确解析代理的输出可以防止许多常见错误,使您的 Langchain.js 应用程序更加可靠和高效。
关于 Langchain.js、代理和工具的常见问题
- Langchain.js 中的代理是什么?
- 代理是与工具和语言模型交互以根据用户查询执行特定任务的组件。它使用 createToolCallingAgent 功能来触发工具。
- 如何解决“ToolCallingAgentOutputParser 上的 parseResult”错误?
- 当代理的输出与解析器不兼容时,会发生此错误。确保输出与解析器期望的匹配并使用 ChatGeneration 输出格式。
- 目的是什么 AgentExecutor?
- 这 AgentExecutor 管理代理及其工具的执行,允许您在 Langchain.js 应用程序中运行复杂的工作流程。
- 怎么样 ChatPromptTemplate 工作?
- ChatPromptTemplate 以结构化格式组织聊天消息,允许将聊天历史记录和座席便笺簿等动态内容插入到对话流中。
- 为什么是 Zod 在工具中使用?
- Zod 用于输入验证,确保自定义工具的输入类型正确(例如数字),从而减少出错的机会。
关于 Langchain.js 中错误处理的最终想法
解决“ToolCallingAgentOutputParser 上的 parseResult 仅适用于 ChatGeneration 输出”错误需要在代理的输出与其解析期望之间仔细对齐。通过正确的方法,可以避免这种错误。
通过使用 Zod 等适当的工具进行验证并确保代理(例如使用 Ollama 构建的代理)正确处理输入和输出,您可以在 Langchain.js 中创建强大的解决方案,而不会遇到解析问题。
Langchain.js 错误解决的来源和参考
- 详细阐述了 Langchain 官方文档,其中提供了有关工具创建和代理配置的见解。 Langchain文档 里面。
- 进一步讲解了Zod用于输入验证的使用及其在Langchain.js中的应用。 Zod 文档 里面。
- 描述 Ollama 语言模型及其在自定义代理中的实现。 奥拉玛法学硕士 里面。