跳至主要内容

如何尝试修复输出解析错误

先决条件

本指南假定你熟悉以下概念: - 聊天模型 - 输出解析器 - 提示模板 - 将 Runnable 连接在一起

LLM 并不完美,有时会生成与所需格式不完全匹配的输出。为了帮助处理错误,我们可以使用 OutputFixingParser。此输出解析器包装另一个输出解析器,并在第一个解析器失败的情况下,它会调用另一个 LLM 来尝试修复任何错误。

具体来说,我们可以将格式不正确的输出以及格式化的说明传递给模型,并要求它进行修复。

对于此示例,我们将使用 StructuredOutputParser,它可以根据 Zod 模式验证输出。以下是将不符合模式的结果传递给它的情况

import { z } from "zod";
import { RunnableSequence } from "@langchain/core/runnables";
import { StructuredOutputParser } from "@langchain/core/output_parsers";
import { ChatPromptTemplate } from "@langchain/core/prompts";

const zodSchema = z.object({
name: z.string().describe("name of an actor"),
film_names: z
.array(z.string())
.describe("list of names of films they starred in"),
});

const parser = StructuredOutputParser.fromZodSchema(zodSchema);

const misformatted = "{'name': 'Tom Hanks', 'film_names': ['Forrest Gump']}";

await parser.parse(misformatted);
Error: Failed to parse. Text: "{'name': 'Tom Hanks', 'film_names': ['Forrest Gump']}". Error: SyntaxError: Expected property name or '}' in JSON at position 1 (line 1 column 2)

现在我们可以构建和使用 OutputFixingParser。此输出解析器接受另一个输出解析器作为参数,但也接受一个 LLM,用于尝试更正任何格式错误。

import { ChatAnthropic } from "@langchain/anthropic";

import { OutputFixingParser } from "langchain/output_parsers";

const model = new ChatAnthropic({
model: "claude-3-sonnet-20240229",
maxTokens: 512,
temperature: 0.1,
});

const parserWithFix = OutputFixingParser.fromLLM(model, parser);

await parserWithFix.parse(misformatted);
{
name: "Tom Hanks",
film_names: [
"Forrest Gump",
"Saving Private Ryan",
"Cast Away",
"Catch Me If You Can"
]
}

有关不同参数和选项的更多信息,请查看我们的 API 参考文档


此页面是否有帮助?


你也可以在 GitHub 上留下详细的反馈 GitHub.