昨天寫好 黑殼蝦 LINE 機器人,馬上想到有趣實驗 - 我們跟 AI 聊天、上網、看圖、交辦任務,背後是要燒 Token 的,用得很開心,背後花掉多少錢?

大部分的訂閱制 AI 模型都是以 Token 計費,其中輸入送交模型的提示、文字、圖片等上下文是一個價格,模型輸出的內容則是另一種。以我最常用的 GPT-5.2-Chat 為例,使用 Azure 模型的價格約為輸入每一百萬 Token 台幣 54.84 元,輸出每百萬 Token 438.66 元。

至於圖檔,查了文件,OpenAI 電腦視覺會依據圖檔解析度及與忠實度(Fidelity)轉換 Token,以 gpt-5-chat 為例:參考

  • 基本成本:每張傳送給模型的圖片固定消耗 70 Token
  • 圖塊成本:圖片切分成數個 512 x 512 像素的「圖塊」(Tiles),每個圖塊消耗 140 Token
  • 若使用高忠實度(High Fidelity)模式,會再依長寬比增加固定 Token。

搞懂計費規則,我對程式做了簡單改寫,一是呼叫時加入計時,並透過回應結果 Response.Usage 取得 InputTokenCount 及 OutputTokenCount,得到輸入、輸出耗用的 Token 數統計:

var sw = System.Diagnostics.Stopwatch.StartNew();
var res = await agent.RunAsync(chatMsg, sessionState.Session);
sw.Stop();
outMsg = res.Text;
var inTokens = res.Usage?.InputTokenCount ?? 0;
var outTokens = res.Usage?.OutputTokenCount ?? 0;
sessionState.AddTokens(inTokens, outTokens);
outMsg += $"\n # 耗時 {sw.Elapsed.TotalSeconds:n1}s, IN {inTokens:n0} / OUT {outTokens:n0} Tokens, {sessionState.TokenUsage}";

另一方面我修改 SessionState,在上面加入累計輸入輸出 Token 計算成本的功能:

public class SessionState
{
    NLog.Logger logger = null!;
    public string SessionId { get; set; } = "NA";
    public string LineUserId { get; set; } = "NA";
    public static string ModelName { get; set; } = "Unset";
    public static decimal ModelInTokenRate { get; set; } = 0;
    public static decimal ModelOutTokenRate { get; set; } = 0;
    public long InTokens { get; set; }
    public long OutTokens { get; set; }
    public Microsoft.Agents.AI.AgentSession Session { get; set; } = null!;
    public SessionState(string lineUserId, Microsoft.Agents.AI.AgentSession session)
    {
        Console.WriteLine($"建立新 Session: {lineUserId}");
        LineUserId = lineUserId;
        Reset(session);
    }
    public void Reset(Microsoft.Agents.AI.AgentSession session)
    {
        SessionId = $"{LineUserId}-{DateTime.Now:yyyyMMdd-HHmmss}-{Guid.NewGuid().ToString().Substring(0, 4)}";
        logger = NLog.LogManager.GetLogger(SessionId);
        Session = session;
        Images.Clear();
    }
    public List<AIContent> Images = new List<AIContent>();
    public void LogInput(string msg) => logger.Debug("INPUT\n" + msg);
    public void LogOutput(string msg) => logger.Debug("OUTPUT\n" + msg);
    public void AddTokens(long inTokens, long outTokens)
    {
        InTokens += inTokens;
        OutTokens += outTokens;
    }
    public string TokenUsage => $" 交談累計成本({ModelName}) IN:{InTokens / 1024f:n1}K ({InTokens * ModelInTokenRate:n2} 元), OUT:{OutTokens / 1024f:n1}K ({OutTokens * ModelOutTokenRate:n2}元)";
}

