跳到主要內容

【2026 最新】Mistral Large 4 接線怎麼做?正式權重、工具回合與自架門檻六步教學

最後更新: ·
Mistral Large 4 接線教學:正式權重、工具回合與自架停止條件

你把上個月的範例貼進程式,模型名稱沒變,請求卻卡在推理參數;修好之後,工具也叫了,最後答案仍對不上庫存。Mistral Large 4 接線最容易漏掉的,是版本、對話歷史與工具回傳之間的連接。下載權重只是拿到引擎,還要把儀表和煞車接好。

2026 年 10 月 29 日,Mistral 已發布改進版權重。這篇寫給第一次串接模型、能照著建立文字檔與執行 Python 的讀者:先完成一個繁中資料擷取,再接一個唯讀工具回合,最後才判斷是否值得自架。你不必先租 GPU;看不懂的欄位,我們逐個拆開。

本文是依官方文件編寫的接線與驗收指南,沒有執行 Large 4 API 或下載完整權重,也不提供模型速度或準確率成績。發布與授權背景可先看權重釋出解析;這裡專注讓下一次請求能留下可核對的收據。

先說結論:Mistral Large 4 接線,要同時接好三條線

可用接線=版本收據+完整對話+受控工具。像電話客服:你要知道接到哪間分店、保留前文,還要核對倉庫真正回了什麼。只有客服說「查到了」,不能當成查詢已完成。

  • 先使用託管 API,完成可人工核對的小任務;自架放到最後。
  • 把預覽範例的 none 改按新規則遷移,不把 API 共用列舉當成此模型的支援清單。
  • 顯示答案只取最終文字;繼續對話保留完整 assistant 訊息。
  • 工具先做唯讀白名單,驗參數、驗 ID、驗答案,再討論更大權限。

一、先核對版本:權重釋出,不代表每個入口同時換了標籤

截至 2026 年 10 月 31 日,本次查閱的官方 API 模型頁仍標示 Public Preview,列出的呼叫名稱包含 mistral-large-4。因此本文的「正式權重」指 10 月 29 日交付的下載版本;不把它寫成 API 已全面 GA。GA 是服務正式推出的生命週期標籤,與檔案能否下載回答不同問題。

Checkpoint(權重快照)可想成一本已印好的書;revision 是能指出哪一版印刷的編號。先在官方模型倉庫開啟 Files and versions,保存當下 revision、README、設定與 LICENSE。本文查閱的主倉庫 revision 為 f12dabdc0c1e99e7f7924461a6f308859b05af4d;這是查閱紀錄,不代表你的 API 請求永久綁定同一套後端權重。

API 端另外保存帳號看得到的模型清單。Models API的 GET /v1/models 列出使用者可用模型;請求名稱、回應的 model、日期與服務入口都留下。若要確認實際帳號權限,這張收據比抄別人的模型名稱有用。

用途也要先過關。權重授權全文對 Model-as-a-Service 業務設有另簽商業授權的條件,並列內部使用與官方產品等例外。先用虛構資料學 API,與把模型對外出租是兩種工作;自架評估時,把誰能存取、可控制哪些輸入與參數寫清楚,再逐條對照授權。

二、Mistral Large 4 接線第一關:更新 effort,別沿用 none

痛點是「套件接受這個字,模型卻不接受」。依目前官方 Reasoning 文件,Large 4 使用 low、medium、high;文件明確說明它不接受 none、minimal、xhigh 或 max。舊預覽的 none 遷移到 low,high 保留,也增加 medium 選項。這是此模型的規則,不是所有模型共用一把尺。

解法是把模型專屬檢查放在送出前。下方程式只允許三個值,讓舊環境變數立即報錯。先明寫 high 作為文件建議的起點,再用自己的題目比較 medium、low;不要看完結果才改驗收條件。舊的none/high 配對教學可借用配對思路,請求設定則要按這次文件重建。

採樣也要記版本。主倉庫的 Recommended Settings 建議 temperature=1.0 與 top_p=0.95;下例明寫這兩項,不套用一般 Chat 文件的通用示例值。max_tokens=8192 則是這份小練習選的輸出預算,不是模型上限或最佳值。若截斷,這次算未完成,下一輪另開目錄再調整。

三、繁中結構化輸出:先驗格式,再驗數字

JSON 是電腦容易逐欄讀取的資料格式,可當成一張填好的表單。JSON mode 文件使用 response_format={"type":"json_object"},並建議在題目明講 JSON 與格式。本文只要 {"total":180}:2 本筆記本,每本 90 元,免運。這個 180 是人工標準答案,不是模型執行結果。

