[如何从模型返回结构化数据:高级指南]

165 阅读3分钟
# 如何从模型返回结构化数据:高级指南

## 引言

在现代应用中,AI模型生成结构化数据以匹配特定模式是一个常见需求。这种能力对于从文本中提取数据以插入数据库或与其他下游系统集成尤为重要。本文将介绍使用不同方法从模型获取结构化输出的策略,以及解决相关挑战的方法。

## 主要内容

### 使用`with_structured_output()`方法

此方法是获取结构化输出的最简单和最可靠的方法。支持这种方法的模型已经实现了输出结构化的能力,例如工具/函数调用或JSON模式。使用此方法时,可以指定一个模式(schema)以定义所需输出的属性。

#### 支持的模型

以下模型支持`with_structured_output()`方法:
- OpenAI
- Anthropic
- Azure
- Google
- Cohere
- NVIDIA
- FireworksAI
- Groq
- MistralAI
- TogetherAI

> 备注:由于某些地区的网络限制,开发者可能需要考虑使用API代理服务提高访问稳定性。

### 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("Tell me a joke about cats")

使用TypedDict或JSON Schema

如果不需要验证输出,可以使用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"]

代码示例

以下是一个完整示例,使用Pydantic类来获取结构化输出:

from typing import Optional
from langchain_core.pydantic_v1 import BaseModel, Field

# 定义Pydantic类
class Joke(BaseModel):
    setup: str = Field(description="笑话的开场白")
    punchline: str = Field(description="笑话的包袱")
    rating: Optional[int] = Field(default=None, description="笑话的搞笑程度,1到10")

# 初始化LLM
structured_llm = llm.with_structured_output(Joke)

# 获取结构化输出
result = structured_llm.invoke("Tell me a joke about cats")
print(result)

常见问题和解决方案

  1. 模型不支持with_structured_output()

    • 对于不支持的模型,需要直接提示模型使用特定格式,并使用输出解析器提取结构化响应。
  2. 输出验证失败

    • 确保Pydantic定义的字段类型和默认值设置正确。
  3. 网络限制

    • 使用API代理服务提高访问稳定性。

总结和进一步学习资源

通过使用相关的编程技术和工具,开发者可以从AI模型中更高效地获取所需的结构化数据。获得更多信息,请查阅以下资源:

参考资料

  1. LangChain API Reference
  2. Python's typing_extensions Documentation

如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!


---END---