LangChain 提供的輸出解析器能有效處理 LLM 輸出,並將其轉換為結構化資料。透過 Pydantic 模型,開發者可以輕鬆定義預期的輸出格式,例如 JSON 或 XML,簡化後續處理流程。同時,LangChain 的評估指標功能,搭配 LangSmith 或 Weights and Biases 等平臺,能有效追蹤模型的效能,並利用測試案例與基準答案,例如 GPT-4 的輸出,來衡量模型的準確性。文章中以銀行交易分類別為例,示範如何結合 Mistral AI 模型與 LangChain,並使用 Pydantic 定義交易型別和類別,實作更精確的金融資料分析。此方法能有效降低使用大型模型的成本,並提升模型佈署的彈性,例如選擇開源模型並自行託管,以保護敏感資料。

使用PromptTemplate與聊天模型

LangChain提供了一個更傳統的範本叫做PromptTemplate,它需要輸入變數和範本引數。例如:

prompt = PromptTemplate(
    template='''您是一個幫助助理,翻譯 {input_language}{output_language}.''',
    input_variables=["input_language", "output_language"],
)

輸出解析器

LangChain提供了一個更高階的抽象叫做輸出解析器,能夠自動從文字中提取結構化資料。目前可用的輸出解析器包括:

  • 列表解析器:傳回一個以逗號分隔的專案列表。
  • 日期時間解析器:將LLM輸出解析為日期時間格式。
  • 列舉解析器:將字串解析為列舉值。
  • 自動修復解析器:包裝另一個輸出解析器,如果該輸出解析器失敗,它將呼叫另一個LLM來修復任何錯誤。
  • Pydantic(JSON)解析器:將LLM回應解析為符合Pydantic schema的JSON輸出。

進階技術:使用 LangChain 進行文字生成

LangChain 提供了多種輸出解析器(Output Parsers),用於處理語言模型(LLM)的輸出結果。這些解析器可以幫助您將 LLM 的輸出轉換為結構化的格式,以便於後續的處理。

重試解析器(Retry Parser)

重試解析器可以在前一次解析失敗的情況下,重新嘗試解析輸出結果。這個功能可以幫助您處理一些複雜的輸出結果。

結構化輸出解析器(Structured Output Parser)

結構化輸出解析器可以用於傳回多個欄位的輸出結果。這個功能可以幫助您處理一些需要傳回多個值的任務。

XML 解析器(XML Parser)

XML 解析器可以將 LLM 的輸出結果解析為 XML 格式。這個功能可以幫助您處理一些需要傳回 XML 格式的任務。

LangChain 輸出解析器的重要功能

LangChain 輸出解析器有兩個重要的功能:

  • .get_format_instructions(): 這個功能提供了必要的指令,以便將輸出結果轉換為結構化的格式。
  • .parse(llm_output: str): 這個功能負責將 LLM 的輸出結果解析為預先定義的格式。

Pydantic(JSON)解析器

Pydantic(JSON)解析器是 LangChain 中的一種常用的解析器。它使用 Pydantic 函式庫來驗證和解析輸入資料。Pydantic 函式庫提供了一種方式來驗證輸入資料,並自動將其轉換為 Python 物件。

以下是一個使用 Pydantic(JSON)解析器的示例:

from langchain_core.prompts.chat import (
    ChatPromptTemplate,
    SystemMessagePromptTemplate,
)
from langchain_openai.chat_models import ChatOpenAI
from langchain.output_parsers import PydanticOutputParser
from pydantic.v1 import BaseModel, Field

from typing import List

temperature = 0.0

class BusinessName(BaseModel):
    name: str = Field(description="商業名稱")
    rating_score: float = Field(description="商業評分,0 是最差,10 是最佳")

class BusinessNames(BaseModel):
    names: List[BusinessName] = Field(description="商業名稱列表")

# 設定解析器和注入指令到提示範本:
parser = PydanticOutputParser(pydantic_object=BusinessNames)

