LLM
🧩 LangChain 的魔法拼圖術!玩轉 Chain 與 LCEL ✨(含三個實戰案例)
2025-06-05 · — views
大家好~今天要來跟大家聊聊 LangChain 中超級實用、也超有彈性的功能之一 —— Chain 🔗!
不誇張,這個概念就是 LangChain 的靈魂 💀。而當你搭配上 LCEL(LangChain Expression Language),那你就像獲得了程式語言的魔法棒 🪄,組裝 AI 流程就像疊樂高一樣簡單又優雅!
🔍 Chain 是什麼?為什麼我們需要它?
LangChain 的 Chain 本質上就是:把幾個可執行的步驟串起來,一起跑。
舉例來說,你可能會這樣想做事情:
-
組一個 prompt
-
丟給 LLM
-
把回來的結果解析成文字或物件
這三個步驟可以單獨跑,也可以「串成一條鏈」,你只要給 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 就能把你的流程「模組化」、「彈性化」,還能快速除錯與重組!