提升API数据处理的利器:如何从模型返回结构化数据
引言
在现代的数据驱动应用程序中,模型输出的结构化数据已成为关键需求。无论是为了将文本数据提取到数据库中,还是与下游系统整合,获得结构化数据都是关键步骤。在本文中,我们将探讨如何从模型返回结构化数据,并通过一些实用的方法和示例代码来展示其实现。
主要内容
1. 使用with_structured_output()方法
with_structured_output()是获取结构化输出的最简单、最可靠的方法。它通过输入一个指定输出属性名称、类型和描述的模式来返回匹配的对象。支持该方法的模型列表可以在此处找到。模式可以定义为TypedDict类、JSON Schema或Pydantic类。
2. 使用Pydantic获取结构化输出
Pydantic提供了验证模型生成输出的优势。如果任何必需字段缺失或字段类型不正确,Pydantic会抛出错误。例如,我们可以让模型生成一个关于猫的笑话:
from typing import Optional
from pydantic import BaseModel, Field
class Joke(BaseModel):
setup: str = Field(description="The setup of the joke")
punchline: str = Field(description="The punchline to the joke")
rating: Optional[int] = Field(default=None, description="How funny the joke is, from 1 to 10")
llm = ChatOpenAI(model="gpt-4o-mini") # 使用API代理服务提高访问稳定性
structured_llm = llm.with_structured_output(Joke)
response = structured_llm.invoke("Tell me a joke about cats")
print(response)
3. 其他模式选择
除了Pydantic外,我们还可以使用TypedDict或JSON Schema。这些方法在某些情况下可能更简便,特别是当需要流式传输模型输出时。
4. 流式输出和多模式选择
当输出类型为字典时,可以流式传输结构化模型的输出。通过创建一个包含多个模式的父模式,模型可以选择最合适的模式输出。
代码示例
以下是一个使用Pydantic的完整代码示例,展示了如何从模型中获取结构化的笑话数据:
from typing import Optional
from pydantic import BaseModel, Field
from langchain_openai import ChatOpenAI
class Joke(BaseModel):
setup: str = Field(description="The setup of the joke")
punchline: str = Field(description="The punchline to the joke")
rating: Optional[int] = Field(default=None, description="How funny the joke is, from 1 to 10")
llm = ChatOpenAI(model="gpt-4o-mini") # 使用API代理服务提高访问稳定性
structured_llm = llm.with_structured_output(Joke)
response = structured_llm.invoke("Tell me a joke about cats")
print(response)
常见问题和解决方案
-
模型输出不准确怎么办?
可通过使用Pydantic进行验证以捕获字段缺失或错误类型的输出。 -
如何选择合适的模式?
根据应用场景,决定使用TypedDict、JSON Schema还是Pydantic。需要验证时建议使用Pydantic。 -
模型不支持结构化输出怎么办?
可以通过自定义解析器进行处理,或直接在模型提示中指定所需格式来提取结构化响应。
总结和进一步学习资源
通过本文,我们了解了如何利用with_structured_output()方法从模型中获取结构化数据,并讨论了使用Pydantic和其他模式的优缺点。有关更多使用输出解析器和提示技术的深入材料,可以参考以下资源:
参考资料
- LangChain库:example.com/langchain
- Pydantic文档:example.com/pydantic
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
---END---