如何尝试修复输出解析中的错误
先决条件
本指南假设您熟悉以下概念: - 聊天模型 - 输出解析器 - 提示模板 - 将可运行对象链接在一起
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 参考文档。