2026年6月30日 星期二

減緩AntiGravity CLI神器之TOKEN消耗參考資訊(3/3)

情境:本篇是繼前篇(archive_old_dialogs.py可能僅屬完全搬移CONTEXT歷史上下文;缺點會有無法銜接作業之疑慮)故再請GEMINI協助針對下面TOKEN減緩消耗進行精進( Prompt Caching (省重複載入的錢) + LLMLingua (把要丟進去的文字瘦身) + MCP 這種動態按需索取的工具 (不該丟的就別丟)」),請協助對現行運作系統之TOKEN耗損進行精進檢視優化:

以下為Gemini神器進行運作系統, 4 大對位健診點與精進代碼實作建議:

一、 底層 I/O 與編碼對位健診(最關鍵的隱形陷阱)

  1. Windows 缺省編碼衝突 (CP950 陷阱)
    • 健診點:如果在 Python 中讀寫對話紀錄時使用 open(filepath, 'r') 'w' 而未明確指定編碼,Win32 底層會預設調用 CP950(繁體中文 Windows 預設)。這會與 LLM 要求的標準 UTF-8 產生衝突,導致對話流內含有特殊中文字、Emoji 或符號時發生 UnicodeDecodeError
    • 精進作為:所有檔案讀寫必須顯式指定 encoding='utf-8'
  2. BOM (Byte Order Mark) 隱形干擾
    • 健診點:若對話紀錄曾透過 PowerShell 重新導向(如 >>)或 Windows 原生文字編輯器儲存,檔案開頭可能帶有 0xEF 0xBB 0xBF (UTF-8-SIG) 特徵碼 。直接用標準 utf-8 讀取會使首行 JSON/Text 解析出不可見字元,破壞 94+ 系統的數據交換協議
    • 精進作為:讀取端改用 utf-8-sig 自動過濾 BOM ,或是寫入端強制約束為無簽章的標準 utf-8

二、 架構面與 Token 減緩精進(開源節流策略)

  1. 從「粗暴切斷」走向「層次摘要(Hierarchical Summary)」
    • 健診點:如果僅僅是把舊對話一刀切移動到歸檔區,雖然清空了 Context,但也丟失了用戶之前的「學習狀態(如正在準備 教練輔助 的進度)」。
    • 精進作為:在封存舊對話的同時,利用輕量模型或特定 Prompt 抽取出「記憶特徵/狀態大綱」(例如:用戶已掌握 X 概念,但 Y 概念常出錯),將此極簡摘要回填至當前活絡的 Context 頂端(即動態上下文管理)。
  2. 拒絕 ghost_scripts 疊床架屋
    • 健診點:此 Python 歸檔腳本若與上層 Node.js 系統通訊,常透過 child_process 調用。若未配置好活動字碼頁(Active Code Page),管道輸出會退化為 CP950 亂碼
    • 精進作為:若由 Node.js 觸發此 Python 腳本,必須確保環境變數或命令列包含 chcp 65001 規範 ,或直接將歸檔邏輯內聚在核心引擎中,不架設冗餘的外部外掛層。

三、 archive_old_dialogs.py 精進代碼對位模板

為了確保符合教練輔助系統的「Trinity Sync」誠信校驗與高內聚標準,建議將該腳本的底層邏輯重構/精進如下 (PYTHON程式)

import os

import json

import sys

# 強制規範標準輸出,防止 Win32 Subprocess 管道亂碼

if sys.platform == "win32":

    import io

    sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8')

def archive_and_summarize(active_log_path, archive_folder_path, max_tokens_limit=4000):

    """

    科學對位精進版:對話封存與動態上下文裁剪

    """

    if not os.path.exists(active_log_path):

        return       

    # 1. 健診對位:使用 utf-8-sig 兼容 Windows BOM 隱形干擾

    with open(active_log_path, 'r', encoding='utf-8-sig') as f:

        try:

            dialog_history = json.load(f)

        except json.JSONDecodeError:

            # 容錯處理:防範混合編碼汙染

            print("[ERROR] 檔案編碼或 JSON 結構損壞,觸發誠信校驗失敗")

            return

    # 假設 dialog_history [{role: user, content: ...}, ...]

    # 進行 Token 或者是輪數的邊界評估 (此處以簡易輪數或字數示範)

    if len(dialog_history) <= 10:

        return

