四、大模型输出解析和结构化
·
在大模型(LLM)应用开发中,输出解析(Output Parsing)和结构化(Structuring)是将模型生成的“自由文本”转化为程序可处理的“可靠数据”的关键环节。这不仅仅是格式转换,更是可靠性工程。
为什么需要结构化?
大模型本质上是概率性的文本生成器,直接输出往往存在以下问题:
- 格式不稳定:有时带 Markdown ( json ),有时不带;有时多一句“好的,这是结果…”。
- 类型不安全:数字可能变成字符串,列表可能变成文本描述。
- 逻辑幻觉:可能编造字段或遗漏关键信息。
结构化输出的目标
- 确定性:保证输出永远符合预定义的 Schema(如 JSON Schema, Pydantic Model)。
- 类型安全:直接在代码中获得 Typed Object(如 Python Class 实例)。
- 可组合性:结构化数据可以直接作为下一个 LLM 调用或传统函数的输入。
三种结构化输出方式
1、with_structured_output:
最高级封装。自动选择最佳策略(通常是 bind_tools 或原生 JSON Mode),直接返回 Pydantic 对象。(首选推荐)
from pydantic import BaseModel
from connect_llm import qw_llm
class User(BaseModel):
name: str
age: int
# 一行代码,自动处理所有底层细节
structured_llm = qw_llm.with_structured_output(User)
result = structured_llm.invoke("小明今年25岁")
# result 是 User 对象,不是字典,也不是字符串
print(result)

2、bind_tools:
底层原语。将 Pydantic 模型转换为“工具(Function/Tool)”定义绑定到模型上。模型会返回一个“工具调用请求”,你需要手动解析这个请求。(灵活控制)
from pydantic import Field, BaseModel
from connect_llm import qw_llm
class ResponseFormater(BaseModel):
"""
返回结果结构类
"""
answer: str = Field(description="对用户问题的回答")
followup_question: str = Field(description="用户可能提出的后续问题")
runnable = qw_llm.bind_tools([ResponseFormater])
resp = runnable.invoke("细胞的动力源是什么?")
print(resp)
resp.pretty_print()

3、SimpleJsonOutputParser:
后处理解析。模型自由输出文本,解析器尝试用正则/JSON 库去“清洗”和“解析”文本。(兼容旧模型/兜底方案)
from langchain_core.output_parsers import SimpleJsonOutputParser
from langchain_core.prompts import ChatPromptTemplate
from connect_llm import qw_llm
prompt_template = ChatPromptTemplate.from_template(
"{topic}"
'你必须始终输出一个包含"answer"和"followup_question"键的 json 对象,其中"answer"代表:对用户问题的回答,"followup_question"代表:用户可能提出的后续问题'
)
chain = prompt_template | qw_llm | SimpleJsonOutputParser()
resp = chain.invoke({"topic": "细胞的动力源是什么?"})
print(resp)

完整项目源码:
- https://github.com/Tangugo/langchain_project#
- commit id: 22b545c6a
更多推荐
所有评论(0)