LangChain 結構化輸出指南

LangChain 結構化輸出指南

概述

對于許多應用程序(如聊天機器人),模型需要直接用自然語言回應用戶。然而,在某些場景下,我們需要模型以結構化格式輸出。例如,我們可能希望將模型輸出存儲在數據庫中,并確保輸出符合數據庫模式。這種需求促成了結構化輸出的概念,即可以指示模型以特定的輸出結構進行響應。

核心概念

(1) 模式定義: 輸出結構表示為模式,可以通過多種方式定義。

(2) 返回結構化輸出: 模型被給予此模式,并被指示返回符合該模式的輸出。

推薦用法

以下偽代碼說明了使用結構化輸出時的推薦工作流程。LangChain 提供了一個方法 with_structured_output(),它自動化了將模式綁定到模型和解析輸出的過程。此輔助函數適用于所有支持結構化輸出的模型提供商。

# 定義模式
schema = {"foo": "bar"}
# 將模式綁定到模型
model_with_structure = model.with_structured_output(schema)
# 調用模型以產生符合模式的結構化輸出
structured_output = model_with_structure.invoke(user_input)

模式定義

核心概念是模型響應的輸出結構需要以某種方式表示。雖然您可以使用的對象類型取決于您使用的模型,但在Python中通常允許或推薦用于結構化輸出的常見對象類型。

1. JSON格式(字典/列表)

結構化輸出最簡單和最常見的格式是類似JSON的結構,在Python中可以表示為字典(dict)或列表(list)。當工具需要原始、靈活和最小開銷的結構化數據時,通常直接使用JSON對象(或Python中的字典)。

{"answer": "用戶問題的答案","followup_question": "用戶可以詢問的后續問題"
}

2. Pydantic模式

Pydantic特別適用于定義結構化輸出模式,因為它提供類型提示和驗證。以下是Pydantic模式的示例:

from pydantic import BaseModel, Fieldclass ResponseFormatter(BaseModel):"""始終使用此工具來構建對用戶的響應。"""answer: str = Field(description="用戶問題的答案")followup_question: str = Field(description="用戶可以詢問的后續問題")

返回結構化輸出

定義了模式后,我們需要一種方法來指示模型使用它。雖然一種方法是在提示中包含此模式并友好地要求模型使用它,但這不是推薦的做法。有幾種更強大的方法可以利用模型提供商API中的原生功能。

使用工具調用

許多模型提供商支持工具調用,這個概念在我們的工具調用指南中有更詳細的討論。簡而言之,工具調用涉及將工具綁定到模型,在適當的時候,模型可以決定調用此工具并確保其響應符合工具的模式。考慮到這一點,核心概念很簡單:只需將我們的模式作為工具綁定到模型!

以下是使用上面定義的 ResponseFormatter 模式的示例:

from langchain_openai import ChatOpenAImodel = ChatOpenAI(model="gpt-4o", temperature=0)
# 將ResponseFormatter模式作為工具綁定到模型
model_with_tools = model.bind_tools([ResponseFormatter])
# 調用模型
ai_msg = model_with_tools.invoke("細胞的動力工廠是什么?")

工具調用的參數已經被提取為字典。此字典可以選擇性地解析為Pydantic對象,匹配我們原始的 ResponseFormatter 模式。

# 獲取工具調用參數
ai_msg.tool_calls[0]["args"]
{'answer': "細胞的動力工廠是線粒體。線粒體是產生細胞大部分三磷酸腺苷(ATP)供應的細胞器,ATP用作化學能源。",'followup_question': 'ATP在細胞中的功能是什么?'
}# 將字典解析為pydantic對象
pydantic_object = ResponseFormatter.model_validate(ai_msg.tool_calls[0]["args"])

JSON模式

除了工具調用,一些模型提供商還支持稱為 JSON模式 的功能。這支持JSON模式定義作為輸入,并強制模型產生符合要求的JSON輸出。您可以在這里找到支持JSON模式的模型提供商表格。

以下是如何在OpenAI中使用JSON模式的示例:

from langchain_openai import ChatOpenAImodel = ChatOpenAI(model="gpt-4o").with_structured_output(method="json_mode")
ai_msg = model.invoke("返回一個JSON對象,鍵為'random_ints',值為[0-99]范圍內的10個隨機整數")
ai_msg
# 輸出: {'random_ints': [45, 67, 12, 34, 89, 23, 78, 56, 90, 11]}

結構化輸出方法

使用上述方法產生結構化輸出時存在一些挑戰:

  1. 解析挑戰: 當使用工具調用時,工具調用參數需要從字典解析回原始模式。

  2. 強制使用工具: 此外,當我們想要強制結構化輸出時,需要指示模型始終使用工具,這是一個特定于提供商的設置。

  3. JSON解析: 當使用JSON模式時,輸出需要解析為JSON對象。

考慮到這些挑戰,LangChain提供了一個輔助函數(with_structured_output())來簡化流程。

在這里插入圖片描述