# 尚在安全範圍,不搬移以維持脈絡完整性

            # 分離出需要歸檔的舊對話與保留的最近對話 (滑動窗口)

    old_dialogs = dialog_history[:-6]

    retained_dialogs = dialog_history[-6:]

    # 2. 精進作為:不只搬移,更進行「特徵提取」(可整合輕量 LLM API 或規則引擎)

    # 這裡提煉出歷史對話的關鍵軌跡,轉為極簡的 "Context Anchor"

    summary_anchor = {

        "role": "system",

        "content": f"[SYSTEM MEMORY ARCHIVE] 歷史對話已歸檔。截至上次學習進度摘要:用戶進行了 {len(old_dialogs)} 輪深度對話。"

    }

     # 3. 確保寫入安全 ( BOM 標準 UTF-8,維持 Hash 誠信校驗)

    os.makedirs(archive_folder_path, exist_ok=True)

    archive_file = os.path.join(archive_folder_path, f"archive_{int(os.path.getmtime(active_log_path))}.json")

        with open(archive_file, 'w', encoding='utf-8') as f:

        json.dump(old_dialogs, f, ensure_ascii=False, indent=2)

            # 新的活動對話:[記憶錨點] + [保留的近期對話] -> 完美控制 Token 消耗

    new_active_context = [summary_anchor] + retained_dialogs

        with open(active_log_path, 'w', encoding='utf-8') as f:

        json.dump(new_active_context, f, ensure_ascii=False, indent=2)

            print(f"[SUCCESS] 順利移除 CONTEXT 長文因子。已封存 {len(old_dialogs)} 輪,當前 Context 已瘦身。")

if __name__ == "__main__":

    # 對位本地實際路徑

    ACTIVE_PATH = r"C:\Users\username\AI_AP\nodejs\active_dialog.json"

    ARCHIVE_DIR = r"C:\Users\username\AI_AP\nodejs\archive"

    archive_and_summarize(ACTIVE_PATH, ARCHIVE_DIR)

診斷結論

💜透過此優化,archive_old_dialogs.py 不僅能徹底根除 Windows 平台下特有的 BOM 崩潰與 CP950 亂碼風險 ,更能透過 「滑動窗口 + 歷史記憶錨點」 的機制,讓 教練輔助系統在去除長文因子的同時,依然保有對先前學習軌跡的「語意彈性」,在不引入額外 MCP 複雜套件的前提下,以高內聚、輕量化的指令碼完美達成減緩 Token 消耗的工程目標。

💜科學對位:直接避開當前最活躍對話的裁剪。這代表著當前對話的高頻率互動(如您此時與我的連續對話)將能百分之百命中 Prompt  Cache,享受極低延遲與極佳的 Token 經濟效益;只有在對話結束、開啟新會話後,舊會話才會在背景被安全剪裁。

