编辑
2025-02-12
后端
00
请注意,本文编写于 87 天前,最后修改于 87 天前,其中某些信息可能已经过时。

目录

如何解析 YAML 输出
前提条件
安装依赖
设置 API 密钥
定义数据模型
解析器的格式指令
示例输出
下一步
总结

如何解析 YAML 输出

前提条件

本教程假设你已经熟悉以下概念:

  • 聊天模型
  • 输出解析器
  • 提示模板
  • 结构化输出
  • 将可运行对象串联在一起

不同提供商的 LLM(大型语言模型)通常根据其训练数据的不同而具有不同的优势。这也意味着某些模型在生成非 JSON 格式的输出时可能更“优秀”且更可靠。

本教程将介绍如何使用 YAML 格式来指定任意模式,并查询 LLM 以生成符合该模式的输出。

注意:请记住,大型语言模型是“有漏洞的抽象”!你需要使用具有足够能力的 LLM 来生成格式良好的 YAML。

安装依赖

首先,我们需要安装必要的库:

bash
%pip install -qU langchain langchain-openai

设置 API 密钥

接下来,设置 OpenAI 的 API 密钥:

python
import os from getpass import getpass if "OPENAI_API_KEY" not in os.environ: os.environ["OPENAI_API_KEY"] = getpass()

定义数据模型

我们使用 Pydantic 和 YamlOutputParser 来定义数据模型,并为模型提供更多上下文,以便它知道应该生成什么类型的 YAML。

python
from langchain.output_parsers import YamlOutputParser from langchain_core.prompts import PromptTemplate from langchain_openai import ChatOpenAI from pydantic import BaseModel, Field # 定义你期望的数据结构 class Joke(BaseModel): setup: str = Field(description="笑话的开头问题") punchline: str = Field(description="笑话的结尾答案") # 初始化模型 model = ChatOpenAI(temperature=0) # 定义一个查询,用于提示语言模型填充数据结构 joke_query = "给我讲个笑话。" # 设置解析器,并将指令注入到提示模板中 parser = YamlOutputParser(pydantic_object=Joke) prompt = PromptTemplate( template="回答用户查询。\n{format_instructions}\n{query}\n", input_variables=["query"], partial_variables={"format_instructions": parser.get_format_instructions()}, ) # 将提示、模型和解析器串联在一起 chain = prompt | model | parser # 调用链并获取结果 result = chain.invoke({"query": joke_query}) print(result)

解析器的格式指令

我们可以查看解析器的 format_instructions,这些指令会被添加到提示中:

python
print(parser.get_format_instructions())

输出将包含如何格式化 YAML 的详细说明,确保输出符合指定的 JSON 模式。

示例输出

假设模型返回了以下 YAML 格式的笑话:

yaml
setup: "为什么自行车找不到回家的路?" punchline: "因为它失去了方向感!"

解析器会自动解析 YAML 输出并创建一个包含数据的 Pydantic 模型。

下一步

现在你已经学会了如何提示模型返回 YAML。接下来,你可以查看更广泛的指南,了解其他相关的结构化输出技术。

总结

通过本教程,你学会了如何使用 YamlOutputParser 来解析 LLM 生成的 YAML 输出,并将其转换为 Pydantic 模型。这种方法在处理需要结构化输出的场景时非常有用,尤其是在 JSON 格式不适用的情况下。

希望这篇教程对你有所帮助!如果你有任何问题或需要进一步的帮助,请随时提问。

本文作者:yowayimono

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!