盤(pán)引擎:從歷史文檔到結(jié)構(gòu)化復(fù)盤(pán)報(bào)告)
1. 立項(xiàng)背景復(fù)盤(pán)總在開(kāi)完會(huì)后消失我需要一個(gè)后見(jiàn)之明引擎hindsight 這個(gè)項(xiàng)目最初的靈感來(lái)自一場(chǎng)讓我印象深刻的復(fù)盤(pán)會(huì)。去年我們團(tuán)隊(duì)一個(gè)平臺(tái)項(xiàng)目上線后表現(xiàn)遠(yuǎn)不及預(yù)期我組織了一場(chǎng)復(fù)盤(pán)三個(gè)小時(shí)討論完筆記本上記了六頁(yè)當(dāng)時(shí)覺(jué)得問(wèn)題已經(jīng)說(shuō)透了。三個(gè)月后我再翻那六頁(yè)發(fā)現(xiàn)很多關(guān)鍵細(xì)節(jié)——誰(shuí)在什么節(jié)點(diǎn)提出過(guò)反對(duì)意見(jiàn)、為什么沒(méi)被采納、有哪些預(yù)警信號(hào)被忽略了——全都對(duì)不上了。筆記還在但后見(jiàn)之明丟了。這個(gè)項(xiàng)目就是試圖解決這個(gè)問(wèn)題的產(chǎn)物把需要靠人腦記憶才能獲得的事后聰明變成一套可以系統(tǒng)化產(chǎn)出、可以被檢索復(fù)用的能力。1.1 三個(gè)讓我下決心的失敗復(fù)盤(pán)現(xiàn)場(chǎng)第一個(gè)現(xiàn)場(chǎng)就是上面說(shuō)的那個(gè)平臺(tái)項(xiàng)目。復(fù)盤(pán)會(huì)上產(chǎn)品說(shuō)需求評(píng)審太粗糙開(kāi)發(fā)說(shuō)排期一直被打斷測(cè)試說(shuō)需求變更導(dǎo)致用例反復(fù)返工每個(gè)人都講得很有道理。但當(dāng)我試圖把時(shí)間線還原出來(lái)時(shí)所有人對(duì)關(guān)鍵節(jié)點(diǎn)的記憶都不一致有人記得需求變更發(fā)生在 9 月有人堅(jiān)持是 8 月中旬誰(shuí)都沒(méi)法給出確切的證據(jù)。這種復(fù)盤(pán)靠感覺(jué)的狀態(tài)讓我非常不安——如果連事實(shí)鏈條都沒(méi)對(duì)齊所謂根因討論就只是各說(shuō)各話。第二個(gè)現(xiàn)場(chǎng)來(lái)自一次人員變動(dòng)。項(xiàng)目里最了解整體架構(gòu)的同事在收尾階段離職了三個(gè)月后新接手的人做復(fù)盤(pán)面對(duì)一堆歷史資料完全無(wú)從下手只能按郵件標(biāo)題瞎猜當(dāng)時(shí)的決策背景。那次復(fù)盤(pán)最終產(chǎn)出的不是教訓(xùn)而是大量的問(wèn)號(hào)。我心里很清楚這些信息不是不存在它就在會(huì)議紀(jì)要、IM 聊天記錄、周報(bào)和郵件里只是散落在幾十個(gè)文件里靠人肉翻找根本拼不出完整的圖。第三個(gè)現(xiàn)場(chǎng)更讓我難受也是直接推動(dòng)我立項(xiàng)的最后一根稻草。同一個(gè)類型的問(wèn)題在不同項(xiàng)目里反復(fù)出現(xiàn)需求變更失控、關(guān)鍵人離職導(dǎo)致信息斷層、技術(shù)債一直被優(yōu)先級(jí)不高擋回去。每個(gè)項(xiàng)目結(jié)束時(shí)復(fù)盤(pán)都會(huì)總結(jié)出類似的教訓(xùn)但下個(gè)項(xiàng)目照樣踩進(jìn)同一個(gè)坑。原因很簡(jiǎn)單教訓(xùn)沒(méi)有被結(jié)構(gòu)化沉淀沒(méi)有變成下次決策前能自動(dòng)檢索到的數(shù)據(jù)。每一次復(fù)盤(pán)都像在荒地上重挖一口井挖完就忘了位置。1.2 hindsight 的定位把事后聰明變成可沉淀的資產(chǎn)hindsight 在英語(yǔ)里就是后見(jiàn)之明、事后聰明心理學(xué)上對(duì)應(yīng)的 hindsight bias 通常被當(dāng)成認(rèn)知偏差來(lái)批判——人一旦知道了結(jié)果就會(huì)不自覺(jué)認(rèn)定我早就知道會(huì)這樣。但我決定換個(gè)角度來(lái)看這件事人腦會(huì)出現(xiàn)事后聰明偏差是因?yàn)槲覀兊挠洃洉?huì)隨著結(jié)果被重構(gòu)但如果分析是建立在真實(shí)、完整、有時(shí)間順序的歷史數(shù)據(jù)上那后見(jiàn)之明就不再是偏差而是一種可以被反復(fù)調(diào)用的資產(chǎn)。所以我把項(xiàng)目命名為 hindsight目標(biāo)很直接做一個(gè) AI 復(fù)盤(pán)引擎輸入是項(xiàng)目的歷史資料——周報(bào)、會(huì)議紀(jì)要、需求變更記錄、郵件、聊天記錄導(dǎo)出——輸出是一份結(jié)構(gòu)化復(fù)盤(pán)報(bào)告包含關(guān)鍵事件時(shí)間線、決策鏈還原、預(yù)期偏差分析、根因判斷、可執(zhí)行的改進(jìn)項(xiàng)。技術(shù)載體我選了 Dify。如果你還不熟悉可以先把它理解成一個(gè)開(kāi)源的大模型應(yīng)用開(kāi)發(fā)平臺(tái)把模型調(diào)用、知識(shí)庫(kù)檢索、工作流編排都做成了可視化節(jié)點(diǎn)能省下大量膠水代碼。這篇文章會(huì)完整記錄我為什么做這個(gè)選型、系統(tǒng)按什么邏輯劃分模塊、在 Dify 上每一步怎么搭以及拿一個(gè)真實(shí)失敗項(xiàng)目做驗(yàn)收時(shí)的輸出效果和踩過(guò)的坑。如果你手里有一堆讀不完的歷史文檔或者正在猶豫要不要用 Dify 落地一個(gè)實(shí)際業(yè)務(wù)場(chǎng)景這篇應(yīng)該能讓你少走不少?gòu)澛贰?. 技術(shù)選型記錄為什么放棄代碼直寫(xiě)選擇 Dify2.1 我先試過(guò)的兩條路線在最終敲定 Dify 之前我實(shí)際試過(guò)兩條路線都走了一半就放棄了。第一條是用 Python 加 LangChain 從零搭建。坦白說(shuō)寫(xiě)一個(gè)讀文檔、做總結(jié)的 Demo 很快一個(gè)周末就能跑通。但一進(jìn)入產(chǎn)品化階段問(wèn)題就全暴露出來(lái)了你要處理模型 API 的限流和超時(shí)重試要搭向量數(shù)據(jù)庫(kù)我當(dāng)時(shí)在 Chroma 和 Milvus 之間反復(fù)折騰要設(shè)計(jì)多輪 Agent 推理時(shí)的工具調(diào)用和記憶管理還得寫(xiě)前端頁(yè)面把報(bào)告展示出來(lái)。任何一個(gè)環(huán)節(jié)出了問(wèn)題排查成本都不低。我在這條路上磨了三周最后發(fā)現(xiàn) Demo 代碼只有幾百行而周邊工程代碼已經(jīng)膨脹到兩三千行還在繼續(xù)增加。第二條路線是用現(xiàn)成的 AI 套件或通用助手。這條路省事但定制天花板太低。通用助手可以幫你做概括總結(jié)可復(fù)盤(pán)分析不是一次提示詞就能搞定的工作——它需要先抽取結(jié)構(gòu)化事件再做預(yù)期偏差比較接著推理根因最后生成報(bào)告每一步都有中間產(chǎn)物需要被保留和復(fù)用。通用工具給不了這種多階段的狀態(tài)管理我如果強(qiáng)行用就得靠人工一步步喂上下文效率和穩(wěn)定性都達(dá)不到可用標(biāo)準(zhǔn)。2.2 Dify 打動(dòng)我的四個(gè)點(diǎn)選擇 Dify 不是因?yàn)樗婷婢愕蕉撬『媒鉀Q了上面兩條路線的核心痛點(diǎn)。對(duì)我這個(gè)項(xiàng)目來(lái)說(shuō)下面四個(gè)特性是最關(guān)鍵的Dify 的特性對(duì) hindsight 項(xiàng)目的價(jià)值可視化工作流編排多階段分析流程用節(jié)點(diǎn)拖拽完成各階段結(jié)果以變量形式傳給下個(gè)節(jié)點(diǎn)中間產(chǎn)物隨時(shí)可查內(nèi)置知識(shí)庫(kù)/RAG上傳的歷史文檔自動(dòng)分塊、向量化檢索參數(shù)可調(diào)省去自建向量庫(kù)的運(yùn)維成本模型無(wú)關(guān)分析階段用強(qiáng)推理模型抽取階段用便宜快的小模型一個(gè)面板就能切換應(yīng)用即 API工作流發(fā)布后自動(dòng)生成接入接口批量和前端集成都很方便其中內(nèi)置知識(shí)庫(kù)這一點(diǎn)幫我省了最多事。之前自建 Milvus 再加 embedding 管線的方案單是處理文檔分塊策略和檢索調(diào)優(yōu)就夠?qū)懸恢艽a。Dify 里這些是開(kāi)箱即用的雖然自定義程度不如自己寫(xiě)但對(duì)復(fù)盤(pán)場(chǎng)景完全夠用。知識(shí)庫(kù)和文檔檢索是這種文檔理解類應(yīng)用的地基能直接復(fù)用成熟能力就不要自己造輪子了。2.3 一個(gè)容易被忽略的決策因素可維護(hù)性選型時(shí)大多數(shù)人容易盯著功能列表看但真正影響長(zhǎng)期收益的是改起來(lái)有多難。復(fù)盤(pán)分析這件事分析維度一定會(huì)變今天我關(guān)心延期根因下個(gè)季度可能更關(guān)心質(zhì)量指標(biāo)再往后也許要加入團(tuán)隊(duì)協(xié)作健康度的評(píng)估。如果用代碼直寫(xiě)每次調(diào)整都要改管線、重新部署但在 Dify 里我只需要改某個(gè) LLM 節(jié)點(diǎn)的提示詞或者在工作流里增刪一個(gè)節(jié)點(diǎn)改動(dòng)范圍被控制在了單一環(huán)節(jié)內(nèi)。還有一點(diǎn)很實(shí)際團(tuán)隊(duì)里不懂代碼的人也能看懂工作流圖形化的邏輯這在評(píng)審和交接時(shí)價(jià)值巨大。如果你想長(zhǎng)期維護(hù)一個(gè) AI 應(yīng)用可維護(hù)性這一條比任何靈活性宣傳都實(shí)在——畢竟沒(méi)有哪個(gè)項(xiàng)目是寫(xiě)完就永遠(yuǎn)不動(dòng)的。3. 核心系統(tǒng)拆解歷史數(shù)據(jù)如何一步步變成復(fù)盤(pán)洞察3.1 第一層異構(gòu)數(shù)據(jù)接入與時(shí)間軸統(tǒng)一復(fù)盤(pán)分析最大的難點(diǎn)不是總結(jié)而是輸入數(shù)據(jù)天生就是異構(gòu)的。同一個(gè)項(xiàng)目里周報(bào)可能是 Markdown會(huì)議紀(jì)要可能是 Word需求變更來(lái)自 Jira 導(dǎo)出的表格關(guān)鍵決策散落在 IM 聊天記錄中發(fā)布記錄是郵件。它們的詳細(xì)程度、時(shí)間粒度、表述口徑完全不同直接丟給模型分析結(jié)果幾乎可以肯定是混亂的。我的處理策略分兩步。第一步是格式統(tǒng)一用文檔提取器把 PDF、Word、Excel 變成純文本再用代碼節(jié)點(diǎn)做清洗比如把表格式的需求變更記錄轉(zhuǎn)成時(shí)間-變更內(nèi)容-提出人的文本行。第二步是時(shí)間歸一把每一條記錄綁定到標(biāo)準(zhǔn)時(shí)間字段上統(tǒng)一成 YYYY-MM-DD 或 YYYY-MM-DD HH:mm 格式并統(tǒng)一到時(shí)區(qū)。這一步容易被低估但它是后面一切分析的地基——沒(méi)有統(tǒng)一時(shí)間軸的資料LLM 判斷誰(shuí)先發(fā)生時(shí)必然出錯(cuò)后續(xù)因果分析也就不可信了。3.2 第二層事件與決策鏈的抽取時(shí)間軸統(tǒng)一之后下一步是讓 LLM 從原始文本里抽取三類結(jié)構(gòu)化信息事件、決策、預(yù)期。事件指發(fā)生了什么、誰(shuí)做的、結(jié)果如何決策指誰(shuí)在什么時(shí)點(diǎn)做了判斷、依據(jù)是什么、有沒(méi)有備選方案預(yù)期指當(dāng)時(shí)設(shè)定的目標(biāo)或預(yù)估比如預(yù)計(jì) 10 月底上線以及后來(lái)實(shí)際實(shí)現(xiàn)的結(jié)果。為了讓抽取結(jié)果能被下游程序直接使用我要求 LLM 輸出嚴(yán)格 JSON。下面是我實(shí)際使用的抽取 schema 簡(jiǎn)化版{ events: [ { time: 2023-08-12, actor: 產(chǎn)品負(fù)責(zé)人, action: 提出新增報(bào)表模塊需求, outcome: 進(jìn)入需求排期, source_doc: 周報(bào)_0812 } ], decisions: [ { time: 2023-08-20, decision: 接受需求變更, rationale: 客戶高層明確要求, alternatives: 拒絕或延期至二期, source_doc: 會(huì)議紀(jì)要_0820 } ], expectations: [ { time: 2023-07-05, stated: 預(yù)計(jì) 2023-10-31 上線, actual: 2024-01-18 上線, delta_days: 79 } ] }這一步做到能跑容易做到穩(wěn)定難。LLM 經(jīng)常把決策和普通動(dòng)作混在一起也會(huì)漏掉隱含的預(yù)期表述比如應(yīng)該在本季度內(nèi)完成這種沒(méi)有明確日期但有明確期望的句子。要穩(wěn)定抽取一方面要在提示詞里給足 few-shot 示例另一方面要用代碼節(jié)點(diǎn)做格式校驗(yàn)發(fā)現(xiàn)不合規(guī)的 JSON 就讓模型重跑一次。這部分在第五節(jié)會(huì)展開(kāi)講。3.3 第三層預(yù)期偏差與根因分析抽取出結(jié)構(gòu)化數(shù)據(jù)之后核心分析才有可靠的輸入。我設(shè)計(jì)了偏差識(shí)別和根因分析兩個(gè)串聯(lián)動(dòng)作。偏差識(shí)別是把每個(gè)預(yù)期和對(duì)應(yīng)的實(shí)際結(jié)果做差值比較找出偏差最大或反復(fù)出現(xiàn)的偏差點(diǎn)。根因分析則用多視角推理讓模型分別從需求管理、技術(shù)方案、資源調(diào)度、流程協(xié)作、外部依賴五個(gè)視角給出各自假設(shè)再合并成一條完整的根因鏈。這里有一個(gè)關(guān)鍵約束每條根因必須引用結(jié)構(gòu)化數(shù)據(jù)里具體的事件、時(shí)間和來(lái)源文檔不允許無(wú)依據(jù)推測(cè)。寧可輸出資料未覆蓋無(wú)法判斷也不能編造。復(fù)盤(pán)場(chǎng)景和一般閑聊不同編造的結(jié)論比沒(méi)有結(jié)論危害更大——因?yàn)樗鼤?huì)給后續(xù)決策提供虛假的安全感。3.4 第四層洞察生成與報(bào)告沉淀最后一步是生成報(bào)告。我不讓 LLM 用一次調(diào)用直接寫(xiě)一篇總結(jié)而是用模板結(jié)構(gòu)把前面各階段的產(chǎn)出渲染成固定格式的 Markdown 報(bào)告包含背景信息、關(guān)鍵事件時(shí)間線、決策鏈、偏差清單、根因鏈、教訓(xùn)、改進(jìn)項(xiàng)七個(gè)部分。為什么用模板因?yàn)楣潭ńY(jié)構(gòu)才能保證不同項(xiàng)目之間的報(bào)告可橫向?qū)Ρ纫材茏屜掠蜗到y(tǒng)穩(wěn)定解析。報(bào)告生成之后我會(huì)把它寫(xiě)入獨(dú)立的復(fù)盤(pán)報(bào)告知識(shí)庫(kù)。這一步的價(jià)值要到項(xiàng)目后期才顯現(xiàn)當(dāng)你積累了十幾份復(fù)盤(pán)報(bào)告后就可以用知識(shí)庫(kù)檢索回答我們團(tuán)隊(duì)最常出現(xiàn)的延期原因是什么哪些改進(jìn)項(xiàng)上次提過(guò)但沒(méi)執(zhí)行這類跨項(xiàng)目問(wèn)題。單個(gè)項(xiàng)目的復(fù)盤(pán)是點(diǎn)跨項(xiàng)目復(fù)盤(pán)才是網(wǎng)而網(wǎng)的前提就是每一份報(bào)告都以可檢索的方式沉淀下來(lái)。4. 搭建實(shí)錄在 Dify 上把 Hindsight 跑起來(lái)4.1 應(yīng)用類型選 Workflow 還是 ChatflowDify 新建應(yīng)用時(shí)首先要選類型這個(gè)選擇不能拍腦袋。我在 hindsight 項(xiàng)目里分別用到了 Workflow 和 Chatflow各自分工完全不同。Workflow 適合輸入確定、流程確定、輸出確定的批處理任務(wù)復(fù)盤(pán)報(bào)告生成正是這種情況拿到一批歷史資料跑完整條管線產(chǎn)出一份報(bào)告。所以我把主分析流程放在了 Workflow 里。Chatflow 則適合對(duì)話式交互。報(bào)告生成后用戶大概率會(huì)追問(wèn)為什么判斷根因是需求變更失控當(dāng)時(shí)有沒(méi)有人反對(duì)過(guò)這個(gè)決策這些是沒(méi)法預(yù)先窮盡的開(kāi)放式問(wèn)題。我另外建了一個(gè) Chatflow把報(bào)告和原始抽取結(jié)果作為上下文專門(mén)回答針對(duì)報(bào)告的追問(wèn)。兩個(gè)應(yīng)用通過(guò)同一個(gè)知識(shí)庫(kù)銜接邏輯清晰、互不干擾。很多人上來(lái)就把所有交互塞進(jìn)一個(gè) Chatflow結(jié)果流程里夾著大量分支調(diào)試難度成倍上升。4.2 主工作流的節(jié)點(diǎn)編排全圖主工作流的節(jié)點(diǎn)順序大致如下我用列表來(lái)說(shuō)清楚每一步的職責(zé)開(kāi)始節(jié)點(diǎn)接收用戶上傳的文件或粘貼的文本。文檔提取器把 docx、pdf、xlsx 轉(zhuǎn)成純文本。代碼節(jié)點(diǎn)文本清洗、敏感信息脫敏、時(shí)間歸一化。迭代節(jié)點(diǎn)按時(shí)間窗口把文本切成多個(gè)分片每個(gè)分片調(diào)用一次事件抽取 LLM。代碼節(jié)點(diǎn)合并所有分片抽取出的 JSON去重并按時(shí)間排序。知識(shí)檢索節(jié)點(diǎn)在已有復(fù)盤(pán)報(bào)告庫(kù)中檢索相似歷史案例可選步驟。LLM 節(jié)點(diǎn)執(zhí)行預(yù)期偏差與根因分析輸入是合并后的結(jié)構(gòu)化數(shù)據(jù)。LLM 節(jié)點(diǎn)生成最終 Markdown 報(bào)告。模板轉(zhuǎn)換節(jié)點(diǎn)把 JSON 報(bào)告渲染成最終可讀格式。結(jié)束節(jié)點(diǎn)返回報(bào)告。這個(gè)編排里有幾個(gè)值得注意的細(xì)節(jié)。迭代節(jié)點(diǎn)的輸入必須是 JSON 數(shù)組所以前面的代碼節(jié)點(diǎn)要把時(shí)間分片構(gòu)造成數(shù)組。每個(gè)分析階段的 LLM 節(jié)點(diǎn)輸出都會(huì)變成變量傳給下游你可以在運(yùn)行記錄里直接查看每一步的中間產(chǎn)物——排查哪一步出了問(wèn)題時(shí)就非常方便這也是可視化工作流比純代碼管線更好用的原因之一。4.3 復(fù)盤(pán)分析的關(guān)鍵 Prompt整個(gè)工作流里Prompt 的重要性遠(yuǎn)大于節(jié)點(diǎn)數(shù)量。我踩過(guò)AI 輸出空泛結(jié)論的坑之后把復(fù)盤(pán)分析的 system prompt 改成了下面這個(gè)版本效果提升非常明顯你是資深項(xiàng)目管理復(fù)盤(pán)分析師。你的任務(wù)是基于時(shí)間有序的歷史資料還原關(guān)鍵事件、決策鏈條和預(yù)期偏差并給出可執(zhí)行的改進(jìn)建議。 要求 1. 所有結(jié)論必須引用資料中的具體時(shí)間、人物和原文依據(jù)禁止無(wú)依據(jù)推測(cè)。 2. 嚴(yán)格按時(shí)間先后順序組織事件禁止使用后來(lái)才知道早就該發(fā)現(xiàn)這類結(jié)果倒推表述。 3. 證據(jù)不足時(shí)明確標(biāo)注資料未覆蓋禁止編造。 4. 避免加強(qiáng)溝通提升效率這類空泛建議。每條建議必須對(duì)應(yīng)一個(gè)具體動(dòng)作、一個(gè)執(zhí)行角色和一個(gè)觸發(fā)時(shí)機(jī)。 5. 輸出必須符合給定的 JSON 格式不得輸出 JSON 之外的任何文本。注意第 2 條它是針對(duì)復(fù)盤(pán)場(chǎng)景里 AI 最容易犯的事后聰明病專門(mén)設(shè)計(jì)的。模型如果只看到結(jié)果會(huì)忍不住把所有事件都往結(jié)果上靠生成一種既然失敗了那每一步都是錯(cuò)的的假因果。強(qiáng)制它按時(shí)間順序組織能很大程度打斷這種倒推傾向。第 4 條則是為了對(duì)抗正確廢話讓每條建議都落到具體的人和動(dòng)作上。4.4 知識(shí)庫(kù)配置和上下文管理我在 Dify 里建了兩個(gè)知識(shí)庫(kù)一個(gè)放歷史原始資料一個(gè)放復(fù)盤(pán)報(bào)告配置邏輯完全不同。原始資料庫(kù)的分塊大小設(shè)在 500 token 左右、重疊 50 token。分塊太大會(huì)導(dǎo)致檢索命中不精確太小又會(huì)丟失上下文。檢索 top_k 設(shè)為 4相關(guān)性閾值 0.3 左右這兩個(gè)參數(shù)需要根據(jù)你的文檔風(fēng)格微調(diào)沒(méi)有統(tǒng)一標(biāo)準(zhǔn)。復(fù)盤(pán)報(bào)告庫(kù)則分塊不用太細(xì)因?yàn)闄z索目標(biāo)是整份報(bào)告而不是某個(gè)細(xì)節(jié)段落。上下文管理上最容易犯的錯(cuò)是把所有資料一次性塞進(jìn)一個(gè) LLM 節(jié)點(diǎn)。我最早就是這么干的二十多份文檔擠進(jìn)一次調(diào)用輸出質(zhì)量在長(zhǎng)文本后半段急劇下降token 費(fèi)用也高得離譜。改成時(shí)間切片 迭代抽取 結(jié)構(gòu)化壓縮之后真正進(jìn)入大模型的語(yǔ)料量大幅下降而且每個(gè)階段模型只看到它該看的那部分?jǐn)?shù)據(jù)分析反而更精準(zhǔn)。這背后的道理很簡(jiǎn)單代碼和結(jié)構(gòu)化數(shù)據(jù)負(fù)責(zé)精確大模型負(fù)責(zé)理解和推理各干各擅長(zhǎng)的活。注意Dify 的迭代節(jié)點(diǎn)不適合處理特別龐大的分片數(shù)組如果項(xiàng)目資料超過(guò)一百個(gè)分片建議先在代碼節(jié)點(diǎn)里做一次粗聚類再分批進(jìn)入迭代避免運(yùn)行超時(shí)。5. 真實(shí)項(xiàng)目驗(yàn)收拿一個(gè)延期項(xiàng)目完整跑了一遍5.1 測(cè)試數(shù)據(jù)的選擇與預(yù)處理工作流搭好之后最關(guān)鍵的驗(yàn)證就是拿真實(shí)數(shù)據(jù)跑一遍。我選了一個(gè)已經(jīng)結(jié)束、公認(rèn)失敗的項(xiàng)目預(yù)算超支約 40%上線時(shí)間比原計(jì)劃晚了 79 天。選它有三個(gè)原因結(jié)果明確、資料完整、不存在敏感內(nèi)容可以放心把 AI 的結(jié)論和當(dāng)年的真實(shí)復(fù)盤(pán)做對(duì)照。我收集了該項(xiàng)目生命周期內(nèi)的 23 份文檔8 份周報(bào)、6 份會(huì)議紀(jì)要、3 份需求變更記錄、2 份技術(shù)方案、2 份發(fā)布郵件、2 份階段匯報(bào)。全部轉(zhuǎn)成純文本后大約有 4 萬(wàn) token。我沒(méi)有做任何精簡(jiǎn)刻意保留原始樣貌就想看系統(tǒng)在真實(shí)臟數(shù)據(jù)下的表現(xiàn)。5.2 輸出報(bào)告的實(shí)際效果整套工作流跑完大約花了四分鐘輸出了一份約 1500 字的報(bào)告。讓我比較驚訝的是它對(duì)偏差點(diǎn)的定位相當(dāng)準(zhǔn)識(shí)別出三個(gè)主要偏差點(diǎn)最嚴(yán)重的一個(gè)是需求變更頻率在第 25 周之后連續(xù)五周上升而排期容量沒(méi)有相應(yīng)調(diào)整。報(bào)告給出的根因鏈也很完整不是單點(diǎn)歸因而是一串因果關(guān)系關(guān)鍵決策人變動(dòng)導(dǎo)致需求確認(rèn)流程出現(xiàn)空窗期空窗期內(nèi)需求變更無(wú)人把關(guān)變更頻率上升開(kāi)發(fā)返工率隨之升高排期持續(xù)被打斷最終整體延期。這條鏈每一步都引用了具體的文檔和日期我可以直接回溯驗(yàn)證不是那種看起來(lái)有道理但無(wú)法核實(shí)的 AI 廢話。5.3 和人工復(fù)盤(pán)對(duì)照它發(fā)現(xiàn)了什么當(dāng)年人工復(fù)盤(pán)其實(shí)也得出了需求變更失控導(dǎo)致延期這個(gè)結(jié)論但對(duì)照下來(lái)Hindsight 有兩點(diǎn)確實(shí)超出了人工復(fù)盤(pán)。第一它把變更頻率的拐點(diǎn)精確到了周而人工當(dāng)時(shí)只能模糊記得需求一直在變。第二它發(fā)現(xiàn)了一條被完全忽略的預(yù)警信號(hào)某位工程師在第 20 周的郵件里明確提出系統(tǒng)技術(shù)債風(fēng)險(xiǎn)過(guò)高的判斷后續(xù)沒(méi)有任何人跟進(jìn)。對(duì)比項(xiàng)當(dāng)年人工復(fù)盤(pán)Hindsight 輸出變更頻率變化的量化只記得需求一直變精確指出第 25 周出現(xiàn)拐點(diǎn)頻率從每周 2 次升到每周 5 次被忽略的預(yù)警信號(hào)沒(méi)有提及指出第 20 周郵件中的技術(shù)債預(yù)警并追蹤到無(wú)人跟進(jìn)的記錄根因鏈完整性大致有但環(huán)節(jié)說(shuō)不清給出帶時(shí)間戳的五環(huán)節(jié)因果鏈人際關(guān)系問(wèn)題會(huì)上有人口頭提到資料未覆蓋AI 明確標(biāo)注無(wú)法判斷那個(gè)被忽略的預(yù)警信號(hào)是讓我印象最深的。人工復(fù)盤(pán)時(shí)大家注意力都被需求變更多吸引沒(méi)人把那條技術(shù)債預(yù)警當(dāng)回事AI 沒(méi)有情緒和注意力偏向只要資料里有明確表述它就一定能識(shí)別。當(dāng)然它也有盲區(qū)團(tuán)隊(duì)里的人際摩擦如果只存在于口頭而沒(méi)有文字記錄AI 完全不知道報(bào)告的結(jié)論也就缺了這一維度。5.4 現(xiàn)在還用人工復(fù)盤(pán)嗎我的做法是讓 AI 當(dāng)?shù)谝桓迤鸩菡叨皇亲罱K裁判。Hindsight 先基于資料產(chǎn)出結(jié)構(gòu)完整、帶依據(jù)的初稿人力在此基礎(chǔ)上補(bǔ)充那些沒(méi)有被寫(xiě)下來(lái)的隱性信息再對(duì)結(jié)論做最終確認(rèn)。原來(lái)一次復(fù)盤(pán)從翻資料、理時(shí)間線、寫(xiě)報(bào)告到討論共識(shí)要花兩三天現(xiàn)在時(shí)間線整理和初稿生成交給系統(tǒng)人工時(shí)間集中在討論和決策上至少省了一大半準(zhǔn)備成本。我不建議任何人把這個(gè)工具當(dāng)作復(fù)盤(pán)的唯一依據(jù)。AI 擅長(zhǎng)的是把結(jié)構(gòu)化事實(shí)找出來(lái)、串起來(lái)但這個(gè)負(fù)責(zé)人當(dāng)時(shí)是不是已經(jīng)疲憊到?jīng)]法理性決策這類需要同理心和現(xiàn)場(chǎng)感知的信息它永遠(yuǎn)無(wú)法從文檔里讀到。最好的分工是讓機(jī)器做考據(jù)讓人做判斷。6. 實(shí)測(cè)中最深的三個(gè)坑與最終解法6.1 上下文爆炸切分、迭代與摘要第一個(gè)坑在第五節(jié)提過(guò)一開(kāi)始我把所有文檔直接塞進(jìn)一個(gè) LLM 節(jié)點(diǎn)。結(jié)果 token 消耗大不說(shuō)分析質(zhì)量到了長(zhǎng)文本后半段明顯退化經(jīng)常出現(xiàn)自相矛盾的判斷。原因很直接上下文窗口再大也有注意力衰減模型對(duì)開(kāi)頭和結(jié)尾記得清楚對(duì)中間內(nèi)容的把握就很弱。解法分兩層。第一層是做時(shí)間切片把四萬(wàn) token 的語(yǔ)料按周切成二十多個(gè)分片用迭代節(jié)點(diǎn)逐個(gè)抽取結(jié)構(gòu)化事件。第二層是做結(jié)構(gòu)化壓縮下游分析節(jié)點(diǎn)只接收抽取結(jié)果——通常只有兩三千 token 的 JSON——而不是原始全文。這兩層配合既控制了成本又保證了每一步模型看到的都是高信號(hào)密度的內(nèi)容。這個(gè)思路其實(shí)可以遷移到任何長(zhǎng)文檔分析場(chǎng)景不只是復(fù)盤(pán)。6.2 和稀泥式結(jié)論讓 AI 敢下判斷第二個(gè)坑是早期版本 Prompt 太禮貌模型輸出的改進(jìn)建議全是建議加強(qiáng)需求變更管理建議提升團(tuán)隊(duì)溝通效率這種正確但無(wú)用的廢話。問(wèn)題出在提示詞沒(méi)有給出判斷標(biāo)準(zhǔn)和負(fù)面激勵(lì)模型傾向于輸出安全、圓滑的措辭。我在 Prompt 里補(bǔ)了三句話所有建議必須關(guān)聯(lián)到時(shí)間線里的具體事件和具體執(zhí)行角色空泛建議視為無(wú)效輸出如果資料支持某個(gè)結(jié)論即使措辭比較直接也要正常輸出。同時(shí)我在 few-shot 示例里放了壞回答 好回答的對(duì)比。實(shí)測(cè)中這個(gè)改動(dòng)立竿見(jiàn)影報(bào)告里的每條建議都能對(duì)應(yīng)到具體動(dòng)作和負(fù)責(zé)人。復(fù)盤(pán)場(chǎng)景尤其需要敢下判斷的 AI和稀泥的復(fù)盤(pán)比不復(fù)盤(pán)更傷人——它消耗了所有人的時(shí)間卻沒(méi)有產(chǎn)生任何決策價(jià)值。6.3 時(shí)間線亂序事件抽取的格式約束第三個(gè)坑藏得比較深是在檢查中間產(chǎn)物時(shí)發(fā)現(xiàn)的。有一次迭代抽取出的 JSON 里時(shí)間字段已經(jīng)是 ISO 格式了但 LLM 在描述事件時(shí)仍然寫(xiě)了在此之前團(tuán)隊(duì)已經(jīng)討論過(guò)而實(shí)際日期可能比后續(xù)事件更晚。也就是說(shuō)時(shí)間字段對(duì)了但模型在推理表述時(shí)的時(shí)間觀還是亂的這種相對(duì)時(shí)間詞會(huì)污染下游的分析邏輯。解法分兩步。第一步是在抽取 Prompt 中強(qiáng)調(diào)所有涉及先后關(guān)系的表述必須使用統(tǒng)一時(shí)間字段禁用之前之后后來(lái)這類相對(duì)時(shí)間詞。第二步是在合并代碼節(jié)點(diǎn)里做強(qiáng)制排序下游分析永遠(yuǎn)拿到的是一份按時(shí)間升序排列的事件列表從根源上消除亂序輸入。這個(gè)坑提醒我一個(gè)通用原則別相信 LLM 對(duì)時(shí)間的直覺(jué)格式約束加程序兜底才是可靠組合。6.4 從單項(xiàng)目到跨項(xiàng)目洞察三個(gè)坑填平之后Hindsight 已經(jīng)能穩(wěn)定輸出單項(xiàng)目復(fù)盤(pán)報(bào)告了。我現(xiàn)在正把已生成的報(bào)告往復(fù)盤(pán)知識(shí)庫(kù)里滾動(dòng)沉淀下一步想做的是跨項(xiàng)目聚合分析——讓系統(tǒng)回答我們團(tuán)隊(duì)最容易在哪個(gè)環(huán)節(jié)出問(wèn)題過(guò)去一年提過(guò)的改進(jìn)項(xiàng)執(zhí)行率如何這類問(wèn)題。單個(gè)項(xiàng)目復(fù)盤(pán)解決這件事為什么失敗跨項(xiàng)目聚合才能回答我們?yōu)槭裁磿?huì)反復(fù)失敗后者才是組織能力提升的關(guān)鍵。我個(gè)人對(duì)這套方案的真實(shí)感受是它最大的價(jià)值不在于取代人的判斷而在于把復(fù)盤(pán)從開(kāi)會(huì)時(shí)的即興發(fā)揮變成基于證據(jù)的討論。以前翻筆記翻到懷疑人生現(xiàn)在系統(tǒng)把時(shí)間線和證據(jù)鏈擺在面前人只需要做判斷和補(bǔ)充判斷依據(jù)。這正是我最初想要的東西——不是一臺(tái)替你做決定的機(jī)器而是一面不會(huì)撒謊的鏡子。最后再分享一個(gè)小技巧歷史資料里越瑣碎、越像廢話的記錄比如某次周會(huì)末尾順口提到聽(tīng)說(shuō)某客戶對(duì)現(xiàn)有方案不太滿意往往是復(fù)盤(pán)里最關(guān)鍵的線索。所以接入數(shù)據(jù)時(shí)別急著清洗掉所謂低價(jià)值內(nèi)容讓抽取階段先完整跑一遍再?zèng)Q定哪些數(shù)據(jù)不值得保留。這個(gè)細(xì)節(jié)曾經(jīng)幫我留住過(guò)一條至關(guān)重要的預(yù)警記錄也直接解釋了某個(gè)延期項(xiàng)目真正的引爆點(diǎn)。