原則 = """
- 名稱必須容易記憶。
- 使用 {industry} 行業和公司背景來建立有效的名稱。
- 名稱必須容易發音。
- 您必須只傳回名稱,不得包含其他文字或字元。
- 避免傳回全停、\n 或其他字元。
- 名稱的最大長度必須是 10 個字元。
"""

在這個示例中,我們定義了一個 BusinessName 類別,包含了商業名稱和評分。然後,我們定義了一個 BusinessNames 類別,包含了商業名稱列表。接著,我們設定了 Pydantic(JSON)解析器,並注入指令到提示範本中。這樣,我們就可以使用 LangChain 來生成商業名稱,並將其轉換為結構化的格式。

使用輸出解析器來構建靈活的LLM應用

在使用LLM(大語言模型)進行文字生成時,輸出解析器是一種強大的工具,可以幫助您從LLM的輸出中提取所需的資訊。透過使用輸出解析器,您可以指定LLM的輸出格式,從而使您的應用程式更加靈活和易於使用。

如何使用輸出解析器

要使用輸出解析器,您需要先建立一個Pydantic模型來定義您想要從LLM的輸出中提取的資訊。然後,您可以使用PydanticOutputParser類別來建立一個輸出解析器,該解析器可以將LLM的輸出轉換為Pydantic模型。

以下是一個示例:

from pydantic import BaseModel
from langchain import PydanticOutputParser

class BusinessName(BaseModel):
    name: str
    rating_score: float

class BusinessNames(BaseModel):
    names: list[BusinessName]

parser = PydanticOutputParser(pydantic_object=BusinessNames)

將輸出解析器新增到LCEL鏈中

一旦您建立了輸出解析器,您就可以將其新增到LCEL鏈中。LCEL鏈是一種可以將多個LLM模型和輸出解析器連結在一起的方式,從而使您的應用程式更加靈活和易於使用。

以下是一個示例:

chain = prompt | model | parser
result = chain.invoke(
    {
        "principles": principles,
        "industry": "Data Science",
        "format_instructions": parser.get_format_instructions(),
    }
)

輸出解析器的優點

使用輸出解析器有幾個優點:

  • 靈活性:輸出解析器允許您指定LLM的輸出格式,從而使您的應用程式更加靈活和易於使用。
  • 易於使用:輸出解析器提供了一種簡單的方式來提取LLM的輸出中的資訊,無需使用複雜的正規表示式或其他方法。
  • 高效性:輸出解析器可以幫助您快速地提取LLM的輸出中的資訊,從而使您的應用程式更加高效。

LangChain 評估指標

LangChain 提供了一系列預先設定好的評估指標(evals),用於衡量每個提示回應的效能。這些評估指標可以直接記錄在 LangChain 的 LangSmith 平臺中,以便進一步除錯、監控和測試。Weights and Biases 是另一個提供類別似功能和追蹤能力的機器學習平臺。

評估指標不僅適用於提示測試,也可以用於識別正面和負面示例以進行檢索,以及建立資料集以微調自定義模型。大多數評估指標都依賴於一組測試案例,即輸入和輸出配對,其中包含正確答案。這些參考答案通常由人工建立或企劃,但也常使用更先進的模型(如 GPT-4)來生成基準答案。

使用 GPT-4 生成基準答案

給定一份金融交易描述清單,我們使用 GPT-4 將每筆交易分類別為 transaction_categorytransaction_type。這個過程可以在 langchain-evals.ipynb Jupyter Notebook 中找到,該筆記本位於 GitHub 儲存函式庫中。

評估模型準確性

以 GPT-4 的答案為基準,可以評估較小模型(如 GPT-3.5-turbo 和 Mixtral 8x7b)的準確性。如果能夠使用較小的模型達到足夠的準確性,可以節省成本或降低延遲。此外,如果該模型是開源的(如 Mistral 的模型),可以將任務遷移到自己的伺服器上,避免將敏感資料傳送到組織外部。

測試和自託管

