LCEL 與 Agent

LCEL 全名 LangChain Expression Language, 是一種描述 LangChain 架構的語言。最大的特徵就是看到 A = B | C | D 這種表示法 – 說明了 LCEL 串接多個可執行單元的特性,是 LangChain 的進階實現。而 ‘|’ 的理解和 Linux 的 pipe 很像,它是非同步的串接。

舉例來說,一個 LLM 的 LangChain 可以表示為:

chain = prompt | LLM model | Output Parser

依序做好這三件事:有方向性的提示、強大的大語言模型、友善的輸出格式,就可以提升使用者體驗。

但是顯然這樣還不太夠,比方說,LLM 需要查一筆它沒被訓練過的資料,在上面的 pipe 就無法做到。換個例子,我想幫 AI 助理取個名字,它也會說好。但是一轉眼什麼山盟海誓都忘光了!

顯然,我們要有個負責的 agent,把 function call 的能力加進來;而且 call 完之後,還要餵給 LLM 做 “人性化" 的自然語言潤飾。這是一個循環的路徑,直到 AI 判斷它不再需要任何外部工具,就可以結束迴圈,跟使用者報告最終結果了。

那麼這個 code 長什麼樣子? 首先把基本元件準備好:

# 初始化模型
llm = ChatOpenAI(model="gpt-4o", temperature=0)

# 將工具打包成列表
tools = [get_current_weather] # 以問天氣的函式為例

# 給出配合 function 的 prompt
prompt = ChatPromptTemplate.from_messages(
    [
        ("system", "你是天氣助理,請根據工具的結果來回答問題。"),
        ("placeholder", "{chat_history}"),  # 預留給歷史訊息
        ("human", "{input}"), # 真正的輸入
        ("placeholder", "{agent_scratchpad}"), # 於思考和記錄中間步驟
    ]
)

創建 agent

# 創建 Tool Calling Agent
# 將 LLM、Prompt 和 Tools 組合起來,處理 Function Calling 的所有複雜流程
agent = create_tool_calling_agent(llm, tools, prompt)

執行 agent

# 創建執行器, 跑 模型思考 -> 呼叫工具 -> 再次思考 -> 輸出答案的循環
agent_executor = AgentExecutor(agent=agent, tools=tools, verbose=True)

設計人機介面

def run_langchain_example(user_prompt: str):
    print(f"👤 用戶提問: {user_prompt}")
    
    # 使用 invoke 運行 Agent,LangChain 會自動管理多輪 API 呼叫
    result = agent_executor.invoke({"input": user_prompt})
    
    print(f"🌟 最終答案: {result['output']}")

測試案例

# 示範一:Agent 判斷需要呼叫工具
run_langchain_example("請問新竹現在的天氣怎麼樣?請告訴我攝氏溫度。")

# 示範二:Agent 判斷不需要呼叫工具,直接回答
run_langchain_example("什麼是 LLM?請用中文簡短回答。")

這邊要留意的是,第一個問天氣的問題,LLM 顯然要用到 tool 去外面問,第二個問題不需要即時的資料,所以它自己回答就好。

意猶未盡的讀者可能好奇 function 長怎樣? 其實就很一般,主要的特色是用 @tool decorator。這樣可以獲得很多好處,最重要的一點是 agent 都認得它的 JSON 輸出,方便資料異步流動。

# LangChain 會自動將這個 Python 函數轉換成模型可理解的 JSON Schema
from langchain_core.tools import tool

@tool
def get_current_weather(location: str, unit: str = "celsius") -> str:
    if "新竹" in location or "hsinchu" in location.lower():
        return "風大啦! 新竹就是風大啦!"
    else:
        return f"我不知道 {location} 的天氣啦!"

另外,追根究柢的讀者可能想問,code 裡面怎麼沒看到 ‘|’? 它跑那裡去了? 沒錯,上面講的都是 agent,它比較進階,可以動態跑流程。反而 LCEL 只是 LangChain 的實行方式,它就是一個線性的 chain。

