的工程化范式演進與實踐)
1. 從“工具”到“駕馭”AI應用范式的根本性轉(zhuǎn)變?nèi)绻阕罱陉P(guān)注AI領(lǐng)域尤其是那些真正在用它解決實際業(yè)務問題的團隊可能會頻繁聽到一個詞Harness Engineering。它不像Prompt Engineering提示詞工程那樣已經(jīng)有一套相對成熟的方法論和社區(qū)共識。Harness Engineering更像是一個正在浮現(xiàn)的共識一種新的實踐哲學。簡單來說它標志著我們看待和使用AI的方式正在從“如何讓AI更好地回答問題”轉(zhuǎn)向“如何讓AI可靠地、自主地完成復雜任務”。過去兩年我們經(jīng)歷了從ChatGPT帶來的“對話式AI”狂歡到越來越多開發(fā)者嘗試將大語言模型LLM集成到工作流中。最初的興奮點在于“它能理解我”我們熱衷于研究如何寫出更好的提示詞Prompt讓模型生成更準確、更符合格式的答案。這催生了Prompt Engineering這門“手藝”。但很快當人們試圖用這些模型去處理真實世界的業(yè)務流程時——比如自動分析財報、處理客戶工單、生成并執(zhí)行代碼——問題接踵而至。模型會“胡言亂語”幻覺會不穩(wěn)定會卡在某個步驟上更無法處理需要多步驟推理、調(diào)用外部工具、或長期維護狀態(tài)的任務。Harness Engineering直譯為“駕馭工程”或“控制工程”正是為了解決這些問題而生。它不再將AI模型視為一個需要精心“提問”的黑箱而是將其視為一個需要被“駕馭”的、具有一定自主能力但又不完全可靠的“數(shù)字勞動力”。核心思想是通過系統(tǒng)性的工程化手段為AI構(gòu)建一個可靠、可控、可觀測的執(zhí)行環(huán)境使其能夠像軟件一樣被集成、調(diào)試和運維。這不僅僅是語義上的變化而是整個技術(shù)棧和設計思維的遷移。一個典型的Harness駕馭框架會包含任務規(guī)劃、工具調(diào)用、狀態(tài)管理、錯誤處理、驗證與回滾等一整套機制。如果說Prompt Engineering是教AI“怎么想”那么Harness Engineering就是為AI打造“怎么做”的舞臺和規(guī)則。一場新的AI應用范式確實已經(jīng)悄然開始了。2. 為什么我們需要Harness Engineering從三個真實痛點說起要理解Harness Engineering的必要性我們必須回到實際應用場景中。僅僅讓AI生成一段不錯的文本或代碼片段已經(jīng)無法滿足企業(yè)級應用的需求。以下是三個促使范式轉(zhuǎn)變的核心痛點2.1 痛點一單次交互的局限性與“任務原子性”的缺失傳統(tǒng)的PromptCompletion模式是“單次交互”。你給一個輸入它給一個輸出。但對于一個復雜任務比如“分析上季度銷售數(shù)據(jù)找出表現(xiàn)最差的三個區(qū)域并為每個區(qū)域起草一份改進計劃郵件”這包含了數(shù)據(jù)查詢、分析、排序、文案生成等多個子任務。試圖用一個超長的、包含所有指令的Prompt去完成結(jié)果往往不可預測且難以調(diào)試。Harness Engineering將復雜任務原子化和序列化??蚣軙⑸鲜鋈蝿兆詣臃纸鉃檫B接數(shù)據(jù)庫執(zhí)行SQL查詢獲取銷售數(shù)據(jù)。調(diào)用數(shù)據(jù)分析模塊計算各區(qū)域指標并排序。將結(jié)果傳遞給文案生成模塊結(jié)合區(qū)域特點生成郵件草稿。將草稿發(fā)送給人類審核。每個步驟都是一個原子操作有明確的輸入、輸出和成功/失敗狀態(tài)??蚣茇撠熅幣胚@些步驟的順序傳遞數(shù)據(jù)并處理步驟間的依賴。這使得整個流程變得透明、可調(diào)試并且當某個步驟失敗時可以精準定位和重試而不是整個推倒重來。2.2 痛點二模型的“幻覺”與不可靠性無法通過Prompt根除無論你的Prompt寫得多么完美基于概率生成的大模型始終存在“幻覺”即生成看似合理但實際錯誤的信息的風險。在關(guān)鍵業(yè)務場景中這是不可接受的。Harness Engineering通過外部驗證與工具調(diào)用來應對。一個設計良好的Harness不會完全相信模型生成的“事實”。例如當AI生成“某公司2023年營收為1.2億美元”時Harness可以配置一個驗證步驟自動調(diào)用財經(jīng)數(shù)據(jù)API進行核對。如果核對不一致則觸發(fā)糾錯流程如讓模型重新生成或轉(zhuǎn)交人工處理。同樣對于需要計算、查詢、執(zhí)行的操作Harness會強制模型通過調(diào)用預設的工具函數(shù)來完成而不是依賴其內(nèi)部可能不準確的知識或計算能力。模型的工作被限定在“理解意圖”和“規(guī)劃調(diào)用”而具體的“執(zhí)行”則由可靠的外部工具完成從而大幅提升了結(jié)果的準確性。2.3 痛點三狀態(tài)管理、記憶與長期對話的復雜性很多應用需要AI在較長的對話或任務周期中保持上下文和狀態(tài)。例如一個AI訂票助手需要記住用戶的出發(fā)地、偏好座位、預算并在多輪對話中逐步確認信息。用簡單的對話歷史拼接作為上下文會很快觸及模型的令牌Token長度限制且效率低下。Harness Engineering引入了顯式的狀態(tài)管理和記憶模塊??蚣軙S護一個結(jié)構(gòu)化的任務狀態(tài)State記錄當前進展、已收集的信息、用戶偏好等。AI模型在每一步?jīng)Q策時可以查詢這個狀態(tài)而不需要閱讀冗長的歷史對話。記憶模塊則可能包括向量數(shù)據(jù)庫用于存儲和檢索長期的、跨會話的信息。這樣AI的行為不再是基于臨時的對話片段而是基于一個持續(xù)的、可管理的“工作記憶”使得構(gòu)建復雜的多輪交互代理Agent成為可能。3. Harness Engineering的核心組件與架構(gòu)設計理解了“為什么”我們來看“是什么”。一個典型的Harness Engineering框架或系統(tǒng)通常會包含以下幾個核心組件它們共同構(gòu)成了駕馭AI的“韁繩”和“鞍具”。3.1 智能體Agent與工具Tools賦予AI“手腳”這是最基礎(chǔ)的組件。智能體是任務的執(zhí)行主體它具備理解指令、規(guī)劃步驟、調(diào)用工具的能力。而工具則是智能體可以使用的具體函數(shù)例如search_web(query): 網(wǎng)絡搜索工具。execute_sql(query): 數(shù)據(jù)庫查詢工具。send_email(to, subject, body): 發(fā)送郵件工具。call_calculator(expression): 計算工具。Harness框架會為智能體提供一個工具列表及其描述。智能體根據(jù)任務決定調(diào)用哪個工具并生成符合工具要求的參數(shù)??蚣茇撠煱踩貓?zhí)行這些工具調(diào)用并將結(jié)果返回給智能體進行下一步?jīng)Q策。這嚴格區(qū)分了“思考”和“行動”將風險較高的“行動”限制在預先審核過的安全工具集內(nèi)。3.2 工作流編排器Orchestrator與任務分解Task Decomposition這是Harness的大腦。對于一個高層級任務如“準備月度市場報告”編排器負責將其分解為一系列有序的子任務“收集數(shù)據(jù)”、“分析趨勢”、“生成圖表”、“撰寫摘要”。這可以通過以下方式實現(xiàn)預定義模板針對常見任務人工設計好固定的任務流。LLM動態(tài)規(guī)劃讓一個“規(guī)劃型”LLM根據(jù)任務描述實時生成任務步驟圖?;旌夏J皆陬A定義骨架的基礎(chǔ)上由LLM填充具體參數(shù)和分支邏輯。編排器還管理著任務流的執(zhí)行包括順序執(zhí)行、并行執(zhí)行、條件分支if-else、循環(huán)loop等并處理子任務之間的數(shù)據(jù)傳遞。3.3 狀態(tài)管理機State Management與記憶Memory這是Harness的“記事本”。它維護著任務執(zhí)行過程中的所有關(guān)鍵信息會話狀態(tài)Session State當前任務鏈的臨時變量如用戶輸入、中間結(jié)果。長期記憶Long-term Memory通常存儲在向量數(shù)據(jù)庫中記錄跨會話的用戶偏好、歷史交互摘要、學到的知識等。知識庫Knowledge Base提供給AI參考的領(lǐng)域特定文檔、數(shù)據(jù)通過檢索增強生成RAG技術(shù)被動態(tài)引入上下文。一個設計精良的狀態(tài)管理機制能確保AI在復雜的多步交互中始終保持一致性避免前后矛盾也是實現(xiàn)個性化服務的基礎(chǔ)。3.4 驗證器Validators與守衛(wèi)Guards設置安全圍欄這是Harness的“安全員”和“質(zhì)檢員”。它們在關(guān)鍵節(jié)點對AI的輸入輸出進行檢查輸出格式驗證檢查AI生成的JSON、SQL、代碼是否符合預定模式Schema。內(nèi)容安全過濾檢測并過濾有害、偏見或不適當?shù)膬?nèi)容。事實核查如前所述調(diào)用外部API驗證AI生成事實的準確性。業(yè)務規(guī)則守衛(wèi)確保AI的操作符合公司政策或業(yè)務流程如“審批金額超過1萬需轉(zhuǎn)人工”。當驗證失敗或觸發(fā)守衛(wèi)時框架會進入錯誤處理流程如重試、降級fallback或上報人工防止錯誤擴散。3.5 可觀測性Observability與評估Evaluation這是Harness的“儀表盤”。工程化的系統(tǒng)必須是可觀測、可評估的。這包括日志記錄詳細記錄每個智能體的思考過程、工具調(diào)用、輸入輸出。鏈路追蹤Tracing像分布式系統(tǒng)一樣追蹤一個用戶請求經(jīng)過的所有AI組件和處理步驟便于性能分析和故障排查。指標監(jiān)控監(jiān)控任務成功率、延遲、Token消耗成本、工具調(diào)用頻率等。自動化評估通過一套測試用例或評估AILLM-as-a-Judge來定期對智能體的表現(xiàn)進行打分持續(xù)監(jiān)控其性能是否退化。4. 實戰(zhàn)構(gòu)建一個簡單的Harness框架原型理論說得再多不如動手感受一下。下面我們以一個“智能數(shù)據(jù)分析師”代理為例勾勒一個極度簡化的Harness框架實現(xiàn)思路。這個代理的任務是用戶用自然語言提問它自動編寫并執(zhí)行SQL然后對結(jié)果進行解讀。我們將使用Python和一些流行的庫來演示核心概念。請注意這是一個用于說明原理的教學示例并非生產(chǎn)級代碼。4.1 環(huán)境準備與核心庫選擇首先我們需要幾個核心組件大語言模型LLM作為智能體的“大腦”。這里我們使用OpenAI的GPT-4系列模型通過其API調(diào)用。你也可以替換為其他兼容OpenAI API的模型或本地模型。工具定義庫我們需要一個框架來方便地定義工具并將工具描述傳遞給LLM。LangChain或LlamaIndex是常見選擇它們提供了強大的Agent和Tool抽象。為了更貼近底層原理我們這里會簡化處理。SQL數(shù)據(jù)庫一個用于查詢的示例數(shù)據(jù)庫比如SQLite。安裝基礎(chǔ)依賴pip install openai sqlite3注LangChain等框架會封裝更多細節(jié)但為了理解本質(zhì)我們先從相對底層的實現(xiàn)開始。4.2 定義核心工具SQL執(zhí)行器工具是Harness控制AI行為的基石。我們先定義一個最關(guān)鍵的sql_executor工具。import sqlite3 import json import pandas as pd from typing import Optional class SimpleHarness: def __init__(self, db_path: str): # 初始化數(shù)據(jù)庫連接 self.conn sqlite3.connect(db_path) # 模擬的工具列表包含名稱、描述和函數(shù)引用 self.tools [ { name: sql_executor, description: 執(zhí)行一個SQL查詢語句并返回結(jié)果。輸入必須是有效的SQL SELECT語句。, function: self.execute_sql } ] def execute_sql(self, query: str) - str: 執(zhí)行SQL查詢并安全地返回結(jié)果。 # 基礎(chǔ)安全守衛(wèi)只允許SELECT查詢防止數(shù)據(jù)被修改 if not query.strip().upper().startswith(SELECT): return 錯誤只允許執(zhí)行SELECT查詢語句。 try: # 使用pandas執(zhí)行查詢并返回表格形式的結(jié)果更易讀 df pd.read_sql_query(query, self.conn) # 將結(jié)果轉(zhuǎn)換為字符串如果結(jié)果太大可以截斷 if len(df) 100: result_str f查詢成功返回{len(df)}行數(shù)據(jù)顯示前10行\(zhòng)n result_str df.head(10).to_string() else: result_str df.to_string() return result_str except Exception as e: # 錯誤處理將數(shù)據(jù)庫錯誤信息返回給Agent以便它調(diào)整查詢 return fSQL執(zhí)行錯誤{str(e)}這個工具類有幾個關(guān)鍵設計點描述清晰description字段會原樣送給LLM所以必須準確說明工具的功能、輸入格式和限制。安全守衛(wèi)在工具函數(shù)內(nèi)部我們首先檢查是否是SELECT語句這是一個最基本的安全措施防止數(shù)據(jù)庫被意外修改或刪除。錯誤處理捕獲異常并以文本形式返回錯誤原因這樣智能體就能“知道”自己哪里做錯了從而有機會修正。結(jié)果格式化將數(shù)據(jù)庫結(jié)果轉(zhuǎn)換為易于LLM理解和后續(xù)處理的字符串格式。4.3 構(gòu)建智能體Agent的決策循環(huán)智能體的核心是一個循環(huán)理解任務、決定行動、執(zhí)行工具、觀察結(jié)果、繼續(xù)下一步。我們實現(xiàn)一個簡化的run_agent方法。import openai class SimpleHarness(SimpleHarness): # 繼承上面的類 def __init__(self, db_path: str, api_key: str): super().__init__(db_path) self.client openai.OpenAI(api_keyapi_key) # 記錄對話歷史和工具調(diào)用結(jié)果作為Agent的“短期記憶” self.messages [] def _call_llm(self, prompt: str) - str: 調(diào)用LLM獲取回復。 self.messages.append({role: user, content: prompt}) response self.client.chat.completions.create( modelgpt-4-turbo, # 可根據(jù)需要調(diào)整模型 messagesself.messages, temperature0.1, # 低溫度使輸出更確定、更專注于工具調(diào)用 ) ai_message response.choices[0].message.content self.messages.append({role: assistant, content: ai_message}) return ai_message def run_agent(self, user_query: str, max_steps: int 5): 運行智能體處理用戶查詢。 print(f用戶問題{user_query}) # 初始化系統(tǒng)提示定義Agent的角色和能力 system_prompt f你是一個智能數(shù)據(jù)分析助手。你可以使用以下工具 {json.dumps([{name: t[name], description: t[description]} for t in self.tools], indent2)} 你的工作流程 1. 理解用戶關(guān)于數(shù)據(jù)的問題。 2. 如果需要查詢數(shù)據(jù)請生成一個準確的SQL查詢語句。 3. 調(diào)用sql_executor工具來執(zhí)行SQL。 4. 根據(jù)查詢結(jié)果用通俗的語言回答用戶的問題。 請嚴格按以下JSON格式回應只輸出JSON {{ thought: 你的思考過程分析用戶意圖和下一步計劃, action: 要執(zhí)行的動作只能是 sql_executor 或 final_answer, action_input: 如果action是sql_executor這里放SQL語句如果是final_answer這里放最終答案 }} self.messages [{role: system, content: system_prompt}] for step in range(max_steps): print(f\n--- 步驟 {step1} ---) # 1. 讓LLM做決策 llm_response self._call_llm(user_query if step 0 else 繼續(xù)) try: # 2. 解析LLM的決策期望是JSON decision json.loads(llm_response) thought decision.get(thought, ) action decision.get(action, ) action_input decision.get(action_input, ) print(f智能體思考{thought}) print(f決策行動{action}, 輸入{action_input}) # 3. 執(zhí)行行動 if action final_answer: print(f\n最終答案{action_input}) return action_input # 任務完成 elif action sql_executor: # 找到對應的工具并執(zhí)行 tool_func next((t[function] for t in self.tools if t[name] action), None) if tool_func: result tool_func(action_input) print(f工具執(zhí)行結(jié)果\n{result}) # 將結(jié)果作為新的用戶消息讓Agent繼續(xù)處理 user_query f上次查詢的結(jié)果是{result}。請根據(jù)這個結(jié)果回答我的原始問題。 else: print(錯誤未知工具。) break else: print(錯誤無效的行動指令。) break except json.JSONDecodeError: print(f錯誤LLM回復不是有效的JSON?;貜蛢?nèi)容{llm_response}) break return 抱歉任務處理失敗或達到最大步數(shù)限制。這個決策循環(huán)體現(xiàn)了Harness的核心控制邏輯結(jié)構(gòu)化輸出我們強制要求LLM以特定的JSON格式回應這比解析自由文本要可靠得多。這是確保AI行為可控的關(guān)鍵技巧。循環(huán)與狀態(tài)for循環(huán)和user_query的更新模擬了多輪交互。LLM在每一步都能看到上一步工具執(zhí)行的結(jié)果從而做出下一步?jīng)Q策。工具調(diào)用抽象框架根據(jù)action字段自動匹配并調(diào)用對應的工具函數(shù)實現(xiàn)了思考與執(zhí)行的分離。4.4 運行示例與結(jié)果分析假設我們有一個sales.db的SQLite數(shù)據(jù)庫里面有一張sales_data表包含region區(qū)域、product產(chǎn)品、revenue收入等字段。# 主程序 if __name__ __main__: # 初始化Harness傳入數(shù)據(jù)庫路徑和OpenAI API Key harness SimpleHarness(sales.db, your-openai-api-key) # 用戶提出一個自然語言問題 question 上個季度哪個區(qū)域的銷售額最高具體是多少 # 運行智能體 final_answer harness.run_agent(question) print(f\n 處理結(jié)束 )可能的執(zhí)行過程輸出用戶問題上個季度哪個區(qū)域的銷售額最高具體是多少 --- 步驟 1 --- 智能體思考用戶想了解上個季度銷售額最高的區(qū)域。我需要從數(shù)據(jù)庫的sales_data表中查詢數(shù)據(jù)。假設表中有‘quarter’、‘region’和‘revenue’字段。我需要先過濾出上個季度的數(shù)據(jù)然后按區(qū)域匯總收入最后找出最高的。 決策行動sql_executor, 輸入SELECT region, SUM(revenue) as total_revenue FROM sales_data WHERE quarter Q2-2024 GROUP BY region ORDER BY total_revenue DESC LIMIT 1 工具執(zhí)行結(jié)果 region total_revenue 0 華東地區(qū) 1250000 --- 步驟 2 --- 智能體思考查詢結(jié)果顯示上個季度Q2-2024銷售額最高的區(qū)域是華東地區(qū)總銷售額為1,250,000。現(xiàn)在我需要根據(jù)這個結(jié)果用清晰的語言回答用戶的問題。 決策行動final_answer, 輸入根據(jù)數(shù)據(jù)上個季度2024年第二季度銷售額最高的區(qū)域是華東地區(qū)其總銷售額為1,250,000元。 最終答案根據(jù)數(shù)據(jù)上個季度2024年第二季度銷售額最高的區(qū)域是華東地區(qū)其總銷售額為1,250,000元。 處理結(jié)束 通過這個簡單的例子你可以看到Harness Engineering如何將模糊的自然語言問題轉(zhuǎn)化為一個結(jié)構(gòu)化的、可執(zhí)行的、并且每一步都可觀測和控制的流程。雖然這個原型非?;A(chǔ)缺少錯誤恢復、復雜工作流編排等高級功能但它清晰地展示了“駕馭”AI的核心思想用確定性的程序邏輯去管理和引導非確定性的AI模型。5. 從原型到生產(chǎn)Harness Engineering的進階挑戰(zhàn)與最佳實踐構(gòu)建一個可用的原型只是第一步。要將Harness投入生產(chǎn)環(huán)境解決真實業(yè)務問題我們還需要面對一系列更嚴峻的挑戰(zhàn)并采納相應的工程最佳實踐。5.1 挑戰(zhàn)一可靠性Reliability與錯誤處理Error HandlingAI模型和外部服務如數(shù)據(jù)庫、API都可能出錯。一個健壯的Harness必須具備完善的錯誤處理機制。重試與退避對于暫時性錯誤如網(wǎng)絡超時、API限流框架應自動重試并采用指數(shù)退避策略避免加重服務壓力。降級策略Fallback當主要工具或模型失敗時應有備用方案。例如如果GPT-4調(diào)用失敗可以自動降級到GPT-3.5如果自動SQL生成失敗可以轉(zhuǎn)交給一個更簡單的關(guān)鍵詞查詢模板或直接提示用戶提供更明確的信息。超時控制為每個工具調(diào)用和LLM響應設置嚴格的超時時間防止單個步驟卡死整個流程。事務與回滾對于涉及多步驟數(shù)據(jù)修改的任務需要考慮類似數(shù)據(jù)庫事務的機制。如果后續(xù)步驟失敗應能回滾之前步驟已執(zhí)行的操作。這在自動化流程中至關(guān)重要。5.2 挑戰(zhàn)二成本控制與性能優(yōu)化大規(guī)模使用LLM成本高昂延遲也可能成為問題。智能路由根據(jù)任務的復雜度和對模型能力的要求將任務路由到不同成本的模型。簡單的信息提取可以用小模型復雜的推理再用大模型。這需要框架具備模型路由的能力。緩存策略對頻繁出現(xiàn)的、結(jié)果確定的查詢?nèi)纭肮究偛康刂肥鞘裁础笨梢詫LM的響應進行緩存避免重復計算。對于工具調(diào)用結(jié)果如果數(shù)據(jù)更新不頻繁也可以緩存。Token使用優(yōu)化精心設計系統(tǒng)提示詞System Prompt和上下文管理避免攜帶不必要的冗長歷史。使用摘要技術(shù)Summarization來壓縮長對話歷史而非簡單拼接。異步與流式處理對于長耗時任務框架應支持異步執(zhí)行并可能提供進度反饋。對于文本生成支持流式輸出可以提升用戶體驗。5.3 挑戰(zhàn)三評估、監(jiān)控與持續(xù)改進MLOps for AI如何知道你的AI Harness運行良好如何持續(xù)改進它這需要建立一套針對AI工作流的MLOps實踐。定義評估指標根據(jù)任務類型定義成功指標。例如對于問答系統(tǒng)可以是準確率對于代碼生成可以是單元測試通過率對于工作流可以是端到端任務完成率。自動化評估流水線構(gòu)建一個包含大量測試用例Golden Dataset的評估集。每次對Harness框架或Prompt進行修改后自動運行評估集對比關(guān)鍵指標的變化防止回歸。生產(chǎn)環(huán)境監(jiān)控除了傳統(tǒng)的應用性能監(jiān)控APM還需要監(jiān)控AI特定指標每次調(diào)用的Token消耗、成本、延遲、工具調(diào)用成功率、用戶反饋點贊/點踩等。設置警報當錯誤率或成本異常升高時及時通知。數(shù)據(jù)飛輪與持續(xù)學習收集生產(chǎn)環(huán)境中處理成功和失敗的案例經(jīng)過脫敏和審核將其作為新的訓練數(shù)據(jù)或Few-shot示例用于持續(xù)優(yōu)化Prompt、工具描述或任務分解邏輯。5.4 挑戰(zhàn)四安全、合規(guī)與可控性在企業(yè)環(huán)境中安全永遠是第一位的。工具調(diào)用沙箱對于執(zhí)行代碼、訪問敏感系統(tǒng)的工具必須在嚴格的沙箱環(huán)境中運行限制其權(quán)限和資源訪問。輸入/輸出過濾與審查在所有與用戶交互的邊界點部署內(nèi)容安全過濾器防止生成或傳播有害信息。審計日志詳細記錄每一個用戶請求、AI的完整思考鏈Chain-of-Thought、所有的工具調(diào)用及其參數(shù)結(jié)果。這對于問題排查、合規(guī)審計和模型行為分析不可或缺。人工在環(huán)Human-in-the-loop為關(guān)鍵決策點或低置信度結(jié)果設置“人工審批”環(huán)節(jié)。例如當AI建議的營銷文案涉及特定法規(guī)時必須由人類審核后才能發(fā)布。Harness Engineering的成熟意味著AI應用開發(fā)正從“煉金術(shù)”走向“工程學”。它要求開發(fā)者不僅需要理解機器學習模型更需要具備扎實的軟件工程能力——設計模式、系統(tǒng)架構(gòu)、測試、部署、監(jiān)控。這場范式轉(zhuǎn)移正在重塑我們構(gòu)建智能軟件的方式。