本文根據 promptfoo 官方倉庫 README 和官方文檔《Getting started》整理,資料核對於 2026-10-11。命令取自官方頁面,沒有在本機運行驗證。
適用於誰
- 搜「promptfoo 使用」「promptfoo 是什麼」「promptfoo 使用教學」「promptfoo 怎麼使用」的人;
- 改提示詞全憑感覺,改完不知道是變好了還是隻是換了一種錯法的人;
- 要在兩三個模型之間選型,想用自己的真實問題而不是排行榜來比較的人。
結論先說
- promptfoo 是一個評測大模型應用的命令行工具和庫,也用來做紅隊測試。README 寫明它現在是 OpenAI 的一部分,並且仍然開源,MIT 許可。
- 它做的事很直接:把「幾個提示詞 × 幾個模型 × 一批測試用例」全部跑一遍,用你寫的斷言自動判分,再在網頁裏並排展示結果。
- 一切寫在一個
promptfooconfig.yaml裏:prompts、providers、tests三部分。 - 兩條命令:
promptfoo eval運行評測,promptfoo view打開結果頁面。 - 評測在本地運行。README 的說法是提示詞留在你的機器上;當然,調用模型時內容還是會發給你所配置的模型服務商。
一、它解決什麼問題
改提示詞時最常見的情況:針對一個不滿意的回答改了幾句,那個問題好了,另外三個原本沒問題的卻壞了,而你沒有發現。
評測工具的做法是把「原本沒問題的」也固定下來:準備一批有代表性的輸入,為每個輸入寫明「合格的輸出應該滿足什麼」,每次改動後全部重跑。這和寫代碼時跑單元測試是一個道理。
README 列出的用途:
- 用自動化評測來測試提示詞和模型;
- 並排比較不同廠商的模型(OpenAI、Anthropic、Azure、Bedrock、Ollama 等);
- 紅隊測試和漏洞掃描,生成漏洞報告;
- 接入 CI/CD,自動檢查;
- 審查拉取請求裏與大模型相關的安全和合規問題。
二、安裝
三種方式任選:
sh
npm install -g promptfoo
sh
brew install promptfoo
sh
pip install promptfoo
不想安裝的話,用 npx promptfoo@latest 加上後面的子命令即可運行。
三、用示例項目起步
sh
promptfoo init --example getting-started
cd getting-started
這會創建一個帶翻譯示例的目錄,裏面有 promptfooconfig.yaml 和一個 README.md。
另外兩種起步方式:npx promptfoo@latest init 通過命令行問答生成配置;npx promptfoo@latest eval setup 打開瀏覽器,在網頁裏填提示詞、模型和測試用例。
然後設定模型廠商的 API Key,以 OpenAI 為例:
sh
export OPENAI_API_KEY=sk-abc123
(sk-abc123 是官方文檔裏的佔位符,換成你自己的 Key。)Key 的獲取見《OpenAI API Key 怎麼獲取》。
四、配置文件的三部分
按官方入門文檔描述的結構,一份配置大致是這樣(演示用,模型 ID 換成你要比較的):
yaml
prompts:
- 'Convert the following English text to {{language}}: {{input}}'
providers:
- openai:gpt-6-sol
- openai:gpt-6-luna
tests:
- vars:
language: French
input: Hello world
assert:
- type: icontains
value: bonjour
- vars:
language: Spanish
input: Where is the library?
assert:
- type: icontains
value: biblioteca
prompts:要比較的提示詞,可以寫多條。雙花括號裏的是變量;providers:要比較的模型,格式是廠商:模型;tests:測試用例。每條用vars給變量賦值,用assert寫合格標準。
運行時,每個提示詞、每個模型、每條用例的組合都會被執行一次。
五、運行和查看
sh
promptfoo eval
promptfoo view
eval:跑完所有組合,在終端裏顯示彙總;view:打開網頁查看器,以表格並排展示各個模型、各個提示詞的輸出和斷言結果。
臨時換一組模型來比,不用改配置文件,用 -r:
sh
npx promptfoo@latest eval -r google:gemini-3.8-flash google:gemini-3.5-flash-lite
結果可以導出為表格、JSON、YAML 或 HTML。
六、常用的斷言類型
| 類型 | 含義 |
|---|---|
contains | 輸出包含指定的文字 |
icontains | 同上,不區分大小寫 |
icontains-any | 輸出包含列出的幾個值中的任意一個 |
javascript | 用一段自定義的 JavaScript 表達式給輸出打分 |
llm-rubric | 讓一個模型按你寫的評分標準給輸出打分 |
cost | 檢查單次響應的成本是否低於閾值 |
latency | 檢查單次響應的耗時(毫秒)是否低於閾值 |
官方文檔對最後兩個有明確的提醒:cost 只是逐條檢查,不會限制總花費;latency 只是事後檢查,不會中止慢的請求。
怎麼選:
- 能用確定性斷言就用確定性的。「必須包含訂單號」「必須是合法的 JSON」「不得出現某個詞」,用
contains或javascript,結果穩定、不花錢; - 確實需要判斷語義時再用
llm-rubric。例如「語氣是否禮貌」「是否回答了用戶的問題」。評分標準寫具體,並抽查它的評分是否靠譜,因為評分的模型也會出錯。
官方文檔還提到可以用 defaultTest 給所有用例加上共同的斷言。
七、放進日常流程
- 從真實問題裏攢用例。用戶實際問過的、之前出過錯的,各收幾條。十幾條就能開始,比憑空想的五十條有用;
- 每條用例寫清合格標準。寫不出標準的用例,說明你自己也沒想清楚要什麼;
- 改提示詞之前先跑一遍,記下當前結果作為基線;
- 每次只改一處,改完重跑,對比;
- 發現新的失敗案例就加進用例,用例集會越來越能代表真實情況;
- 換模型、模型升級時重跑。同一份提示詞在不同模型上的表現可能差很多。
README 提到它有實時重載和緩存,官方文檔裏也有接入 CI 的說明(包括一個 GitHub Action),可以讓每個拉取請求自動跑評測。
提示詞本身怎麼寫,見《系統提示詞怎麼寫》和《Few-shot 提示怎麼寫》。
常見問題
Q:跑一次要花多少錢?
取決於「提示詞數 × 模型數 × 用例數」和每次調用的長度,每個組合都是一次真實的接口調用。先用少量用例和便宜的模型把配置調通,再放開跑。
Q:能測本地模型嗎?
README 列出的可比較對象裏包括 Ollama。本地模型的搭建見《Ollama 怎麼用》。
Q:我的應用不是一條提示詞,而是一整條流程,能測嗎?
README 的說法是它適用於任何大模型接口和任何編程語言,可以把你自己的程序作為被測對象。具體接法見官方文檔裏關於自定義 provider 的部分。
Q:評測結果每次不一樣?
模型輸出本身有隨機性。關鍵用例可以多跑幾次看通過率,而不是隻看一次的結果。
參考資料
- promptfoo/promptfoo(官方倉庫):https://github.com/promptfoo/promptfoo
- Getting started(官方文檔):https://www.promptfoo.dev/docs/getting-started/
0 條評論
還沒有評論,來搶沙發~