2026年4月17日 星期五

Google Gemini API 學習筆記 : 新舊 API 呼叫方法整理

Google 在 2024 年底推出新版的 SDK 套件 google-genai 來取代舊版的 google-generativeai, 目前我的 LG Gram 筆電的虛擬環境安裝的最新 langchain-core 就是依賴於 google-genai, 但昨天在 Pi 3A+ 的 Bulleye 上測試發現無法安裝新版的 google-genai, 只能用舊版的 google-generativeai, 所以我將呼叫原生 Gemini API 時新舊兩種用法整理如下備查. 參考 :



1. 舊版 Gemin API (google-generativeai) 用法 :

安裝 :

pip install google-generativeai 

匯入 :

import google.generativeai as genai 

設定金鑰 :

genai.configure(api_key=api_key)

建立模型 :

model=genai.GenerativeModel('gemini-2.5-flash') 

提問 :

reply=model.generate_content('你是誰?')  

取得回覆 : 

print(reply.text)


2. 新版 Gemin API (google-genai) 用法 :

安裝 :

pip install google-genai 

匯入 :

from google import genai 

建立 Client 物件 (設定金鑰) :

client=genai.Client(api_key=api_key)

建立模型 & 提問 :

reply=client.models.generate_content(
    model='gemini-2.5-flash', 
    contents='你是誰?'
    )

取得回覆 : 

print(reply.text)

樹莓派學習筆記 : 在 Bulleye 上安裝 google-generativeai 套件

昨天成功重灌 Pi 3A+ 的 Bulleye 後嘗試安裝 langchain-core, 結果因為版本衝突不順利, 且就算安裝成功, 由於 Pi 3A+ 只有 512MB DRAM, 跑 langchain 太沉重了只好放棄, 改為安裝原生 SDK. 安裝 openai 套件成功且可順利匯入 :

pi@pi3aplus:~ $ pip install openai   
Looking in indexes: https://pypi.org/simple, https://www.piwheels.org/simple
Collecting openai
...(略)...
Installing collected packages: openai
Successfully installed openai-2.32.0
pi@pi3aplus:~ $ python   
Python 3.9.2 (default, Jan 24 2026, 09:41:14) 
[GCC 10.2.1 20210110] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> from openai import OpenAI   
>>> exit()  

安裝 Gemini 舊版 API 的 google-generativeai 套件 : 

pi@pi3aplus:~ $ pip install google-generativeai   
Looking in indexes: https://pypi.org/simple, https://www.piwheels.org/simple
Collecting google-generativeai
  Downloading google_generativeai-0.8.6-py3-none-any.whl (155 kB)
...(略)...
Successfully installed google-ai-generativelanguage-0.6.15 google-api-python-client-2.194.0 google-auth-httplib2-0.3.1 google-generativeai-0.8.6 grpcio-1.80.0 grpcio-status-1.71.2 httplib2-0.31.2 protobuf-5.29.6 uritemplate-4.2.0

但用 import google.generativeai as genai 匯入時會出現 grpcio 相關錯誤, 原因也是版本衝突問題, AI 建議改用下列安裝指令鎖住版本 : 

pi@pi3aplus:~ $ pip install "google-generativeai==0.3.1" \
            "google-ai-generativelanguage==0.4.0" \
            "grpcio==1.54.2" \
            "grpcio-status==1.54.2" \
            "protobuf==4.25.3" \
            --force-reinstall --no-cache-dir   
Looking in indexes: https://pypi.org/simple, https://www.piwheels.org/simple
Collecting google-generativeai==0.3.1
  Downloading google_generativeai-0.3.1-py3-none-any.whl (146 kB)
...(略)...
Successfully installed certifi-2026.2.25 cffi-2.0.0 charset-normalizer-3.4.7 cryptography-46.0.7 google-ai-generativelanguage-0.4.0 google-api-core-2.29.0 google-auth-2.49.2 google-generativeai-0.3.1 googleapis-common-protos-1.73.0 grpcio-1.54.2 grpcio-status-1.54.2 idna-3.11 proto-plus-1.27.1 protobuf-4.25.3 pyasn1-0.6.3 pyasn1-modules-0.4.2 pycparser-2.23 requests-2.32.5 tqdm-4.67.3 typing-extensions-4.15.0 urllib3-2.6.3