從大語言模型(如 Gemini / Claude 等具有 Prompt Caching 機制的  API)的科學運行原理,解析本工具如何百分之百避免冷啟動,維持 Prompt Cache 命中率之解說如下:

  ──────

  ### 1. 大模型 Prompt Caching 的物理命中規則

   在現代 API(如 Gemini)中,Prompt Caching(提示詞快取) 是基於 「前綴完全匹配(Prefix Matching)」 的。

   命中條件:新傳入的 Context 必須與伺服器端緩存的舊 Context 具有完全相同的前綴(Prefix)(包括 System  Instructions、歷史對話的順序、字元、空格)。

  •  失效條件:一旦歷史對話的中間或開頭被修改、插入、或是日誌大小被截斷(例如把中間的某些對話行刪除),前綴的雜湊值(Hash)就會改變,  導致 Prompt Cache 全數失效,模型必須重新讀取所有輸入(冷啟動),造成 Token 費用暴增與延遲。

  ──────

  ### 2. 實作代碼舉證:如何保證「零變動」以維護 Cache

    archive_old_dialogs.py 中:

    if not force and conversation_path.name == active_cid:

        print(f"🔥 對話 [{conversation_path.name[:8]}...] 為當前活躍階段,跳過以維護 Prompt Cache")

        return False

   #### 🛡️ 科學對位解析:

   1. 物理跳過,絕不寫入:

  此處的條件分支在  conversation_path.name == active_cid (即當前活躍會話的 ID)成立時,會立即 return  False,跳過後續所有的裁剪與重寫操作。

  2. 前綴 100% 相同:

  因為當前會話的日誌檔案  transcript.jsonl  完全沒有被進行任何編輯、寫入或搬移,其檔案內容、格式與上一輪交互時送到 Gemini  伺服器端的內容位元級一致(Bitwise Identical)。

  3. 無痛追加,完美命中:

  Gemini 只需要在先前已經 Cached 的歷史前綴後,追加讀取「最新一輪的使用者輸入與模型回覆」,即可完美繼承之前的快取,百分之百命中  Prompt Cache,杜絕冷啟動。

  ──────

  ### 3. 離線對話的「溫啟動」對位 (Sliding Window 保留最近 6 )

   對於非活躍但未來可能會重啟的對話,若真的需要裁剪,代碼在寫入新 Context 時:

  archive_old_dialogs.py 中:

     new_active_context = [summary_anchor] + retained_dialogs

    設計目的:此處將歷史對話截斷,只留下最後 6 輪( retained_dialogs )並補上一個  summary_anchor 。雖然會使原本的 Cache  失效,但因為它是在非活躍狀態下被處理,所以此時沒有人正在與其交互。

  當您之後重新打開此歷史對話並輸入新問題時,API 伺服器會以這僅剩的 6 + 錨點(通常小於 5K  Tokens)進行冷啟動,隨後的交互便會以此為新起點重新建立快取,避免了每次提問都需要重送原本數十萬 Tokens 歷史檔案的巨大開銷。

💜建立閉環自律機制來有效防止 AI 產生幻覺(Zero Stochastic Guessing)。其具體的防幻覺協作邏輯如下:

1. 即時監控與遙測預警 系統將 transcript.jsonl 視為唯一真實數據源(SSoT),記錄對話的所有輸入與思考鏈。同時,擔任「主動防護守衛」的 token_monitor.py 會持續解析該日誌檔,精確估算 Token 消耗量。當日誌大小或 Token 逼近臨界點(例如 80KB 30,000 tokens)時,系統會發出警告並觸發自癒機制,以防止長文本造成的注意力稀釋與胡亂猜測。

2. 物理剪枝與滑動窗口 接收到預警後,「自癒與執行器」archive_old_dialogs.py 會被觸發。它會將前半段較舊的歷史對話物理搬移至硬碟的封存路徑,並僅保留最近 6 輪對話作為「滑動窗口」,藉此對話日誌進行瘦身。

3. 注入記憶錨點(反幻覺的核心機制) 如果只是單純截斷對話,AI 在找不到過去資訊時容易產生隨機猜測(Stochastic Guessing)的妄想現象。為了科學對位,archive_old_dialogs.py 會在瘦身後的 transcript.jsonl 首行寫入一個 [SYSTEM MEMORY ARCHIVE] 記憶錨點

由  archive_old_dialogs.py  原始碼中的實體邏輯進行舉證。以下為原始碼對照與行為推導鏈:

  ### 1. 物理代碼證據 (Code Evidence)

  在 archive_old_dialogs.py 的原始碼第 110 行至 140 行,有以下實體寫入邏輯:                                                         

         # 1. 精進作為:特徵提取 (提煉出歷史對話的關鍵軌跡,轉為極簡的 "Context Anchor")

        summary_anchor = {

            "step_index": 0,

            "source": "SYSTEM",

            "type": "PLANNER_RESPONSE",

            "created_at": datetime.utcnow().isoformat() + "Z",

            "content": (

                f"> 💡 **[SYSTEM MEMORY ARCHIVE]**\n"

                f"> - **歸檔狀態**:已執行歷史對話層次化裁剪歸檔 (SSoT對位完成)\n"

                f"> - **封存輪數**:{len(old_dialogs)} 輪\n"

                f"> - **封存估算 Token**:{archived_tokens:,} tokens\n"

                f"> - **原始日誌指紋 (SHA-256)**:{orig_hash}\n"

                f"> - **實體備份路徑**:`_archive/{conversation_path.name}/transcript_archived.jsonl`\n"

            ),

            "status": "DONE"

        }

        ...

            #2. 確保寫入安全並歸檔舊的部分

            ...

            # 寫入新的活動 Context:[記憶錨點] + [保留的近期對話]

            new_active_context = [summary_anchor] + retained_dialogs

            with open(log_path, 'w', encoding='utf-8') as f:

                for item in new_active_context:

                    f.write(json.dumps(item, ensure_ascii=False) + "\n")

  ### 2. 推導邏輯鏈 (Reasoning Chain)

  1. 陣列重構 (Context Re-alignment):

 在原始日誌被剪枝後,代碼藉由  new_active_context = [summary_anchor] + retained_dialogs  將定錨物件  summary_anchor  物理放置於陣列的第一個元素(索引  0 )。

  2. 寫入首行 (First-line Anchoring):

 隨後透過  open(log_path, 'w')  以覆寫模式開啟  transcript.jsonl 。迴圈寫入時,第一個被轉換為 JSON 字串並寫入檔案的即是  summary_anchor ,這保證了它一定會成為  transcript.jsonl  的物理首行。

  3. 語意指紋映射 (Semantic Parity):

 當新對話載入時,AI 讀取日誌,其隱藏思考鏈(Thinking Chain)會優先讀入此首行內容,建立明確的歷史邊界,達成防幻覺控制。

