← 文章列表
LLM

🧩 LangChain 的魔法拼圖術!玩轉 Chain 與 LCEL ✨(含三個實戰案例)

2025-06-05 · — views

大家好~今天要來跟大家聊聊 LangChain 中超級實用、也超有彈性的功能之一 —— Chain 🔗!

不誇張,這個概念就是 LangChain 的靈魂 💀。而當你搭配上 LCEL(LangChain Expression Language),那你就像獲得了程式語言的魔法棒 🪄,組裝 AI 流程就像疊樂高一樣簡單又優雅!

🔍 Chain 是什麼?為什麼我們需要它?

LangChain 的 Chain 本質上就是:把幾個可執行的步驟串起來,一起跑

舉例來說,你可能會這樣想做事情:

  1. 組一個 prompt

  2. 丟給 LLM

  3. 把回來的結果解析成文字或物件

這三個步驟可以單獨跑,也可以「串成一條鏈」,你只要給 input,結果就會一路通到底。
更酷的是,你可以用 LCEL 的 | 操作符,像串 UNIX 指令一樣,把每個模組串起來!

🧪 Case 1:最簡單的 RunnableSequence + LCEL

讓我們從一個最簡單的範例開始 ⛳:

這段程式的邏輯就是:🧠 提示模板 → 🤖 模型回答 → 🪄 解析文字

prompt_template = ChatPromptTemplate.from_template(
    "告訴我一個關於{topic}的有趣事實。"
)

chain = (
    prompt_template
    | chat_model
    | str_parser
)

我們也可以用 RunnableSequence() 明確定義這些步驟:

chain_runnable_sequence = RunnableSequence(
    prompt_template,
    chat_model,
    str_parser
)

👉 不管哪一種方式,本質都一樣!你可以根據需求選你喜歡的寫法 😎

🧪 執行結果:

pprint(chain_runnable_sequence.invoke({"topic": "volleyball"}))

### result###
排球的起源可以追溯到1895年,當時美國麻薯州的體育老師威廉·摩根(William G. 
Morgan)創造了一種名為“mintonette”的運動,結合了籃球、網球和手球的元素。最初的目的是為了提供一項適合於室內的休閒活動,並不打算成為一項競技運動。隨著時間的推移,這項運動在18
96年被重新命名為“排球”,並逐漸演變為今天我們所熟知的排球。

🧪 Case 2:RunnableParallel 平行處理 🚀

如果你想同時做兩件事,怎麼辦?這時候 RunnableParallel 就能大顯神威!

# Initialize the AzureChatOpenAI model
chat_model = AzureChatOpenAI(
    deployment_name=deployment,
    openai_api_base=endpoint,
    openai_api_version=api_version,
    openai_api_key=subscription_key,
    temperature=1.0,
    max_tokens=1024
)

# Initialize the output parser
str_parser = StrOutputParser()

country_template = PromptTemplate.from_template(
    "請告訴我{city}位於那個國家。"
)
food_template = PromptTemplate.from_template(
    "請告訴我{city}的特色美食是什麼。"
)

chain_country = country_template | chat_model | str_parser
chain_food = food_template | chat_model | str_parser
chain_parallel = RunnableParallel(
    {
        "country": chain_country,
        "activity": chain_food
    }
)

只要給一個 input,它就會同時丟給兩個 chain 跑起來,然後整合結果!

pprint(chain_parallel.invoke({"city": "台北"}))

###result###
{
    'country': '台北位於台灣,台灣是一個位於東亞的島嶼。台北是台灣的首都和最大的城市。',
    'activity': '台北的特色美食多樣且富有地方風味,以下是一些不容錯過的台北美食:\n\n1. 
**牛肉麵**:這是台北最具代表性的美食之一,湯頭濃郁,搭配嫩滑的牛肉和Q彈的麵條。\n\n2. 
**小籠包**:極具人氣的點心,以薄皮包裹鮮美的肉餡和湯汁,蒸製而成,吃的時候要小心熱湯噴出。\n\n3. ...
}

🧪 Case 3:平行 + 串聯組合技 💥

我們還可以更進一步:「把兩個結果再用一句話總結起來!」這就需要把平行的輸出,再串回一個新的 chain

summary_template = PromptTemplate.from_template(
    "用一句話來總結{country}的{food}"
)
summary_chain = ({
    "country": chain_country,
    "food": chain_food
} | summary_template | chat_model | str_parser)

🔄 結構上看起來像這樣:

城市 ➜ [查國家, 查美食](平行) ➜ 結果合併 ➜ 丟進摘要 prompt ➜ 模型 ➜ 輸出

🧪 執行結果:

pprint(summary_chain.invoke({"city": "台北"}))

### result ###
台北是台灣首都,擁有豐富的美食文化,其中牛肉麵、小籠包、臭豆腐等特色美食是必嘗的佳餚。

🔚 小結:Chain + LCEL 是打造 AI 工作流程的必備工具 🧰

🚀 無論你要做簡單的 QA 還是複雜的任務編排,用 LCEL + chain 就能把你的流程「模組化」、「彈性化」,還能快速除錯與重組!