我們由奢返儉,回過頭來看 LCEL,它不能跟 agent 比,只能打敗傳統的 LangChain。標為紅色的是 LCEL 特色的 coding style。

def demonstrate_legacy_chain():
 
    # 定義模型
    llm = ChatOpenAI(temperature=0)
    
    # 定義 Prompt Template
    template = "Translate English text to Chinese: {text}"
    prompt = PromptTemplate(template=template, input_variables=["text"])
    
    # 建立 Chain (透過類別組合)
    # 缺點:語法較冗長,看不到資料流向,且 output 通常包含原始 meta data
    chain = LLMChain(llm=llm, prompt=prompt)
    
    # 執行
    input_text = "Make American Great Again!"
    result = chain.run(input_text)

VS

def demonstrate_lcel():
    
    # 定義模型
    model = ChatOpenAI(temperature=0)
    
    # 定義 Prompt Template, 使用更現代的 ChatPromptTemplate
    prompt = ChatPromptTemplate.from_template("Translate English text to Chinese: {text}")
    
    # 定義 Output Parser (將 AI Message 轉為純字串)
    output_parser = StrOutputParser()
    
    # 建立 Chain (使用 Pipe '|' 運算符)
    # 優點:Unix 風格管道,由左至右邏輯清晰,易於修改和擴展
    chain = prompt | model | output_parser
    
    # 執行
    input_text = "Make American Great Again!"
    result = chain.invoke({"text": input_text})

這兩個都是一次性的 Q&A。

  1. Functions, Tools and Agents with LangChain

超學習時代

最近的 Gemini 3 Pro 真的變比較聰明,所以我取消 Monica 的訂閱,改訂 Gemini。現在想要學習最新的技術,不但學校教不了;網路課程也教不了。就算是追著科技網紅,心裡沒有譜的話,也會像個無頭蒼蠅一樣、不會授粉只會傳播細菌,哈!

以 AI 技術來說,訓練模型、微調模型、RAG (檢索增強生成) 都是舊世代的技術。次世代的技術重點在於 Reasoning 和 Agency。雖然這個發展有跡可循、合情合理,但是沒有前面的跌跌撞撞,也絕不可能一步到位。短短一兩年之間,我們有了下面的這些進化。

[觀念改變]

一個 AI model 自己角色扮演 –> 建立認知架構:記憶、規畫、反思。

LangChain –> LangGraph, 線性思考 –> 非線性思考、圖論、立體化。

Funcation call –> Tool call。錯誤檢查和自我校正。

[模型調校]

Supervised Fine-Tuning、 RLHF (reinforcement learning from human feedback) –> DPO (Direct Preference Optimization)、IPO (Identity Preference Optimization)、KTO (Kahneman-Tversky Optimization)。

全能模型 –> SLERP (Spherical Linear Interpolation)、TIES-Merging。

自我對局 (Self-Play) 強化。

[In Model Learning]

Prompt –> DSPy (Declarative Self-improving Language Programs),透過 Compiler 自動尋找 Prompt 組合。

快問快答 –> Chain of Tought、Tree of Thought –> Test-Time Compute (有節制地想久一點,時間換取品質)

[模型評估]

BLEU、ROUGE 考試 –> LLM-as-a-Judge,自動評估

多元評價 – RAGAS

  • R:Retrieval(檢索)
  • A:Accuracy(準確性)
  • G:Generality(通用性)
  • A:Adherence(遵循性)
  • S:Stability(穩定性)

[多模態]

OCR + LLM –> 原生多模態 (Native Multimodel)、audio/video tokenization。

文字到文字 –> any-to-any interaction

上述有很多新的東西,也有一些半新半舊,我打算加強 Agentic、MCP 這方面的知識,然後快速進入 DSPy 的領域。

附帶一提,雖然退訂 Monica 可以省錢,但是我還不打算把 Coursera 停掉。因為上面還是有很多 Andrew Ng 開的短課程。愈長的課程愈容易過時、短課程甚至像  Andrej Karpathy 的 Youtube 都可能有一些最新的東西。至於 ArXiv 肯定好料滿滿,但是可能要叫 NoteLLM 幫我讀了。

