
1. 項目概述從“幻覺”到“可控”的工程化實踐在深度使用大語言模型LLM進行應用開發時我們幾乎都遇到過同一個令人頭疼的問題模型的輸出不穩定。有時它妙語連珠精準地解決了問題有時卻會一本正經地“胡說八道”生成一些看似合理但完全錯誤或脫離指令的“幻覺”內容。這種不確定性是LLM從實驗室玩具走向生產級應用的最大障礙之一。我們需要的不是一個偶爾會“靈光一現”的黑箱而是一個輸出穩定、質量可控、能夠持續自我改進的可靠系統。這正是“LLM自優化流水線”要解決的核心問題。這個項目我們稱之為“Harness”其目標就是構建一套工程化的框架將LLM的“自由發揮”納入一個可觀測、可評估、可優化的閉環流程中。它不是一個單一的算法而是一套組合了多種技術思想的工程實踐核心在于利用LLM自身的能力LLM as Judge和系統化的采樣策略如Best of N Sampling來自動化地篩選、評估并迭代優化LLM的生成結果。簡單來說就是讓LLM自己當裁判從自己生成的多個答案中選出最好的那個并從中學習如何變得更好。這個過程不是一次性的而是一個可以持續運行的“流水線”每一次交互都是一次微小的優化迭代最終目標是讓模型的輸出越來越符合我們的預期將“幻覺”的概率降到最低實現輸出的高度“可控”。這套流水線非常適合那些對輸出質量有嚴格要求且需要自動化處理的場景。比如自動生成產品描述、代碼審查注釋、客服話術質檢、報告摘要等。如果你正在為LLM輸出的隨機性而煩惱希望構建一個更健壯、更可靠的AI應用那么這個手把手構建Harness的過程將為你提供一個清晰的工程藍圖。2. 自優化流水線的核心架構與設計思路構建一個有效的自優化流水線關鍵在于設計一個能夠自我評估、自我修正的閉環系統。我們不能指望單次提示就能得到完美答案而是要通過“生成-評估-選擇-反饋”的循環來逼近最優解。Harness的架構正是圍繞這個循環展開的。2.1 核心組件與工作流拆解一個完整的Harness流水線通常包含以下幾個核心組件它們像工廠的流水線一樣協同工作提示詞工程與任務分解器這是流水線的起點。它的任務不僅僅是發送一個簡單的用戶查詢而是將復雜任務分解為LLM更容易理解和執行的子任務并精心設計系統提示詞System Prompt來約束模型的行為范圍減少無關“幻覺”的產生。例如生成SQL的任務可能會先分解為“理解自然語言問題”、“識別實體和關系”、“映射到數據庫schema”等步驟。候選生成器這是利用LLM生成能力的環節。對于同一個輸入我們不會只生成一個答案。這里會采用諸如Best of N Sampling、溫度采樣Temperature Sampling、Top-p采樣等策略讓模型基于相同的提示詞生成N個例如5個或10個不同的候選回答。多樣性是后續優化的基礎。評估器這是流水線的“大腦”和“裁判”通常由另一個LLM實例扮演即LLM as Judge。它的職責是根據預設的、明確的標準如準確性、相關性、完整性、安全性、風格一致性等對生成的N個候選答案進行打分或排序。評估提示詞的設計至關重要它需要將主觀的質量要求轉化為客觀、可比較的評分項。選擇與聚合器評估器給出評分后這個組件負責根據分數選出最優答案。策略可以很簡單比如直接選擇最高分也可以很復雜比如根據多個維度分數加權計算或者設置最低閾值僅輸出達標的結果。反饋與優化循環這是實現“自優化”的關鍵。被選出的最優答案及其生成路徑包括使用的提示詞、中間步驟等可以被記錄下來形成一個高質量的數據對。這些數據對可以用于后續的提示詞迭代優化如通過少量示例進行提示詞微調或者在極端情況下作為微調數據集對模型本身進行微調從而讓模型在下一次類似任務中表現更好。這個工作流的核心思想是將不確定性前置并系統化處理。與其祈禱單次生成的結果是好的不如承認生成具有隨機性然后通過系統化的方法從多個可能中找出最好的那個并讓系統從這個過程中學習。2.2 為什么是“Best of N” “LLM as Judge”這是Harness架構中最經典也最有效的組合拳其背后的邏輯非常堅實。Best of N Sampling解決了“廣度”問題。LLM的生成本質上是概率性的單次采樣就像抽獎可能抽到“頭獎”完美答案也可能抽到“謝謝惠顧”幻覺答案。通過多次獨立采樣我們極大地提高了抽中“頭獎”或至少是“二等獎”的概率。這比單純調整溫度參數更直接有效因為高溫度雖然增加多樣性但也可能直接導致語法混亂低溫度雖然穩定但可能陷入局部最優、缺乏創意。Best of N在保持生成質量基線通常用較低溫度的同時通過增加嘗試次數來覆蓋更多的可能性空間。LLM as Judge解決了“評估”問題。傳統的評估方法可能需要編寫復雜的規則引擎或者依賴人工標注前者不夠靈活后者成本高昂且無法自動化。而使用LLM作為評估者其優勢在于靈活性你可以用自然語言定義復雜的評估標準LLM能夠理解。例如“檢查這個代碼片段是否存在安全漏洞并解釋原因”。上下文感知LLM可以結合原始問題和生成的答案進行整體評估理解答案是否真正解決了問題??蓴U展性增加一個新的評估維度通常只需要修改評估提示詞而無需重寫整個評估系統。將兩者結合就形成了一個高效的“生成-篩選”漏斗生成器提供多樣化的候選評估器用智能的標準進行過濾和排序最終輸出經得起檢驗的結果。這個組合將LLM從一個“生成器”升級為一個具備“批判性思維”和“質量控制”能力的系統。注意LLM as Judge并非完美。它自身也可能產生評估“幻覺”比如對某個細微錯誤過度懲罰或對流暢但錯誤的答案給予高分。因此評估提示詞需要精心設計有時甚至需要引入多個LLM進行“交叉驗證”或者結合一些確定性規則如代碼能否通過編譯、SQL能否執行來增強評估的可靠性。3. 手把手構建Harness從環境準備到核心實現理論講完了我們進入實戰環節。我將以一個具體的場景為例手把手搭建一個簡化但功能完整的Harness流水線。我們的場景是構建一個“文本轉JSON”的自動化工具。用戶輸入一段描述性的文本我們需要輸出結構化的JSON數據。這是一個非常典型的需求在數據抽取、表單填寫、API參數生成等場景下廣泛應用也極易因為模型理解偏差而產生“幻覺”比如生成錯誤的字段名或值。3.1 環境準備與工具選型工欲善其事必先利其器。我們首先需要搭建開發環境。編程語言與框架Python是目前LLM生態最豐富的語言。我們將使用openai庫或兼容OpenAI API的庫如litellm來調用模型使用pydantic來定義嚴謹的數據結構使用langchain或llama-index來構建流水線框架會更方便但為了理解底層原理我們先從基礎實現開始。模型選擇對于生成和評估我們都可以使用同一個強大的模型例如GPT-4 Turbo、Claude 3或者開源的DeepSeek-V2、Qwen2.5??紤]到成本和可控性生成器可以使用性價比高的模型如GPT-3.5-Turbo、DeepSeek-V2而評估器為了更高的判斷力建議使用能力更強的模型如GPT-4。對于本地部署可以選擇Qwen2.5-72B-Instruct這類高性能開源模型。關鍵庫安裝pip install openai pydantic tenacityopenai: 用于調用API。pydantic: 用于數據驗證和設置確保輸入輸出的結構。tenacity: 用于實現API調用的重試機制增強流水線的魯棒性。項目結構規劃harness_project/ ├── config.py # 存放API密鑰、模型配置等 ├── schemas.py # 用Pydantic定義輸入/輸出JSON Schema ├── generator.py # 候選生成器模塊 ├── evaluator.py # LLM評估器模塊 ├── selector.py # 答案選擇器模塊 ├── pipeline.py # 主流水線串聯所有組件 └── main.py # 示例運行入口3.2 定義任務與數據結構文本轉JSON首先我們必須明確任務邊界。模糊的任務會導致模糊的結果。我們使用Pydantic來嚴格定義我們希望輸出的JSON結構。假設我們要從產品描述中提取信息輸出結構化的產品數據。我們在schemas.py中定義from pydantic import BaseModel, Field from typing import List, Optional class ProductInfo(BaseModel): 產品信息數據結構 product_name: str Field(description產品名稱) brand: Optional[str] Field(defaultNone, description品牌如未提及則為None) main_category: str Field(description主要分類如電子產品、家居用品) price: Optional[float] Field(defaultNone, description價格單位元如未提及則為None) key_features: List[str] Field(description關鍵特性列表至少一項) in_stock: bool Field(description是否有庫存) # 可以添加自定義驗證器 # validator(price) # def price_must_be_positive(cls, v): # if v is not None and v 0: # raise ValueError(價格必須為正數) # return v這個ProductInfo類就是我們期望的“完美答案”的藍圖。它明確了每個字段的名稱、類型、是否可選以及描述。這個Schema有兩個重要作用用于生成我們可以將其描述作為系統提示詞的一部分極大地約束LLM的輸出格式減少格式錯誤。用于驗證在評估階段我們可以先嘗試用Pydantic解析LLM生成的JSON字符串如果解析失敗說明格式不正確可以直接給予低分或淘汰。這是第一道也是最硬的過濾網。3.3 實現候選生成器接下來我們實現generator.py中的CandidateGenerator類。它的核心是調用LLM API并利用溫度等參數進行多次采樣。import openai import json from tenacity import retry, stop_after_attempt, wait_random_exponential from schemas import ProductInfo from typing import List import logging logging.basicConfig(levellogging.INFO) logger logging.getLogger(__name__) class CandidateGenerator: def __init__(self, model: str gpt-3.5-turbo, api_key: str None): self.client openai.OpenAI(api_keyapi_key) self.model model retry(stopstop_after_attempt(3), waitwait_random_exponential(min1, max20)) def _call_llm(self, prompt: str, temperature: float 0.7) - str: 帶重試機制的LLM調用 try: response self.client.chat.completions.create( modelself.model, messages[{role: system, content: 你是一個精準的信息抽取助手必須嚴格按照給定的JSON格式輸出。}, {role: user, content: prompt}], temperaturetemperature, response_format{type: json_object} # 強制要求返回JSON ) return response.choices[0].message.content except Exception as e: logger.error(fLLM調用失敗: {e}) raise def generate_candidates(self, user_input: str, schema: BaseModel, n: int 5) - List[dict]: 生成N個候選答案 candidates [] # 構建系統化的提示詞 schema_description schema.schema_json(indent2) # 獲取JSON Schema描述 system_prompt f 你的任務是從用戶輸入中提取信息并填充到以下JSON結構中。 請嚴格遵循此結構只輸出JSON對象不要有任何額外解釋。 JSON Schema: {schema_description} 示例僅說明格式內容不一定相關 輸入“這是一款蘋果手機iPhone 15屬于智能手機售價5999元特點是超視網膜顯示屏和A16芯片目前有貨?!?輸出{{product_name: iPhone 15, brand: 蘋果, main_category: 智能手機, price: 5999.0, key_features: [超視網膜顯示屏, A16芯片], in_stock: true}} 現在請處理以下輸入 full_prompt system_prompt f\n輸入{user_input} for i in range(n): # 可以微調溫度讓每次生成略有不同。例如第一次用較低溫度求穩后面幾次用稍高溫度探索。 temp 0.3 if i 0 else 0.7 try: raw_output self._call_llm(full_prompt, temperaturetemp) # 嘗試解析為Python字典 parsed_dict json.loads(raw_output) candidates.append({ raw_text: raw_output, parsed_dict: parsed_dict, index: i, temperature_used: temp }) logger.info(f成功生成候選答案 {i1}/{n}) except json.JSONDecodeError as e: logger.warning(f候選 {i} 輸出不是合法JSON已丟棄。錯誤: {e}) # 可以選擇記錄這個錯誤答案用于分析但在此不加入候選池 candidates.append({ raw_text: raw_output, parsed_dict: None, index: i, temperature_used: temp, error: str(e) }) except Exception as e: logger.error(f生成候選 {i} 時發生未知錯誤: {e}) return candidates實操心得重試機制是必須的API調用可能因網絡、速率限制失敗tenacity庫能優雅地處理間歇性故障。利用response_formatOpenAI等API支持指定返回格式為json_object這能顯著提高模型輸出合規JSON的概率。溫度策略第一個候選用較低溫度如0.3確保一個“穩健”的基線答案后續用較高溫度如0.7探索更多可能性。這是一種簡單有效的多樣性策略。立即驗證JSON在生成環節就進行初步的JSON語法驗證將無法解析的結果標記出來避免污染后續的評估流程。3.4 實現LLM評估器這是Harness最精妙的部分。我們在evaluator.py中構建評估器。評估標準需要具體、可操作。我們將從以下幾個維度打分每個維度1-5分格式正確性輸出是否為嚴格符合Schema的JSON此維度可一票否決信息完整性是否提取了輸入文本中所有相關且Schema要求的字段信息準確性提取的值是否與輸入文本描述一致有無虛構或曲解邏輯合理性提取的信息在常識和業務邏輯上是否合理例如價格不會是負數class LLMEvaluator: def __init__(self, judge_model: str gpt-4, api_key: str None): self.client openai.OpenAI(api_keyapi_key) self.judge_model judge_model def create_evaluation_prompt(self, user_input: str, candidate_output: dict, schema: BaseModel) - str: 構建評估提示詞 schema_description schema.schema_json(indent2) evaluation_criteria 請你作為公正的裁判根據以下標準對候選答案進行評分1-5分5分為最佳。請先進行思考然后給出各維度分數及簡要理由最后輸出一個JSON格式的評分結果。 評分維度 1. 格式正確性候選答案是否是一個完全符合提供之JSON Schema的、無語法錯誤的JSON對象如果不符合此項直接1分。 2. 信息完整性候選答案是否填充了Schema中所有非可選字段是否盡可能填充了可選字段參考原始輸入 3. 信息準確性候選答案中每個字段的值是否嚴格忠實于用戶輸入文本有無添加、刪減或曲解原文信息 4. 邏輯合理性候選答案在常識和業務邏輯上是否合理例如價格應為正數庫存狀態應為布爾值 請基于以下信息進行評估 - 用戶輸入{user_input} - 目標JSON Schema{schema_description} - 候選答案{candidate_json} 你的輸出必須是且僅是一個JSON對象包含以下字段 {{ reasoning: 你的逐步思考過程, scores: {{ format_correctness: 分數, information_completeness: 分數, information_accuracy: 分數, logical_soundness: 分數 }}, overall_score: 平均分, has_critical_error: 布爾值如果格式錯誤或嚴重歪曲事實則為true }} # 將候選字典轉為格式化的JSON字符串用于展示 candidate_json_str json.dumps(candidate_output, ensure_asciiFalse, indent2) if candidate_output else 無效JSON或為空 prompt evaluation_criteria.format( user_inputuser_input, schema_descriptionschema_description, candidate_jsoncandidate_json_str ) return prompt retry(stopstop_after_attempt(2), waitwait_random_exponential(min2, max30)) def evaluate_candidate(self, user_input: str, candidate: dict, schema: BaseModel) - dict: 評估單個候選答案 # 檢查1如果生成時就沒解析成功直接給最低分 if candidate.get(parsed_dict) is None: return { scores: {format_correctness: 1, information_completeness: 1, information_accuracy: 1, logical_soundness: 1}, overall_score: 1.0, has_critical_error: True, reasoning: 候選答案非有效JSON無法解析。 } eval_prompt self.create_evaluation_prompt(user_input, candidate[parsed_dict], schema) try: response self.client.chat.completions.create( modelself.judge_model, messages[{role: system, content: 你是一個嚴謹、公正的質量評估助手。}, {role: user, content: eval_prompt}], temperature0.0, # 評估需要確定性溫度設為0 response_format{type: json_object} ) eval_result json.loads(response.choices[0].message.content) # 將評估結果合并到候選信息中 candidate.update({evaluation: eval_result}) return candidate except Exception as e: logger.error(f評估候選 {candidate.get(index)} 時失敗: {e}) # 評估失敗給予一個保守的中等偏下分數 default_eval { scores: {format_correctness: 2, information_completeness: 2, information_accuracy: 2, logical_soundness: 2}, overall_score: 2.0, has_critical_error: False, reasoning: f評估過程發生異常{e} } candidate.update({evaluation: default_eval}) return candidate注意事項評估模型的選擇評估器Judge通常需要比生成器更強的推理和理解能力以確保評估質量。GPT-4、Claude 3 Opus是很好的選擇。如果成本敏感可以嘗試讓生成器模型自我評估但效果會打折扣。評估提示詞是核心提示詞必須清晰、無歧義地定義評分標準。要求模型先進行“思考”reasoning再輸出分數有助于提高評估的穩定性和可解釋性。這種“思維鏈”提示對評估任務非常有效。溫度設為0評估需要一致性和客觀性因此應將溫度參數設為0確保相同的輸入得到相同的評估輸出。結構化輸出強制要求評估器返回結構化JSON便于程序自動化處理評分結果。3.5 實現選擇器與聚合邏輯評估完成后selector.py中的Selector類需要根據評估結果做出選擇。策略可以多樣化from typing import List, Dict, Any class Selector: staticmethod def select_best_by_score(evaluated_candidates: List[Dict[str, Any]]) - Dict[str, Any]: 根據綜合得分選擇最佳候選 valid_candidates [c for c in evaluated_candidates if not c.get(evaluation, {}).get(has_critical_error, True)] if not valid_candidates: logger.error(所有候選答案均存在關鍵錯誤無法選擇。) # 可以返回一個兜底答案或觸發人工干預 return {error: No valid candidate found, fallback: evaluated_candidates[0] if evaluated_candidates else None} # 按整體分數排序 sorted_candidates sorted(valid_candidates, keylambda x: x[evaluation][overall_score], reverseTrue) best_candidate sorted_candidates[0] # 記錄選擇理由 best_candidate[selection_reason] f綜合得分最高 ({best_candidate[evaluation][overall_score]:.2f}) return best_candidate staticmethod def select_by_threshold(evaluated_candidates: List[Dict[str, Any]], min_overall: float 3.5, min_accuracy: float 4.0) - List[Dict[str, Any]]: 根據閾值篩選合格候選可用于多答案輸出或后續人工復核 qualified [] for cand in evaluated_candidates: eval_data cand.get(evaluation, {}) if eval_data.get(has_critical_error): continue if (eval_data.get(overall_score, 0) min_overall and eval_data.get(scores, {}).get(information_accuracy, 0) min_accuracy): qualified.append(cand) return qualified選擇策略的考量簡單最高分最直接的策略適用于大多數情況。閾值過濾設置最低分數線只有達標的結果才被輸出。如果多個達標可以全部返回供下游處理或按分數排序。加權評分不同維度的分數重要性不同。例如對于“文本轉JSON”“信息準確性”的權重可能遠高于“邏輯合理性”??梢栽谶x擇器中實現加權平均計算。一票否決如果某個維度如格式正確性得分極低即使總分高也可以淘汰。3.6 組裝完整流水線與運行示例最后我們在pipeline.py中將所有組件串聯起來形成一個完整的HarnessPipeline類。class HarnessPipeline: def __init__(self, generator_model: str, judge_model: str, api_key: str): self.generator CandidateGenerator(modelgenerator_model, api_keyapi_key) self.evaluator LLMEvaluator(judge_modeljudge_model, api_keyapi_key) self.selector Selector() def run(self, user_input: str, output_schema: BaseModel, num_candidates: int 5) - Dict[str, Any]: 運行完整自優化流水線 logger.info(f開始處理輸入: {user_input[:50]}...) # 1. 生成候選 logger.info(f步驟1: 生成 {num_candidates} 個候選答案...) candidates self.generator.generate_candidates(user_input, output_schema, nnum_candidates) # 2. 評估候選 logger.info(步驟2: 評估候選答案...) evaluated_candidates [] for cand in candidates: evaluated self.evaluator.evaluate_candidate(user_input, cand, output_schema) evaluated_candidates.append(evaluated) # 3. 選擇最佳 logger.info(步驟3: 選擇最佳答案...) best_candidate self.selector.select_best_by_score(evaluated_candidates) # 4. 最終驗證與格式化輸出 result { original_input: user_input, best_candidate: best_candidate.get(parsed_dict), best_candidate_raw: best_candidate.get(raw_text), best_candidate_score: best_candidate.get(evaluation, {}).get(overall_score), all_candidates_summary: [ { index: c.get(index), score: c.get(evaluation, {}).get(overall_score), has_error: c.get(evaluation, {}).get(has_critical_error, False) } for c in evaluated_candidates ], selection_reason: best_candidate.get(selection_reason, N/A) } # 嘗試用Pydantic Schema做最終驗證確保輸出格式絕對正確 try: if result[best_candidate]: validated_data output_schema(**result[best_candidate]) result[validated_output] validated_data.dict() else: result[validated_output] None except Exception as e: logger.error(f最終輸出驗證失敗: {e}) result[validation_error] str(e) result[validated_output] None logger.info(f流水線執行完畢。最佳答案得分: {result[best_candidate_score]}) return result現在我們可以在main.py中運行一個示例from pipeline import HarnessPipeline from schemas import ProductInfo import os # 配置API密鑰 api_key os.getenv(OPENAI_API_KEY) pipeline HarnessPipeline( generator_modelgpt-3.5-turbo, judge_modelgpt-4, api_keyapi_key ) # 測試輸入 test_input 我想買一個華為的MateBook X Pro筆記本電腦是輕薄本價格大概在8999元左右店員說現在有現貨特點是3.1K觸控屏和超長續航。 result pipeline.run( user_inputtest_input, output_schemaProductInfo, num_candidates3 # 演示用3個 ) print(最終輸出:) print(json.dumps(result[validated_output], indent2, ensure_asciiFalse)) print(f\n選擇理由: {result[selection_reason]}) print(f\n所有候選概覽: {result[all_candidates_summary]})運行后你可能會得到類似這樣的輸出{ product_name: MateBook X Pro, brand: 華為, main_category: 筆記本電腦, price: 8999.0, key_features: [3.1K觸控屏, 超長續航, 輕薄本], in_stock: true }選擇理由: 綜合得分最高 (4.75) 所有候選概覽: [{index: 0, score: 4.5, has_error: false}, {index: 1, score: 4.75, has_error: false}, {index: 2, score: 4.25, has_error: false}]可以看到系統從3個候選答案中自動選出了評分最高4.75分的一個作為最終輸出。整個過程中生成、評估、選擇全部自動化完成。4. 高級優化與工程化考量基礎流水線搭建完成后我們可以從多個維度對其進行增強使其更健壯、更高效、更適合生產環境。4.1 提升評估的可靠性與效率LLM as Judge的評估質量直接決定流水線的效果。我們可以通過以下方法提升它多評委投票引入多個不同的評估模型如GPT-4、Claude、DeepSeek-V2對同一候選進行評分然后取平均分或中位數可以減少單一模型的偏差和隨機性。這類似于“集成學習”的思想。分步評估與鏈式思考將復雜的評估任務分解。例如先讓一個LLM判斷“格式是否正確”如果正確再交給另一個LLM判斷“信息是否準確”。或者要求評估LLM必須逐步推理Chain-of-Thought并在提示詞中提供幾個評估示例Few-shot能顯著提高評估的一致性。引入確定性規則校驗對于可以程序化驗證的部分絕不依賴LLM。例如在“文本轉JSON”任務中我們可以先用Pydantic驗證JSON格式和類型在“文本轉SQL”任務中可以用一個輕量級SQL解析器檢查語法甚至在一個隔離的測試數據庫里執行EXPLAIN來驗證其是否可運行。將規則校驗與LLM評估結合形成混合評估系統。評估結果緩存對于相同的(用戶輸入, 候選答案)對評估結果應該是確定的。可以建立緩存機制避免重復調用昂貴的評估模型尤其是當生成器參數如溫度固定時多次運行流水線可能產生相同候選。4.2 構建反饋循環與持續優化Harness的終極目標是“自優化”這意味著它應該能從每次運行中學習。收集高質量數據對每次流水線運行后將(用戶輸入 被選中的最佳輸出)作為一個高質量的訓練數據對保存下來。特別是當最佳答案的評分很高時例如4.5分這個數據對非常寶貴。提示詞迭代優化定期分析失敗案例。如果發現某一類錯誤頻繁出現例如模型總是漏掉“品牌”字段可以修改生成器的系統提示詞加入針對性的強調或示例。甚至可以自動化這個過程用收集到的高質量數據對作為Few-shot示例動態地構建更有效的提示詞。模型微調當積累到足夠多例如數千個高質量數據對時可以考慮用它們對生成器模型進行監督微調。這能讓模型更直接地學習到我們期望的輸入-輸出映射從根本上提升其在特定任務上的表現和穩定性。對于開源模型這是非常可行的路徑。評估標準進化隨著業務發展評估標準可能需要調整。Harness系統應該允許動態更新評估提示詞而無需修改代碼。4.3 性能、成本與監控將Harness用于生產必須考慮工程現實。成本控制Harness的核心成本來自LLM API調用尤其是評估步驟。策略包括候選數N的權衡N越大找到好答案的概率越高但成本線性增加。需要通過實驗找到性價比最高的N值例如對于大多數任務N3到5可能就足夠了。模型選型生成器用較小/較便宜的模型評估器用較大/較貴的模型。提前淘汰在完整評估前先進行低成本過濾。例如先用規則檢查JSON格式格式錯誤的直接淘汰不送評估。延遲優化生成和評估N個候選是順序進行的會導致延遲增加。可以考慮并行調用生成API如果API支持來減少生成階段的耗時。評估階段也可以并行評估多個候選。監控與可觀測性必須為流水線添加詳細的日志和監控。記錄每個環節的耗時、每個候選的分數分布、最終選擇的原因、失敗案例等。這有助于發現問題如果某天平均分突然下降可能意味著模型服務異?;蛱崾驹~出了問題。分析瓶頸了解時間主要花在生成還是評估上。持續改進基于監控數據分析哪些類型的輸入容易導致低分從而針對性優化。5. 常見問題、故障排查與避坑指南在實際構建和運行Harness的過程中你會遇到各種各樣的問題。下面是我踩過的一些坑以及解決方案。5.1 評估器LLM as Judge本身不可靠問題表現評估分數波動大或者明顯給出錯誤評判如對事實錯誤的答案打高分。排查與解決檢查評估提示詞確保評分標準清晰、無歧義。加入具體的評分示例Few-shot能極大提高一致性。例如“如果答案完全準確給5分有細微偏差給4分有主要錯誤給2分完全無關給1分。”要求“思維鏈”在評估提示詞中明確要求模型“請逐步推理然后給出分數”。這能迫使模型進行更深入的思考而不是憑直覺打分。使用更強的模型如果用的是GPT-3.5做評估嘗試升級到GPT-4或Claude 3。評估通常比生成需要更強的推理能力。多模型投票如前所述使用多個模型評估并取綜合結果。人工校準定期抽樣一批評估結果進行人工復核。如果發現系統性的評分偏差調整提示詞或評分規則。5.2 流水線輸出質量不穩定問題表現有時效果很好有時很差無法達到穩定的生產要求。排查與解決增加候選數量N這是最直接的方法。從N3增加到N5或7找到優質答案的概率會顯著提升但成本和延遲也會增加。優化生成提示詞生成器的提示詞是源頭。確保它清晰、具體并包含了輸出格式的明確約束如使用JSON Schema。在提示詞中加入少量高質量示例Few-shot learning效果極佳。調整溫度策略不要對所有候選使用相同的溫度。嘗試“低溫度高溫度”混合策略確保既有穩健輸出也有多樣性探索。引入后處理對于選出的最佳答案可以增加一個“潤色”或“一致性檢查”步驟。例如讓另一個LLM快速檢查一下最終答案是否與原始輸入矛盾。5.3 API調用失敗與速率限制問題表現流水線運行時隨機失敗報錯超時或額度不足。排查與解決實現健壯的重試機制使用tenacity等庫對可重試的錯誤如網絡超時、速率限制進行指數退避重試。設置合理的超時時間根據模型和任務復雜度為API調用設置合適的超時時間避免無限等待。監控使用量和成本設置每日預算和用量告警。對于評估這類高成本操作可以考慮使用緩存。使用負載均衡與多API密鑰如果請求量很大可以使用多個API端點或密鑰并在客戶端實現簡單的輪詢或負載均衡。5.4 如何處理“沒有合格答案”的情況問題表現所有候選答案的評估分數都很低或者都有關鍵錯誤。解決方案設置兜底策略在Selector中當所有候選都不合格時可以返回一個預定義的錯誤信息或者返回分數“相對最高”的那個但標記上低置信度。觸發人工審核流程將低置信度的結果放入一個待審核隊列由人工處理。同時這些案例是優化提示詞或模型的寶貴素材。動態回退如果多次嘗試均失敗可以自動切換到一個更簡單、更保守的生成策略例如使用溫度0、更詳細的提示詞只生成一個答案。5.5 針對特定場景的調優技巧文本轉SQL這是“幻覺”重災區。除了上述通用流程務必加入SQL語法驗證和執行計劃驗證??梢栽谝粋€只有Schema沒有數據的測試庫中執行EXPLAIN確保SQL語法正確且能有效利用索引避免產生笛卡爾積等性能炸彈。評估標準中要強調“查詢結果必須與問題意圖匹配”。創意寫作對于寫小說、營銷文案等任務“準確性”可能不那么重要而“連貫性”、“創意性”、“風格符合度”更重要。需要重新設計評估維度甚至可以讓多個評估器分別從不同維度打分。代碼生成必須集成代碼靜態分析和單元測試。評估器不僅要看代碼是否“看起來對”更要能通過編譯和基本的測試用例??梢詫⒋a放入沙箱執行來驗證其功能。構建LLM自優化流水線是一個典型的“用魔法打敗魔法”的工程實踐。它承認當前LLM的不完美但通過系統化的工程方法將這種不穩定性控制在一個可接受、可管理的范圍內。從簡單的Best of N采樣到復雜的LLM自我評估與迭代優化Harness的理念為我們提供了一條通往可靠AI應用的切實路徑。記住沒有一勞永逸的銀彈持續地觀察流水線的輸出分析失敗案例并迭代優化你的提示詞、評估標準和流程才是讓這個系統越來越強大的關鍵。