如何尝试修复输出解析错误
先决条件
本指南假定你熟悉以下概念: - 聊天模型 - 输出解析器 - 提示模板 - 将 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 参考文档。