跳至主要内容

如何解析 XML 输出

先决条件

不同提供商的 LLM 通常具有不同的优势,具体取决于它们训练的特定数据。 这也意味着有些可能在生成除 JSON 之外的格式的输出方面“更好”和更可靠。

本指南向您展示了如何使用 XMLOutputParser 提示模型以生成 XML 输出,然后将该输出解析为可用的格式。

注意

请记住,大型语言模型是漏洞抽象!您需要使用具有足够容量的 LLM 来生成格式良好的 XML。

在以下示例中,我们使用 Anthropic 的 Claude (https://docs.anthropic.com/claude/docs),该模型是针对 XML 标签优化的模型之一。

yarn add @langchain/anthropic

让我们从对模型的简单请求开始。

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

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

const query = `Generate the shortened filmograph for Tom Hanks.`;

const result = await model.invoke(
query + ` Please enclose the movies in "movie" tags.`
);

console.log(result.content);
Here is the shortened filmography for Tom Hanks, with movies enclosed in "movie" tags:

<movie>Forrest Gump</movie>
<movie>Saving Private Ryan</movie>
<movie>Cast Away</movie>
<movie>Apollo 13</movie>
<movie>Catch Me If You Can</movie>
<movie>The Green Mile</movie>
<movie>Toy Story</movie>
<movie>Toy Story 2</movie>
<movie>Toy Story 3</movie>
<movie>Toy Story 4</movie>
<movie>Philadelphia</movie>
<movie>Big</movie>
<movie>Sleepless in Seattle</movie>
<movie>You've Got Mail</movie>
<movie>The Terminal</movie>

这实际上运行得很好! 但将该 XML 解析为更易于使用的格式会更好。 我们可以使用 XMLOutputParser 在提示中添加默认格式指令,并将输出的 XML 解析为字典。

import { XMLOutputParser } from "@langchain/core/output_parsers";

// We will add these instructions to the prompt below
const parser = new XMLOutputParser();

parser.getFormatInstructions();
"The output should be formatted as a XML file.\n" +
"1. Output should conform to the tags below. \n" +
"2. If tag"... 434 more characters
import { ChatPromptTemplate } from "@langchain/core/prompts";

const prompt = ChatPromptTemplate.fromTemplate(
`{query}\n{format_instructions}`
);
const partialedPrompt = await prompt.partial({
format_instructions: parser.getFormatInstructions(),
});

const chain = partialedPrompt.pipe(model).pipe(parser);

const output = await chain.invoke({
query: "Generate the shortened filmograph for Tom Hanks.",
});

console.log(JSON.stringify(output, null, 2));
{
"filmography": [
{
"actor": [
{
"name": "Tom Hanks"
},
{
"films": [
{
"film": [
{
"title": "Forrest Gump"
},
{
"year": "1994"
},
{
"role": "Forrest Gump"
}
]
},
{
"film": [
{
"title": "Saving Private Ryan"
},
{
"year": "1998"
},
{
"role": "Captain Miller"
}
]
},
{
"film": [
{
"title": "Cast Away"
},
{
"year": "2000"
},
{
"role": "Chuck Noland"
}
]
},
{
"film": [
{
"title": "Catch Me If You Can"
},
{
"year": "2002"
},
{
"role": "Carl Hanratty"
}
]
},
{
"film": [
{
"title": "The Terminal"
},
{
"year": "2004"
},
{
"role": "Viktor Navorski"
}
]
}
]
}
]
}
]
}

您会注意到,上面的输出不再只是在 movie 标签之间。 我们还可以添加一些标签来根据我们的需要调整输出。

const parser = new XMLOutputParser({
tags: ["movies", "actor", "film", "name", "genre"],
});

// We will add these instructions to the prompt below
parser.getFormatInstructions();
"The output should be formatted as a XML file.\n" +
"1. Output should conform to the tags below. \n" +
"2. If tag"... 460 more characters

您可以在提示的其他部分中添加您自己的格式提示,以增强或替换默认指令,并且应该这样做。

以下是我们调用它时产生的结果。

import { ChatPromptTemplate } from "@langchain/core/prompts";

const prompt = ChatPromptTemplate.fromTemplate(
`{query}\n{format_instructions}`
);
const partialedPrompt = await prompt.partial({
format_instructions: parser.getFormatInstructions(),
});

const chain = partialedPrompt.pipe(model).pipe(parser);

const output = await chain.invoke({
query: "Generate the shortened filmograph for Tom Hanks.",
});

console.log(JSON.stringify(output, null, 2));
{
"movies": [
{
"actor": [
{
"film": [
{
"name": "Forrest Gump"
},
{
"genre": "Drama"
}
]
},
{
"film": [
{
"name": "Saving Private Ryan"
},
{
"genre": "War"
}
]
},
{
"film": [
{
"name": "Cast Away"
},
{
"genre": "Drama"
}
]
},
{
"film": [
{
"name": "Catch Me If You Can"
},
{
"genre": "Biography"
}
]
},
{
"film": [
{
"name": "The Terminal"
},
{
"genre": "Comedy-drama"
}
]
}
]
}
]
}

后续步骤

您现在已经了解了如何提示模型返回 XML。 接下来,查看 获取结构化输出的更广泛指南,了解其他相关技术。


此页面是否有用?


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