你把上個月的範例貼進程式,模型名稱沒變,請求卻卡在推理參數;修好之後,工具也叫了,最後答案仍對不上庫存。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,還不等於庫存已查過。

我們只開一個工具,查虛構商品 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 直接替整機報價。

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 文章庫挑下一個可驗收的小任務。