我讀 «原子習慣»

Atomic Habits – 本書的作者是詹姆斯克里爾 (James Clear),我讀的版本是蔡仕偉先生翻譯,方智出版社發行。作者能夠跟大家談習慣養成的底氣在於親身的經歷。高二那年在棒球賽中,他被同學甩棒打中門面,造成骨折、複視、癲癇…等傷害,幾乎斷送運動生命。然而六年後,他在大四成為 ESPN 全明星隊投手、總統獎章得主。這個艱苦的復健過程,應證了養成好習慣並持之以恆的可能性。

好習慣的養成有四個法則 – 類似管理上的 PDCA [1] 這樣反覆加強,分別是提示、渴望、回應、獎賞 (cue, craving, response, and reward)。渴望這個詞,我理解為渴求;不然太文謅謅了,其實就是 “想要" 某個東西。擴充幾句就是: (1) 提示一個目標,(2) 激起達到目標的渴望,(3) 做出能達到目標的某件事,(4) 並獲得獎賞。

習慣的緣起是很細微的事情,所以作者才會用 atomic 來描述它。而習慣造成的影響剛開始可能影響微小,像是冰塊加熱到 0 度才突然變成水,竹子雨後突然爆長,甚至只要六週就長到 90 英呎高 (p.18~p.19)。以前國文課讀過劉蓉的 «習慣說»,大家也都知道 “習慣成自然" 這個成語。它說明好習慣也會有一段沒有回報的潛伏期 (p.19),假設大家都能接受這件事,就可以減少一些挫折感。像是運動了好幾週也沒變瘦。

在上面的論述中,作者已經悄悄地把習慣養成和目標設定做了聯結。這本書不只是要教大家怎麼養成好習慣,而是要講如何達成目標。通常我們會為自己訂目標,做出規劃,然後進入需要反覆操作的階段,順便在不知不覺中獲得一些好習慣。例如為了準備考試,早上 6 點起床讀書。或者我們了解到某些好習慣對身體有益無害,例如每週運動三次。於是作者認為與其緊盯著偉大的目標,不如堅持過程 (process),靠著不斷進步 (progress) 去達成它 (p.21)。

擴大而言,我們完成目標需要一套系統,這個系統有目標也有過程。例如目標是職棒年度總冠軍,我們要拆解系統成為可以回饋的子系統,如果只有大目標,卻沒有建立系統,並不一定會成功。因為,你的對手的目標跟你一模一樣 (p.20),為什麼偏偏是你奪冠呢? 顯然大家對於系統的設計就有不同的看法,然後才是比執行力,以及能否堅持到成為一種習慣。

作者舉出反例說,假如我們眼裡只有目標,大目標前面放個中目標,例如先得個上半季冠軍吧! 球隊可能也真的做到了,但是下半季發生溜溜球效應 [3],球隊忽然失去打球的動力,結果離目標更遠。我想富邦悍將或許是把熱身賽得第一當作小目標吧,以至於每年都第一個被淘汰!? 哈!

作者說大目標只是你想要改變的結果。深入一層去看,你應該要改變過程。再更深入地去理解,則是你要改變身分認同 – 你心裡希望成為什麼樣的人 (p. 23)。有人遞菸給甲,甲說我在戒菸;遞給乙,乙說我不抽菸。甲是個正在戒菸的人,乙是個已經戒菸的人 (或者從不抽菸)。作者舉這個例子說明身分認同是什麼? 我們的行動代表一個信念系統,有信仰可以讓習慣更持久。習慣也讓你成為理想的自己。