解法是兩道驗收。第一道確認唯一欄位是 total,型別是整數;第二道確認它等於 2×90=180。模型回傳合法 JSON,仍可能填成 190。回應若包含 thinking 和 text 區塊,解析器只把頂層 text 組成最後答案;遇到陌生區塊就停止並保留原始回應。

這裡刻意使用非串流 stream:false,先省下增量片段拼接的問題。檢查 finish_reason 再讀內容;程式只有在 stop 時放行這個擷取題。判準偏保守,目的是讓新手能分清傳輸完成、格式通過與答案正確。

四、Mistral Large 4 接線第二關:工具回合要完整走回來

Function calling(工具呼叫)像客服開查詢單:模型產生工具名稱與參數,由你的程式決定是否執行,再把結果交回模型回答。官方工具文件把這段流程分開描述。模型提出 lookup_stock,還不等於庫存已查過。

Mistral Large 4 接線的唯讀工具回合:請求、核對、回傳與最終回答
流程示意使用虛構商品;stock=7 是本機示範資料,不是 Large 4 執行觀察。

我們只開一個工具,查虛構商品 M-001。白名單核對要求工具名稱、參數集合與商品值完全符合;通過後才回傳本機寫定的 stock:7。沒有資料庫連線、檔案寫入工具或 shell 執行權。程式要求恰好一個工具請求,第二次模型呼叫用 tool_choice:"none" 收尾,避免這個練習擴成無限回圈。

關鍵是兩份材料用途不同:給讀者看的是 final text,給下一輪的是完整 assistant message。保留其中 thinking、tool_calls 與其他對話欄位,再補上 tool 訊息。回傳的 tool_call_id 必須等於該次模型提出的 ID,像回覆查詢單要對單號。把歷史縮成一句「庫存是 7」,會失去這個連接。

下方程式使用現有 Python 3 標準函式庫。先在自己的環境設定 MISTRAL_API_KEY,將程式存為 connect.py,在可用帳號與額度下執行 python3 connect.py。每次會新建一個收據資料夾,保存模型清單、三次 Chat 請求、完整回應與時間;金鑰只放在請求標頭,沒有寫進收據。

import json, os, pathlib, time, urllib.request

BASE = 'https://api.mistral.ai/v1'
MODEL = os.environ.get('ML4_MODEL', 'mistral-large-4')
EFFORT = os.environ.get('ML4_EFFORT', 'high')
if EFFORT not in {'low', 'medium', 'high'}:
    raise ValueError('Use low, medium or high; migrate Preview none to low')
OUT = pathlib.Path('ml4-' + time.strftime('%Y%m%dT%H%M%SZ', time.gmtime()))
OUT.mkdir(exist_ok=False)
KEY = os.environ['MISTRAL_API_KEY']

def call(label, path, body=None):
    if body is not None:
        (OUT / (label + '-request.json')).write_text(
            json.dumps(body, ensure_ascii=False), encoding='utf-8')
    req = urllib.request.Request(BASE + path,
        data=None if body is None else json.dumps(body).encode('utf-8'),
        headers={'Authorization': 'Bearer ' + KEY,
                 'Content-Type': 'application/json'})
    start = time.perf_counter()
    with urllib.request.urlopen(req, timeout=300) as response:
        raw = response.read()
    (OUT / (label + '-response.json')).write_bytes(raw)
    (OUT / (label + '-seconds.txt')).write_text(str(time.perf_counter()-start))
    return json.loads(raw)

def final_text(content):
    if isinstance(content, str):
        return content
    if not isinstance(content, list):
        raise ValueError('Unexpected content')
    texts = []
    for chunk in content:
        if chunk['type'] == 'text':
            texts.append(chunk['text'])
        elif chunk['type'] != 'thinking':
            raise ValueError('Unknown content chunk')
    if not texts:
        raise ValueError('No final answer')
    return ''.join(texts)

cards = call('00-models', '/models')['data']
if not any(c['id'] == MODEL or MODEL in (c.get('aliases') or []) for c in cards):
    raise ValueError('Selected model unavailable for this account')
COMMON = {'model': MODEL, 'reasoning_effort': EFFORT, 'stream': False,
          'temperature': 1.0, 'top_p': 0.95, 'max_tokens': 8192}
extract = call('01-extract', '/chat/completions', dict(COMMON,
    messages=[{'role': 'user', 'content':
        '虛構訂單:小明買 2 本筆記本,每本 90 元,免運。只回傳 JSON,唯一欄位 total,整數。'}],
    response_format={'type': 'json_object'}))
