前天和昨天,我們進行promptTemplate和langServe快速部屬api的操作範例,但今天介紹及說明另外一個核心功能,結構化輸出structured_output,將LLM的輸出變成特定格式,此功能我們會在之後的LangGraph上常常看見。
Pydantic 允許定義class來限制資料的格式和類型,實際上會在創建物件時,自動驗證資料類型和格式,如果資料不符合定義的類型和格式,Pydantic 就會throw expection。
LangChain 使用 Pydantic 確保傳遞給chain或agent的資料格式和類型是正確的,避免執行時發生錯誤。
from langchain_core.pydantic_v1 import BaseModel, Field
# pydantic class
class Joke(BaseModel):
"""Joke to tell user."""
setup: str = Field(description="笑話的設定")
punchline: str = Field(description="笑話有趣的重點")
rating: int = Field(
description="這個笑話的評分,從1到10")
當使用pydantic class當作輸入時,模型的輸出也會是pydantic class。
輸出
structured_llm = model.with_structured_output(Joke)
structure_joke = structured_llm.invoke("告訴我一個關於貓的笑話")
print(structure_joke)
完整程式碼
import os
from langchain_openai import ChatOpenAI
from typing import Optional
from langchain_core.pydantic_v1 import BaseModel, Field
# 1. Create model
os.environ["OPENAI_API_KEY"] = "你的OpenAI api key"
model = ChatOpenAI(model="gpt-4o")
# 2. pydantic class
class Joke(BaseModel):
"""Joke to tell user."""
setup: str = Field(description="笑話的設定")
punchline: str = Field(description="笑話有趣的重點")
rating: int = Field(
description="這個笑話的評分,從1到10")
structured_llm = model.with_structured_output(Joke)
structure_joke = structured_llm.invoke("告訴我一個關於貓的笑話")
print(structure_joke)
setup='為什麼貓咪不喜歡上網?' punchline='因為牠們怕滑鼠!' rating=7
pydantic class的參數的名稱和提供的描述也非常重要,可以將這些資訊視為提示的一部份。
當然也可以輸出成Json,若需要更詳細的資料可以參考
https://python.langchain.com/v0.2/docs/how_to/structured_output/#typeddict-or-json-schema
需要如下的修改
structured_llm = model.with_structured_output(method="json_mode")
structure_joke = structured_llm.invoke(
"告訴我一個關於貓的笑話,用JSON回應並且有`setup`和`punchline`和`rating`這些關鍵字")
print(structure_joke)
{'setup': '為什麼貓咪不玩撲克牌?', 'punchline': '因為牠們怕老虎(Tiger)!', 'rating': 7}