如何从模型返回结构化数据

本文介绍一下如何使用 LangChain 框架(一个用于构建基于大型语言模型(LLM)的端到端应用程序的工具库)来生成 结构化输出(Structured Output)。结构化输出是指让模型(如GPT、LLama等)的输出结果符合预定义的格式(如 JSON、Pydantic 对象、表格等),而不是自由文本。这在需要程序化处理结果(如数据提取、后续自动化操作)时非常有用。

1. 为什么需要结构化输出?

  • 提高数据可处理性:结构化输出便于程序直接解析和操作,减少人工干预。
  • 减少歧义:明确的格式约束能降低模型输出模糊或错误的风险。
  • 兼容下游系统:结构化数据可直接集成到数据库、API等系统中。

2. LangChain 实现结构化输出的核心方法

LangChain 提供了多种工具和模式来实现结构化输出,核心是 定义输出格式解析输出结果。以下是关键步骤:

(1) 定义输出格式
  • 使用 Pydantic 模型 :通过 Python 的 pydantic 库定义数据模型,指定输出的字段和类型(例如:name 是字符串,age 是整数)。

    python 复制代码
    from pydantic import BaseModel
    
    class Person(BaseModel):
        name: str
        age: int
        is_student: bool
  • 其他格式:也可以直接指定 JSON 或其他结构化格式的要求。

(2) 配置 LLM 模板(Prompt)

在提示词(Prompt)中明确要求模型输出符合指定的格式,例如:

text 复制代码
请以以下 JSON 格式返回用户信息:
{
  "name": "<用户姓名>",
  "age": <年龄>,
  "is_student": <是否为学生(true/false)>
}
(3) 使用输出解析器(Output Parser)

LangChain 提供了多种解析器将模型输出转换为结构化数据:

  • PydanticOutputParser:将文本解析为 Pydantic 模型对象。
  • ResponseSchemaParser:根据预定义的字段列表解析输出。
  • StructuredOutputParser:组合解析逻辑,支持复杂结构。

示例代码:

python 复制代码
from langchain.output_parsers import PydanticOutputParser

parser = PydanticOutputParser(pydantic_object=Person)
(4) 整合到 LLMChain

将解析器与 LLMChain 结合,确保输出自动转换为结构化格式:

python 复制代码
from langchain import LLMChain, OpenAI

llm = OpenAI(temperature=0)
chain = LLMChain(
    llm=llm,
    prompt=prompt,  # 包含格式要求的提示词
    output_parser=parser  # 指定解析器
)

3. 关键步骤与代码示例

以下是完整的流程示例,演示如何让模型输出符合 Pydantic 模型的结构:

python 复制代码
# 1. 定义 Pydantic 模型
class Person(BaseModel):
    name: str
    age: int
    is_student: bool

# 2. 创建解析器
parser = PydanticOutputParser(pydantic_object=Person)

# 3. 构建提示词(包含格式要求)
from langchain.prompts import PromptTemplate
prompt_template = """基于以下信息,返回用户的信息:
姓名:{name_info}
年龄:{age_info}
是否学生:{student_info}

请以 {format_instructions} 格式返回结果。
"""
prompt = PromptTemplate(
    template=prompt_template,
    input_variables=["name_info", "age_info", "student_info"],
    partial_variables={
        "format_instructions": parser.get_format_instructions()
    }
)

# 4. 创建 LLMChain
from langchain import OpenAI, LLMChain
llm = OpenAI(temperature=0)
chain = LLMChain(llm=llm, prompt=prompt, output_parser=parser)

# 5. 运行并获取结果
result = chain.run(
    name_info="Alice",
    age_info="25",
    student_info="是"
)
print(result)  # 输出为 Person 对象,包含 name, age, is_student

4. 常见问题与注意事项

  • 模型输出不符合格式怎么办?

    • 使用 output_parserparse_with_prompt 方法结合错误提示重新运行。
    • 在提示词中明确强调格式要求,或增加示例。
  • 如何调试输出解析问题?

    • 直接获取原始 LLM 输出,检查格式是否正确。
    • 使用 parser.get_format_instructions() 生成格式说明,确保提示词中包含清晰的指令。
  • 支持的输出格式类型

    • 自定义 Pydantic 模型。
    • 嵌套结构(如列表、字典)。
    • 简单的 JSON 或表格格式。

5. 总结

通过 LangChain 的结构化输出功能,开发者可以:

  1. 定义清晰的数据格式(如 Pydantic 模型)。
  2. 指导模型遵循格式(通过提示词和示例)。
  3. 自动解析输出(使用内置解析器)。
  4. 无缝集成到程序逻辑(直接操作结构化数据)。

这种方法大幅简化了从 LLM 输出到实际应用的转换过程,尤其适用于需要高效处理和存储信息的场景(如数据提取、表单填写、信息汇总等)。


关键术语解释

  • Pydantic:Python 库,用于数据验证和设置类型,常用于定义结构化数据模型。
  • 输出解析器(Output Parser):将模型的自由文本输出转换为结构化数据的工具。
  • LLMChain:LangChain 中的核心组件,将 LLM、提示词和输出解析器串联成完整的流程。

通过以上方法,可以更高效、可靠地利用 LLM 的能力,同时确保输出结果符合程序化处理的需求。

参考文档

How to return structured data from a model

相关推荐
慧一居士9 分钟前
Kafka批量消费部分处理成功时的手动提交方案
分布式·后端·kafka
命中的缘分40 分钟前
SpringCloud原理和机制
后端·spring·spring cloud
ErizJ40 分钟前
Golang|分布式索引架构
开发语言·分布式·后端·架构·golang
.生产的驴41 分钟前
SpringBoot 接口国际化i18n 多语言返回 中英文切换 全球化 语言切换
java·开发语言·spring boot·后端·前端框架
Howard_Stark44 分钟前
Spring的BeanFactory和FactoryBean的区别
java·后端·spring
-曾牛1 小时前
Spring Boot中@RequestParam、@RequestBody、@PathVariable的区别与使用
java·spring boot·后端·intellij-idea·注解·spring boot 注解·混淆用法
极客智谷1 小时前
Spring AI应用系列——基于Alibaba DashScope的聊天记忆功能实现
人工智能·后端
极客智谷1 小时前
Spring AI应用系列——基于Alibaba DashScope实现功能调用的聊天应用
人工智能·后端
RJiazhen1 小时前
5分钟让你的服务接入AI——用 API Auto MCP Server 实现大模型与后端系统的无缝对话
后端·开源·mcp
前端付豪1 小时前
2、ArkTS 是什么?鸿蒙最强开发语言语法全讲解(附实操案例)
前端·后端·harmonyos