choice = extract['choices'][0]
if choice['finish_reason'] != 'stop':
    raise ValueError('Extraction did not finish normally')
value = json.loads(final_text(choice['message']['content']))
if (not isinstance(value, dict) or set(value) != {'total'}
        or type(value['total']) is not int or value['total'] != 180):
    raise ValueError('Extraction failed acceptance')

messages = [{'role': 'user', 'content':
    '請呼叫 lookup_stock 查詢虛構商品 M-001,再用繁體中文告訴我庫存數量。'}]
tools = [{'type': 'function', 'function': {'name': 'lookup_stock',
    'description': '唯讀查詢虛構示範庫存', 'parameters': {'type': 'object',
    'properties': {'sku': {'type': 'string', 'enum': ['M-001']}},
    'required': ['sku'], 'additionalProperties': False}}}]
first = call('02-tool', '/chat/completions', dict(COMMON,
    messages=messages, tools=tools, tool_choice='any', parallel_tool_calls=False))
choice = first['choices'][0]
assistant = choice['message']
calls = assistant.get('tool_calls') or []
if choice['finish_reason'] != 'tool_calls' or len(calls) != 1:
    raise ValueError('Expected one completed tool request')
tool = calls[0]
if (tool['type'] != 'function' or tool['function']['name'] != 'lookup_stock'
        or json.loads(tool['function']['arguments']) != {'sku': 'M-001'}
        or not tool.get('id')):
    raise ValueError('Tool request rejected')
# Retain the full content, including thinking chunks, for replay.
messages.append(assistant)
messages.append({'role': 'tool', 'name': 'lookup_stock', 'tool_call_id': tool['id'],
    'content': json.dumps({'sku': 'M-001', 'stock': 7})})
last = call('03-final', '/chat/completions', dict(COMMON,
    messages=messages, tools=tools, tool_choice='none'))
choice = last['choices'][0]
if choice['finish_reason'] != 'stop' or choice['message'].get('tool_calls'):
    raise ValueError('Final answer did not finish normally')
print(final_text(choice['message']['content']))
print('核對回答是否為商品 M-001、庫存 7;原始收據位於', OUT)

跑完有三個觀察點:擷取題是否通過 180 的檢查;工具請求是否只有 M-001;最後回答是否真的寫庫存 7。第三點保留人工核對,避免把「提到數字 7」這種脆弱字串比對冒充語意驗收。若流程中途停止,先看最後留下的 request/response,確認卡在存取、參數、截斷還是工具格式。

這份教學省略正式服務的重試佇列、多人狀態與持久化日誌。HTTP 錯誤會停止,不會自動重送;要上線時,再依Chat API 協定補上分級處理:400 檢查設定、401/403 檢查授權、429 依 Retry-After 等待;寫入型工具還需要防止重複執行。本篇工具唯讀且資料固定,適合先把回合走對。

五、重跑小題集:換參數,也要換一張驗收收據

痛點是升級後挑一個漂亮答案就搬家。解法是先保留舊題和舊結果,再另開新輪次。把相同擷取題、唯讀工具題與一個多步計算題,分別交給 low、medium、high;各自保留請求、模型回應、終止原因、格式、正確性與人工核對。這是在你的工作上比較三個配置,不是在重新宣布模型排名。

例如把商品改成未列入白名單的 M-999,預期結果是程式拒絕或停止,而不是自動去找別的資料。再加入缺欄位、額外參數、重複工具要求與截斷案例。正常案例證明流程走得通;這些失敗案例證明它在錯誤路徑會停下來。若需要設計更完整題集,可接著看Agent 回歸測試。

把「答案過關」「工具證據完整」「總等待可接受」分成三欄。費用按所有嘗試合計,包括失敗與重跑;不能拿最低一次請求代替交付成本。API 入口的回應 model 與日期也要留,因為 request 的別名不等於永久固定後端。這部分可搭配Agent Harness 原理,理解執行層為什麼會影響結果。

六、最後才算自架:先列停止條件,再挑硬體

MoE(混合專家架構)像一座大型圖書館,每次只請幾位專家工作,整套藏書仍要有地方存。每個 token 啟用的參數量,描述一部分計算;整套權重、快取與執行暫存一起決定部署容量。因此不按 52B active 直接替整機報價。

Mistral Large 4 自架容量預算:FP8、NVFP4 權重之外仍要留快取與執行空間
權重量級引自 vLLM 部署配方;圖示是容量帳本,不代表 AlphaLab 完成部署或量測。

