Pydantic 和 Prompt Engineering:验证大型语言模型输出的基本要素
![](https://miro.medium.com/v2/resize:fit:1400/1*bytrK3M-k2q94JzSSpdl0Q.jpeg)
源:https://www.wisecube.ai/blog/一个全面的大型语言模型概述/
引言
大型语言模型(LLMs)根据我们的提示输出文本。这在与它们聊天时提供了令人满意的交互,但当我们希望将这些模型集成到应用程序中时,它构成了挑战。为了实现无缝集成,通常至关重要的是让这些响应具有结构化的格式,可以有效地使用并传递给后续流程。这时,Pydantic 发挥了作用,弥合了来自LLMs的文本响应和我们的应用程序需要的结构化输入之间的差距。Pydantic 使我们能够定义一个期望的数据模型,该模型可以将LLM的输出转换为。这样,我们可以确保从LLMs获得结构化、经过验证、因此更有用的响应。
使用提示查询您的LLM
要使用提示从我们的 LLM 获取响应,我们使用以下函数。
让我们用以下提示调用这个函数:
深入 Pydantic 建模
利用 Pydantic 模型,让我们为数据构建一个结构化的输出。我们定义了一个 CityResponse
模型,捕获关键细节 - 城市名称、所在的国家、人口和本地货币。然后我们将这些城市打包到一个 Cities
模型中。这个过程帮助我们生成一个定制的城市列表,具有具体信息并包装精美,便于深入的数据处理。每个字段都必须提供描述,因为 LangChain 将使用这些来生成提示。
使用 Langchain 设置 Pydantic 输出解析器
接下来,我们将利用 LangChain 的 PydanticOutputParser。这有助于我们塑造语言模型的输出,以满足我们所需的格式。
格式说明用作我们语言模型输出的结构化蓝图。这些说明确立了输出应遵循特定的 JSON 模式。它们提供了一些例子,其中一个 JSON 实例正确地遵循了模式 - 具有'foo'键和数组值的对象,另一个实例不符合模式。
查询你的LLM并获取结构化的响应
接下来,让我们使用 LangChain 的 PromptTemplate 来配置语言模型的结构化输入。一旦提示配置完成,我们将将其传递给LLM并获取响应。我们可以看到,根据上面各部分指定的,响应格式良好。
添加自定义验证逻辑
此外,我们还可以为每个字段使用 Pydantic 模型的验证逻辑。这一额外的验证层确保了LLM的每个响应都严格符合我们预设的标准。例如,假设我们需要城市名称全大写。为了实现这一点,我们将使用 validator 装饰器,并将我们的条件逻辑嵌入到类方法 validate_cities 中。在从LLM接收到响应后,我们可以评估其是否符合我们设定的准则。
当我们解析答案时,Pydantic 会验证字段 city_name 的值。Istanbul 并非如我们指定的大写字符串。因此,我们得到以下错误:
OutputParserException: Failed to parse Cities from completion {
"cities": [
{
"city_name": "Istanbul",
"country": "Turkey",
"population_number": 15030000,
"local_currency": "Turkish lira"
},
{
"city_name": "Moscow",
"country": "Russia",
"population_number": 12615000,
"local_currency": "Russian ruble"
},
{
"city_name": "London",
"country": "United Kingdom",
"population_number": 8908000,
"local_currency": "Pound sterling"
}
]
}. Got: 1 validation error for Cities
cities
City name 'Istanbul' is not uppercase (type=value_error)
结论
总的来说,我们在 Python 代码中使用 LangChain 的 Pydantic 模型、PromptTemplate 和 PydanticOutputParser 从大型语言模型中获取结构良好且非常特定的数据是一种无价的方法。这种方法不仅简化了处理非结构化输出的复杂过程,而且还使我们能够保持高质量的数据,确保我们的需求和规范得到完全满足。