這既將模式綁定到模型作為工具,又將輸出解析為指定的輸出模式。

# 將模式綁定到模型
model_with_structure = model.with_structured_output(ResponseFormatter)
# 調用模型
structured_output = model_with_structure.invoke("細胞的動力工廠是什么?")
# 獲取pydantic對象
structured_output
# 輸出: ResponseFormatter(
#     answer="細胞的動力工廠是線粒體。線粒體是產生細胞大部分三磷酸腺苷(ATP)供應的細胞器,ATP用作化學能源。", 
#     followup_question='ATP在細胞中的功能是什么?'
# )

實際應用場景

結構化輸出在以下場景中特別有用:

  1. 數據庫存儲: 確保模型輸出符合數據庫模式
  2. API集成: 生成符合特定API要求的響應格式
  3. 數據提取: 從非結構化文本中提取結構化信息
  4. 表單填充: 自動填充具有特定字段的表單
  5. 報告生成: 創建具有一致格式的報告

最佳實踐

  1. 明確的模式定義: 使用清晰的字段描述和類型提示
  2. 驗證機制: 利用Pydantic的驗證功能確保數據質量
  3. 錯誤處理: 實現適當的錯誤處理機制
  4. 性能考慮: 選擇適合您用例的最高效方法

總結

LangChain的結構化輸出功能為開發者提供了一種強大而靈活的方式來確保模型輸出符合特定格式。通過使用 with_structured_output() 方法,您可以輕松地將模式綁定到模型并獲得結構化的響應,這對于構建生產級應用程序至關重要。


參考資料:

  • LangChain官方文檔 - 結構化輸出
    方法,您可以輕松地將模式綁定到模型并獲得結構化的響應,這對于構建生產級應用程序至關重要。

參考資料:

  • LangChain官方文檔 - 結構化輸出
  • 更多詳細用法請參見官方使用指南

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/84039.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/84039.shtml
英文地址,請注明出處:http://en.pswp.cn/web/84039.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

探究webView與html的通訊

最近出來個新需求: 需求描述: 將uniapp的代碼打包成一個app,并實現原本的功能。 原uniapp是一個H5項目,主要的步驟流程是上傳用戶的身份證進行二要素認證,成功后再進行三方活體認證,然后三方回跳到項目中的…

高級定時器TIM1、TIM8

高級定時器在通用定時器的基礎上增加了一些功能,如:重復計數器、帶死區控制的互補輸出通道、斷路輸入等。 捕獲/比較通道的輸出部分(通道1至3) 捕獲/比較通道的輸出部分(通道4) ①重復計數器RCR 基本和通用定時器發生溢出時,會直接生成更新時…

搭建簡易采購系統:從需求分析到供應商數據庫設計

一、需求分析框架(4大核心模塊) 關鍵需求清單: 需求提報(含審批流) 供應商準入與評估 比價與訂單生成 基礎報表功能 二、技術選型方案 組件推薦方案替代方案前端框架Vue.js ElementUIReact Ant Design后端語言P…

基于LSTM-GARCH混合模型的“獲利了結”量化解析:黃金單日1.27%跌幅的技術性歸因

摘要:本文通過多維度量化指標、結合地緣風險溢價因子、貨幣政策預期指數及貿易摩擦不確定性指數,構建動態情景分析框架。 一、黃金價格技術面解析 周一(6月16日)現貨黃金呈現"沖高回落-獲利了結"典型特征,日…

【AI】Spring AI Alibaba 的介紹

