LangChain 和 Pydantic 生成 JSON 格式的响应
Pydantic 1 的生命周期结束于 2024 年 6 月。LangChain 将很快停止对 Pydantic 1 的支持,并可能在内部迁移到 Pydantic 2。这个变化预计将在 9 月发生,届时主 langchain 包的版本将小幅提升至 0.3.x。
从 langchain>=0.0.267 版本开始,LangChain 允许用户安装 Pydantic V1 或 V2。
内部来说,LangChain 继续通过 Pydantic 2 的 v1 命名空间使用 Pydantic V1。
由于 Pydantic 不支持混合使用 .v1 和 .v2 对象,用户在使用 LangChain 与 Pydantic 时应该注意一些问题。
尽管 LangChain 在某些 API 中支持 Pydantic v2 对象,但建议用户在 LangChain 0.3 版本发布之前继续使用 Pydantic v1 对象。
本文将体验生成 JSON 格式的结构化响应的能力。
一、JSON 格式的优势
JSON(JavaScript Object Notation)格式无疑是开发者首选的标准,原因有多个:
- 可读性:对人类和机器来说都易于阅读和理解。
- 兼容性:被大多数编程语言和平台支持。
- 灵活性:能够简单而简洁地表示复杂的数据结构。
- 集成性:能够轻松地与 RESTful API、NoSQL 数据库等许多现代技术集成。
二、使用 Pydantic 定义模型
下面使用 Pydantic,这是一个允许我们在 Python 中创建强类型数据模型的库。这些模型随后可以用于数据验证和序列化。与其他验证库不同,Pydantic 使用注解自动执行数据验证和强制转换。
下面尝试生成具有文本和一些标签的社交媒体帖子:
from langchain_core.pydantic_v1 import BaseModel, Field
class SocialPost(BaseModel):
"""社交媒体帖子"""
tags: str = Field(description="帖子标签")
text: str = Field(description="帖子的纯文本")
上面定义一个通用 SocialPost 类:
- 使用了描述类本身目的的文档字符串;
- 扩展了 Pydantic 的 BaseModel,它代表了验证框架的基类;
- 使用了 Field 函数来定义对象属性,并附带了额外的元信息(例如描述、默认值等)。
三、在 LangChain 中使用 Pydantic 模型
在定义了想要使用的输出 JSON 模板之后,接下来在 LangChain 应用程序中使用它:
# 导入ChatOpenAI类,用于与OpenAI聊天模型交互
from langchain_openai import ChatOpenAI
# 导入BaseModel和Field类,用于定义结构化数据模型
from langchain_core.pydantic_v1 import BaseModel, Field
# 定义SocialPost类,表示社交媒体帖子的数据模型
class SocialPost(BaseModel):
"""社交媒体帖子"""
# 定义tags字段,表示帖子的标签
tags: str = Field(description="帖子标签")
# 定义text字段,表示帖子的纯文本内容
text: str = Field(description="帖子的纯文本")
# 创建一个使用gpt-4o模型的ChatOpenAI实例
llm = ChatOpenAI(model="gpt-4o")
# 为ChatOpenAI实例设置输出结构化为SocialPost模型
structured_llm = llm.with_structured_output(SocialPost)
# 调用invoke方法生成关于海滩假期的帖子,并将响应结果存储在response变量中
response = structured_llm.invoke("你能写一篇关于海滩假期的帖子吗?")
# 打印响应结果
print(response)
输出内容:
代码中使用了 with_structured_output 方法来生成符合 SocialPost 类定义格式的结构化输出。
LangChain 提供了一个强大而灵活的解决方案,用于生成 JSON 格式的结构化响应,使得将语言模型集成到现代应用程序中变得更加容易。