建議先使用外部 API 進行測試,然後再自行託管 OS 模型。請記得註冊並訂閱以獲得 API 金鑰,然後將其作為環境變數暴露給 玄貓:

export MISTRAL_API_KEY=api-key

評估指令碼

以下指令碼是之前定義了 DataFrame df 的筆記本的一部分。為了簡潔起見,讓我們只調查指令碼的評估部分,假設 DataFrame 已經定義好了。

import os
from langchain_mistralai.chat_models import ChatMistralAI
from langchain.output_parsers import PydanticOutputParser
from langchain_core.prompts import ChatPromptTemplate
from pydantic.v1 import BaseModel
from typing import Literal, Union
from langchain_core.output_parsers import StrOutputParser

# 1. 定義模型:
mistral_api_key = os.environ["MISTRAL_API_KEY"]
model = ChatMistralAI(model="mistral-small", mistral_api_key=mistral_api_key)

# 2. 定義提示:
system_prompt = """您是一位銀行交易分析專家,您將對單一交易進行分類別。
始終傳回交易型別和類別:不要傳回 None。
格式說明:

{format_instructions}"""
user_prompt = """交易文字:

{transaction}"""
prompt = ChatPromptTemplate.from_messages(
    [
        ("system", system_prompt),
        ("user", user_prompt),
    ]
)

# 3. 定義 Pydantic 模型:
class EnrichedTransactionInformation(BaseModel):
    transaction_type: Union[
        Literal["Purchase", "Withdrawal", "Deposit", "Bill Payment", "Refund"], None
    ]
    transaction_category: Union[
        Literal["Food", "Entertainment", "Transport", "Utilities", "Rent", "Other"], None
    ]

# 4. 定義輸出解析器:
output_parser = PydanticOutputParser(pydantic_object=EnrichedTransactionInformation)

內容解密:

這個指令碼定義了一個使用 LangChain 和 Mistral AI 的聊天模型來分析銀行交易的過程。它首先定義了模型、提示和 Pydantic 模型,然後定義了輸出解析器。這個過程可以用於評估模型的準確性和效率,並根據需要進行調整和最佳化。

玄貓風格技術文章結論:使用 LangChain 進行文字生成與評估

深入剖析 LangChain 的核心架構後,我們發現其提供的 PromptTemplate、輸出解析器和評估指標,為構建更靈活、高效的 LLM 應用程式奠定了堅實基礎。從 Pydantic(JSON)解析器到重試解析器,LangChain 提供了多種工具,能有效處理 LLM 輸出的結構化和非結構化資料,滿足不同應用場景的需求。技術堆疊的各層級協同運作中體現了 LangChain 的設計理念:簡化開發流程,提升開發效率。

透過多維度效能指標的實測分析,LangChain 的輸出解析器在處理複雜 LLM 輸出時展現了其優勢,例如能有效地將文字轉換為結構化資料,並與 Pydantic 模型無縫整合。然而,目前 LangChain 的評估指標仍高度依賴人工設定的測試案例,這在某些特定領域的應用中可能會限制其泛用性。此外,對於中文繁體技術用語的支援仍有待加強,這也是 LangChain 在臺灣市場拓展中需要克服的挑戰。

展望未來,隨著 LLM 技術的快速發展,預計 LangChain 將持續最佳化其輸出解析器和評估指標,例如發展更自動化的評估方法,並支援更多元的資料格式。同時,社群與工具鏈的協同進化趨勢將推動 LangChain 與更多開源專案和商業產品的整合,進一步拓展其應用生態。

玄貓認為,LangChain 作為一個快速發展的開源專案,已展現出相當的成熟度和潛力。對於希望利用 LLM 技術構建應用程式的開發者而言,LangChain 值得深入研究和應用。尤其在結合更先進的模型如 GPT-4 生成基準答案,並善用 LangSmith 或 Weights and Biases 等平臺進行追蹤和除錯的情況下,LangChain 將能更好地協助開發者打造更具商業價值的 LLM 應用。