這樣匯入時就只報出無關緊要的 Warning 了 (這些警告只是提醒 : Python 3.9 太舊了, 以後可能不支援而已) : 

pi@pi3aplus:~ $ python  
Python 3.9.2 (default, Jan 24 2026, 09:41:14) 
[GCC 10.2.1 20210110] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import google.generativeai as genai   
/home/pi/.local/lib/python3.9/site-packages/google/api_core/_python_version_support.py:246: FutureWarning: You are using a non-supported Python version (3.9.2). Google will not post any further updates to google.api_core supporting this Python version. Please upgrade to the latest Python version, or at least Python 3.10, and then update google.api_core.
  warnings.warn(message, FutureWarning)
/home/pi/.local/lib/python3.9/site-packages/google/auth/__init__.py:54: FutureWarning: You are using a Python version 3.9 past its end of life. Google will update google-auth with critical bug fixes on a best-effort basis, but not with any other fixes or features. Please upgrade your Python version, and then update google-auth.
  warnings.warn(eol_message.format("3.9"), FutureWarning)
/home/pi/.local/lib/python3.9/site-packages/google/oauth2/__init__.py:40: FutureWarning: You are using a Python version 3.9 past its end of life. Google will update google-auth with critical bug fixes on a best-effort basis, but not with any other fixes or features. Please upgrade your Python version, and then update google-auth.
  warnings.warn(eol_message.format("3.9"), FutureWarning)

如果不想看到這些警告, 可以在程式開頭用下列程式碼隱藏 :

import warnings
warnings.filterwarnings("ignore", category=FutureWarning)

如果想永久隱藏, 就要用 nano ~/.bashrc 去修改設定檔, 在最底下加上 :

export PYTHONWARNINGS="ignore::FutureWarning"

用下列程式測試可正確載入 API :

import grpc
print(f"GRPC 版本: {grpc.__version__}") # 應該要是 1.54.2
import google.generativeai as genai
print("Gemini SDK 成功載入!")

>>> import google.generativeai as genai    
>>> print(genai.__version__)   
0.3.1
>>> try:
...     print("SDK 載入成功,準備測試屬性...")
...     model = genai.GenerativeModel('gemini-pro')
...     print("模型物件建立成功!")
... except Exception as e:
...     print(f"執行出錯: {e}")
... 
SDK 載入成功,準備測試屬性...
模型物件建立成功!

我把 Gemini API 金鑰放在環境變數檔 .env 裡的 GEMINI_API_KEY 中利用 dotenv 套件讀取後實際呼叫 Gemini API 測試 OK :

>>> import google.generativeai as genai  
>>> from dotenv import dotenv_values   
>>> config=dotenv_values('.env')     
>>> gemini_api_key=config.get('GEMINI_API_KEY')   
>>> genai.configure(api_key=gemini_api_key)    
>>> model=genai.GenerativeModel('gemini-2.5-flash')   
>>> reply=model.generate_content('你是誰?')    
>>> print(reply.text)    
我是一個大型語言模型,由 Google 訓練。
我沒有名字、沒有身體,也沒有個人情感或意識。我的目的是回答你的問題、提供資訊、進行對話,並在各種任務上提供幫助。

下面是 OpenAI API 的測試 :

>>> from openai import OpenAI   
>>> from dotenv import dotenv_values 
>>> config=dotenv_values('.env')
>>> openai_api_key=config.get('OPENAI_API_KEY')    
>>> client=OpenAI(api_key=openai_api_key)   
>>> reply=client.chat.completions.create(   
...     messages=[   
...         {"role": "user",
...          "content": "你是誰?",
...         }],
...     model="gpt-3.5-turbo",
...     )
>>> print(reply.choices[0].message.content)
我是一個AI人工智能助手,可以與你進行對話、回答問題和提供信息。有什麼我可以幫助你的嗎?

樹莓派學習筆記 : 消除 PATH 環境變數警告的方法

高雄家的 Pi 3 A+ 主機在三月下旬我去日本時不明原因當機 (應該是 8GB TF 卡掛了), 它負責的爬蟲停擺, 回來後一直沒時間修復, 昨晚找出一片 32GB TF 卡重新燒錄 Bulleye 後已重新上線. 但在更新套件時出現一個警告 : 

