視頻理解智能體架構(gòu)與實(shí)踐)
1. 從“被動(dòng)觀看”到“主動(dòng)探索”視頻理解范式的根本性轉(zhuǎn)變?cè)趥鹘y(tǒng)的視頻理解任務(wù)中無論是動(dòng)作識(shí)別、事件檢測(cè)還是視頻問答模型的處理方式都像是一個(gè)被動(dòng)的“觀眾”。我們通常會(huì)將整段視頻分割成均勻的幀序列或者通過滑動(dòng)窗口的方式將視頻片段一股腦地喂給模型。模型的任務(wù)是在這些給定的、通常是冗余的視覺信息中提煉出我們想要的答案。這種范式存在一個(gè)根本性的瓶頸它默認(rèn)了所有視頻區(qū)域和時(shí)間片段都具有同等的信息價(jià)值。然而人類在觀看視頻時(shí)我們的注意力是高度動(dòng)態(tài)和選擇性的。我們會(huì)快速掃視畫面聚焦于運(yùn)動(dòng)物體、人臉、文字或者任何與當(dāng)前任務(wù)比如“找鑰匙”、“看比分”相關(guān)的關(guān)鍵區(qū)域而忽略掉靜止的背景或無關(guān)細(xì)節(jié)。這種主動(dòng)的、目標(biāo)驅(qū)動(dòng)的視覺感知機(jī)制是高效理解復(fù)雜視覺場(chǎng)景的核心。“LensWalk”這個(gè)概念的出現(xiàn)正是試圖將這種人類般的主動(dòng)感知能力賦予AI Agent。它不再是一個(gè)被動(dòng)的信息接收器而是一個(gè)擁有“視覺焦點(diǎn)的決策者”。Agent需要根據(jù)當(dāng)前的任務(wù)例如“描述視頻中人物的情緒變化”或“找出導(dǎo)致故障的操作步驟”自主地決定接下來應(yīng)該“看”視頻的哪個(gè)部分、以何種分辨率、持續(xù)多長時(shí)間。這不僅僅是技術(shù)上的優(yōu)化更是一種范式上的躍遷——從“全盤接收后處理”轉(zhuǎn)向“按需索取式感知”。其核心驅(qū)動(dòng)力來自于大型語言模型LLM所展現(xiàn)出的強(qiáng)大任務(wù)規(guī)劃與推理能力以及視覺語言模型VLM提供的跨模態(tài)理解基礎(chǔ)。LLM充當(dāng)了Agent的“大腦”負(fù)責(zé)解析任務(wù)、制定觀察計(jì)劃、綜合歷史觀察做出判斷而VLM則像是Agent的“眼睛”能夠根據(jù)大腦的指令對(duì)指定的視覺區(qū)域進(jìn)行理解和描述。這種新范式的價(jià)值是顯而易見的。首先它極大地提升了處理效率。對(duì)于長視頻或高分辨率視頻無需處理全部像素可以節(jié)省大量的計(jì)算資源。其次它能夠提升理解的精度和深度。通過主動(dòng)聚焦于關(guān)鍵信息可以減少無關(guān)噪聲的干擾使得模型的分析更加精準(zhǔn)。最后它使得AI與視頻的交互方式更加自然和靈活為構(gòu)建真正具備“視覺常識(shí)”和“場(chǎng)景理解”能力的智能體鋪平了道路。接下來我們將深入拆解實(shí)現(xiàn)這一范式的核心組件與工作流程。2. LensWalk智能體的核心架構(gòu)大腦、眼睛與決策循環(huán)構(gòu)建一個(gè)能夠自主決定“看哪里”的LensWalk智能體需要一個(gè)精心設(shè)計(jì)的架構(gòu)將規(guī)劃、感知與記憶模塊緊密耦合。這個(gè)架構(gòu)通常不是單一的模型而是一個(gè)由多個(gè)組件協(xié)同工作的系統(tǒng)。我們可以將其核心抽象為三個(gè)部分任務(wù)規(guī)劃器大腦、視覺感知器眼睛以及一個(gè)驅(qū)動(dòng)它們不斷迭代的工作記憶與決策循環(huán)。2.1 任務(wù)規(guī)劃器基于LLM的“戰(zhàn)略大腦”任務(wù)規(guī)劃器是整個(gè)智能體的指揮中心通常由一個(gè)大型語言模型LLM來擔(dān)任。它的輸入是用戶的自然語言指令例如“總結(jié)這個(gè)烹飪教學(xué)視頻的關(guān)鍵步驟”以及智能體自身的工作記憶即歷史觀察和推理記錄。它的核心職責(zé)是進(jìn)行高層級(jí)的任務(wù)分解和觀察點(diǎn)規(guī)劃。工作流程如下任務(wù)解析與初始化LLM首先解析用戶指令將其轉(zhuǎn)化為一個(gè)可執(zhí)行的、分階段的目標(biāo)。例如對(duì)于“總結(jié)關(guān)鍵步驟”它可能會(huì)初步規(guī)劃為“第一階段識(shí)別視頻主題和主要人物第二階段定位明顯的場(chǎng)景轉(zhuǎn)換如切菜、翻炒第三階段聚焦于手部特寫和食材變化以確認(rèn)具體步驟?!鄙删唧w觀察指令基于當(dāng)前階段的目標(biāo)和工作記憶中的已有信息LLM會(huì)生成一個(gè)非常具體的、機(jī)器可執(zhí)行的觀察指令。這個(gè)指令不再是自然語言而是一個(gè)結(jié)構(gòu)化的查詢通常包含時(shí)空定位需要觀察的視頻時(shí)間戳如t120s和空間區(qū)域如bbox[x1, y1, x2, y2]或描述性指令如“畫面中央正在說話的人的臉部”。觀察粒度需要以何種細(xì)節(jié)程度進(jìn)行觀察。例如“快速瀏覽整個(gè)畫面以獲取全局上下文”或者“高分辨率聚焦于儀表盤上的數(shù)字讀數(shù)”。觀察目的明確本次觀察希望回答的問題這有助于視覺感知器進(jìn)行有針對(duì)性的分析。例如“觀察這個(gè)區(qū)域判斷人物手中拿著的工具是什么”信息綜合與決策在收到視覺感知器返回的觀察結(jié)果后LLM會(huì)將其整合到工作記憶中。然后判斷當(dāng)前子任務(wù)是否已完成是否需要調(diào)整后續(xù)計(jì)劃是否發(fā)現(xiàn)了新的、更重要的線索需要優(yōu)先追蹤基于此它決定是進(jìn)入下一個(gè)規(guī)劃-觀察循環(huán)還是可以生成最終答案。注意LLM本身并不“看”視頻。它所有的空間和時(shí)間推理都基于文本描述。因此如何將視頻的時(shí)空結(jié)構(gòu)如幀序列、物體位置有效地編碼成LLM能夠理解的文本提示是設(shè)計(jì)中的關(guān)鍵挑戰(zhàn)。通常需要將視頻的元信息如總時(shí)長、可能存在的物體類別列表以及歷史觀察的文本描述精心組織成提示詞Prompt。2.2 視覺感知器基于VLM的“高精度眼睛”視覺感知器是智能體與視頻像素直接交互的接口其核心是一個(gè)視覺語言模型VLM。VLM具備同時(shí)理解圖像和文本的能力。當(dāng)它接收到來自任務(wù)規(guī)劃器的結(jié)構(gòu)化觀察指令時(shí)它需要執(zhí)行以下操作指令解析與幀提取系統(tǒng)根據(jù)指令中的時(shí)間戳從視頻中提取出對(duì)應(yīng)的關(guān)鍵幀或一個(gè)短的幀序列如1秒內(nèi)的3幀。區(qū)域裁剪與處理如果指令中包含了空間區(qū)域邊界框則從提取的幀中裁剪出該區(qū)域。如果需要高分辨率觀察可能會(huì)對(duì)裁剪區(qū)域進(jìn)行上采樣。視覺問答將處理后的圖像或圖像序列與指令中的“觀察目的”文本問題一起輸入VLM。VLM會(huì)分析圖像內(nèi)容并生成一個(gè)文本形式的答案或描述。例如對(duì)于問題“人物手中拿著的工具是什么”VLM可能回答“一把紅色的螺絲刀”。結(jié)果格式化與返回將VLM的輸出進(jìn)行格式化通常是一個(gè)結(jié)構(gòu)化的觀察記錄包含時(shí)間戳、觀察區(qū)域、提出的問題以及得到的答案然后返回給任務(wù)規(guī)劃器。VLM的選擇至關(guān)重要它的能力直接決定了智能體“看”的清晰度和理解深度。一個(gè)強(qiáng)大的VLM應(yīng)該能準(zhǔn)確識(shí)別物體、動(dòng)作、場(chǎng)景、文字并能理解物體間的關(guān)系和簡(jiǎn)單的因果。目前像GPT-4V、Gemini Pro Vision、Claude 3以及開源的LLaVA、Qwen-VL等都是常用的候選模型。選擇時(shí)需要在識(shí)別精度、推理速度、上下文長度和API成本之間進(jìn)行權(quán)衡。2.3 工作記憶與決策循環(huán)智能體的“認(rèn)知流”單個(gè)的“看”和“想”不足以構(gòu)成智能行為。LensWalk的核心在于一個(gè)動(dòng)態(tài)的、迭代的決策循環(huán)而工作記憶是這個(gè)循環(huán)的粘合劑。工作記憶這是一個(gè)不斷增長的文本記錄它存儲(chǔ)了智能體到目前為止所有的“經(jīng)歷”用戶初始任務(wù)、歷次規(guī)劃決策、每一次的觀察指令、以及對(duì)應(yīng)的觀察結(jié)果。它本質(zhì)上為LLM提供了完整的上下文使其能夠進(jìn)行連貫的、有狀態(tài)的推理避免重復(fù)觀察或遺忘關(guān)鍵信息。決策循環(huán)這是一個(gè)經(jīng)典的“感知-規(guī)劃-行動(dòng)”循環(huán)在視頻理解領(lǐng)域的體現(xiàn)規(guī)劃LLM基于當(dāng)前任務(wù)和工作記憶生成下一個(gè)觀察指令。感知系統(tǒng)執(zhí)行該指令調(diào)用VLM對(duì)指定視頻區(qū)域進(jìn)行觀察并獲得結(jié)果。更新將觀察結(jié)果整合到工作記憶中。評(píng)估LLM評(píng)估當(dāng)前信息是否足以完成任務(wù)或是否需要繼續(xù)觀察。若需繼續(xù)則回到步驟1若已完成則生成最終輸出。這個(gè)循環(huán)會(huì)一直進(jìn)行直到LLM認(rèn)為已經(jīng)收集到足夠的信息來可靠地回答用戶問題或者達(dá)到了預(yù)設(shè)的迭代次數(shù)防止陷入死循環(huán)。通過這種方式智能體實(shí)現(xiàn)了對(duì)視頻內(nèi)容的主動(dòng)、定向探索。3. 實(shí)現(xiàn)LensWalk的關(guān)鍵技術(shù)挑戰(zhàn)與應(yīng)對(duì)策略將LensWalk從概念變?yōu)榭蛇\(yùn)行的代碼會(huì)遇到一系列棘手的技術(shù)挑戰(zhàn)。這些挑戰(zhàn)直接關(guān)系到智能體的實(shí)用性、效率和可靠性。3.1 時(shí)空指令的 grounding如何讓LLM“理解”視頻空間LLM是純文本模型它如何能“說出”像“請(qǐng)觀察視頻第32秒畫面右下角四分之一的區(qū)域”這樣的指令這涉及到將視頻的時(shí)空坐標(biāo)“接地”grounding到LLM的文本世界中。常見的策略有幾種離散化網(wǎng)格編碼將每一幀畫面劃分為NxN的網(wǎng)格如8x8并為每個(gè)網(wǎng)格單元賦予一個(gè)唯一的標(biāo)識(shí)符如A1, B2, … H8。在提示詞中告訴LLM這個(gè)坐標(biāo)系。當(dāng)LLM需要指定區(qū)域時(shí)它可以用“網(wǎng)格C3到F6”這樣的文本描述。系統(tǒng)在收到指令后再將網(wǎng)格標(biāo)識(shí)符映射回像素坐標(biāo)。這種方法簡(jiǎn)單但精度較粗。相對(duì)位置描述訓(xùn)練LLM或通過提示工程使其學(xué)會(huì)使用“左上角”、“中央偏右”、“覆蓋整個(gè)屏幕下方三分之一”等相對(duì)描述。系統(tǒng)后端需要將這些模糊描述解析為具體的坐標(biāo)這通常需要結(jié)合目標(biāo)檢測(cè)或顯著性區(qū)域檢測(cè)來輔助定位復(fù)雜度較高。混合策略結(jié)合使用網(wǎng)格編碼和自然描述。例如先讓LLM輸出一個(gè)邊界框的歸一化坐標(biāo)[0.1, 0.6, 0.4, 0.9]這需要LLM在訓(xùn)練時(shí)見過類似的格式或者通過少樣本提示Few-shot Prompting來教會(huì)它。同時(shí)讓LLM附帶一個(gè)自然語言描述作為冗余方便人類理解和調(diào)試。實(shí)操心得在項(xiàng)目初期從離散化網(wǎng)格開始是最穩(wěn)妥的。你可以定義一個(gè)6x6的網(wǎng)格并在給LLM的系統(tǒng)提示System Prompt中清晰地定義這個(gè)坐標(biāo)系并給出幾個(gè)示例。例如“你可以在指令中使用如‘觀察網(wǎng)格區(qū)域 B2:D5’來指定一個(gè)矩形區(qū)域?!?這能快速驗(yàn)證循環(huán)的可行性。后續(xù)為了更精細(xì)的控制可以嘗試讓LLM輸出歸一化坐標(biāo)但務(wù)必在提示詞中提供嚴(yán)格的輸出格式示例并使用后處理代碼來校驗(yàn)和修正格式錯(cuò)誤的輸出。3.2 觀察效率與成本控制避免“無頭蒼蠅”式的亂看一個(gè)幼稚的智能體可能會(huì)像無頭蒼蠅一樣在視頻中隨機(jī)跳躍觀察導(dǎo)致計(jì)算成本VLM API調(diào)用極高且效率低下。我們必須設(shè)計(jì)策略來引導(dǎo)智能體的注意力。分層觀察策略模仿人類“先看全局再看局部”的習(xí)慣。第一輪觀察可以是低分辨率、全幀的快速瀏覽目的是建立視頻的全局概覽主題、主要人物、場(chǎng)景類型、關(guān)鍵事件時(shí)間點(diǎn)。基于這個(gè)概覽LLM再規(guī)劃后續(xù)針對(duì)特定區(qū)域和時(shí)間的精細(xì)化觀察。這能有效避免一開始就陷入無關(guān)細(xì)節(jié)。利用視頻先驗(yàn)信息在讓智能體“自由探索”之前我們可以先用一些輕量級(jí)、自動(dòng)化的工具為它提供“地圖”。例如場(chǎng)景分割使用傳統(tǒng)CV算法或輕量模型檢測(cè)出視頻的場(chǎng)景切換點(diǎn)將這些時(shí)間點(diǎn)作為潛在的觀察錨點(diǎn)。運(yùn)動(dòng)檢測(cè)識(shí)別出視頻中運(yùn)動(dòng)顯著的區(qū)域這些區(qū)域更可能包含重要信息。語音轉(zhuǎn)文字提取視頻的音頻并轉(zhuǎn)為字幕文本信息可以直接提供給LLM幫助它理解對(duì)話內(nèi)容和關(guān)鍵時(shí)間點(diǎn)。 將這些先驗(yàn)信息作為初始上下文給到LLM能極大提升其規(guī)劃的質(zhì)量和效率。設(shè)置預(yù)算與停止條件這是工程上的必須項(xiàng)。必須明確設(shè)定最大迭代次數(shù)例如最多進(jìn)行10輪“規(guī)劃-觀察”循環(huán)。單次觀察成本估算每次調(diào)用VLM的耗時(shí)和費(fèi)用設(shè)定總成本上限。置信度閾值LLM在綜合所有信息后可以輸出一個(gè)對(duì)最終答案的置信度。當(dāng)置信度達(dá)到閾值時(shí)提前終止循環(huán)。3.3 幻覺與錯(cuò)誤累積如何保證探索的可靠性LLM和VLM都可能產(chǎn)生“幻覺”生成與輸入不符的內(nèi)容。在LensWalk的循環(huán)中一次觀察的錯(cuò)誤可能會(huì)被帶入工作記憶進(jìn)而導(dǎo)致后續(xù)一系列錯(cuò)誤的規(guī)劃形成錯(cuò)誤累積。交叉驗(yàn)證機(jī)制對(duì)于關(guān)鍵性的觀察結(jié)果可以采用多次提問或從不同角度提問的方式進(jìn)行交叉驗(yàn)證。例如當(dāng)VLM識(shí)別出一個(gè)物體為“手機(jī)”后可以追加提問“這個(gè)物體的屏幕是亮著的嗎”或“它旁邊有充電線嗎”通過回答的一致性來增加可信度。不確定性表達(dá)與處理提示LLM和VLM在輸出時(shí)對(duì)不確定的觀察注明其不確定性例如“這看起來像是一把鑰匙但畫面模糊置信度中等”。LLM在規(guī)劃時(shí)可以優(yōu)先選擇去驗(yàn)證那些高不確定性但對(duì)任務(wù)關(guān)鍵的信息。設(shè)計(jì)魯棒的提示詞給LLM的提示詞中應(yīng)明確要求其進(jìn)行批判性思考。例如“你之前的觀察指出‘人物A在生氣’但請(qǐng)注意這個(gè)觀察是基于模糊的面部表情。在下一步規(guī)劃中考慮是否可以尋找更清晰的畫面或輔助信息如肢體動(dòng)作、對(duì)話內(nèi)容來確認(rèn)這一情緒。”人工反饋回路在關(guān)鍵應(yīng)用中可以引入人工反饋。當(dāng)智能體的置信度較低或規(guī)劃陷入循環(huán)時(shí)將當(dāng)前狀態(tài)和候選決策呈現(xiàn)給人類由人類給出下一步的指導(dǎo)。這可以作為高質(zhì)量數(shù)據(jù)用于后續(xù)微調(diào)LLM的規(guī)劃能力。4. 實(shí)戰(zhàn)構(gòu)建一個(gè)簡(jiǎn)易LensWalk視頻問答系統(tǒng)的搭建步驟下面我們將拋開復(fù)雜的理論直接進(jìn)入實(shí)戰(zhàn)環(huán)節(jié)手把手搭建一個(gè)簡(jiǎn)易的LensWalk系統(tǒng)原型。這個(gè)原型將使用GPT-4 Turbo作為任務(wù)規(guī)劃器LLM使用GPT-4V作為視覺感知器VLM并通過Python代碼將它們串聯(lián)起來。我們假設(shè)要完成的任務(wù)是“找出這個(gè)會(huì)議室視頻中是誰最后離開了房間并描述他離開時(shí)的動(dòng)作?!杯h(huán)境準(zhǔn)備Python環(huán)境3.8以上。關(guān)鍵庫openai(用于調(diào)用GPT API),moviepy或opencv-python(用于視頻幀提取),Pillow(用于圖像處理)。API密鑰你需要準(zhǔn)備OpenAI的API密鑰并確保有權(quán)限調(diào)用GPT-4 Turbo和GPT-4V。4.1 步驟一視頻預(yù)處理與基礎(chǔ)工具函數(shù)首先我們需要一些輔助函數(shù)來處理視頻。import cv2 from PIL import Image import numpy as np def extract_frame(video_path, time_sec): 從視頻的指定時(shí)間點(diǎn)提取一幀圖像。 cap cv2.VideoCapture(video_path) fps cap.get(cv2.CAP_PROP_FPS) frame_index int(time_sec * fps) cap.set(cv2.CAP_PROP_POS_FRAMES, frame_index) ret, frame cap.read() cap.release() if ret: # OpenCV使用BGR轉(zhuǎn)換為RGB frame_rgb cv2.cvtColor(frame, cv2.COLOR_BGR2RGB) return Image.fromarray(frame_rgb) else: return None def crop_image(image_pil, bbox): 根據(jù)歸一化邊界框 [x1, y1, x2, y2] (值域0-1) 裁剪圖像。 width, height image_pil.size left bbox[0] * width upper bbox[1] * height right bbox[2] * width lower bbox[3] * height return image_pil.crop((left, upper, right, lower))4.2 步驟二定義智能體狀態(tài)與核心循環(huán)我們用一個(gè)簡(jiǎn)單的類來維護(hù)智能體的狀態(tài)。class LensWalkAgent: def __init__(self, openai_api_key, video_path): self.client openai.OpenAI(api_keyopenai_api_key) self.video_path video_path self.work_memory [] # 存儲(chǔ)歷史觀察和規(guī)劃 self.max_iterations 8 self.current_iteration 0 def plan_next_observation(self, user_query): 調(diào)用LLMGPT-4 Turbo基于工作記憶規(guī)劃下一步觀察。 # 構(gòu)建給LLM的提示詞 system_prompt 你是一個(gè)視頻理解智能體。你的任務(wù)是通過主動(dòng)觀察視頻的不同部分來回答用戶的問題。 你無法直接看到視頻但你可以發(fā)出觀察指令。指令格式必須是嚴(yán)格的JSON { reasoning: 你的思考過程解釋為什么選擇這個(gè)時(shí)間和區(qū)域進(jìn)行觀察。, observation_command: { timestamp_sec: 一個(gè)數(shù)字表示要觀察的時(shí)間點(diǎn)秒 bbox: [x1, y1, x2, y2], // 歸一化邊界框x1,y1是左上角x2,y2是右下角值在0到1之間。如果要看全幀用[0,0,1,1]。 question: 一個(gè)針對(duì)該區(qū)域的具體問題例如這個(gè)區(qū)域里的人在做什么 或 桌子上有什么物體 } } 你擁有之前所有觀察的歷史記錄。請(qǐng)根據(jù)任務(wù)和已有信息規(guī)劃出最能推進(jìn)任務(wù)解決的下一個(gè)觀察。 user_prompt f用戶問題{user_query}\n\n user_prompt 歷史觀察記錄\n for i, record in enumerate(self.work_memory): user_prompt f{i1}. 在{record[timestamp]}秒?yún)^(qū)域{record[bbox]} 問題{record[question]} 答案{record[answer]}\n user_prompt \n請(qǐng)生成下一個(gè)觀察指令的JSON。 response self.client.chat.completions.create( modelgpt-4-turbo-preview, messages[ {role: system, content: system_prompt}, {role: user, content: user_prompt} ], temperature0.2, # 低溫度保證輸出格式穩(wěn)定 response_format{type: json_object} ) plan json.loads(response.choices[0].message.content) return plan def execute_observation(self, plan): 執(zhí)行觀察指令提取幀裁剪區(qū)域調(diào)用VLMGPT-4V回答問題。 cmd plan[observation_command] timestamp cmd[timestamp_sec] bbox cmd[bbox] question cmd[question] # 1. 提取幀 full_frame extract_frame(self.video_path, timestamp) if full_frame is None: return {error: f無法在時(shí)間{timestamp}秒提取幀} # 2. 裁剪區(qū)域 if bbox ! [0,0,1,1]: observation_image crop_image(full_frame, bbox) else: observation_image full_frame # 3. 調(diào)用VLM response self.client.chat.completions.create( modelgpt-4-vision-preview, messages[ { role: user, content: [ {type: text, text: question}, { type: image_url, image_url: { url: fdata:image/jpeg;base64,{self.pil_to_base64(observation_image)} } } ] } ], max_tokens300 ) answer response.choices[0].message.content # 4. 記錄結(jié)果 observation_record { timestamp: timestamp, bbox: bbox, question: question, answer: answer, plan_reasoning: plan[reasoning] } self.work_memory.append(observation_record) return observation_record def pil_to_base64(self, image): 將PIL圖像轉(zhuǎn)換為Base64字符串。 import io, base64 buffered io.BytesIO() image.save(buffered, formatJPEG) return base64.b64encode(buffered.getvalue()).decode(utf-8) def run(self, user_query): 運(yùn)行主循環(huán)。 print(f開始處理任務(wù){(diào)user_query}) while self.current_iteration self.max_iterations: self.current_iteration 1 print(f\n--- 迭代 {self.current_iteration} ---) # 1. 規(guī)劃 print( 規(guī)劃中...) plan self.plan_next_observation(user_query) print(f 計(jì)劃在{plan[observation_command][timestamp_sec]}秒觀察區(qū)域{plan[observation_command][bbox]}) print(f 問題{plan[observation_command][question]}) print(f 理由{plan[reasoning]}) # 2. 執(zhí)行 print( 執(zhí)行觀察...) result self.execute_observation(plan) if error in result: print(f 錯(cuò)誤{result[error]}) break print(f 觀察結(jié)果{result[answer]}) # 3. 簡(jiǎn)單評(píng)估可以在這里加入LLM判斷是否已獲得足夠信息 # 此處為簡(jiǎn)化我們固定迭代次數(shù)后由LLM做最終回答 # 循環(huán)結(jié)束生成最終答案 final_answer self.generate_final_answer(user_query) return final_answer def generate_final_answer(self, user_query): 基于所有工作記憶生成最終答案。 # 將最終整合任務(wù)也交給LLM history_text \n.join([f在{t[timestamp]}秒看到{t[answer]} for t in self.work_memory]) prompt f基于以下對(duì)視頻的系列觀察請(qǐng)回答用戶的問題。 用戶問題{user_query} 觀察歷史 {history_text} 請(qǐng)給出一個(gè)綜合、準(zhǔn)確的答案。 response self.client.chat.completions.create( modelgpt-4-turbo-preview, messages[{role: user, content: prompt}], temperature0 ) return response.choices[0].message.content4.3 步驟三運(yùn)行與結(jié)果分析現(xiàn)在我們可以初始化智能體并運(yùn)行它。# 配置和運(yùn)行 api_key your_openai_api_key_here video_file meeting_room.mp4 # 你的視頻文件 agent LensWalkAgent(api_key, video_file) question 找出這個(gè)會(huì)議室視頻中是誰最后離開了房間并描述他離開時(shí)的動(dòng)作。 answer agent.run(question) print(f\n 最終答案 \n{answer}) print(f\n 完整的探索歷史 ) for i, obs in enumerate(agent.work_memory): print(f{i1}. t{obs[timestamp]}s, 區(qū)域{obs[bbox]}, Q: {obs[question]}, A: {obs[answer][:50]}...)一次可能的運(yùn)行過程模擬迭代1LLM規(guī)劃“先看視頻結(jié)尾比如最后5秒的全景確認(rèn)房間內(nèi)是否還有人?!?執(zhí)行后VLM回答“畫面顯示房間空無一人椅子擺放整齊?!钡?LLM規(guī)劃“這不夠。需要找到最后一個(gè)人離開的時(shí)刻。觀察視頻中間時(shí)段比如總時(shí)長的一半看是否有多人在場(chǎng)?!?執(zhí)行后VLM回答“畫面中有三個(gè)人正在會(huì)議桌旁討論?!钡?LLM規(guī)劃“現(xiàn)在需要追蹤人員減少的過程。觀察比剛才時(shí)間點(diǎn)稍晚一些比如30秒的全景?!?執(zhí)行后VLM回答“現(xiàn)在有兩個(gè)人穿藍(lán)襯衫的人正在起身?!钡?LLM規(guī)劃“聚焦于那個(gè)起身的藍(lán)襯衫人物觀察他的動(dòng)作和方向。” 執(zhí)行后VLM回答“藍(lán)襯衫男子拿起筆記本向門口走去。”迭代5LLM規(guī)劃“觀察門口區(qū)域在他可能離開的時(shí)間點(diǎn)確認(rèn)他是否走出了門。” ……最終經(jīng)過數(shù)次迭代智能體通過主動(dòng)的、有目的的觀察拼湊出了“穿藍(lán)襯衫的男子最后離開他起身拿起筆記本然后走向并離開了房間”的完整情節(jié)。踩坑實(shí)錄在實(shí)際測(cè)試中最大的不穩(wěn)定因素來自于LLM規(guī)劃指令的格式。盡管要求輸出JSON它偶爾仍會(huì)輸出不規(guī)范的內(nèi)容如缺少括號(hào)、錯(cuò)誤的鍵名。務(wù)必在plan_next_observation函數(shù)中添加健壯的JSON解析異常處理比如使用try-except并在解析失敗時(shí)讓LLM重試或回退到一個(gè)默認(rèn)的全局觀察指令。此外VLM API的調(diào)用有頻率限制如TPM/RPM限制在循環(huán)中需要加入適當(dāng)?shù)难舆t如time.sleep(1)以避免觸發(fā)429錯(cuò)誤。5. 超越問答LensWalk范式的廣闊應(yīng)用場(chǎng)景與未來展望LensWalk所代表的“主動(dòng)視覺智能體”范式其應(yīng)用遠(yuǎn)不止于簡(jiǎn)單的視頻問答。它為我們處理復(fù)雜的、開放式的視頻理解任務(wù)提供了一個(gè)全新的框架。應(yīng)用場(chǎng)景延伸交互式視頻編輯助理告訴智能體“幫我剪一個(gè)高光集錦”它可以通過主動(dòng)觀察識(shí)別出進(jìn)球、精彩操作、觀眾歡呼等時(shí)刻并自動(dòng)生成剪輯時(shí)間線。你甚至可以交互式地提出要求“再多找一些體現(xiàn)團(tuán)隊(duì)配合的片段?!惫I(yè)安防與流程監(jiān)控在工廠監(jiān)控視頻中智能體可以持續(xù)主動(dòng)巡檢而不是被動(dòng)報(bào)警。任務(wù)可以是“檢查流水線A在第三班次是否有違規(guī)操作?!?智能體會(huì)自主定位到那個(gè)時(shí)間段然后聚焦于工人的手部動(dòng)作、設(shè)備狀態(tài)等關(guān)鍵區(qū)域進(jìn)行分析。沉浸式內(nèi)容分析與檢索對(duì)于長達(dá)數(shù)小時(shí)的游戲直播或教學(xué)視頻你可以問“主播在講解‘背包管理’技巧時(shí)具體演示了哪幾個(gè)操作步驟” 智能體需要先定位到講解相關(guān)話題的片段然后聚焦于游戲UI和主播的操作細(xì)節(jié)一步步還原過程。自動(dòng)駕駛仿真分析在回放自動(dòng)駕駛系統(tǒng)的路測(cè)視頻時(shí)工程師可以詢問“在下午3點(diǎn)05分那個(gè)無保護(hù)左轉(zhuǎn)場(chǎng)景中系統(tǒng)對(duì)右側(cè)突然出現(xiàn)的自行車做出了哪些感知和決策反應(yīng)” 智能體需要找到對(duì)應(yīng)時(shí)間并持續(xù)跟蹤車輛傳感器視角、自行車軌跡以及系統(tǒng)內(nèi)部的決策標(biāo)識(shí)如果渲染在視頻上。技術(shù)演進(jìn)方向多模態(tài)記憶與推理當(dāng)前的工作記憶主要是文本。未來的智能體需要真正的多模態(tài)記憶能夠存儲(chǔ)和檢索關(guān)鍵的視覺特征如目標(biāo)的外觀嵌入從而進(jìn)行更高效的視覺關(guān)聯(lián)和追蹤。學(xué)習(xí)型規(guī)劃器目前的規(guī)劃器LLM依賴通用提示詞并非專為視覺探索優(yōu)化??梢酝ㄟ^強(qiáng)化學(xué)習(xí)RL或模仿學(xué)習(xí)Imitation Learning來微調(diào)一個(gè)專用的“視覺探索規(guī)劃器”讓它學(xué)會(huì)更高效、更精準(zhǔn)的觀察策略。具身交互如果將LensWalk智能體部署在機(jī)器人上那么“看哪里”就與“去哪里”、“做什么”緊密關(guān)聯(lián)。這演變成了經(jīng)典的具身人工智能Embodied AI問題如視覺導(dǎo)航VLN和機(jī)器人操作智能體需要為了完成物理任務(wù)如“拿一杯水”而主動(dòng)規(guī)劃視覺觀察。開源生態(tài)與輕量化目前依賴GPT-4等閉源、重型模型成本高且延遲大。未來的趨勢(shì)是出現(xiàn)專門為主動(dòng)視覺任務(wù)設(shè)計(jì)的、更輕量化的開源VLM和規(guī)劃模型使得LensWalk能力能夠本地化部署應(yīng)用于更廣泛的場(chǎng)景。從我個(gè)人的實(shí)驗(yàn)來看LensWalk范式最令人興奮的一點(diǎn)在于它將視頻理解從一個(gè)“靜態(tài)分類問題”轉(zhuǎn)變?yōu)橐粋€(gè)“動(dòng)態(tài)決策過程”。我們不再僅僅是設(shè)計(jì)一個(gè)更好的分類網(wǎng)絡(luò)而是在設(shè)計(jì)一個(gè)智能體的“行為策略”。這其中的挑戰(zhàn)從如何定義觀察動(dòng)作的空間到如何評(píng)估探索策略的好壞再到如何訓(xùn)練一個(gè)穩(wěn)健的規(guī)劃器每一個(gè)都是充滿趣味的研究課題。雖然當(dāng)前的原型還比較簡(jiǎn)陋容易受到幻覺和錯(cuò)誤規(guī)劃的干擾但它清晰地指明了一個(gè)方向讓AI像我們一樣帶著目的和好奇心去“看”世界。