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]}
結構化輸出方法
使用上述方法產生結構化輸出時存在一些挑戰:
-
解析挑戰: 當使用工具調用時,工具調用參數需要從字典解析回原始模式。
-
強制使用工具: 此外,當我們想要強制結構化輸出時,需要指示模型始終使用工具,這是一個特定于提供商的設置。
-
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在細胞中的功能是什么?'
# )
實際應用場景
結構化輸出在以下場景中特別有用:
- 數據庫存儲: 確保模型輸出符合數據庫模式
- API集成: 生成符合特定API要求的響應格式
- 數據提取: 從非結構化文本中提取結構化信息
- 表單填充: 自動填充具有特定字段的表單
- 報告生成: 創建具有一致格式的報告
最佳實踐
- 明確的模式定義: 使用清晰的字段描述和類型提示
- 驗證機制: 利用Pydantic的驗證功能確保數據質量
- 錯誤處理: 實現適當的錯誤處理機制
- 性能考慮: 選擇適合您用例的最高效方法
總結
LangChain的結構化輸出功能為開發者提供了一種強大而靈活的方式來確保模型輸出符合特定格式。通過使用 with_structured_output()
方法,您可以輕松地將模式綁定到模型并獲得結構化的響應,這對于構建生產級應用程序至關重要。
參考資料:
- LangChain官方文檔 - 結構化輸出
方法,您可以輕松地將模式綁定到模型并獲得結構化的響應,這對于構建生產級應用程序至關重要。
參考資料:
- LangChain官方文檔 - 結構化輸出
- 更多詳細用法請參見官方使用指南