pi@pi3aplus:~ $ pip install --upgrade requests urllib3   
Looking in indexes: https://pypi.org/simple, https://www.piwheels.org/simple
Requirement already satisfied: requests in /usr/lib/python3/dist-packages (2.25.1)
Collecting requests
... (略)...
Installing collected packages: urllib3, charset-normalizer, requests
  WARNING: The script normalizer is installed in '/home/pi/.local/bin' which is not on PATH.
  Consider adding this directory to PATH or, if you prefer to suppress this warning, use --no-warn-script-location.
Successfully installed charset-normalizer-3.4.7 requests-2.32.5 urllib3-2.6.3

此警告意思是套件有安裝可執行腳本 (此處為 normalizer), 但該腳本所在目錄 /home/pi/.local/bin 沒有在 PATH 裡, 所以若在終端機直接打指令 (normalizer) 時會找不到, 出現 command not found 錯誤. 如果根本不用 CLI 工具執行此套件可忽略此警告, 但以後 pip install 時仍可能出現, 為了不礙眼, 乾脆將 /home/pi/.local/bin 加入 PATH 裡一勞永逸, 做法如下 :

編輯 .bashrc : 

pi@pi3aplus:~ $ nano ~/.bashrc   

在最底下加入此目錄 : 

export PATH="$HOME/.local/bin:$PATH"




重新執行 .bashrc 即可 :

pi@pi3aplus:~ $ source ~/.bashrc   

2026年4月16日 星期四

好站 : 高見龍老師的部落格

三月時內訓課程請到六角學院的高見龍老師來講 SDD 規格驅動開發, 讓我覺得獲益匪淺, 其實課程內容的精髓大部份都可以在其部落格找到 :


部落格中與 SDD 規格驅動開發有關的是這幾篇 :


其中 Spectra 是高老師為 OpenSpec 開發的 GUI 工具, 可以讓 OpenSpec 用起來更簡單更直覺, 剛好我最近正在學 OpenSpec 用得上 (雖然我只開發小專案, 但江湖在走, SDD 還是要有). 

我去年參加公司的 Hahow 企業版線上課程時就上了不少高老師的課 (Python, Javascript, 網頁前端), 不管是口條或內容都非常棒, 雖說 AI 時代學習這些技能似乎不那麼重要了, 但有基礎的人與菜菜小白終究是不同的. 

2026年4月15日 星期三

好站 : 工程師下班有約

最近上了幾堂林鼎淵老師的 Vibe coding 內訓課程, 覺得他是實力厚實備課非常認真的老師, 這從等候程式執行的幾分鐘, 他都有準備小知識與開發經驗談來墊檔與分享可見一斑. 他經營的 YT 頻道有非常多實用與最新的 AI 技術分享影片 (尤其是 Vibe coding), 值得記下來有空時學習 : 


2026年4月14日 星期二

(補記) 購買 Accupass AI 實戰工作坊

月初 (大約 4/6) 在 Accupass 買了一堂 Vibe coding 線上課程忘了記錄下來, 今天整理截圖才發現, 4/18 (六) 13:30~16:30 上課, 馬上列入行事曆以免錯過 :




我在 Hahow 也還有四門課買了尚未啟用學習, 第二季要來完成進度了. 

如何尋找靜音中的手機

前天 (週日) 爸坐阿泉伯的車去愛心會開會, 手機掉在車上未發覺, 回到家才發現手機不見了, 我透過定位發現手機在阿泉伯家, 但去他家找了三遍都沒找到, 撥電話都沒聽到響鈴, 我懷疑爸是否誤將手機關靜音, 於是問 Gemini 如何在手機靜音狀態下讓它發出聲音? 方法如下 :
  1. 在電腦或其他行動裝置的瀏覽器網址 google.com/android/find 
  2. 登入要尋找的手機的 Google 帳號
  3. 在左側面板或選單中點擊 「播放音效」(Play Sound)
我開啟自己的手機瀏覽器, 連線 google.com/android/find, 登入爸的 Google 帳戶後, 點選 "安全性與登入" :




點選尋找遺失的裝置 : 




點選要找尋的手機 OPPO A38 :




按 "播放音效" 就會持續播放 5 分鐘的響鈴了 :





