LangChain 結(jié)構(gòu)化輸出終于講透了:ProviderStrategy、ToolStrategy、動(dòng)態(tài) Schema 一篇全會(huì)
LangChain 結(jié)構(gòu)化輸出從入門到踩坑摘要結(jié)構(gòu)化輸出讓 Agent 返回可預(yù)測(cè)的 JSON/Pydantic 模型而不是自然語言。本文深入解析 Provider Strategy 和 Tool Strategy 兩種策略附完整代碼和踩坑經(jīng)驗(yàn)。一、為什么會(huì)寫這篇最近在項(xiàng)目里做 Agent 開發(fā)遇到一個(gè)頭疼的問題大模型返回的內(nèi)容格式飄忽不定有時(shí)候是 JSON有時(shí)候是純文本解析起來特別痛苦。后來發(fā)現(xiàn) LangChain 提供了**結(jié)構(gòu)化輸出Structured Output**機(jī)制能讓 Agent 按照我們定義的格式返回?cái)?shù)據(jù)。聽起來簡(jiǎn)單實(shí)際踩了不少坑。門主這篇文章把結(jié)構(gòu)化輸出的兩種策略講清楚順便把踩過的坑分享出來幫你少走彎路。二、什么是結(jié)構(gòu)化輸出結(jié)構(gòu)化輸出允許Agent以特定的、可預(yù)測(cè)的格式返回?cái)?shù)據(jù)。這樣你無需解析自然語言響應(yīng)就能獲得JSON 對(duì)象、Pydantic 模型或數(shù)據(jù)類dataclasses形式的結(jié)構(gòu)化數(shù)據(jù)供應(yīng)用程序直接使用。簡(jiǎn)單說就是你定義好格式模型按格式返回。from pydantic import BaseModel, Fieldfrom langchain.agents import create_agentclass Answer(BaseModel): summary: str confidence: floatagent create_agent(modelopenai:gpt-5.5, response_formatAnswer)result agent.invoke({messages: [{role: user, content: 總結(jié) AI 趨勢(shì)}]})# 直接拿到結(jié)構(gòu)化對(duì)象print(result[structured_response]) # Answer(summary..., confidence...)三、響應(yīng)格式類型LangChain 的create_agent通過response_format參數(shù)控制結(jié)構(gòu)化輸出方式類型說明適用場(chǎng)景ToolStrategy通過工具調(diào)用實(shí)現(xiàn)結(jié)構(gòu)化輸出所有支持工具調(diào)用的模型ProviderStrategy使用提供商原生結(jié)構(gòu)化輸出OpenAI、Anthropic、xAI 等type[Schema]自動(dòng)選擇最佳策略推薦寫法None不請(qǐng)求結(jié)構(gòu)化輸出默認(rèn)自動(dòng)選擇邏輯四、提供商策略Provider Strategy4.1 原理部分模型提供商通過 API 原生支持結(jié)構(gòu)化輸出如 OpenAI、xAI、Gemini、Anthropic。這是最可靠的方式。當(dāng)模型支持原生結(jié)構(gòu)化輸出時(shí)直接傳 Schema 類型即可自動(dòng)啟用from pydantic import BaseModel, Fieldfrom langchain.agents import create_agentclass ContactInfo(BaseModel): 聯(lián)系人信息 name: str Field(description姓名) email: str Field(description郵箱) phone: str Field(description電話)# 自動(dòng)選擇 ProviderStrategyagent create_agent( modelopenai:gpt-5.5, response_formatContactInfo)result agent.invoke({ messages: [{role: user, content: 提取聯(lián)系人張三, zhangsanexample.com, 13800138000}]})print(result[structured_response])# ContactInfo(name張三, emailzhangsanexample.com, phone13800138000)4.2 支持的 Schema 類型Schema 類型返回類型特點(diǎn)Pydantic ModelPydantic 實(shí)例支持字段驗(yàn)證推薦Dataclassdict簡(jiǎn)單輕量TypedDictdict類型提示友好JSON Schemadict靈活但無代碼提示4.3 嚴(yán)格模式ProviderStrategy支持strict參數(shù)啟用嚴(yán)格模式需要langchain1.2from langchain.agents.structured_output import ProviderStrategyagent create_agent( modelopenai:gpt-5.5, response_formatProviderStrategy(schemaContactInfo, strictTrue))門主提醒嚴(yán)格模式要求模型完全遵守 Schema部分國產(chǎn)模型可能不支持建議先測(cè)試再上線。五、工具調(diào)用策略Tool Strategy5.1 原理對(duì)于不支持原生結(jié)構(gòu)化輸出的模型LangChain 通過工具調(diào)用實(shí)現(xiàn)結(jié)構(gòu)化輸出。模型會(huì)假裝調(diào)用一個(gè)工具工具的參數(shù)就是結(jié)構(gòu)化數(shù)據(jù)。這是兼容性最好的方式幾乎所有支持工具調(diào)用的模型都能用。5.2 基本用法from pydantic import BaseModel, Fieldfrom langchain.agents import create_agentfrom langchain.agents.structured_output import ToolStrategyfrom langchain.tools import tool# 定義輸出格式class WeatherStrategy(BaseModel): city: str Field(description城市名稱) weather: str Field(description天氣描述) temperature: str Field(description溫度) activity: str Field(description建議活動(dòng))# 定義工具tool(description查詢城市天氣的工具)def get_weather(city: str): return f今天{city}的天氣晴,溫度為30度,適合戶外活動(dòng)# 創(chuàng)建 Agentagent create_agent( modelchanAI, tools[get_weather], response_formatToolStrategy(WeatherStrategy),)result agent.invoke({ messages: [{role: user, content: 長(zhǎng)沙今天是什么天氣}]})print(result[structured_response])# WeatherStrategy(city長(zhǎng)沙, weather晴, temperature30度, activity適合戶外活動(dòng))5.3 執(zhí)行流程六、自定義工具消息內(nèi)容tool_message_content參數(shù)允許自定義生成結(jié)構(gòu)化輸出時(shí)對(duì)話歷史中顯示的消息from langchain.agents.structured_output import ToolStrategyagent create_agent( modelchanAI, tools[get_weather], response_formatToolStrategy( schemaWeatherStrategy, tool_message_content天氣查詢已完成 ),)對(duì)比效果設(shè)置ToolMessage 內(nèi)容不設(shè)置Returning structured response: {city: 長(zhǎng)沙, ...}設(shè)置后天氣查詢已完成門主建議生產(chǎn)環(huán)境建議自定義方便日志排查和調(diào)試。七、錯(cuò)誤處理模型在通過工具調(diào)用生成結(jié)構(gòu)化輸出時(shí)可能會(huì)出錯(cuò)。LangChain 提供了智能的重試機(jī)制。7.1 handle_errors 參數(shù)值行為True捕獲所有錯(cuò)誤使用默認(rèn)錯(cuò)誤模板默認(rèn)值str捕獲所有錯(cuò)誤使用自定義消息type[Exception]只捕獲指定異常類型Callable[[Exception], str]自定義錯(cuò)誤處理函數(shù)False不重試直接拋出異常7.2 完整示例from typing import Literalfrom pydantic import BaseModel, Field, field_validatorfrom langchain.agents import create_agentfrom langchain.agents.structured_output import ToolStrategyfrom langchain.tools import toolclass WeatherStrategy(BaseModel): city: str Field(description城市名稱) weather: str Field(description天氣) temperature: str Field(description溫度) activity: str Field(description建議活動(dòng)) field_validator(city) classmethod def check_city(cls, value): # 模擬 Schema 校驗(yàn)失敗 raise ValueError(故意觸發(fā) Schema 校驗(yàn)失敗)tool(description查詢天氣)def get_weather(city: str): return f城市{city}\n天氣晴\n溫度30℃\n建議適合出去玩agent create_agent( modelchanAI, tools[get_weather], response_formatToolStrategy( schemaWeatherStrategy, tool_message_content天氣查詢完成, handle_errorsTrue # 開啟錯(cuò)誤重試 ),)result agent.invoke({ messages: [{role: user, content: 長(zhǎng)沙今天什么天氣}]})7.3 常見錯(cuò)誤類型錯(cuò)誤類型原因解決方案Schema 校驗(yàn)失敗模型返回?cái)?shù)據(jù)不符合 Schema檢查 Schema 定義開啟重試多次調(diào)用結(jié)構(gòu)化輸出工具模型一次返回多個(gè)結(jié)構(gòu)化數(shù)據(jù)LangChain 自動(dòng)處理工具調(diào)用格式錯(cuò)誤模型生成的 JSON 格式不正確使用更強(qiáng)大的模型八、多格式動(dòng)態(tài)選擇不同問答不同 Schema實(shí)際項(xiàng)目中經(jīng)常會(huì)遇到這種情況用戶問天氣 → 返回天氣格式用戶問聯(lián)系人 → 返回聯(lián)系人格式用戶問產(chǎn)品信息 → 返回產(chǎn)品格式總不能寫死一個(gè) Schema 吧LangChain 提供了幾種方式解決這個(gè)問題。8.1 Union Types多 Schema 自動(dòng)匹配ToolStrategy支持傳入U(xiǎn)nion類型模型會(huì)根據(jù)上下文自動(dòng)選擇最合適的 Schemafrom pydantic import BaseModel, Fieldfrom typing import Literal, Unionfrom langchain.agents import create_agentfrom langchain.agents.structured_output import ToolStrategyclass ProductReview(BaseModel): 產(chǎn)品評(píng)價(jià)分析 rating: int | None Field(description產(chǎn)品評(píng)分 1-5, ge1, le5) sentiment: Literal[positive, negative] Field(description情感傾向) key_points: list[str] Field(description關(guān)鍵要點(diǎn))class CustomerComplaint(BaseModel): 客戶投訴 issue_type: Literal[product, service, shipping, billing] Field(description問題類型) severity: Literal[low, medium, high] Field(description嚴(yán)重程度) description: str Field(description問題描述)class WeatherInfo(BaseModel): 天氣信息 city: str Field(description城市) weather: str Field(description天氣狀況) temperature: str Field(description溫度)# 多個(gè) Schema 聯(lián)合模型自動(dòng)選擇agent create_agent( modelchanAI, toolstools, response_formatToolStrategy(Union[ProductReview, CustomerComplaint, WeatherInfo]))# 模型會(huì)根據(jù)用戶問題自動(dòng)匹配合適的 Schemaresult1 agent.invoke({messages: [{role: user, content: 分析這個(gè)評(píng)價(jià)質(zhì)量很好5星推薦}]})# → ProductReview(rating5, sentimentpositive, key_points[質(zhì)量很好])result2 agent.invoke({messages: [{role: user, content: 長(zhǎng)沙今天天氣怎么樣}]})# → WeatherInfo(city長(zhǎng)沙, weather晴, temperature25°C)執(zhí)行流程8.2 運(yùn)行時(shí)動(dòng)態(tài)切換 Schema如果需要更靈活的控制可以在不同場(chǎng)景下創(chuàng)建不同的 Agent 實(shí)例from langchain.agents import create_agentfrom langchain.agents.structured_output import ToolStrategy# 定義多個(gè) Schemaclass WeatherSchema(BaseModel): city: str Field(description城市) temperature: str Field(description溫度) weather: str Field(description天氣)class ContactSchema(BaseModel): name: str Field(description姓名) phone: str Field(description電話) email: str Field(description郵箱)class OrderSchema(BaseModel): order_id: str Field(description訂單號(hào)) status: str Field(description訂單狀態(tài)) amount: float Field(description金額)# 工廠函數(shù)根據(jù)場(chǎng)景創(chuàng)建不同 Agentdef create_agent_by_scene(scene: str): scene_config { weather: { schema: WeatherSchema, system_prompt: 你是天氣查詢助手, tool_message_content: 天氣查詢完成 }, contact: { schema: ContactSchema, system_prompt: 你是聯(lián)系人管理助手, tool_message_content: 聯(lián)系人信息提取完成 }, order: { schema: OrderSchema, system_prompt: 你是訂單查詢助手, tool_message_content: 訂單查詢完成 } } config scene_config.get(scene, scene_config[weather]) return create_agent( modelchanAI, response_formatToolStrategy( schemaconfig[schema], tool_message_contentconfig[tool_message_content] ), system_promptconfig[system_prompt] )# 使用示例weather_agent create_agent_by_scene(weather)contact_agent create_agent_by_scene(contact)8.3 根據(jù)用戶意圖動(dòng)態(tài)路由更智能的做法是先識(shí)別用戶意圖再路由到對(duì)應(yīng)的 Agentfrom pydantic import BaseModel, Fieldfrom typing import Literalclass IntentSchema(BaseModel): 用戶意圖識(shí)別 intent: Literal[weather, contact, order, other] Field(description用戶意圖) extracted_info: str Field(description提取的關(guān)鍵信息)def smart_route(user_input: str): # 先用輕量模型識(shí)別意圖 intent_agent create_agent( modelchanAI, response_formatIntentSchema ) intent_result intent_agent.invoke( {messages: [{role: user, content: user_input}]} ) intent intent_result[structured_response].intent # 根據(jù)意圖路由到對(duì)應(yīng) Agent agent create_agent_by_scene(intent) return agent.invoke( {messages: [{role: user, content: user_input}]} )# 使用result smart_route(幫我查一下北京的天氣)8.4 對(duì)比總結(jié)方式優(yōu)點(diǎn)缺點(diǎn)適用場(chǎng)景Union Types簡(jiǎn)單一行代碼模型可能選錯(cuò) SchemaSchema 數(shù)量少差異明顯工廠模式清晰可控需要預(yù)設(shè)場(chǎng)景場(chǎng)景固定數(shù)量有限意圖路由最靈活可擴(kuò)展多一次模型調(diào)用復(fù)雜場(chǎng)景Schema 數(shù)量多門主建議如果 Schema 不超過 5 個(gè)直接用 Union 就行。場(chǎng)景很多的話上意圖路由更穩(wěn)。九、兩種策略對(duì)比維度Provider StrategyTool Strategy可靠性?????????兼容性僅支持原生輸出的模型所有支持工具調(diào)用的模型性能更快一次調(diào)用可能需要多次調(diào)用Schema 復(fù)雜度支持復(fù)雜 Schema同樣支持錯(cuò)誤處理提供商處理LangChain 自動(dòng)重試推薦場(chǎng)景OpenAI/Anthropic 等國產(chǎn)模型/開源模型十、實(shí)戰(zhàn)代碼完整示例10.1 基礎(chǔ)示例古詩生成from langchain_openai import ChatOpenAIfrom langchain.agents import create_agentfrom pydantic import BaseModel, Fieldfrom langchain.agents.structured_output import ToolStrategyimport dotenvdotenv.load_dotenv()chanAI ChatOpenAI( modelqwen3.7-plus, temperature0.7, extra_body{enable_thinking: False})class PoemStrategy(BaseModel): name: str Field(description古詩名稱) content: str Field(description古詩內(nèi)容)agentChat create_agent( modelchanAI, response_formatPoemStrategy,)result agentChat.invoke({ messages: [ {role: system, content: 你是一個(gè)古詩創(chuàng)作助手}, {role: user, content: 今天長(zhǎng)沙的天氣如何} ]})print(result[structured_response])# PoemStrategy(name長(zhǎng)沙今日即景, content湘水悠悠繞古城...)10.2 進(jìn)階示例帶工具的天氣查詢from langchain.tools import toolfrom langchain.agents.structured_output import ToolStrategyclass WeatherStrategy(BaseModel): city: str Field(description城市名稱) weather: str Field(description天氣描述) temperature: str Field(description溫度) activity: str Field(description建議活動(dòng))tool(description查詢城市天氣的工具)def get_weather(city: str): return f今天{city}的天氣晴,溫度為30度,適合戶外活動(dòng)agentChat create_agent( modelchanAI, tools[get_weather], response_formatToolStrategy( schemaWeatherStrategy, tool_message_content天氣查詢已完成, handle_errorsTrue ),)result agentChat.invoke({ messages: [{role: user, content: 長(zhǎng)沙今天是什么天氣}]})print(result[structured_response])# WeatherStrategy(city長(zhǎng)沙, weather晴, temperature30度, activity適合戶外活動(dòng))學(xué)AI大模型的正確順序千萬不要搞錯(cuò)了2026年AI風(fēng)口已來各行各業(yè)的AI滲透肉眼可見超多公司要么轉(zhuǎn)型做AI相關(guān)產(chǎn)品要么高薪挖AI技術(shù)人才機(jī)遇直接擺在眼前有往AI方向發(fā)展或者本身有后端編程基礎(chǔ)的朋友直接沖AI大模型應(yīng)用開發(fā)轉(zhuǎn)崗超合適就算暫時(shí)不打算轉(zhuǎn)崗了解大模型、RAG、Prompt、Agent這些熱門概念能上手做簡(jiǎn)單項(xiàng)目也絕對(duì)是求職加分王給大家整理了超全最新的AI大模型應(yīng)用開發(fā)學(xué)習(xí)清單和資料手把手幫你快速入門學(xué)習(xí)路線:?大模型基礎(chǔ)認(rèn)知—大模型核心原理、發(fā)展歷程、主流模型GPT、文心一言等特點(diǎn)解析?核心技術(shù)模塊—RAG檢索增強(qiáng)生成、Prompt工程實(shí)戰(zhàn)、Agent智能體開發(fā)邏輯?開發(fā)基礎(chǔ)能力—Python進(jìn)階、API接口調(diào)用、大模型開發(fā)框架LangChain等實(shí)操?應(yīng)用場(chǎng)景開發(fā)—智能問答系統(tǒng)、企業(yè)知識(shí)庫、AIGC內(nèi)容生成工具、行業(yè)定制化大模型應(yīng)用?項(xiàng)目落地流程—需求拆解、技術(shù)選型、模型調(diào)優(yōu)、測(cè)試上線、運(yùn)維迭代?面試求職沖刺—崗位JD解析、簡(jiǎn)歷AI項(xiàng)目包裝、高頻面試題匯總、模擬面經(jīng)以上6大模塊看似清晰好上手實(shí)則每個(gè)部分都有扎實(shí)的核心內(nèi)容需要吃透我把大模型的學(xué)習(xí)全流程已經(jīng)整理好了抓住AI時(shí)代風(fēng)口輕松解鎖職業(yè)新可能希望大家都能把握機(jī)遇實(shí)現(xiàn)薪資/職業(yè)躍遷這份完整版的大模型 AI 學(xué)習(xí)資料已經(jīng)上傳CSDN朋友們?nèi)绻枰梢晕⑿艗呙柘路紺SDN官方認(rèn)證二維碼免費(fèi)領(lǐng)取【保證100%免費(fèi)】