vLLM 的部署配方列 FP8 權重約 1.06 TB、NVFP4 約 610 GB,並分別列出驗證硬體。這些是該配方的配置,不是所有量化與卸載方案的最低需求。KV Cache 是模型為已讀文字保存的工作筆記;上下文越長、同時服務的請求越多,容量安排就越需要跟著實際負載重算。

同一配方區分模型宣告的 1,048,576 個位置與配方驗證至 256k 的範圍。容量上限、引擎驗證範圍與你能接受的等待,各要一欄;不要只把服務參數填到最大。自架還要記權重 revision、容器 digest、推論引擎、tokenizer 與工具/推理解析器,這些一起構成可以重建的部署。

真的已有合適伺服器時,再按vLLM 與 Mistral 的部署說明選對專用映像及 GPU 配置,核對 --tool-call-parser mistral、--enable-auto-tool-choice 與 --reasoning-parser mistral 等選項。先以內網、短上下文和單一請求重跑同一個唯讀工具題,驗收通過才擴負載;這不是一般筆電下載後直接照貼的步驟。

  • 授權用途還寫不清:先停自架上線,補齊服務邊界與條款對照。
  • 權重放得下、工作空間卻不足:先縮上下文與同時請求,量資源再決定;不要把成功載入當成功服務。
  • 工具回合對不上:先修對話模板、解析器與 ID,保留 API 版作對照,不擴權限。
  • 運維或成本沒有可接受的界線:先留託管 API,將品質、費用、資料位置需求記成下一次評估條件。

常見問題:八個直接答案

1. 權重釋出,就等於 API 已經 GA?

不等於。本文查閱時 API 頁仍標示 Public Preview;本文處理的是已交付權重後的接線。

2. 舊範例的 none 可以直接保留嗎?

不可以。當前 Large 4 文件明列拒收 none,並把預覽 none 的遷移對應寫為 low。

3. high 一定最適合每件工作?

不一定。先用文件建議起點確認流程,再按自己的合格成果、等待與費用比較三種 effort。

4. JSON 格式正確,就算訂單處理成功?

不算。還要查欄位、型別、金額,以及資料能否對回輸入;本例的驗收答案是人工算出的 180。

5. thinking 都要放進最後答案?

不用。顯示時只取最終文字;後續模型呼叫保留完整 assistant 訊息,兩個用途分開處理。

6. 工具呼叫成功,就能開放付款工具?

不能由此推得。這個練習只驗唯讀假資料;付款需要另訂權限、簽核與防重複執行條件。

7. 610 GB 就是自架只需的顯存?

不是。那是 NVFP4 權重量級,還要算快取、執行暫存、並行負載與硬體/引擎配置。

8. 沒有 API 金鑰,今天仍能做什麼?

可以先整理版本與用途紀錄,讀懂工具請求、回傳 ID 和停止條件;等已有帳號與額度,再執行三次 Chat 請求。

給新手的三個重點

  • 先留版本收據,分清模型名稱、API 生命週期與權重 revision。
  • 先把 final 顯示與完整歷史分開,讓工具回傳有單號可對。
  • 先過小任務與失敗路徑,再決定要不要承擔自架容量與運維。

接著閱讀

左右滑動查看更多推薦

下一步:先替一次工具查詢,留下完整收據

回到那句定位:可用接線=版本收據+完整對話+受控工具。今天先核對一個模型入口,跑過虛構訂單與庫存題,打開原始回應檢查工具 ID;三欄都對,再把你真正需要的一個唯讀工作接進來。想把這段練習做成可維護的系統,可以從AlphaLab 課程繼續學習,或到AI 文章庫挑下一個可驗收的小任務。

ALPHALAB 社群

有問題?來 Telegram 聊

和 Terry、編輯、其他網友一起討論這篇文章。提問、分享觀點,回覆更即時。

加入 Telegram 討論

📩 訂閱 AlphaLab 電子報

週日 Weekly 週報+週二、週四 Alpha Signal,每週最多三封。

我們不會 spam,隨時可退訂。已訂閱?管理訂閱偏好(會寄登入連結到你的信箱)

主題篩選與退訂說明

寄送日期以台灣時間為準。主題偏好會篩選每期精選,並非每篇新文章的即時通知;當期符合主題的文章不足時會略過寄送。

未勾選任何主題會收到所有主題的精選,並不會停止寄信。

取消勾選 Alpha Signal 可停止週二、週四短報,仍保留週日週報。若要停止所有電子報,請使用信件底部的「取消訂閱」。