這四個法則都有正反兩面,既可以做正向加強、並做負向削減。例如:我們讓養成好習慣的物件顯而易見、讓養成壞習慣的物件隱而不見。假設想戒菸,就最好整天都看不到菸 (讓提示隱而不顯);想要讀書,書就放在垂手可得的地方 (讓提示顯而易見) (p. 33)。或者說,環境、情境比激勵更重要 (p. 44)。這也解釋了為何孟母要三遷,人類在新環境中比較容易改變習慣,戒毒也是如此 (p. 47)。還有模仿的對象也很重要 (p. 57)。

要提升自己,就要注意自己已經感覺不到的習慣是好是壞? 然後決定保持或是戒掉。書上說從一早開始做了哪些事? 可以詳細記錄 “習慣計分卡" 來做檢查 (p. 37, p. 89)。至於要養成一個好習慣,除了明確知道要做什麼,還要知道何時何地去做。例如自己宣告要在某個時間地點運動,執行力比只決定要運動好 2 倍以上 (p. 39)。

好習慣還可以疊加,造成鏈結。例如每次做完 A 之後,就固定做 B。習慣 A –>B 之後,可以在培養 B –> C 的習慣,這樣每件事都暗示著下一件事,整個生活都可以步上新的軌道 (p. 40)。

改變行為的第二條法則在於讓習慣有吸引力 (p. 52)。多巴胺測量實驗證明,想到快要達成目標的感覺比實際達成目標時更快樂! 所以想要 (craving) 的感覺可以幫助我們養成習慣。作者說我們可以綁定獎賞和一個待養成的好習慣,例如拿出手機就先做十下波比跳 [4] (需要) 再看臉書 (想要)。至於要戒掉壞習慣,就是要讓它變得毫無吸引力 (p.63)。

既然是習慣,養成的重點在於重複,而不是完美 (p. 66)。例如寫日記或是 Youtube 日更這種習慣。行為改變的第三法則是讓行動變得輕而易舉 (p. 70)。書上說農業技術的傳播對於同個緯度的地區比較容易,因此東西向傳播很快,但南北向傳遞速度只有 1/2~1/3。

追求輕鬆,最小努力是人類的本能,在每個決定性的瞬間我們要讓環境引導我們自然而然選擇好習慣,想都不用想 (p.75)。為了瞬間可以做出好的選擇,我們的目標可以定在 2 分鐘就可以做到的小段落。像是每晚就寢前讀書,先簡化為讀一頁就好 (p. 77)。

再來談到獎賞。眾所周知,重賞之下必有勇夫,而且即時獎勵效果更好 (p. 86)。這對別人適用,對自己也適用。特別值得一提的是 – 作者說父母鼓勵小孩時,可以給予代幣 (星星或其他的 token),讓小孩受到正向的鼓勵。在小孩做錯事情,例如說髒話,優先冷處理,輕描淡寫地說 “那樣說話不好。" 而不是去扣掉他的代幣或是劃掉小星星,因為負向的增強也是增強 (p. 128~p.129),衝擊到價值觀的純淨性。或許此時可以給一道閃電做出區隔 [5]。

本書在第 18 章有一記回馬槍,提到基因影響習慣 (p. 97)。不要違反你的天賦去培養沒好處的習慣,例如長不高想打籃球、虎背熊腰去跑馬拉松之類的 。第 19 章也稍微有點歪樓 (p. 100)。它說要在生活與工作中維持動力,只要求達到剛好難度的目標,否則培養 CP 值很低的習慣也沒有好處。書上提到這個金髮女孩原則,就是小時候讀的金捲兒闖入三隻熊家裡偷吃東西、偷睡床鋪的那個故事。當小偷還要挑三揀四選剛剛好的。

第 20 章回頭講養成好習慣的潛伏期 (p.104),只是更強調心理建設。書上說我們要對自己警覺,不要氣餒或是過於自滿。透過更有效率的指標來檢視自己的進步程度,例如棒球有很多進階數據,比單純看勝率、打擊率更有意義。

再後面本書就沒有章節了,取而代之的是一些補充、範本、手冊。總之,這本書相當有名,一面講習慣,也一面講目標設定。在這個範疇內,作者已經反覆論證完他的觀點了,是本不錯的書。

