langchain核心组件 Model I/O(3)-OutputParser

2.5.1 输出解析器介绍

在应用开发中,大模型的输出可能是下一步逻辑处理的关键输入。因此,在这种情况下,规范化输出是必须要做的任务,以确保应用能够顺利进行后续的逻辑处理。

语言模型返回的内容通常都是文本字符串,而实际AI应用开发过程中有时希望模型可以返回更直观、更格式化的内容,LangChain提供了输出解析器(Output Parser)将模型输出解析为结构化数据。

有多种类型的输出解析器,常用的有 StrOutputParser(字符串解析器)与 JsonOutputParser(JSON 解析器)。

2.5.2 StrOutputParser

StrOutputParser 是一个简单的解析器,从结果中提取 content 字段。

举例:将模型输出结果解析为字符串

ini 复制代码
import os   
from langchain.chat_models import init_Chat_model   
from langchain_core.output_parser import StrOutputParser   
llm = init_chatting_model( 
    model="openai/gpt-oss-20b:free", 
    modelprovider="openai",
    base_url="https://openrouter.ai/api/v1", 
    api_key = os.getenv("OPENROUTER_API_KEY"),   
)  
messages=[ {"role": "system", "content": "你是一个机器人"}, {"role": "user", "content": "你好"}]   
resp = llm.invoke(messages)
print(resp)# content'你好!有什么我可以帮忙的吗?'  
str_resp = StrOutputParser().invoke(resp)   
print(str_resp)# 你好!有什么我可以帮忙的吗?

2.5.3 JsonOutputParser

JSON解析器用于将大模型的自由文本输出转换为结构化JSON数据的工具。特别适用于需要严格结构化输出的场景,比如API调用、数据存储或下游任务处理。

JsonOutputParser 能够结合 Pydantic 模型进行数据验证,自动验证字段类型和内容(如字符串、数字、嵌套对象等)

使用get_formatInstructions()获取JSON解析的格式化指令:

ini 复制代码
from pydantic import BaseModel, Field   
from langchain_core.output_parser import JsonOutputParser   
class Prime(BaseModel): 
    prime: list[int]=Field(description="素数") 
    count: list[int] = Field(description = "小于该素数的素数个数")   
json_parser = JsonOutputParser(pydantic_object=Prime) 
print (json_parser.get_format Instructions()) 
# The output should be formatted as a JSON instance that conforms to the JSON schema below.

举例:

ini 复制代码
import os  
from pydantic import BaseModel, Field  
from langchain.chat_models import init_chatting_model
from langchain_core.output_parser import JsonOutputParser   
llm = init_chatting_model(
    model = "openai/gpt-oss-20b:free",
    modelprovider = "openai", 
    base_url = "https://openrouter.ai/api/v1", 
    api_key =os.getenv("OPENROUTER_API_KEY"),   
class Prime(BaseModel): 
    prime: list[int]=Field(description="素数") 
    count: list[int]=Field(description="小于该素数的素数个数")   
json_parser = JsonOutputParser(pydantic_object=Prime) messages={"role": "system", "content": json_parser.get_formatInstructions}}, { "role": "user", "content": "任意生成5个1000-100000之间素数,并标出小于该素数的 素数个数", },   
]   
resp = llm.invoke(messages) 
jsonResp=json_parser.invoke (resp) 
print(jsonResp) 
#{'prime':[1009,2003,3001,4001,5003], 'count':[168,303, 430,584,669]}

2.6 Structured Outputs

可以要求模型按照给定的模式格式提供其响应,这有助于确保输出可以被轻松解析并在后续处理中使用。LangChain支持多种模式类型和强制结构化输出的方法。

2.6.1TypedDict

TypedDict 提供了一个使用 Python 内置类型的简单方案,但是没有验证功能。

kotlin 复制代码
import os  
from typing import Dict, Annotated  
from langchain.chat_models import init chatting_model