防幻覺的最終成效: AI 讀取到這個記憶錨點時,語意學上會明確告知 AI「缺失的上下文並沒有消失,而是已安全歸檔於硬碟中。」 透過這種物理指紋與邊界依據的指引,AI 遇到缺乏歷史上下文的問題時,絕不會隨意編造答案(不產生幻覺),而是會主動引導使用者去提供或讀取該歸檔片段,達成科學且精準的防護控制。



2026年6月29日 星期一

減緩AntiGravity CLI神器之TOKEN消耗參考資訊(2/3)

情境: 本篇是延續前篇減緩AI神器TOKEN消耗參考評估,於系統匣(SYSTEM TRAY視窗右下方)再加入圖示,以方便掌握CONTEXT 上下文對話用量之監督功能。

python token_monitor.py --tray             # 系統匣常駐圖示監控

💜安裝系統匣常駐圖示監控,需另外加載   python -m pip install pystray pillow  

💜在 LLM(大型語言模型)的 API 機制中,Token 損耗是由「當前對話歷史的長度」決定的,而非對話視窗是否關閉或退出;而以命令提示視窗下達 /exit  只是結束了當前終端機的「會話狀態」,但並不會自動刪除或精簡已經記錄在  brain  中的歷史 JSONL  日誌。當您重啟或繼續在同一個 Conversation ID 提問時,它依然會重新讀取該日誌,導致 Token 消耗隨著輪數,持續性呈急速上升。


減緩TOKEN持續性上升耗損之參考作法:

💜 開新對話(換一個全新的 Conversation ID),這樣歷史歸零,亦即需進行 

• 清理/封存歷史對話日誌,讓監控工具和後續會話不再讀取過大的歷史。

• 清理/移檔歷史對話:將  <appDataDir>\brain (即  C:\Users\username\.gemini\antigravity-cli\brain  )下那些用量過高、已結束的舊對話資料夾,移動到其他備份目錄,讓監控工具不再掃描到它們。

• 完成移檔歷史對話後,再次下達 /EXIT ,才算實質性減緩TOKEN持續性上升耗損!


💜開新對話作法之 PROMPT提示詞如下:(藍色部分) 請協助將  token_monitor.py 監督TOKEN狀態程式,加入SYSTEM TRAY機制;另外,可以按滑鼠右鍵  一鍵清理與移檔歷史對話 (亦即  清理/移檔歷史對話:將  <appDataDir>\brain (即  C:\Users\username\.gemini\antigravity-cli\brain  )下那些用量過高、已結束的舊對話資料夾,移動到其他備份目錄 )

💟一鍵清理與移檔歷史對話   (archive_old_dialogs.py),主要功能如下 : 