[REF]

  1. https://www.managertoday.com.tw/articles/view/55730
  2. 習慣說(清代劉蓉創作的一篇散文)
  3. 溜溜球效應
  4. 如何正確地波比跳 (中文字幕)
  5. SPY×FAMILY間諜家家酒

2024 Q3 投資回顧

今年真的相當神奇! 經歷了上半年的創新高和倒退嚕,Q3 竟然又回神了! 不是因為買了什麼妖股、飆股,而是幾乎甚麼都沒有做,只有獲利再投入。這就是長期投資神奇之處。

大家都知道巴菲特的 95% 的財富都是 60 歲以後才獲得的。他在 60 歲之前賺了 54 億美金,目前的身價則是約 1,535 億美金 [1]。對今天的老巴來說,當初那 54 億已經不算什麼了,但是沒有當時的基礎,就沒有現在的高樓。根據公開資料,他在 10~60 歲每個年紀賺到的錢大致如下圖。

由於他在 50~59 歲這十年,比起 49 歲之前賺得多太多了,所以 50~54 歲和 55~59 歲,我把它分成兩格來畫。

我最近才嘴過老巴不行了,但他仍然是我學習的對象。我很榮幸地發現,我們的成長曲線差不多。

我在十幾歲的時候一毛都沒有賺到,只會花錢。在 20~29 歲好不容易賺到一點錢,但結個婚、買個房就所剩不多了。所以在我的圓餅圖上就是一根細細的線。

30 多歲我進入瑞昱,那時還有股票分紅,所以賺錢很快,得到了第一桶金。40 歲出頭時,我經歷了分紅費用化、金融海嘯和轉職,以至於這 10 年的複利累積不太明顯。這個時期總計有六成的獲利來自投資,四成的獲利來自薪資的結餘-也就是稅後薪資減去家用的部份。

50~54 歲這五年,賺的比整個 40 歲更多一些。雖然這 5 年已經開始投資美股大盤,但還處於摸索期,除了 buy and hold 之外,沒有其他的想法,成效也一般般。整體獲利的 46% 有來自薪資的結餘,只有 54% 來自投資,比 40 歲還低。主要原因是工作穩定,小孩自己賺錢,儲蓄率變高所致。

55~59 歲這五年,投資組合慢慢移動到以 QQQ 為重心,複利成長的效果就比較明顯了。此時的獲利只有 23% 來自工作結餘,77% 來自投資。兩者的比例從 1:1 長到了 3:1。

在這五年當中,超商茶葉蛋默默地從 10 元漲到 12、13 元,通膨和 AI 夢大幅推升了資產的價格。最大關鍵點還是 covid-19。我從死撐股市的中國市場安然退出,低接打折的美股。特別是一度跌到 -40 元的油價,讓我即使後知後覺,都想得到應該低接能源股。因此投報率相當好。

BTW,很多人應該會聯想:那老巴 在 55~60 歲是投資了什麼才大展鴻圖的呢?根據 AI 的資料,老巴 58 歲時大買可口可樂。花了 10 億美金買下 7% KO 的股權。後面眾所皆知。

時間來到 2025 年。前兩季被川普老大玩壞了。所幸 Q3 反彈,讓我這次可以輕鬆 PO 文 。目前年度獲利翻轉為 11.12 %。由於累積了一甲子功力(誤),這 10 趴也就不少了。

雖然未來怎麼樣沒有人知道,我對美股的長期發展持續樂觀看待。現在每個月定期定額買 6 次 QQQ ,以及 3 次 PFF。

買 QQQ 理由充分,無需多言。買 PFF 的原因則是為了現金流。雖然這會比 all in 少賺一些,但穩定的現金流可以讓我退休後不用賣股票換生活費。只有單筆重大支出才需要賣股。

畢竟只要有買賣就有心魔,沒有買賣沒有傷害。我要是某個月股票多賣了 1 股,那整個月吃到薯條都不會想加大。要是賣在當月最高點,可能會慶祝八次,把賺的都敗光。另外,若是為了賣個好價錢,退休了反而要看線型找賣點,這種生活我可不想要。

