Python 程式設計 - 高階

LangChain 怎麼玩? LCEL (LangChain Expression Language) 篇,一定要認識的 LangChain 核心

LangChain 怎麼玩?入門教學篇 雖然有提到 LCEL(LangChain Expression Language), 不過並沒有深入理解到底什麼是 LCEL 。

LCEL 是 LangChain 的核心,如果要能夠設計出更複雜的 LangChain 應用,甚至是將 LangChain 應用轉為 API 對外服務,那麼 LCEL 是一定要認識/理解的。

Posted on  Feb 27, 2024  in  LangChain , Python 程式設計 - 高階  by  Amo Chen  ‐ 5 min read

LangChain 怎麼玩? Agents 篇,來整合一些客製化的功能/工具吧

你有沒有特別想過如果我們開發的功能要怎麼跟語言模型進行結合?畢竟語言模型如果只能做聊天應用的話,那麼它的應用範圍就相當侷限。

這個問題的解答就是 LangChain 的 Agents 。

Agents 可以讓我們把自己開發的功能接上語言模型,讓語言模型執行我們所開發的功能!

本文同樣以 1 個簡單的範例開始,帶大家建立自己的 Agents 。

Posted on  Feb 24, 2024  in  LangChain , Python 程式設計 - 高階  by  Amo Chen  ‐ 7 min read

LangChain 怎麼玩? Retrieval 篇,來做個聊天機器人(ChatBot)吧

LangChain 怎麼玩?入門教學篇 中,我們學會如何透過 LangChain 與語言模型進行互動,不過很可惜的是它不像 ChatGPT 那樣記住對話內容,另外也無法輸入新的資料,訓練它像客服機器人一樣回答特定的問題。

本文將進一步突破這些限制,讓我們能夠做出像 ChatGPT 那樣的對話應用,甚至是輸入新的資料給語言模型,讓它能夠回答特定的問題!

Posted on  Feb 8, 2024  in  LangChain , Python 程式設計 - 高階  by  Amo Chen  ‐ 9 min read

LangChain 怎麼玩?入門教學篇

AI 時代,打不贏就加入它!

所以個人認為學會 LangChain 之類的框架,在未來可能會是每個程式設計師不可或缺的技術,也就是說除了寫程式之外,你可能還需要用 LangChain 之類的框架做出適合自己的工具,幫助提升效率與生產力,藉此增加自身的職場優勢。

本文將介紹 LangChain 結合 llama 語言模型如何使用的入門教學。

p.s. 使用開源語言模型的 llama 的好處在於不用付費,輸出品質也有一定保證

Posted on  Feb 2, 2024  in  LangChain , Python 程式設計 - 高階  by  Amo Chen  ‐ 5 min read

Python 細說 type() 與 Metaclass

Python 的類別定義有個神奇的參數,稱為 metaclass , 範例如下:

class Meta(type):
    pass

class A(metaclass=Meta):
    pass

這個參數不是繼承(inheritance), 但是它到底具體是做什麼的呢?就讓本文娓娓道來吧!

Posted on  Oct 26, 2023  in  Python 程式設計 - 高階  by  Amo Chen  ‐ 4 min read

Python contextvars 模組教學

大家都知道執行緒(Threads)之間會共用 Process 的記憶體,這種共用的情況有可能造成 Race Condition, 使得程式出現不可預期的行為或錯誤,所幸這個問題可以透過 threadling.local 解決。

而 Python 3.4 之後推出 asyncio 模組,使得 Python 具備執行非同步 I/O (asynchronous I/O) 的能力,開發者可以同時結合 multiprocessing , threading 以及 asyncio 將 Python 效能提升至全新檔次,但是當結合 threading 以及 asyncio 時,可能會遭遇一個問題, 多個協程(coroutines)可能會在同 1 個執行緒中執行,因此多個 coroutines 也可能有互相影響的情況!所以有了 contextvars 模組,用以解決 coroutines 互相干擾的情況,將每個 coroutine 以 Context 切開,避免互相干擾!

Thread-local variables are insufficient for asynchronous tasks that execute concurrently in the same OS thread. Any context manager that saves and restores a context value using threading.local() will have its context values bleed to other code unexpectedly when used in async/await code.

Posted on  Sep 21, 2023  in  Python 程式設計 - 高階  by  Amo Chen  ‐ 4 min read

Python 套件推薦 - rustimport 給你的 Python 一對翅膀

不可否認 Python 以其優異的生態系與社群資源為開發帶來速度優勢。

不過每個應用都有效率極限, Python 當然也不例外,而且 Python 天生比起 JavaScript, Java 等語言更容易遇到效能瓶頸,這時候通常有 3 種選擇:

  1. 改用效率較好的寫法或套件
  2. 部分功能/元件改用別的語言實作
  3. 全部用別的語言實作

選項 1 是最簡單的,只要能夠找到更快的寫法或者更好的套件,就能夠緩解問題,再撐一陣子;選項 3 則是最困難的,要有足夠的時間以及負責人的支持之下,才有可能進行,畢竟所有的功能都必須改寫之外,測試也是需要全部重新來過,更何況通常公司專案都有時程壓力,選項 3 通常都是難以說服高層的選項;至於選項 2 則是折衷選項,建議選項 1 已經無法解決問題時採用,目前很多 Python 套件為了效率也都會採用選項 2 的做法,例如 orjson 就是以 Rust 語言實作的 JSON parser 。

目前 Python 與 Rust 的介接主要靠 PyO3 , 不過步驟稍微複雜一些,本文將介紹如何透過 rustimport 套件,極度簡化介接 Python 與 Rust 的方法,讓開發 Python 擴充套件可以更快樂、簡便!

Posted on  Sep 18, 2023  in  Python 模組/套件推薦 , Python 程式設計 - 高階  by  Amo Chen  ‐ 4 min read

Python threading.local() 解說

我們都知道多個執行緒(thread)之間會共用 Process 的記憶體,那你覺得以下範例程式的執行結果會是什麼呢?這是 2 個執行緒分別做 +1 與 -1 運算各 100,000 次的 Python 程式:

import threading


def count(thread_name, step=1):
    global v
    for i in range(0, 100000):
        v += 1 * step
    print(f'{thread_name} -> ', v, flush=True)


v = 0
t1 = threading.Thread(target=count, args=('t1', 1, ))
t2 = threading.Thread(target=count, args=('t2', -1, ))
t1.start()
t2.start()
t1.join()
t2.join()

這段範例程式的執行結果,就跟本文要解說的 threading.local() 有關。

Posted on  Sep 4, 2023  in  Python 程式設計 - 高階  by  Amo Chen  ‐ 3 min read