def archive_high_usage_dialogs():

    if not BRAIN_DIR.exists():

        print("❌ 找不到 brain 目錄。")

        return

    ARCHIVE_DIR.mkdir(exist_ok=True)

    print(f"📂 備份封存目錄設為: {ARCHIVE_DIR}")

    print("🔍 開始檢查對話資料夾...")

    archived_count = 0

    

    # 遍歷 brain 下的所有對話資料夾

    for item in BRAIN_DIR.iterdir():

        # 排除已封存目錄自身與隱藏資料夾

        if item.is_dir() and item.name != "_archive" and not item.name.startswith("."):

            log_path = item / ".system_generated" / "logs" / "transcript.jsonl"

        # 若日誌檔案存在,檢查其大小或修改時間

            if log_path.exists():

                file_size_kb = log_path.stat().st_size / 1024

         # 策略:如果 transcript 檔案大於 100KB (通常代表輪次很多/程式碼貼很多),則移檔封存

                if file_size_kb > 80: 

                    print(f"⚠️  對話 [{item.name[:8]}...] 大小為 {file_size_kb:.1f} KB,判定為高用量對話,進行封存。")

                    try:

                        dest = ARCHIVE_DIR / item.name

                        if dest.exists():

                            shutil.rmtree(dest)

                        shutil.move(str(item), str(ARCHIVE_DIR))

                        archived_count += 1

                    except Exception as e:

                        print(f"❌ 移動失敗: {e}")

    print(f"✨ 清理完成!共封存了 {archived_count} 個高 Token 對話。")


減緩AntiGravity CLI神器之TOKEN消耗參考資訊(1/3)

減緩AntiGravity CLI神器之TOKEN消耗參考資訊(3/3)

2026年6月21日 星期日

如何從數千筆之本地端相簿Pictures資料夾中,找出實體大頭照片對應存放位置參考資訊

情境:數天前,拿著實體相片之大頭照,但精美原始JPEG電子檔,已放置不知到何處去?(相簿中有數千個圖檔),是否有辦法透過本地端,不經過雲端方式,將實體照片所對應本地端存放實體存放路徑大頭照圖檔找出來?

下PROMPT提示詞,(如藍色部分) 不使用GOOGL相簿機制,因為電腦內含個人隱私大頭照片,我想用OLLAMA本地端模型協助找尋出,實體大頭照檔,對應於本地端詳細對應路徑之原本精美照片原始電子檔

💜處理個人隱私大頭照,不建議上傳到任何公有雲端。

要在完全離線、確保隱私的本地端(On-Premise)環境下實作這個需求,有以下兩個關鍵的技術核心需要釐清:

1. 為什麼「純 Ollama(LLM/視覺模型)」不適合做這件事?

Ollama 運行的主要是大語言模型(如 Llama 3.2 Vision 或 LLaVA)。雖然它們看得到圖片,但有兩個致命缺點:

  • 不擅長微觀特徵比對:視覺模型擅長的是「語意理解」(例如:描述這張圖有一個穿西裝的男人),但不擅長精準辨識「這張臉是不是 A 客戶」。

  • 效能災難:如果要在大圖庫中找圖,視覺模型必須把每一張圖都重新編碼、推理一次,速度慢且記憶體容易寫滿,並不適合做高密度的「人臉特徵值(Embedding)比對」。

2. 本地端隱私環境的最佳解決方案

最快、最精準且完全離線的做法,是利用 Python 的 deepfaceface_recognition 庫。這類工具專門為了提取人臉的 128 或 512 維度特徵向量(Face Embeddings)而設計,搭配向量比對,幾秒鐘就能掃描完上千張照片。

您可以寫一個簡單的 Python 腳本,完全在您的本機執行,並輸出精美的原始照片完整路徑。

以下為您準備一個完全離線、高內聚(High-Cohesion)的實作腳本,不需要任何外部 API。

Prerequisite (安裝依賴庫)

pip install deepface opencv-python tf-keras

(註:DeepFace 會在第一次執行時,於本地下載人臉辨識權重模型(如 VGG-Face),之後便可完全斷網運行。)

Python 本地尋找原圖腳本

請將以下程式碼存為 face_search.py。這個設計直接針對您的需求,尋找目標大頭照並返回圖庫中所有相符的照片與完整路徑:

import os
from pathlib import Path
from deepface import DeepFace