本季資產配置狀況,除了定期定額、股息再投入之外都不變。其中 QQQ 的比重已經過半了。又因為台幣升值,複委託的可口可樂相對折價,想賣還沒賣。其他的組合都是高成長或是高股息,沒有高不成低不就的,目前都還滿意。我們就 Q4 再研究了。

[REF]

  1. 股市大拋售億萬富豪難逃 巴菲特今年財富仍堅定成長

我讀 «人生的五種財富»

本書的作者是薩希布魯姆 (Shahil Bloom),原文書名是 “The 5 Types of Wealth"。雖然書名有點老套,內容也不是太亮眼。但有幾個地方很值得留意。首先是這個觀念:如果你的雙親已經 60 歲,你每年回家團聚一次,則在你的餘生可能只能再見到他們 15 次。假如他們活到 85 歲的話。

同理,你的好同學們,每隔兩三年聚會一次,那麼今生見面的次數可能也數得出來。我們以為明天之後還有明天,但是這些數字很快就會到了屈指可數的那一天。二十歲的年輕人還有 20 億秒的生命,從 50 歲到 80 歲就只剩 10 億秒。問題是,我們選對了終點嗎?P. 7 提到終點謬誤這個觀念。如果把時間用在不夠對的地方,那以後很可能會後悔!

一般人的人生目標都是賺大錢,根據作者的訪談,有一定的錢之後,金錢就跟快幸福感就會脫鉤。而且不論錢多錢少,每個人的賺錢目標都是現況的兩三倍。這意味著以賺錢為目標,通常最後都不會滿足!於是作者引導出五種財富的觀念,時間、社會、心理、身體、金錢。

不意外地,大標題展開之後,作者就會針對每個題目寫一些篇幅,旁徵博引,最後全書完!真正有啟發性的,我覺得還是一開始講到的那個觀念 – 來日無多,不只是你自己,還有你關心的人。

與家人相處的時光

與孩子相處的時光

與朋友相聚的時光

與伴侶相聚的時光

與同事相處的時光

獨處的時光

其他人能在你的身邊多久是種緣分,但是你肯定要跟自己相處一輩子。所以要對自己好一點。為自己設定有意義的目標,不要為了別人的眼光而盲從!

本書講到一個觀念,剛剛我在開車回家的路上,聽到一個 Youter 介紹另外一本書 « 金錢心理學» 的時候也講到。我覺得這是天意,所以我特別 highlight 一下。摩根豪瑟在 « 致富心態» 中所言:當你看到某人開著一輛好車時,你很少會想:"哇!開那輛車的人好酷。" 相反地,你會想:"哇!如果我有那輛車,人們會覺得我好酷。" (p. 60).

如果運動員表現出矯健的身手,我們自覺投胎八輩子也趕不上,自然就會覺得運動員酷!當這個東西是買來的,特別是你也有機會買得起,那就比較可能出現 “有為者亦若是" 的想法,把焦點從羨慕別人變成想要擁有,對方看似有光環,但不多。因為前者是贏來的榮耀 / 地位、後者是買來的榮耀 / 地位。(pp. 59~61) 作者當然是強調大家要追求贏來的地位。"不要購買地位,專心在贏地位,因為獎品更充實。(p.71)

既然要介紹五大主題,其中不少內容與其他書籍相似。特別是在投資方面,通常不會帶來太多新意。畢竟,如果作者同時精通健身、人際關係、時間管理、心理諮詢和投資理財,那他應該去當直播主,這樣更有機會同時獲得五方面的財富。除了和觀眾進行問答,還可以偶爾進行吃播、運動直播,分析股市,甚至提供諮詢……這樣的情景是不是太夢幻了呢,哈哈!

言歸正傳,上面那幾張圖,大家看了之後若有所感觸的話,其實作者的貢獻已經非常大了!