接著,來做幾個簡單實驗。

  1. 每次輸入 Token 有低消
    說個 "Hi" 也要 252 Token, 新台幣 0.01 元。原因是每次提交請求時都,除了這次輸入內容,還要附上 Instruction、System Prompt、工具函式清單、交談歷史... 等。我的任務簡單,簡單交待兩句再加上一個工具函式,用了大約 250 Token。若複雜任務,相關要求、規則、工具函式一籮筐,數 K 起跳也是很常見的,由於每一次交談都要附,消耗成本驚人。所以 Skill 才會採取每次交談只放入名稱跟描述,決定要用才載入整份 SKILL.md 的策略。
    你是 LINE 聊天助理,負責完成以下任務:
    
    - 若使用者提供 URL,依其指示處理該網頁內容
    - 若使用者提供圖片,依其指示分析圖片內容
    
    ## 執行說明
    
    - 使用者除 URL 及圖片外需說明需求,請先確認需求,再進行分析
    - 使用 ReadWebPage 工具取得網頁內容
    - 不要使用 Emoji 與 Markdown
    
  2. AgentSession 會協助保留交談歷史
    第二次問"我的名字叫什麼?",IN Token 為 355,比第一次說完長串名字時的 286 還長,證明後面的輸入內容會包含先前的交談內容;而 /clear 清除階段後,再問 AI 我的名字,IN Token 降回 257,但也不記得先前說過的事。
  3. 解析網頁時如何省錢?
    基於上一點展示 AgentSession 會保存交談歷史的特性,如果我們請 AI Agent 上網查文章給摘要,之後每次追加一個小問題,整篇文章內容都會重新送一次,在以下案例中超過 6K,要花 0.7 元,哪怕打一個字不小心送出,一樣要花 0.7。如果你的模型是以 Token 計費,則一次想完整要 AI 回答的問題,用一次提示得到所有答案,可以省點錢。
  4. 大圖與小圖的 Token 差異
    我分別準備同一張圖 640x475 106KB 及 3359x2497 1.8MB 兩種解析圖上傳,問題與回答相近,但可觀察到二者 IN Token 數有別,652 vs 1242。(LINE 會強迫壓縮及縮小圖檔,大圖有被縮成 2374x1765)
  5. 圖檔也是交談歷史,每次要重新上傳
    以下這個實驗可以驗證上傳圖檔後,後續問的每一句話都會包含這個圖檔。了解這點特性,有助於更有效率提問、掌握成本及拿捏開啟新 Session 的時機。
  6. 易被忽略的思考成本
    一開始看到這個結果我也很疑惑,回答結果只有一個數字 6,為什麼 OUT Token 數高達 331?
    原因是輸出 Token 不只是輸出文字,中間思考推理過程看不到但要計入輸出 Token 參考,如何證明? 我們可在程式加上一段顯示 AgentResponse.Usage.ReasoningTokenCount :
    outMsg += $"\n # 耗時 {sw.Elapsed.TotalSeconds:n1}s, IN {inTokens:n0} / OUT {outTokens:n0} Tokens, {sessionState.TokenUsage}";
    var resonTokens = res.Usage?.ReasoningTokenCount ?? 0;
    outMsg += resonTokens > 0 ? $"\n # 推理:{resonTokens:n0} Tokens" : "";
    
    再試一次,這回輸出 459 Token,其中推理部分佔 448 Token。

做完這些實驗,對於 AI 模型執行任務的 Token 消耗,有了不一樣的認識。除了過去知道使用者輸入訊息外,還需要加上系統提示跟交談歷史,實際觀察到圖檔如何消耗 Token,還學到複雜問題,AI 的內心戲也要算 Token (而且是比較貴的輸出 Token),如此未來在估算 AI 模型成本時,會更有概念。

範例專案

Explores real token costs behind an AI LINE bot by instrumenting Agent Framework usage. Measures input, output, image, history, and reasoning tokens, revealing hidden minimums, image overhead, session effects, and expensive reasoning tokens in everyday AI interactions.


Comments

Be the first to post a comment

Post a comment