構(gòu)化簡(jiǎn)報(bào):AI日?qǐng)?bào)自動(dòng)化生成全流程拆解)
1. 一份AI日?qǐng)?bào)的誕生從信息洪流到結(jié)構(gòu)化簡(jiǎn)報(bào)每天早上七點(diǎn)我的信息采集腳本會(huì)自動(dòng)跑完一輪把過(guò)去24小時(shí)里散落在各個(gè)角落的AI動(dòng)態(tài)抓回來(lái)去重、分類、打分最后生成一份可以直接發(fā)出去的日?qǐng)?bào)。這套流程我打磨了將近一年中間推翻重來(lái)過(guò)三次現(xiàn)在算是跑得比較順了。今天這篇不聊別的就把這套AI最新資訊日?qǐng)?bào)的生產(chǎn)邏輯完整拆開從信息源怎么選、去重怎么做、評(píng)分怎么定到最終排版和人工復(fù)核的邊界在哪里全部攤開講。你可能會(huì)問(wèn)現(xiàn)在各種AI新聞聚合工具一抓一大把為什么還要自己搭一套原因很簡(jiǎn)單通用工具給你的是所有信息而日?qǐng)?bào)需要的是今天值得看的信息。這兩者之間的差距就是一套篩選和排序邏輯。我搭這套東西的初衷是給自己團(tuán)隊(duì)做每日晨會(huì)前的信息同步材料后來(lái)發(fā)現(xiàn)身邊不少朋友也有類似需求就慢慢把流程標(biāo)準(zhǔn)化了。這篇文章適合三類人看一是想給自己或團(tuán)隊(duì)做信息簡(jiǎn)報(bào)的從業(yè)者二是對(duì)信息聚合流程感興趣的技術(shù)同學(xué)三是單純想知道一份靠譜的AI日?qǐng)?bào)背后長(zhǎng)什么樣的讀者。不管你是哪一類看完應(yīng)該都能拿走點(diǎn)能直接用的東西。先說(shuō)清楚一個(gè)前提日?qǐng)?bào)的核心價(jià)值不在于全而在于準(zhǔn)和快。全的信息網(wǎng)上到處都是但把噪音過(guò)濾掉、把真正重要的東西挑出來(lái)、并且用最短的時(shí)間讓人看懂這才是日?qǐng)?bào)存在的意義。所以整套流程的設(shè)計(jì)目標(biāo)就三個(gè)詞覆蓋夠廣、噪音夠低、閱讀夠快。后面所有的技術(shù)選型和參數(shù)調(diào)整都是圍繞這三個(gè)目標(biāo)來(lái)的。2. 信息源的分層策略為什么我不追求全網(wǎng)抓取2.1 三層信息源結(jié)構(gòu)的設(shè)計(jì)邏輯剛開始做的時(shí)候我犯過(guò)一個(gè)典型錯(cuò)誤覺得信息源越多越好恨不得把能抓的站點(diǎn)全接進(jìn)來(lái)。結(jié)果就是每天抓回來(lái)幾百條光去重和篩選就耗掉大量時(shí)間而且信噪比極低。后來(lái)我改成三層結(jié)構(gòu)情況才好轉(zhuǎn)。第一層是核心源大概8到10個(gè)這些是必須每天掃的包括主流AI研究機(jī)構(gòu)的官方博客、幾個(gè)頭部模型廠商的更新日志、以及兩三個(gè)高質(zhì)量的行業(yè)分析通訊。這一層的特點(diǎn)是更新頻率穩(wěn)定、內(nèi)容質(zhì)量高、幾乎不會(huì)出現(xiàn)純?cè)胍簟5诙邮菙U(kuò)展源大概20到30個(gè)覆蓋技術(shù)社區(qū)的熱門討論、開源項(xiàng)目的release動(dòng)態(tài)、以及一些垂直領(lǐng)域的專業(yè)媒體。這一層需要過(guò)濾但經(jīng)常能挖到核心源沒覆蓋的細(xì)節(jié)。第三層是信號(hào)源主要是社交平臺(tái)上的討論熱度和關(guān)鍵詞趨勢(shì)這一層不直接產(chǎn)出內(nèi)容而是用來(lái)判斷今天什么話題在升溫輔助排序。為什么要這么分因?yàn)椴煌瑢蛹?jí)的源處理策略完全不同。核心源可以全量抓取、直接進(jìn)入候選池?cái)U(kuò)展源需要先過(guò)一遍關(guān)鍵詞過(guò)濾信號(hào)源則只提取趨勢(shì)指標(biāo)不抓正文。如果混在一起處理要么漏掉重要信息要么被噪音淹沒。2.2 每個(gè)源的具體接入方式和踩坑記錄接入方式上我優(yōu)先選RSS其次是官方API最后才是網(wǎng)頁(yè)解析。RSS的好處是結(jié)構(gòu)穩(wěn)定、解析成本低缺點(diǎn)是很多新站點(diǎn)不提供了。官方API最可靠但有頻率限制需要做請(qǐng)求隊(duì)列。網(wǎng)頁(yè)解析是最后的選擇因?yàn)轫?yè)面結(jié)構(gòu)一變就得改代碼維護(hù)成本高。這里踩過(guò)一個(gè)坑有幾個(gè)源我一開始用網(wǎng)頁(yè)解析跑了兩個(gè)月都好好的結(jié)果對(duì)方改版整個(gè)抓取直接掛掉而且因?yàn)闆]做失敗告警我過(guò)了三天才發(fā)現(xiàn)日?qǐng)?bào)里少了這一塊內(nèi)容。后來(lái)我加了兩條規(guī)則一是所有解析任務(wù)必須有失敗重試和告警二是核心源盡量走RSS或API實(shí)在沒有再考慮解析。另外抓取頻率也要控制我一般設(shè)成每30分鐘一輪太頻繁容易被限流太稀疏又會(huì)影響時(shí)效性。還有一個(gè)細(xì)節(jié)是時(shí)區(qū)處理。AI領(lǐng)域的動(dòng)態(tài)是全球性的不同源的發(fā)布時(shí)間戳?xí)r區(qū)不一樣如果不統(tǒng)一處理排序就會(huì)亂。我的做法是全部轉(zhuǎn)成UTC存儲(chǔ)展示的時(shí)候再轉(zhuǎn)成本地時(shí)區(qū)。這個(gè)看起來(lái)是小事但實(shí)際跑起來(lái)時(shí)區(qū)問(wèn)題導(dǎo)致的排序錯(cuò)亂非常常見。3. 去重這件事比想象中難得多3.1 從URL去重到語(yǔ)義去重的三級(jí)方案去重是日?qǐng)?bào)流程里最容易被低估的環(huán)節(jié)。最開始我只做了URL去重覺得同一個(gè)鏈接不重復(fù)出現(xiàn)就行了。但實(shí)際跑起來(lái)發(fā)現(xiàn)同一個(gè)事件往往有多個(gè)來(lái)源報(bào)道URL完全不同內(nèi)容卻高度重合。比如某個(gè)模型發(fā)布官方博客一條、科技媒體三條、社區(qū)討論五條如果不去重日?qǐng)?bào)里就會(huì)出現(xiàn)九條講同一件事的內(nèi)容。我現(xiàn)在的去重分三級(jí)。第一級(jí)是URL精確去重這個(gè)最簡(jiǎn)單維護(hù)一個(gè)已抓取URL的集合就行。第二級(jí)是標(biāo)題相似度去重用編輯距離或者簡(jiǎn)單的分詞后Jaccard相似度閾值設(shè)在0.75左右超過(guò)就認(rèn)為是同一事件。第三級(jí)是語(yǔ)義去重這個(gè)最復(fù)雜需要對(duì)正文做向量化然后計(jì)算余弦相似度。我試過(guò)幾種方案最后選了一個(gè)輕量級(jí)的句子向量模型本地跑不依賴外部服務(wù)延遲可以接受。三級(jí)去重不是每級(jí)都全量跑而是逐級(jí)過(guò)濾。URL去重后剩下的才進(jìn)標(biāo)題去重標(biāo)題去重后剩下的才進(jìn)語(yǔ)義去重。這樣能把計(jì)算量壓下來(lái)。實(shí)測(cè)下來(lái)一級(jí)去重能去掉大約15%的重復(fù)二級(jí)再去掉20%左右三級(jí)再去掉10%左右。最終進(jìn)入候選池的大概是原始抓取量的55%到60%。3.2 語(yǔ)義去重的閾值調(diào)優(yōu)和誤殺處理語(yǔ)義去重的閾值調(diào)優(yōu)是個(gè)細(xì)活。閾值太高重復(fù)內(nèi)容去不掉閾值太低會(huì)把相關(guān)但不同的事件誤殺。比如某模型發(fā)布新版本和某模型新版本性能評(píng)測(cè)這兩條語(yǔ)義相似度很高但它們是不同的內(nèi)容一個(gè)是發(fā)布消息一個(gè)是評(píng)測(cè)分析都不應(yīng)該被去掉。我的做法是引入一個(gè)事件類型標(biāo)簽。在去重之前先對(duì)每條內(nèi)容做一個(gè)粗分類比如發(fā)布評(píng)測(cè)融資論文工具更新等。只有同類型的內(nèi)容才進(jìn)入語(yǔ)義去重比較跨類型的即使相似度高也保留。這樣能有效降低誤殺率。另外我還會(huì)保留被去重內(nèi)容的來(lái)源列表在最終展示時(shí)標(biāo)注此事件有N個(gè)來(lái)源報(bào)道這樣既避免了重復(fù)又保留了信息完整度。還有一個(gè)經(jīng)驗(yàn)是去重結(jié)果要定期人工抽查。我一般每周抽一天把去重前后的內(nèi)容對(duì)比看一下確認(rèn)沒有誤殺重要內(nèi)容。這個(gè)習(xí)慣幫我發(fā)現(xiàn)過(guò)好幾次閾值設(shè)置的問(wèn)題。4. 評(píng)分與排序讓真正重要的內(nèi)容浮上來(lái)4.1 多維度評(píng)分模型的構(gòu)建去重之后候選池里可能還有幾十條內(nèi)容這時(shí)候就需要排序把最重要的放在前面。我用的是一套多維度評(píng)分模型主要考慮四個(gè)維度來(lái)源權(quán)重、內(nèi)容熱度、時(shí)效性、以及話題匹配度。來(lái)源權(quán)重是基礎(chǔ)分核心源給高分?jǐn)U展源給中等分信號(hào)源不直接參與內(nèi)容評(píng)分。內(nèi)容熱度包括社交平臺(tái)的討論量、轉(zhuǎn)發(fā)量等指標(biāo)這個(gè)需要從信號(hào)源那邊拿數(shù)據(jù)。時(shí)效性是隨時(shí)間衰減的越新的內(nèi)容分越高我用的是一個(gè)半衰期24小時(shí)的衰減函數(shù)。話題匹配度則是看這條內(nèi)容是否命中了當(dāng)前的重點(diǎn)關(guān)注關(guān)鍵詞比如最近大家在關(guān)注什么方向命中就加分。四個(gè)維度的權(quán)重不是固定的我會(huì)根據(jù)實(shí)際情況調(diào)整。比如重大發(fā)布密集的時(shí)候會(huì)提高來(lái)源權(quán)重的占比行業(yè)討論活躍的時(shí)候會(huì)提高熱度權(quán)重。這個(gè)調(diào)整目前還是手動(dòng)做的我試過(guò)做成自動(dòng)的但效果不穩(wěn)定后來(lái)還是保留了人工干預(yù)的入口。4.2 人工干預(yù)的邊界在哪里說(shuō)到人工干預(yù)這里有個(gè)原則機(jī)器負(fù)責(zé)排序人負(fù)責(zé)定調(diào)。什么意思就是評(píng)分模型給出一個(gè)初始排序但最終日?qǐng)?bào)的頭條放什么、哪些內(nèi)容需要加編者按、哪些內(nèi)容要合并成專題這些由人來(lái)決定。機(jī)器不擅長(zhǎng)判斷這條內(nèi)容對(duì)讀者意味著什么這個(gè)判斷必須由人來(lái)做。我一般會(huì)在早上花15到20分鐘做這件事。先看機(jī)器排出來(lái)的前20條快速掃一遍然后做三件事一是調(diào)整頭條把當(dāng)天最重要的放上去二是合并同類項(xiàng)把講同一件事的多條內(nèi)容合成一條三是補(bǔ)充背景有些內(nèi)容需要一句話說(shuō)明為什么這條重要這個(gè)機(jī)器寫不出來(lái)。這個(gè)流程聽起來(lái)簡(jiǎn)單但實(shí)際做起來(lái)最耗時(shí)的往往是判斷哪條最重要。我的經(jīng)驗(yàn)是不要試圖追求絕對(duì)客觀日?qǐng)?bào)本身就是有立場(chǎng)的關(guān)鍵是立場(chǎng)要一致、要透明。比如我這份日?qǐng)?bào)的立場(chǎng)是關(guān)注技術(shù)進(jìn)展和產(chǎn)品落地那么純資本層面的新聞就會(huì)往后排這個(gè)標(biāo)準(zhǔn)一旦定了就不要每天變。5. 日?qǐng)?bào)的呈現(xiàn)格式讓人三分鐘能讀完5.1 結(jié)構(gòu)化模板的設(shè)計(jì)日?qǐng)?bào)的呈現(xiàn)格式我改過(guò)很多版現(xiàn)在的版本大概是這樣的開頭是一句話摘要概括今天最重要的動(dòng)態(tài)然后是分板塊的內(nèi)容一般分模型與產(chǎn)品技術(shù)與研究行業(yè)與生態(tài)三個(gè)板塊每個(gè)板塊下面按重要性排3到5條每條包含標(biāo)題、一句話說(shuō)明、以及來(lái)源鏈接最后是一個(gè)值得關(guān)注的簡(jiǎn)短列表放一些還沒成氣候但值得留意的信號(hào)。為什么要分板塊因?yàn)樽x者的關(guān)注點(diǎn)不一樣。做技術(shù)的可能更關(guān)心模型和研究做產(chǎn)品的可能更關(guān)心產(chǎn)品和生態(tài)。分板塊能讓不同的人快速定位到自己關(guān)心的部分。每個(gè)板塊內(nèi)部的排序邏輯是一樣的都是按評(píng)分從高到低。每條內(nèi)容的一句話說(shuō)明是最考驗(yàn)功力的地方。它不能只是標(biāo)題的重復(fù)而要補(bǔ)充標(biāo)題里沒有的信息比如這個(gè)更新解決了什么問(wèn)題這個(gè)數(shù)據(jù)意味著什么。我一般要求自己寫的一句話說(shuō)明能讓讀者不點(diǎn)開鏈接就知道這條內(nèi)容的核心價(jià)值。5.2 排版細(xì)節(jié)和閱讀體驗(yàn)優(yōu)化排版上有幾個(gè)細(xì)節(jié)是我踩過(guò)坑之后定下來(lái)的。第一每條內(nèi)容之間要有明顯的分隔我用的是空行加短橫線這樣掃讀的時(shí)候不會(huì)串行。第二來(lái)源鏈接放在每條內(nèi)容的末尾用統(tǒng)一的格式方便復(fù)制。第三重要內(nèi)容用加粗標(biāo)注關(guān)鍵詞但不要整句加粗那樣反而沒有重點(diǎn)。還有一個(gè)是長(zhǎng)度控制。整份日?qǐng)?bào)我控制在1500到2000字之間太短信息量不夠太長(zhǎng)讀者讀不完。如果某天內(nèi)容特別多我會(huì)把次要內(nèi)容放到值得關(guān)注列表里只給標(biāo)題和鏈接不展開說(shuō)明。這樣既保證了信息完整度又控制了閱讀時(shí)間。實(shí)測(cè)下來(lái)一份排版良好的日?qǐng)?bào)讀者三到五分鐘就能讀完并且能記住三到五個(gè)關(guān)鍵信息。這個(gè)效率是遠(yuǎn)高于自己刷各種信息流的。6. 自動(dòng)化與人工的配合哪些環(huán)節(jié)必須留人6.1 可以完全自動(dòng)化的環(huán)節(jié)抓取、去重、初步評(píng)分、排版生成這些環(huán)節(jié)我已經(jīng)完全自動(dòng)化了。每天早上七點(diǎn)腳本跑完八點(diǎn)前我打開電腦就能看到一份初稿。這些環(huán)節(jié)的共同特點(diǎn)是規(guī)則明確、判斷標(biāo)準(zhǔn)一致、不需要理解內(nèi)容含義。比如去重相似度超過(guò)閾值就是重復(fù)這個(gè)判斷不需要人來(lái)做。自動(dòng)化帶來(lái)的好處不只是省時(shí)間更重要的是一致性。人工做這些事情今天狀態(tài)好可能做得細(xì)明天累了可能就馬虎了。機(jī)器不會(huì)只要規(guī)則不變輸出就是穩(wěn)定的。這也是為什么我堅(jiān)持把能自動(dòng)化的都自動(dòng)化。6.2 必須人工介入的環(huán)節(jié)但有幾個(gè)環(huán)節(jié)我堅(jiān)持留給人來(lái)做。一是頭條判斷哪條內(nèi)容放頭條這個(gè)需要理解當(dāng)天整體信息環(huán)境機(jī)器做不了。二是一句話說(shuō)明的撰寫這個(gè)需要理解內(nèi)容的價(jià)值機(jī)器寫的往往很生硬。三是異常處理比如某天某個(gè)核心源掛了或者抓回來(lái)的內(nèi)容明顯異常這些需要人來(lái)判斷怎么處理。還有一個(gè)容易被忽略的環(huán)節(jié)是反饋收集。我會(huì)定期問(wèn)幾個(gè)固定讀者這份日?qǐng)?bào)對(duì)他們有沒有用、哪里可以改進(jìn)。這個(gè)反饋是調(diào)整評(píng)分權(quán)重和板塊設(shè)置的重要依據(jù)。機(jī)器不知道讀者想要什么只有人知道。7. 跑了一年之后我總結(jié)出的幾條經(jīng)驗(yàn)7.1 關(guān)于信息源的維護(hù)信息源不是接進(jìn)來(lái)就完事了需要定期維護(hù)。我每個(gè)月會(huì)做一次源的健康檢查看哪些源更新頻率下降了、哪些源內(nèi)容質(zhì)量變差了、有沒有新的優(yōu)質(zhì)源可以加進(jìn)來(lái)。這個(gè)維護(hù)工作看起來(lái)瑣碎但不做的話日?qǐng)?bào)質(zhì)量會(huì)慢慢下降。還有一個(gè)經(jīng)驗(yàn)是不要迷信大源。有些小型的垂直博客更新頻率不高但每篇都是干貨這種源的價(jià)值遠(yuǎn)高于一些更新頻繁但內(nèi)容注水的媒體。判斷一個(gè)源值不值得留我的標(biāo)準(zhǔn)是過(guò)去一個(gè)月里它貢獻(xiàn)了多少條最終進(jìn)入日?qǐng)?bào)的內(nèi)容。如果一條都沒有那就要考慮替換了。7.2 關(guān)于時(shí)效性和準(zhǔn)確性的平衡AI領(lǐng)域的信息有個(gè)特點(diǎn)快但經(jīng)常反轉(zhuǎn)。早上看到的消息下午可能就被辟謠了。所以日?qǐng)?bào)里我有個(gè)原則不確定的信息標(biāo)注不確定。如果一條內(nèi)容只有單一來(lái)源而且來(lái)源權(quán)威性一般我會(huì)在說(shuō)明里加一句此消息尚未得到官方確認(rèn)。這樣既保證了時(shí)效性又避免了誤導(dǎo)讀者。另外對(duì)于重大事件我一般會(huì)等半天再發(fā)看看有沒有后續(xù)更新。這個(gè)等半天的策略幫我避免過(guò)好幾次烏龍。當(dāng)然如果是確定性的官方發(fā)布那就直接發(fā)不用等。7.3 關(guān)于讀者反饋的處理讀者反饋里最有價(jià)值的是這條內(nèi)容對(duì)我沒用和這條內(nèi)容我早就知道了。前者說(shuō)明篩選標(biāo)準(zhǔn)有問(wèn)題后者說(shuō)明時(shí)效性或覆蓋度有問(wèn)題。這兩類反饋我都會(huì)認(rèn)真處理調(diào)整對(duì)應(yīng)的環(huán)節(jié)。但也要注意不要被個(gè)別反饋帶偏。日?qǐng)?bào)是給一群人看的不可能讓每個(gè)人都滿意。我的做法是看趨勢(shì)如果多個(gè)人反映類似問(wèn)題那就調(diào)整如果只是個(gè)別意見那就記錄一下觀察觀察再說(shuō)。8. 如果你也想搭一套從哪里開始8.1 最小可行版本的搭建路徑如果你看完想自己搭一套我建議從最小可行版本開始。不要一上來(lái)就搞幾十個(gè)源、復(fù)雜的評(píng)分模型那樣很容易半途而廢。第一步選3到5個(gè)你最??吹男畔⒃从米詈?jiǎn)單的腳本抓回來(lái)存到一個(gè)地方。第二步加一個(gè)最簡(jiǎn)單的去重URL去重就行。第三步按時(shí)間排序生成一個(gè)簡(jiǎn)單的列表。這三步做完你就有了一份最基礎(chǔ)的日?qǐng)?bào)。然后根據(jù)實(shí)際使用中的痛點(diǎn)逐步加功能。覺得噪音多就加關(guān)鍵詞過(guò)濾覺得排序不合理就加評(píng)分模型覺得排版不好看就調(diào)模板。每一步都解決一個(gè)具體問(wèn)題這樣搭出來(lái)的系統(tǒng)才是真正適合你的。8.2 幾個(gè)容易踩的坑和規(guī)避方法第一個(gè)坑是過(guò)度追求自動(dòng)化。有些環(huán)節(jié)機(jī)器做不好就是做不好硬要自動(dòng)化結(jié)果就是質(zhì)量下降。該人工的地方就人工效率和質(zhì)量要平衡。第二個(gè)坑是忽視失敗處理。抓取失敗、解析失敗、去重失敗這些都要有告警和重試機(jī)制。我前面說(shuō)過(guò)我因?yàn)闆]做告警漏了三天內(nèi)容才發(fā)現(xiàn)。這個(gè)教訓(xùn)很深刻。第三個(gè)坑是不做版本管理。評(píng)分權(quán)重、去重閾值、模板格式這些參數(shù)改了之后要記錄不然過(guò)一段時(shí)間你自己都忘了為什么設(shè)成這個(gè)值。我用一個(gè)簡(jiǎn)單的配置文件加注釋來(lái)管理每次調(diào)整都寫清楚原因和日期。第四個(gè)坑是只做不評(píng)。日?qǐng)?bào)發(fā)出去就完了不收集反饋、不做效果評(píng)估。這樣你永遠(yuǎn)不知道自己做得好不好。我建議至少每個(gè)月做一次簡(jiǎn)單的回顧看看哪些內(nèi)容被讀得多、哪些被忽略據(jù)此調(diào)整。這套流程跑到現(xiàn)在我最大的體會(huì)是日?qǐng)?bào)的價(jià)值不在于技術(shù)多復(fù)雜而在于對(duì)讀者需求的理解有多深。技術(shù)只是工具真正決定日?qǐng)?bào)質(zhì)量的是你知不知道自己或你的讀者真正需要什么信息。這個(gè)判斷機(jī)器幫不了你只能靠自己在實(shí)踐中慢慢摸索。