def find_original_photos(target_face_path, gallery_dir, threshold=0.4):
    """
    在本地圖庫中找尋與目標大頭照相符的照片,並回傳完整路徑。
    
    :param target_face_path: 實體大頭照(掃描或翻拍檔)的完整路徑
    :param gallery_dir: 存放原始精美照片的本地資料夾路徑
    :param threshold: 比對閾值,越小越嚴格(VGG-Face 預設餘弦距離建議 0.40)
    """
    target_path = Path(target_face_path)
    gallery_path = Path(gallery_dir)
    
    if not target_path.exists():
        print(f"[錯誤] 找不到目標大頭照:{target_face_path}")
        return []
        
    print(f"正在分析目標大頭照特徵...")
    try:
        # 先提取目標大頭照的 Embedding
        target_objs = DeepFace.represent(img_path=str(target_path), model_name="VGG-Face", enforce_detection=True)
        target_embedding = target_objs[0]["embedding"]
    except Exception as e:
        print(f"[錯誤] 無法辨識目標大頭照中的人臉:{e}")
        return []

    print(f"開始掃描圖庫資料夾:{gallery_dir} ...")
    valid_extensions = {'.jpg', '.jpeg', '.png', '.bmp', '.webp'}
    matches = []

    # 走訪圖庫內所有檔案
    for root, _, files in os.walk(gallery_path):
        for file in files:
            file_path = Path(root) / file
            if file_path.suffix.lower() not in valid_extensions:
                continue
                
            # 避免重複比對目標大頭照本身
            if file_path.resolve() == target_path.resolve():
                continue

            try:
                # 提取圖庫照片的 Embedding (不強制要求每張都有人臉,避免背景圖報錯)
                gallery_objs = DeepFace.represent(img_path=str(file_path), model_name="VGG-Face", enforce_detection=False)
                if not gallery_objs:
                    continue
                    
                for obj in gallery_objs:
                    # 如果該圖沒偵測到臉(enforce_detection=False 時),其 facial_area 可能為 0
                    if obj.get("face_confidence", 0) < 0.6: 
                        continue
                        
                    # 計算人臉與目標的距離 (DeepFace.verify 內部邏輯簡化版)
                    result = DeepFace.verify(img1_path=str(target_path), img2_path=str(file_path), 
                                             model_name="VGG-Face", distance_metric="cosine", 
                                             enforce_detection=False)
                    
                    if result["verified"] and result["distance"] <= threshold:
                        print(f"[找到匹配] 相似度高 (距離: {result['distance']:.4f}) -> {file_path.resolve()}")
                        matches.append({
                            "path": str(file_path.resolve()),
                            "distance": result["distance"]
                        })
                        break # 這張照片已確認匹配,跳到下一張
                        
            except Exception as e:
                # 忽略損毀檔案或無法讀取的照片
                continue

    # 依相似度(距離由小到大)排序
    matches.sort(key=lambda x: x["distance"])
    return matches

if __name__ == "__main__":
    # ===== 請修改下方的本地路徑 =====
    TARGET_FACE = r"C:\Users\中文使用者\client_headshot.jpg"  # 欲找尋之實體大頭照,將該大頭照存至左列資料夾
    GALLERY_DIRECTORY = r"C:\Users\中文使用者\Pictures"       # 精美照片原圖庫 (
此路徑依每個人環境不同,自行做調整) results = find_original_photos(TARGET_FACE, GALLERY_DIRECTORY) print("\n" + "="*50) print(f"掃描結束!共找到 {len(results)} 張相符的原始精美照片:") print("="*50) for idx, match in enumerate(results, 1): print(f"[{idx}] 完整路徑: {match['path']} (距離分數: {match['distance']:.4f})")

本地處理的優勢:

  1. 完全離線:沒有任何資料會經由網路封包傳送到第三方伺服器,100% 符合商業隱私與資安規範。

  2. 精確路徑輸出:透過 os.walkPath.resolve(),直接輸出作業系統上的完整實體路徑(如 C:\Users\中文使用者\Pictures ),方便您直接複製並用檔案總管開啟。

  3. 低耦合與高彈性:如果您後續想加入自動分類、移動檔案等功能,可以直接在這個 Python 架構內擴充,不需要疊床架屋去調用 LLM 大型框架。


執行結果: (執行您的臉部搜尋腳本  python face_search.py  了!將您的大頭照片)
💢已針對 DeepFace 不支援 Windows 中文路徑(包含使用者名稱裡的「中文編碼之資料夾」)的問題完成代碼更新:
  • 在 face_search.py 中,對傳入大頭照與圖庫中所有要分析的照片路徑,在呼叫 DeepFace 分析前均會自動複製一份無中文的臨時副本。
  • 使用臨時副本呼叫 DeepFace 分析與比對,確保不會觸發  non-english characters  的錯誤,並於比對結束後自動刪除暫存檔。
