LangChain的结构化输出功能
LangChain提供了多种方式生成结构化输出(如JSON、XML等),便于后续程序化处理。核心是通过输出解析器(Output Parsers)将LLM的文本响应转换为结构化格式。
Pydantic输出解析器
通过结合Pydantic模型定义数据结构,确保输出符合预定格式:
from langchain.output_parsers import PydanticOutputParser
from pydantic import BaseModel, Field
class Person(BaseModel):
name: str = Field(description="姓名")
age: int = Field(description="年龄")
parser = PydanticOutputParser(pydantic_object=Person)
结构化提示模板
在提示模板中明确指定输出格式要求:
from langchain.prompts import PromptTemplate
prompt = PromptTemplate(
template="提取以下信息:{input_string}\n{format_instructions}",
input_variables=["input_string"],
partial_variables={"format_instructions": parser.get_format_instructions()}
)
结合LLM调用
完整示例展示如何生成结构化输出:
from langchain.llms import OpenAI
model = OpenAI(temperature=0)
input_text = "John今年30岁"
response = model(prompt.format(input_string=input_text))
result = parser.parse(response) # 返回Person对象
内置解析器类型
LangChain提供多种现成的解析器:
CommaSeparatedListOutputParser:生成逗号分隔列表StructuredOutputParser:通过描述字段生成结构化输出XMLOutputParser:生成XML格式输出JSONOutputParser:直接生成JSON格式
自定义解析逻辑
当需要特殊处理时,可继承BaseOutputParser:
from langchain.schema import BaseOutputParser
class CustomParser(BaseOutputParser):
def parse(self, text: str):
return text.upper()
parser = CustomParser()
错误处理机制
解析失败时可通过OutputFixingParser自动修复:
from langchain.output_parsers import OutputFixingParser
from langchain.llms import OpenAI
fix_parser = OutputFixingParser.from_llm(
parser=parser,
llm=OpenAI()
)
多模式输出处理
对于需要同时返回文本和结构化数据的场景,可使用ResponseSchema:
from langchain.output_parsers import ResponseSchema
response_schemas = [
ResponseSchema(name="answer", description="回答内容"),
ResponseSchema(name="source", description="数据来源")
]
流式输出处理
当LLM采用流式响应时,使用BaseTransformOutputParser逐步处理:
class TransformParser(BaseTransformOutputParser):
def parse_result(self, result):
return json.loads(result)
最佳实践建议
- 在提示词中明确说明需要的格式
- 为Pydantic模型添加详尽的字段描述
- 对关键字段设置校验规则
- 为复杂结构实现递归解析
- 在生产环境中添加fallback处理逻辑
with_structured_output(schema) 方法
with_structured_output(schema) 是 LangChain 中的一个方法,用于将模型的输出结构化为指定的格式。该方法允许用户定义一个模式(schema),模型将根据该模式生成结构化输出,而不是自由文本。这在需要特定格式的输出(如 JSON)时非常有用。
主要功能
- 结构化输出:强制模型的输出符合预定义的格式,如 JSON、字典等。
- 简化后续处理:结构化输出可以直接用于后续的代码处理,无需额外解析。
- 支持复杂模式:可以定义嵌套的、多层次的输出结构。
基本用法
from langchain_core.pydantic_v1 import BaseModel
from langchain_openai import ChatOpenAI
# 定义输出模式
class Person(BaseModel):
name: str
age: int
# 初始化模型并绑定结构化输出
model = ChatOpenAI()
structured_model = model.with_structured_output(Person)
# 调用模型
response = structured_model.invoke("提取以下文本中的姓名和年龄:小明今年25岁。")
print(response)
# 输出示例:Person(name='小明', age=25)
支持的参数
- schema:定义输出结构的模式。可以是 Pydantic 模型、字典或其他支持的格式。
- method:可选参数,指定如何生成结构化输出(如 "function_calling" 或 "json_mode")。
高级用法
使用字典模式
如果不使用 Pydantic 模型,可以直接传递一个字典作为模式:
schema = {
"type": "object",
"properties": {
"name": {"type": "string"},
"age": {"type": "integer"}
}
}
structured_model = model.with_structured_output(schema)
多轮对话支持
结构化输出可以与对话链结合使用,确保多轮对话的输出格式一致:
from langchain_core.prompts import ChatPromptTemplate
prompt = ChatPromptTemplate.from_template("提取信息:{input}")
chain = prompt | structured_model
response = chain.invoke({"input": "小李今年30岁。"})
注意事项
- 并非所有模型都支持结构化输出,需确保使用的模型(如 OpenAI)支持此功能。
- 复杂的模式可能会导致模型输出不符合预期,建议从简单结构开始测试。
- 结构化输出通常依赖于模型的功能(如函数调用或 JSON 模式),可能消耗更多 Token。
输出解析器和.with_structured_output(schema)的区别
在LangChain框架中,with_structured_output(schema)和输出解析器(Output Parsers)都用于将模型的自由文本输出转换为结构化格式,但它们的实现方式和适用场景有所不同。以下是两者的区别:
核心差异
with_structured_output(schema)
- 直接要求模型生成符合指定模式(如JSON Schema或Pydantic模型)的结构化输出,模型会在生成时遵循格式约束。
- 依赖模型本身的推理能力(如GPT-4对JSON结构的理解),无需后处理。
- 适用于支持结构化输出的较新模型(如OpenAI的GPT-4-turbo)。
输出解析器(Output Parsers)
- 先让模型生成自由文本,再通过代码逻辑(如正则匹配、模板提取)将文本解析为结构化数据。
- 需额外编写解析规则(如
PydanticOutputParser定义字段和校验逻辑)。 - 兼容性更广,适用于任何文本生成模型。
使用示例
通过with_structured_output
from langchain_core.pydantic_v1 import BaseModel
class Answer(BaseModel):
value: str
chain = llm.with_structured_output(Answer)
result = chain.invoke("问题内容") # 直接返回Answer实例
通过输出解析器
from langchain.output_parsers import PydanticOutputParser
parser = PydanticOutputParser(pydantic_object=Answer)
prompt = ChatPromptTemplate.from_template("回答并格式化为{format_instructions}")
chain = prompt | llm | parser
result = chain.invoke({"question": "问题内容"}) # 需解析文本输出
选择建议
- 若模型原生支持结构化输出(如GPT-4-turbo),优先使用
with_structured_output,更简洁可靠。 - 若需兼容旧模型或自定义解析逻辑(如处理非标准响应),使用输出解析器更灵活。
1796

被折叠的 条评论
为什么被折叠?