llm = init chatting_model(
    model="openai/gpt-oss-20b:free",
    modelprovider="openai",
    base_url="https://openrouter.ai/api/v1",
    api_key=os.getenv("OPENROUTER_API_KEY"),
) 
class Animal(TypedDict):
    animal: Annotated[str, "动物"]
    emoji: Annotated[str, "表情"]
class AnimalList(TypedDict):
    animals: Annotated[list[Animal], "动物与表情列表"]
messages = ["role": "user", "content": "任意生成三种动物,以及他们的emoji表情"]
llm_with_structured_output = llm.with_structured_output(AnimalList)
resp = llm_with_structured_output.invoke(messages)
print(resp)
#{'animals': ['animal': '猫', 'emoji': '鸟'}, {'animal': '老虎', 'emoji': '□'}, {'animal': '企鹅', 'emoji': '□'}]}

2.6.2 Pydantic

Pydantic 模型提供了丰富的功能集,包括字段验证、描述和嵌套结构。

ini 复制代码
import os   
from pydantic import BaseModel,Field   
from langchain.chat_models import init_chat_model   
llm = init_chatting_model( 
    model = "openai/gpt-oss-20b:free", 
    modelprovider = "openai", 
    base_url = "https://openrouter.ai/api/v1", 
    api_key = os.getenv("OPENROUTER_API_KEY"),   
class Animal(BaseModel):
    animal: str=Field(description="动物")  
    emoji: str=Field(description="表情")  
class AnimalList(BaseModel):  
    animals: list[Animal] = Field(description="动物与表情列表")  
    messages = ["role": "user", "content": "任意生成三种动物,以及他们的emoji表情"]  
llm_with_structured_output = llm.with_structured_output(AnimalList)  
resp = llm_with_structured_output.invoke(messages)  
print(resp)  

2.6.3 JSON Schema

若需最大程度的控制或互操作性,可以提供一个原始的JSON Schema。详情可参考platform.openai.com/docs/guides...

可以将原始响应与解析后的表示一起返回,可在调用 with_structured_output 时设置 include_raw=True 来实现。

python 复制代码
import os   
from langchain.chat_models import init_chat_model   
llm=init_chatting_model( 
    model="openai/gpt-oss-20b:free", 
    modelprovider="openai", 
    base_url= "https://openrouter.ai/api/v1", 
    api_key=os.getenv("OPENROUTER_API_KEY")   
)   
schema = {
    "name": "animal_list",
    "schema": {
        "type": "array",
        "items": {
            "type": "object",
            "properties": {
                "animal": {"type": "string", "description": "动物名称"},
                "emoji": {"type": "string", "description": "动物的emoji表情"},
            },
            "required": ["animal", "emoji"],
        },
    },
}  
messages = ["role": "user", "content": "任意生成三种动物,以及他们的emoji表情"]}  
llm_with_structured_output = llm.with_structured_output(schema, method="json_schema", include_raw=True)  
resp = llm_with_structured_output.invoke(messages)  
print(resp)  
print(resp["raw")]  
print(resp[" parsed")]  
相关推荐
工藤学编程3 小时前
零基础学AI大模型之个人助理智能体之tool_calling_agent实战
人工智能·langchain
喜欢吃豆4 小时前
LangChain 架构深度解析:从中间件机制到人机协同 SQL 智能体实战报告
人工智能·中间件·架构·langchain·大模型
学Linux的语莫4 小时前
初始化大模型的不同方式
langchain
学Linux的语莫6 小时前
本地部署ollama
linux·服务器·langchain
闻道且行之7 小时前
NLP 部署实操:Langchain-Chatchat 配置文件深度修改与精细化调试
java·自然语言处理·langchain
nvd1121 小时前
深入剖析 LangChain 消息系统:BaseMessageChunk 与 AIMessageChunk 的设计哲学
langchain
Generalzy1 天前
langchain deepagent框架
人工智能·python·langchain
LangChain布道师1 天前
深入理解LangChain智能体(Agents)的核心架构
langchain
FreeCode1 天前
Agentic AI系统开发:智能体工程(Agent Engineering)的概念与方法
langchain·agent·ai编程