相關(guān)新聞

Adobe-GenP 3.0:5分鐘掌握Adobe全家桶激活技術(shù)

Adobe-GenP 3.0:5分鐘掌握Adobe全家桶激活技術(shù)

Adobe-GenP 3.0:5分鐘掌握Adobe全家桶激活技術(shù) 【免費(fèi)下載鏈接】Adobe-GenP Adobe CC 2019/2020/2021/2022/2023 GenP Universal Patch 3.0 項(xiàng)目地址: https://gitcode.com/gh_mirrors/ad/Adobe-GenP Adobe Creative Cloud訂閱費(fèi)用讓許多創(chuàng)意工作者望而卻步&…

2026/8/1 22:42:03 閱讀更多
用AI降A(chǔ)I的成本:一場(chǎng)從價(jià)格表開始的技術(shù)革命

用AI降A(chǔ)I的成本:一場(chǎng)從價(jià)格表開始的技術(shù)革命

7月31日午后,一家創(chuàng)業(yè)公司的技術(shù)負(fù)責(zé)人盯著后臺(tái)的賬單,差點(diǎn)以為自己看錯(cuò)了數(shù)字。他一直在用的一個(gè)模型,輸入價(jià)格從每百萬Token 1美元直接掉到0.2美元,輸出價(jià)格從6美元跌到1.2美元——足足降了八成。換算成人民幣,輸入從…