[錯誤] 無法辨識目標大頭照中的人臉:Input image must
  not have non-english characters - C:\Users\中文使用者\headshot.jpg
  ==================================================
  掃描結束!共找到 0 張相符的原始精美照片:
  ==================================================
💢實際有精美照片,但搜尋大頭照 竟落空了!詢問GEMINI神器後,原來 DeepFace 的內部  load_image  函數(位於  deepface/commons/image_utils.py  )對傳入的路徑字串有極為嚴格的限制:
    if not img.isascii():
        raise ValueError(f"Input image must not have non-english characters - {img}")

  由於 Windows 系統的臨時目錄路徑通常也包含了使用者帳號中文名(如  c:\Users\中文資料夾\Pictures\... ),因此即使複製到 Temp  資料夾,只要路徑帶有中文,仍會觸發此錯誤。

  💜為了解決此限制:
 AI神器已將 face_search.py 改為記憶體讀取模式:

  1. 先使用 Python 以二進制讀取圖片檔案,並用  numpy  與  opencv  轉譯成記憶體中的圖像陣列( NDArray )。
  2. 直接將此  numpy  圖像陣列傳遞給  DeepFace.represent  和  DeepFace.verify 。
  3. 如此便能完全繞過路徑中英文字元的限制,不需建立任何暫存檔即可執行。

改用記憶體載入(NDArray 傳遞)後,人臉搜尋已成功避開 Windows 中文路徑的限制,並於  C:\Users\中文使用者\Pictures        圖庫中找到了 5 張 與目標人臉高度相似的原始照片:
  1. 008252-35x45.jpg (距離分數: 0.1734 - 相似度極高)
  2. 008252-2.jpg (距離分數: 0.1741)
  3. 008252.jpg (距離分數: 0.1742)
  4. 008252-2w.jpg (距離分數: 0.1809 - 也就是您提到的大頭照原始圖)
  5. CBFD853C-1DA3-4781-B653-BB0.jpg (距離分數: 0.3089)

  (註:VGG-Face 模型的餘弦距離閾值預設為 0.40,分數越接近 0 代表相似度越高。)

注意事項:
本地端基本電腦環境,需預先將PYTHON環境安裝好。

2026年6月18日 星期四

減緩AntiGravity CLI神器之TOKEN消耗參考資訊(1/3)

 情境:AntiGravity CLI神器 的用量消耗之所以會比預期快,核心原因在於現代 AI 模型採用的「上下文記憶機制(Context Window)」與「運算成本計算方式」。這並非單純計算您發送了幾次對話,而是計算模型每次處理你您的請求時,所需要「閱讀」的總資訊量。

以下是導致您消耗快速的幾個技術性主因:

1. 「上下文累積」效應 (Context Accumulation)

當您在同一個對話視窗(Chat Thread)中進行多輪問答,模型並不是只讀取您剛剛輸入的那句話,而是每一次都會把該對話視窗內所有的歷史紀錄重新閱讀一遍。

消耗倍增: 如果一個對話已經聊了 20 個回合,您的第 21 個問題,模型會處理「前 20 個回合的內容 +您的最新問題 + 系統提示詞(System Prompt)」。

影響: 隨著對話越長,每次發送請求所需的「Token(運算單位)」就越多,消耗速度呈現非線性的指數增長。

2. 系統提示詞與背景配置 (System Prompt)

您可能以為只是打了一行字,但實際上系統後台預載了許多規則(例如你的 客製化任務性之系統架構定義、語言偏好、身份設定等)。

這些「隱形成本」在每一次請求中都會被重複載入,即便您的問題很短,這些背景資料依舊會佔用您的額度。

3. Agentic AI 的運作邏輯

如果您在使用某些具有「代理功能(Agentic AI)」的工具或模式,系統可能會在後台執行多個步驟(例如:先搜尋文件 -> 閱讀程式碼庫 -> 進行邏輯運算 -> 產生摘要 -> 生成回應)。

隱性循環: 每個步驟都是一次完整的運算循環,如果您要求它分析 客製化任務性質 的模組結構,這可能觸發數次內部的 API 呼叫,導致額度在短時間內被「耗盡」。可行性作法: 限制模型的自由度。不要讓 AI 自己決定什麼時候要去搜尋、去哪裡讀程式碼。 評估用 LangGraph 或傳統程式邏輯,將步驟硬編碼(Hard-coded)。如:優先採用 Python 腳本抓取特定檔案內容,才接續將「精準過濾後的程式碼」餵給 LLM 進行對位檢核。用傳統程式碼代替 LLM 做檢索,能省下大量的推理 Token。