最後是在阿泉伯媳婦提醒下在車子副駕椅子下找到手機, 雖然這個方法並未建功 (在車內就算響鈴除非走近也聽不到), 但如果要在家裡某個角落找尋亂放的手機就能派上用場了. 

2026年4月12日 星期日

2026 年第 14 周記事

時光飛逝, 思緒還駐留在大阪城門口初綻的櫻花, 怎麼一轉眼已來到四月中旬矣, 三周前還要穿長袖冬衣, 現在已換季來到夏天了, 三月真是一個天氣多變的月份. 

本周回頭抓了一下 LangChain 與 LLM 串接的進度, 其實只是想對借來的書有所交代而已, 目前重點還是 Vibe coding, 以及較專業些的 SDD, 這周末都在補課, 之前購買的線上課程在 3/28 就開課了, 但那時在忙掃墓, 所以沒跟上. 上完課覺得, 我其實都只開發小型專案而已, SDD 對我而言似乎大砲打小鳥. 不過或許以後用得著, 就學起來吧.  

今天早上爸去參加愛心會理監事開會, 中午回來吃過飯後發現手機不見了, 我用 Google 地圖定位發現手機在阿泉伯家, 但我騎車下去找, 現場撥電話也沒聽到響鈴, 猜測可能掉水裡, 但周邊水溝來回也沒找著. 傍晚忙完芭樂套袋, 騎機車再次去阿泉伯家, 剛好遇見他媳婦阿勤, 我說好奇怪, 明明定位在你家, 為何找不到? 她說會不會掉在車裡, 因為早上爸是搭阿泉伯車去開會, 打開車門果然掉在椅子下, 難怪撥電話都聽不到響鈴. 幸好找到了, 不然得買新手機, 且還要跑中華電信換 SIM 卡. 

2026年4月11日 星期六

LangChain 學習筆記 : 提示詞模板 (二)

上一篇測試是針對字串提示詞模板類別 PromptTemplate, 主要是用於單一句子的簡單提問, 功能類似於 f 字串, 可快速填充模板參數以得到完整的訊息字串. 本篇旨在測試需要更多上下文語境的對話提示模板類別 ChatPromptTemplate 之用法. 

本系列全部文章索引參考 :


本篇同樣會使用 OpenAI 與 Gemini API 來測試對話提示詞模板用法, 首先匯入所需之金鑰與外掛套件並預先建立模型物件 :  

(myvenv) D:\python\test>python   
Python 3.12.1 (tags/v3.12.1:2305ca5, Dec  7 2023, 22:03:25) [MSC v.1937 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> from langchain_openai import ChatOpenAI   
>>> from langchain_google_genai import ChatGoogleGenerativeAI  
>>> from dotenv import dotenv_values   
>>> config=dotenv_values('.env')   
>>> openai_api_key=config.get('OPENAI_API_KEY')   
>>> gemini_api_key=config.get('GEMINI_API_KEY')   
>>> gpt_model=ChatOpenAI(api_key=openai_api_key, model='gpt-3.5-turbo')     
>>> gemini_model=ChatGoogleGenerativeAI(api_key=gemini_api_key, model='gemini-2.5-flash')   

然後從 langchain_core 匯入 prompts 子模組下的 ChatPromptTemplate 類別 (因為之前只安裝 langchain_core, 沒有安裝大禮包 langchain) :

>>> from langchain_core.prompts import ChatPromptTemplate   

ChatPromptTemplate 類別的核心在於角色扮演, 它不像 PromptTemplate 那樣把所有內容塞成一個大字串, 而是將對話拆解成不同的角色訊息, 在 LangChain 的訊息物件中有三種角色 : 
  • System (系統) : 設定 AI 的人格, 背景, 規則 (例如 "你是一位 Python 專家")
  • Human (使用者) : 你對 AI 的提問
  • AI (助手) : AI 之前回覆過的內容 (用於提供對話脈絡)
呼叫 ChatPromptTemplate 類別的建構式 ChatPromptTemplate() 時, 要把對話內容依照角色拆分, 將其 system, human, 與 ai 三種角色的訊息組成元組串列傳入建構式, 傳回值為一個 ChatPromptTemplate 物件, 例如下面的翻譯對話模板 : 

>>> chat_template=ChatPromptTemplate.from_messages([
    ("system", "你是一位專業的 {style} 翻譯員,擅長將繁體中文翻譯成優雅的 {language}。"), 
    ("human", "請翻譯這段話:{text}"), 
    ]) 

此模板中嵌入了三個模板參數 : style, language, 與 text, 填充此三個參數可以呼叫 ChatPromptTemplate 物件的兩個方法 : 
  • format_message() : 傳入值為個別模板參數, 傳回值為訊息物件串列
  • invoke() : 傳入值為模板參數字典, 傳回值為 ChatPromptValue 物件
不論是哪一種傳回值, 都可以做為參數直接傳給模型物件的 invoke() 方法向 LLM 提交提示詞. 首先來測試使用 format_message() 來填充模板參數, 先準備要翻譯的文本 text : 

>>> text='''趁著午後的陽光灑進窗台,我決定暫時放下手中的電路板與程式碼,給自己泡一杯清茶,享受這難得的靜謐時光。生活不應該只有邏輯與迴圈,還要有隨處可見的驚喜。''' 

然後傳入 style, language, 與 text 參數來填充模板 :

>>> messages=chat_template.format_messages(style="出版業", language="英文", text=text)    
>>> type(messages)   
<class 'list'>   
>>> messages    
[SystemMessage(content='你是一位專業的 出版業 翻譯員,擅長將繁體中文翻譯成優雅的 英文。', additional_kwargs={}, response_metadata={}), HumanMessage(content='請翻譯這段話:趁著午後的陽光灑進窗台,我決定暫時放下手中的電路板與程式碼,給自己泡一杯清茶,享受這難得的靜謐時光。生活不應該只有邏輯與迴圈,還要有隨處可見的驚喜。', additional_kwargs={}, response_metadata={})]

可見 format_messages() 傳回一個訊息物件串列, 裡面有 SystemMessage 與 HumanMessage 等角色的訊息物件 (此對話尚未有 AIMessage 物件), 這樣就可以把填充完的訊息物件串列傳給模型的 invoke() 方法來生成回應了, 例如 GPT : 

>>> response=gpt_model.invoke(messages)   
>>> print(response.content)     
With the afternoon sunlight streaming in through the window, I decided to temporarily set aside the circuit boards and code in my hands, brew myself a cup of clear tea, and savor this rare moment of tranquility. Life shouldn't just be about logic and loops; it should also be filled with unexpected delights at every turn.

下面是串接 Gemini 的回應 :

>>> response=gemini_model.invoke(messages)   
>>> print(response.content)  
以下是幾種翻譯選項,從較為直接到更為優雅的風格:

**選項一 (較為直接,但仍優雅):**

> As the afternoon sun streamed onto the windowsill, I decided to temporarily set aside my circuit board and code. I would brew myself a cup of soothing tea and savor this rare moment of tranquility. Life shouldn't be solely about logic and loops; it should also be filled with readily found surprises.

**選項二 (更為優雅,帶有文學氣息):**

> Bathed in the afternoon sun gracing the windowsill, I chose to momentarily put down my circuit board and code. A cup of fine tea beckoned, promising a rare interlude of serenity. Life, after all, should not be confined to logic and loops, but should also embrace the unexpected delights found at every turn.

**選項三 (簡潔而富有詩意):**

> With the afternoon sun warming the windowsill, I paused from my circuit board and code. A soothing cup of tea, a rare moment of quietude – these were my new companions. For life, I believe, demands more than just logic and loops; it calls for the unexpected joys that lie around every corner.

---

**選擇建議:**

*   如果希望保持原句的結構和語氣,**選項一** 是個不錯的選擇。
*   如果希望加入更多文學色彩和更豐富的詞彙,讓譯文讀起來更具美感,**選項二** 會是最佳選擇。
*   如果偏好更精煉、更具哲思的表達,**選項三** 則能達到這個效果。

我個人最推薦**選項二**,它最能體現「優雅的出版業翻譯」的要求。

接下來改用 ChatPromptTemplate 物件的 invoke() 方法來填充, 這時要把模板參數打包成字典傳給模型物件的 invoke() 方法 : 

>>> messages=chat_template.invoke({
    'style': '科技業', 
    'language': '日文', 
    'text': '這支程式的執行效率非常高。'
    })
>>> type(messages)   
<class 'langchain_core.prompt_values.ChatPromptValue'>   
>>> messages   
ChatPromptValue(messages=[SystemMessage(content='你是一位專業的 科技業 翻譯員,擅長將繁體中文翻譯成優雅的 日文。', additional_kwargs={}, response_metadata={}), HumanMessage(content='請翻譯這段話:這支程式的執行效率非常高。', additional_kwargs={}, response_metadata={})])

可見傳回值是一個 ChatPromptValue 物件, 裡面包裹著 SystemMessage 與 HumanMessage 等角色的訊息物件, 可以直接把這個 ChatPromptValue 物件傳給模型的 invoke() 方法來生成回應, 例如 GPT : 

>>> response=gpt_model.invoke(messages)   
>>> print(response.content)     
このプログラムの実行効率は非常に高いです。

也可串接 Gemini :

>>> response=gemini_model.invoke(messages)   
>>> print(response.content)   
這支程式的執行效率非常高。
**このプログラムは実行効率が非常に高いです。**

或者,稍微更強調性能的話:
**このプログラムの実行効率は非常に優れています。**
*(This program's execution efficiency is excellent.)*

2026年4月10日 星期五

LangChain 學習筆記 : 提示詞模板 (一)

LangChain 的提示詞模板 (Prompt Templates) 功能利用預留變數將靜態文字轉化為動態指令, 可根據不同的傳入參數重複生成結構化的提示詞. LangChain 的 langchain_core.prompts 子模組提供兩種提示詞模板 :
  • 字串提示模板 (PromptTemplate 類別):
    用於單一句子的簡單提問
  • 對話提示模板 (ChatPromptTemplate 類別) :
    用於需要更多上下文語境之完整對話
本篇旨在測試字串提示模板 PromptTemplate 類別的用法. 

本系列全部文章索引參考 :


以下將使用 OpenAI 與 Gemini API 來測試字串提示模板用法, 首先匯入所需之金鑰與外掛套件並預先建立模型物件 :  

(myvenv) D:\python\test>python   
Python 3.12.1 (tags/v3.12.1:2305ca5, Dec  7 2023, 22:03:25) [MSC v.1937 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> from langchain_openai import ChatOpenAI   
>>> from langchain_google_genai import ChatGoogleGenerativeAI  
>>> from dotenv import dotenv_values   
>>> config=dotenv_values('.env')   
>>> openai_api_key=config.get('OPENAI_API_KEY')   
>>> gemini_api_key=config.get('GEMINI_API_KEY')   
>>> gpt_model=ChatOpenAI(api_key=openai_api_key, model='gpt-3.5-turbo')     
>>> gemini_model=ChatGoogleGenerativeAI(api_key=gemini_api_key, model='gemini-2.5-flash')   

由於之前在虛擬目錄下只安裝 langchain_core, 沒有安裝大禮包 langchain; 所以要從 langchain_core 匯入 prompts 子模組下的 PromptTemplate 類別 :

from langchain_core.prompts import PromptTemplate

>>> from langchain_core.prompts import PromptTemplate    

然後呼叫其建構式 PromptTemplate() 並傳入 template (字串) 與 input_variables (串列) 參數建立 PromptTemplate 物件, 其中 input_variables 中列舉了要傳入之模板參數, 例如 : 

prompt_template=PromptTemplate(
    template='用 300 個以內的字說明關於{topic}的知識',
    input_variables=['topic']  
    )

此 PromptTemplate 物件含有一個模板參數 topic. 

>>> prompt_template=PromptTemplate(
...     template='用 300 個以內的字說明關於{topic}的知識',   
...     input_variables=['topic']  
...     )  
>>> type(prompt_template)   
<class 'langchain_core.prompts.prompt.PromptTemplate'>
>>> prompt_template   
PromptTemplate(input_variables=['topic'], input_types={}, partial_variables={}, template='用 300 個以內的字說明關於{topic}的知識')

上面所建立的 PromptTemplate 物件只是一個模板結構而已, 還不能直接做為訊息物件傳給語言模型, 必須呼叫 PromptTemplate 物件的 format() 或 invoke() 方法傳入模板參數進行填充後才行, 這兩個方法的差異如下 : 
  • format() :
    單純的字串填充, 傳入值為單一字串, 傳回值是填充後的字串, 效果類似 f 字串的功能. 
  • invoke() :
    這是 LCEL (LangChain Expression Language) 的標準接口, 是為了配合 LCEL 的鏈式調用而設, 也是推薦的用法. 它的傳入值為模板參數字典, 傳回值為 PromptValue 物件, 它會根據後續接的是純文字模型還是對話模型自動轉成 StringPromptValue 或 ChatPromptValue 物件後傳回. 
總之, 如果是要除錯, 列印提示詞內容, 或串接非 LangChain 的自定義函數等場景, 可以呼叫 format() 以快速得到填充後的字串; 如果是要參與 LangChain 的鏈 (Chain) 運算, 則應該呼叫 invoke(). 

首先用 format() 方法來填充 :

>>> prompt_string=prompt_template.format(topic='疊加態')   
>>> type(prompt_string)    
<class 'str'>  
>>> prompt_string   
'用 300 個以內的字說明關於疊加態的知識'

可見 format() 傳回填充後的訊息字串, 這樣就可以傳給模型物件的 invoke() 讓模型來生成回應了, 例如 OpenAI 的 GPT :

>>> response=gpt_model.invoke(prompt_string)   
>>> print(response.content)  
疊加態是一種量子物理學中的概念,指的是當一個系統同時處於多個可能的狀態時,這些狀態之間可以相互叠加,而不會直接混合在一起。
在疊加態中,系統可以同時存在於不同的狀態中,直到進行測量時才會產生確定的結果。這也解釋了量子超密碼等量子現象的奇異性。
疊加態是量子力學中的一個核心概念,也是量子計算和量子通信等領域的基礎。通過利用疊加態,科學家們可以設計出更快速和更強大的計算機系統,以及更加安全和高效的通訊技術。
總的來說,疊加態是一個深奧而又神秘的概念,它挑戰了我們對現實世界的直覺和理解,也為我們揭示了量子世界的獨特之處。

或者谷歌的 Gemini : 

>>> response=gemini_model.invoke(prompt_string)   
>>> print(response.content)   
疊加態是量子力學中的一個基本概念,指微觀粒子在被測量前,可以同時處於多個可能的狀態。例如,一個電子可以同時向上和向下自旋,或同時在多個位置。只有當我們進行觀測或測量時,疊加態才會「坍縮」,粒子隨機選擇其中一個狀態顯現出來。在未觀測前,它並非處於某個確定的狀態,而是所有可能性的疊加。

其次, 改為呼叫 invoke() 方法, 這時傳入參數是模板參數字典 : 

>>> prompt_value=prompt_template.invoke({'topic': '普郎克常數'})   
>>> type(prompt_value)   
<class 'langchain_core.prompt_values.StringPromptValue'>  
>>> prompt_value   
StringPromptValue(text='用 300 個以內的字說明關於普郎克常數的知識')    

由於模板是純文字模型, 所以傳回值為 StringPromptValue 物件, 可以直接將此 PromptValue 物件傳給模型來生成回應, 例如 GPT :

>>> response=gpt_model.invoke(prompt_value)   
>>> print(response.content)     
普朗克常數是物理學中的一個重要常數,通常用符號h表示。它的數值約為6.626×10^-34 J·s。普朗克常數被廣泛應用於量子力學和粒子物理學中,尤其是在描述微觀世界中微小粒子的運動和行為時。根據普朗克常數,能量和頻率之間存在著一個固定的關係,即E=hf,其中E是能量,h是普朗克常數,f是頻率。普朗克常數還與黑體輻射和光子的能量密度等現象密切相關。因此,普朗克常數在物理學中具有重要的地位,對於我們理解微觀世界的運作方式至關重要。

或者 Gemini 模型 : 

>>> response=gemini_model.invoke(prompt_value)   
>>> print(response.content)  
普朗克常數(h)是一個基本物理常數。它揭示了能量的量子化現象,即能量不是連續的,而是以離散的「量子」形式存在。它將光子的能量E與其頻率ν聯繫起來,公式為E=hν。普朗克常數是量子力學的基石,描述了微觀世界中能量的最小作用量單位。

這就是使用 LangChain 的好處, 不論是串接哪一個 LLM, 呼叫介面都相同.