返回首頁

GitHub Repo

vLLM 社群回報結構化輸出缺陷,特定設定可能改寫 JSON 固定值

Guidance 後端在特定設定下會改寫固定物件,讓合法輸出遭拒、錯誤版本反而通過。社群已提交修補與測試,但尚未合併,受影響版本範圍仍待確認。

Cepice · CC BY-SA 4.0 · Image source
zh-Hant

vLLM 社群於 9 月 25 日回報一項結構化輸出缺陷:使用 Guidance 後端並開啟禁止額外屬性的選項時,前處理可能改寫結構描述中的固定物件值。回報者提供不需模型權重或 GPU 的重現程式;同日提出的修補仍待審查。[問題回報](https://github.com/vllm-project/vllm/issues/58695)、[修補提案](https://github.com/vllm-project/vllm/pull/58709)。

觸發條件是將 `disable_additional_properties` 設為 `true`。官方文件顯示,此選項預設關閉且僅適用於 Guidance。依 JSON Schema 規範,`const` 要求資料等於指定值,`enum` 則要求資料符合列出的其中一值;這些值可以是完整物件,內部欄位不應被當成另一層驗證規則。固定物件內的欄位即使與驗證關鍵字同名,仍須保留原樣。從這項規則推論,若前處理改動資料內容,受限解碼即使遵循編譯結果,也無法保證符合呼叫端最初提交的規格。[設定文件](https://docs.vllm.ai/en/latest/api/vllm/config/structured_outputs/)、[驗證規範](https://json-schema.org/draft/2020-12/json-schema-validation)。

回報指出,受測主分支的處理函式遍歷所有字典與陣列,遇到 `properties` 或 `patternProperties` 便可能補入禁止額外屬性的欄位。案例採用含有屬性資料的 GeoJSON 物件,結果原本合法的固定值遭匹配器拒絕,多出欄位的錯誤版本反而獲准。問題發生在送交 llguidance 編譯之前;不含上述欄位的控制案例未被改寫。[重現結果](https://github.com/vllm-project/vllm/issues/58695)。

修補提案改為只沿承載子結構描述的關鍵字遞迴,保留固定值、列舉值、預設值與範例資料,也避免污染欄位名稱映射。作者列出的本機測試結果為七項通過、兩項未選取,但截至 9 月 26 日查核時仍未合併,不能視為正式版本已修復。[修補與測試紀錄](https://github.com/vllm-project/vllm/pull/58709)。

從工程角度推論,這會讓採用受限解碼的資料抽取或代理工具參數,在生成端與應用端出現驗證落差。團隊可先用原始結構描述另行驗證輸出,並把含保留字欄位的固定物件加入回歸測試;若暫時關閉該選項,也須確認原有欄位限制仍符合需求。後續應追蹤上游審查、正式修復版本與受影響版本清單。目前證據來自特定主分支提交及社群重現,公開案例未涵蓋完整服務流程,亦未建立所有版本的影響範圍。

來源

  1. Guidance disable_additional_properties rewrites const and enum literal values — Issue #58695
  2. Preserve literal values in Guidance disable_additional_properties — PR #58709
  3. StructuredOutputsConfig API 文件
  4. JSON Schema Validation: A Vocabulary for Structural Validation of JSON