4. 輸出長度與深度思考 (Reasoning/Thinking)

目前的進階模型(如 Claude Opus 或 Gemini Pro)在處理複雜問題時,會進行「內部思考」或生成詳盡的技術說明。

輸出成本: 生成長篇幅的技術分析、程式碼優化建議,其成本遠高於簡單的指令。

複雜度溢價: 處理像 客製化任務性質 這種需要「聯邦架構(Federal Architecture)」的高階規劃問題,模型所消耗的算力資源遠大於處理一般常識問答。

筆者解決方式,除了 用地端模型協助處理部分作業外,但可能會犧牲時間(因為受限本地端的硬體,替代了遠端極為高效能硬體運算)、以及可能額外帶來的幻覺風險;另一個比較粗糙有效之作法,就是關閉聊天室(即另外開啟一個新的COMMAND LINE命令提示POWERSHELL視窗)。

💜如何保護你的AntiGravity CLI神器之週用量?

💟 建立「模組化對話」:

不要把所有事情塞在同一個視窗。將「系統架構討論」、「程式碼重構」、「客製化任務性質 教練考練習專屬對話聊天室(即 獨立單一視窗)」分開不同的對話視窗(New  Chat)。這樣可以避免模型重複閱讀不相關的歷史紀錄。
 
💟 定期重置視窗:
  當一個任務告一段落(例如模組審計完成),請果斷開新對話。這能直接截斷累積的上下文資訊量,將每一輪的「輸入成本」壓到最低。

💟請AntiGravity CLI協助生成TOKEN監控耗損監控程式,提示詞PROMPT如下: (藍色部分)
可否提供改善之提示,如果用量TOKEN很大時,避免不自覺耗盡

協助建立完整的 Token 用量優化指南,以下是重點摘要:

  ## 🔑 核心三招

 ### 1. 模組化對話 — 一個視窗一個主題

 把「架構討論」、「程式碼重構」、「教練考練習專屬對話聊天室」放在不同視窗,每輪可節省 50-70% 輸入 Token,因為模型不用重讀不相關歷史。

  ### 2. 果斷重置 — 識別 6 大信號

  • 任務里程碑完成
  • 話題轉換
  • 對話超過 15-20 輪
  • 模型開始重複或遺忘
  • 大量程式碼已貼過
  • 除錯迴圈超過 5 次

  ### 3. 防止不自覺耗盡 — 三個實用提示模板

   模板                                                           │ 用途
 ─────────────────────────────────────────────────────────────
   精簡背景模板                                                   │ 開新對話時只帶入最少必要資訊
   用量自我檢查提示                                            │ 中途評估是否該換對話
   Token 警戒模式提示                                         │ 貼在對話開頭,要求模型精簡回答

⚠️ 最容易忽略的隱藏成本:你的第 20 輪「一句小問題」,實際上會重新送出整個歷史(可能 50,000+ │ tokens)。這就是為什麼定期開新對話如此重要。
                   

💜估算您的 Token 消耗量、發言輪次、工具呼叫次數以及程式碼行數,並根據設定的閾值提供綠色  (正常)、黃色 (提醒)、紅色 (強烈建議開新對話) 三種告警等級,幫助您節省 Token 重送的隱藏成本。
  ──────
  ### 💻 常用命令用法

  您可以開啟終端機並在該目錄下運行以下指令:

  #### 1. 掃描所有對話,顯示摘要與需要注意的對話

    python token_monitor.py

  #### 2. 僅分析最新的對話

    python token_monitor.py --latest

  #### 3. 分析最新的對話(詳細模式,輸出細節)

    python token_monitor.py --latest -v

  #### 4. 分析特定對話 ID

    python token_monitor.py <conversation_id>

  (例如: python token_monitor.py 2174fc95-2378-448b-bda7-a0a035a1754a )

  #### 5. 開啟持續監控模式

  這會以自適應刷新間隔定時刷新對話狀態,非常適合在開發時背景掛載:

    python token_monitor.py --watch


💢注意事項: