套件名稱叫 python-dotenv,但 import 時寫的是 dotenv

> pip install python-dotenv

這樣做的好處是不用把 API Key 直接寫在程式裡,例如避免:




api_key = "sk-xxxxxxxx"

特別是程式要放到 GitHub 時,通常會把 .env 加到 .gitignore,避免不小心把金鑰一起上傳

--------------------------------------------------------------------------------

openrouter設計流程

啟動 openrouter.py

讀取 .env

取得 OPEN_ROUTER_API_KEY

建立 OpenAI Client

把 API 位置改成 OpenRouter

設定 AI 的 system prompt

送出 user message

OpenRouter 呼叫 DeepSeek

收到 response

response.choices[0].message.content

print() 印出 AI 回答

--------------------------------------------------------------------------------

ctrl+shift+p輸入提示> WSL: Open Folder in WSL(windows subsystem for linux)

確保程式碼(client端)是在linux環境下執行(server端)

這份 openrouter.py 的功能,是:.env 讀取 OpenRouter API Key,透過 OpenAI Python SDK 呼叫 OpenRouter 上的 DeepSeek 模型,最後把 AI 的回答印出來。

1. 載入需要的套件




import os
from dotenv import load_dotenv
from openai import OpenAI


  • os:讀取作業系統的環境變數。
  • load_dotenv:把 .env 檔案裡的設定載入成環境變數。
  • OpenAI:OpenAI Python SDK。這裡雖然使用 OpenAI 類別,但實際連線的是 OpenRouter,因為後面有修改 base_url

2. 讀取 .env




load_dotenv()

api_key = os.getenv("OPEN_ROUTER_API_KEY")


假設你的專案資料夾中有:


.env
openrouter.py


.env 裡可能寫:


OPEN_ROUTER_API_KEY=sk-or-v1-xxxxxxxx


load_dotenv() 會載入它,而:




os.getenv("OPEN_ROUTER_API_KEY")


則取得 API Key。

接著:




print("有讀到 API key 嗎?", bool(api_key))


是在檢查有沒有成功讀取。

例如:


有讀到 API key 嗎? True


代表有讀到;如果是 False,通常表示 .env 找不到、變數名稱寫錯,或 Key 沒設定。


3. 建立 OpenRouter Client




client = OpenAI(
    api_key=api_key,
    base_url="https://openrouter.ai/api/v1"
)


這裡是整份程式很重要的一段。

一般直接使用 OpenAI API 時,OpenAI() 會連到 OpenAI 的 API;但你指定:




base_url="https://openrouter.ai/api/v1"


所以 SDK 會改成把請求送到 OpenRouter

可以理解成:


你的 Python
    ↓
OpenAI Python SDK
    ↓
OpenRouter API
    ↓
DeepSeek 模型


因此,OpenAI SDK 在這裡比較像 API 呼叫工具,不代表你正在使用 OpenAI 模型。


4. 設定 System Prompt




system_prompt = "你是一個會說繁體中文,而且會使用大量表情符號互動的可愛機器人"


system_prompt 是用來設定 AI 的角色與行為。

也就是先告訴模型:

你要使用繁體中文,而且講話要像可愛機器人並使用大量 Emoji。

它不是使用者真正問的問題,而是對模型的「最高層級角色設定」之一。


5. 呼叫模型

核心程式是:




response = client.chat.completions.create(
    model="deepseek/deepseek-chat-v3-0324",
    messages=[
        {"role": "system", "content": system_prompt},
        {"role": "user", "content": "你好!你會說繁體中文嗎?你是誰呢?"},
    ],
    max_tokens=100,
    temperature=0.7,
)


可以拆成四個重要部分。

model




model="deepseek/deepseek-chat-v3-0324"


指定 OpenRouter 要使用哪個模型。


messages




messages=[
    {"role": "system", "content": system_prompt},
    {"role": "user", "content": "你好!你會說繁體中文嗎?你是誰呢?"},
]


這是聊天紀錄。

system




{"role": "system", "content": system_prompt}


設定 AI 身分。

user




{"role": "user", "content": "..."}


代表使用者實際輸入的問題。

所以模型實際收到的概念類似:


System:
你是一個會說繁體中文,而且會使用大量表情符號互動的可愛機器人

User:
你好!你會說繁體中文嗎?你是誰呢?



max_tokens=100

限制模型最多產生大約 100 個 token:




max_tokens=100


它不是「100 個中文字」;token 是模型處理文字使用的單位。

數字越大,通常代表允許回答得更長。


temperature=0.7




temperature=0.7


控制回答的隨機性。

粗略可以理解為:


temperature 低
→ 回答比較穩定、保守

temperature 高
→ 回答比較多變、有創意


0.7 算是常見的聊天設定。


6. 取得 AI 回答

API 執行完成後,結果放在:




response


程式最後:




print(response.choices[0].message.content)


可以由外往內理解:


response
└── choices
    └── [0]
        └── message
            └── content


  • choices:模型產生的回答候選。
  • [0]:拿第一個回答。
  • message:這個回答的訊息物件。
  • content:真正的文字內容。

因此最後可能印出類似:


你好呀~🤖✨ 當然可以說繁體中文!💖
我是一個可愛的 AI 機器人~
很高興認識你!🥰🌟




文章標籤:
llm
創作者介紹
創作者 天天向上 的頭像
me1237guy

天天向上

me1237guy 發表在 痞客邦 留言(0) 人氣( 4 )