2026/7/31 22:08:30 閱讀更多
做企業(yè)數(shù)據(jù)庫安全審計(jì)的公司有哪家?看看安得和眾的這款產(chǎn)品吧

做企業(yè)數(shù)據(jù)庫安全審計(jì)的公司有哪家?看看安得和眾的這款產(chǎn)品吧

數(shù)據(jù)庫,承載著企業(yè)最核心的數(shù)字資產(chǎn)——客戶信息、交易記錄、財(cái)務(wù)數(shù)據(jù)、研發(fā)代碼……國際權(quán)威調(diào)查顯示,94%的失竊數(shù)據(jù)涉及數(shù)據(jù)庫服務(wù)器。2024年,國內(nèi)某頭部快遞企業(yè)爆發(fā)重大數(shù)據(jù)泄露事件:IT運(yùn)維人員利用數(shù)據(jù)庫管理權(quán)限漏洞&#x…

2026/8/1 22:33:26 閱讀更多
AI實(shí)驗(yàn)室的“鵜鶘最大化”:當(dāng)大模型都在瘋狂囤積“魚”

AI實(shí)驗(yàn)室的“鵜鶘最大化”:當(dāng)大模型都在瘋狂囤積“魚”

👋 大家好,我是 帶娃的IT創(chuàng)業(yè)者,專注 AI 大模型應(yīng)用落地、Python 實(shí)戰(zhàn)進(jìn)階與 AI 開發(fā)工具鏈)。代表專欄:《AI大模型應(yīng)知應(yīng)會(huì)短平快系列100篇》《解密OpenClaw》《解碼意識(shí)NCTransformer》《WeClaw Agent實(shí)戰(zhàn)》> &am…