目錄 一、Spring AI Alibaba 的介紹 1.1 什么是 Spring AI Alibaba? 1.2 Spring AI 項目簡介 二、核心概念 2.1 模型 2.2 提示(Prompt) 2.3 提示詞模板(Prompt Template) 2.4 嵌入(Embedding&#x…

從main()函數的執行發散開來

大多數程序員的第一行代碼可能都是從輸出“Hello&#xff0c;World!開始的吧。如果請你寫一個c程序&#xff0c;在屏幕上打印“Hello&#xff0c;World!”&#xff0c;下面的代碼對擁有扎實編程基本功的你而言肯定so easy&#xff1a; #include <stdio.h>int main() {pr…

(16)java+ selenium->自動化測試-元素定位之By xpath下篇

1.簡介 老規矩,我們還是接著前面兩篇的Xpath 5.自動測試實戰 以百度首頁為例,將xpath的各種定位方法一一講解和分享一下。 5.1大致步驟 1.訪問百度首頁。 2.通過xpath定位到元素,點擊一下。 5.2模糊定位starts-with關鍵字 有一種特殊的情況:頁面元素的屬性值會被動態…

45-Oracle 索引的新建與重建

小伙們日常里有沒有被業務和BOSS要求新建索引或是重建索引&#xff1f;他們都想著既快又穩&#xff0c;那么索引在在Oracle上如何實現、新建、重建。原則是什么&#xff1a; 1、新建索引&#xff0c;查詢是否高頻且慢&#xff0c;索引列是否高選擇性&#xff0c;新增索引對寫負…

使用 Rust Clippy 的詳細方案

使用 Rust Clippy 的詳細方案 Rust Clippy 是一個強大的靜態分析工具&#xff0c;幫助開發者識別代碼中的潛在問題并改善代碼質量。以下是如何充分利用 Clippy 的方法&#xff1a; 安裝 Clippy 確保 Rust 工具鏈已安裝。通過以下命令安裝 Clippy&#xff1a; rustup compon…

21.什么是JSBridge(1)

1.Native與H5交互的常用交互機制&#xff0c;主流選擇是jsbridge 2.jsbridge是什么&#xff1f; JSBridge 是 Android 官方 WebView 提供的 addJavascriptInterface() 能力 項目方&#xff08;或三方庫&#xff09;封裝的橋梁通信協議。 底層機制由 Android 官方 WebView 提…

什么是Flink

Apache Flink&#xff1a;流批一體的大數據處理引擎 什么是Apache Flink&#xff1f; Apache Flink是一個開源的分布式流處理框架&#xff0c;最初由柏林工業大學開發&#xff0c;后成為Apache軟件基金會的頂級項目。它能夠以高吞吐、低延遲的方式處理無界數據流(流處理)和有…

區塊鏈+智能合約如何解決上門按摩行業的信任問題?——App開發案例

你是不是覺得上門按摩市場已經人滿為患&#xff1f;擔心自己入局太晚或者缺乏行業經驗&#xff1f;一組真實數據可能會讓你改變看法&#xff1a;全國按摩服務需求正以月均8%的速度迅猛增長&#xff0c;但專業技師的供給量僅能跟上5%的增幅&#xff01;這意味著每個月都有相當于…

修改windows hosts文件的軟件

修改hosts文件的軟件推薦及使用教程 這個軟件我用了10多年 推薦工具&#xff1a;Hosts Host軟件不用安裝綠色 如何使用 注意事項 如何沒有安裝.net 3.5 請根據提示安裝就可以了 內容綁定了軟件下載資源&#xff0c;在頂部有需要的自己取

Java web非Maven項目中引入EasyExcel踩坑記錄

最近在幫朋友在老項目上做二次開發&#xff0c;有讀取Excel的需求&#xff0c;習慣性的引入了EasyExcel&#xff0c;但是出現了很多問題&#xff0c;最主要就是jar包的問題,需要依賴的jar包版本問題 項目技術棧&#xff1a; tomcat9 Amazon Corretto JDK 8 (亞馬遜的openJDK…

Flutter——數據庫Drift開發詳細教程(七)

目錄 入門設置 漂移文件入門變量數組定義表支持的列類型漂移特有的功能 導入嵌套結果LIST子查詢Dart 互操作SQL 中的 Dart 組件類型轉換器現有的行類Dart 文檔注釋 結果類名稱支持的語句 入門 Drift 提供了一個dart_api來定義表和編寫 SQL 查詢。尤其當您已經熟悉 SQL 時&#…

【排坑指南】MySQL初始化后,Nacos與微服務無法連接??

Date&#xff1a;2025/06/18 你好&#xff01; 今天&#xff0c;分享一個工作中遇到的一個 MySQL 問題。在這之前都不知道是 MySQL 的問題&#xff0c;特離譜&#xff01; 昨天和今天大多數時間都用來處理了這一個問題&#xff1a;《MySQL進行了數據庫初始化之后&#xff0c…

springboot獲取工程目錄

在springboot中使用ApplicationHome獲取工程所在目錄的時候&#xff0c;開發環境和生產運行環境輸出的目錄是不同的&#xff0c;開發環境到target/classes目錄&#xff0c;而生產運行則是需要的wzkj-server.jar所在目錄 ApplicationHome home new ApplicationHome(CollectTas…

深入ZGC并發處理的原理

大型Java應用的核心痛點之一&#xff1a;當JVM進行垃圾回收時強制程序暫停&#xff08;STW&#xff09;的代價。在要求低延遲的應用場景——高頻交易系統、實時在線服務或全球性大型平臺——中&#xff0c;這種"時空靜止"的成本可能極高。但JDK從16版本&#xff08;生…

配置DHCP服務(小白的“升級打怪”成長之路)

目錄 項目前準備 一、DHCP服務器配置&#xff08;Rocky8&#xff09; 1&#xff0c;關閉防火墻、安全上下文 2、配置網卡文件 3、安裝hdcp-server 4、配置dhcp服務 5、重啟dhcp服務 二、配置路由器 1、添加兩塊網卡并更改網卡配置文件 2、配置路由功能 3、掛載本地鏡…

云原生安全

云原生 | T Wiki 以下大部分內容參考了這篇文章 什么是云原生 云原生&#xff08;Cloud Native&#xff09; “云原生”可以從字面上拆解為“云”和“原生”兩個部分來理解&#xff1a; “云”&#xff0c;是相對于“本地”而言的。傳統應用部署在本地數據中心或物理服務器…