2026/8/1 22:33:26 閱讀更多
AMAT 0100-02186 I/O 分配 PCB

AMAT 0100-02186 I/O 分配 PCB

AMAT 0100-02186 I/O分配PCB板是應(yīng)用材料(Applied Materials)公司生產(chǎn)的一款用于半導(dǎo)體設(shè)備的I/O信號(hào)分配電路板。該型號(hào)(0100-02186)的核心特點(diǎn)如下:專用于Endura等半導(dǎo)體工藝腔室。集成信號(hào)路由與分配功能。連接控制…

2026/8/1 0:09:33 閱讀更多
Nissei Corp FFMN-32L-10-T0 40AX 三相異步電動(dòng)機(jī)

Nissei Corp FFMN-32L-10-T0 40AX 三相異步電動(dòng)機(jī)

Nissei Corp FFMN-32L-10-T0 40AX 三相異步電動(dòng)機(jī)是日本日清(Nissei)品牌的一款工業(yè)用三相異步電機(jī),適用于自動(dòng)化設(shè)備及通用機(jī)械驅(qū)動(dòng)。該型號(hào)(FFMN-32L-10-T0 40AX)的核心特點(diǎn)如下:三相交流異步電動(dòng)機(jī)。額定…

2026/8/1 0:09:33 閱讀更多
AMAT 0100-02186 I/O 分配 PCB

AMAT 0100-02186 I/O 分配 PCB

AMAT 0100-02186 I/O分配PCB板是應(yīng)用材料(Applied Materials)公司生產(chǎn)的一款用于半導(dǎo)體設(shè)備的I/O信號(hào)分配電路板。該型號(hào)(0100-02186)的核心特點(diǎn)如下:專用于Endura等半導(dǎo)體工藝腔室。集成信號(hào)路由與分配功能。連接控制…

2026/8/1 0:09:33 閱讀更多
Nissei Corp FFMN-32L-10-T0 40AX 三相異步電動(dòng)機(jī)

Nissei Corp FFMN-32L-10-T0 40AX 三相異步電動(dòng)機(jī)

Nissei Corp FFMN-32L-10-T0 40AX 三相異步電動(dòng)機(jī)是日本日清(Nissei)品牌的一款工業(yè)用三相異步電機(jī),適用于自動(dòng)化設(shè)備及通用機(jī)械驅(qū)動(dòng)。該型號(hào)(FFMN-32L-10-T0 40AX)的核心特點(diǎn)如下:三相交流異步電動(dòng)機(jī)。額定…

2026/8/1 0:09:33 閱讀更多