據(jù)分析轉(zhuǎn)大模型的權(quán)限與日志課)
聊《做過數(shù)據(jù)分析的人學(xué)大模型哪些經(jīng)驗(yàn)可以直接遷移》之前先說一句實(shí)在的別急著背概念先看它在真實(shí)項(xiàng)目里到底解決什么問題。摘要很多做數(shù)據(jù)分析的同學(xué)轉(zhuǎn)大模型第一個(gè)項(xiàng)目往往是智能分析 Agent——用自然語言查數(shù)據(jù)、出報(bào)表。Demo 跑通很容易但交給團(tuán)隊(duì)用就出問題。這篇文章不聊 Prompt 怎么寫聊一個(gè)更實(shí)際的門檻權(quán)限控制、操作日志、可觀測性。這些不是錦上添花而是 Demo 變產(chǎn)品的分水嶺。目錄數(shù)據(jù)分析的新機(jī)會(huì)自然語言 BI 為什么容易做卻難用好指標(biāo)解釋 Agent不只是翻譯 SQL數(shù)據(jù)工具調(diào)用從單點(diǎn)到工作流項(xiàng)目案例從 Demo 到可維護(hù)項(xiàng)目總結(jié)---數(shù)據(jù)分析的新機(jī)會(huì)我在帶團(tuán)隊(duì)做 AI 數(shù)據(jù)產(chǎn)品時(shí)見過一個(gè)現(xiàn)象數(shù)據(jù)分析背景的同學(xué)轉(zhuǎn)大模型開發(fā)反而比純后端快。原因很實(shí)際。數(shù)據(jù)分析的人懂指標(biāo)、懂?dāng)?shù)據(jù)口徑、懂業(yè)務(wù)邏輯這些在寫 Prompt 和定義 Agent 行為時(shí)比寫代碼本身更重要。但問題也在這里。很多做數(shù)據(jù)分析的同學(xué)習(xí)慣的是出結(jié)果。報(bào)表跑通、數(shù)據(jù)準(zhǔn)確任務(wù)就結(jié)束了。但 Agent 不一樣它要面對的是真實(shí)用戶、真實(shí)權(quán)限、真實(shí)數(shù)據(jù)泄露風(fēng)險(xiǎn)。我見過一個(gè)案例一個(gè)分析師用 LangChain 寫了個(gè)智能分析 Agent本地跑通能回答上月銷售額為什么下降團(tuán)隊(duì)很興奮。結(jié)果上線第一天有用戶通過對話拿到了公司級(jí)敏感指標(biāo)權(quán)限沒控制日志沒記錄事后追查不到是誰問的、問了什么。這不是技術(shù)能力問題是工程化思維缺失。自然語言 BI 為什么容易做卻難用好自然語言轉(zhuǎn) SQL現(xiàn)在隨便一個(gè)模型都能做。Demo 階段你輸入上個(gè)月華東區(qū)的銷售額Agent 生成 SQL查庫返回結(jié)果看起來很完美。但真實(shí)環(huán)境里你會(huì)遇到這些問題權(quán)限問題不同部門的人問同樣的問題應(yīng)該看到不同的數(shù)據(jù)。銷售只能看自己區(qū)域財(cái)務(wù)可以看全公司高管可以看明細(xì)。這個(gè)權(quán)限控制不是在 Prompt 里加一句只返回用戶有權(quán)限的數(shù)據(jù)就能解決的需要在 SQL 生成階段就注入用戶權(quán)限過濾條件??趶絾栴}銷售額是含稅還是不含稅是下單時(shí)間還是發(fā)貨時(shí)間分析師知道但模型不知道。你需要把口徑定義成可查詢的知識(shí)庫而不是每次讓模型自己猜。結(jié)果驗(yàn)證模型生成的 SQL 能不能跑有沒有語法錯(cuò)誤返回結(jié)果是否合理這些都需要在 Agent 流程里加校驗(yàn)環(huán)節(jié)。我最近在做的一個(gè)項(xiàng)目就是在自然語言 BI 上加了權(quán)限注入層。核心思路是在 SQL 生成之前先把用戶身份對應(yīng)的數(shù)據(jù)權(quán)限條件拼進(jìn) WHERE 子句而不是讓模型自己去判斷。# 權(quán)限注入示例在 SQL 生成前注入數(shù)據(jù)權(quán)限條件 def inject_permissions(user_id, base_query): # 從權(quán)限服務(wù)獲取用戶可見的數(shù)據(jù)范圍 allowed_regions get_user_regions(user_id) allowed_departments get_user_departments(user_id) # 注入權(quán)限條件 if allowed_regions: base_query f AND region IN ({format_values(allowed_regions)}) if allowed_departments: base_query f AND department IN ({format_values(allowed_departments)}) return base_query這個(gè)改動(dòng)看起來簡單但它是 Demo 和產(chǎn)品的關(guān)鍵區(qū)別。指標(biāo)解釋 Agent不只是翻譯 SQL數(shù)據(jù)分析轉(zhuǎn)大模型一個(gè)很自然的延伸是做指標(biāo)解釋 Agent——用戶問為什么銷售額下降A(chǔ)gent 不僅返回?cái)?shù)據(jù)還能解釋原因。這個(gè)場景比單純的自然語言 BI 更復(fù)雜因?yàn)樯婕岸嗖酵评?。我見過一個(gè)實(shí)現(xiàn)方案第一步Agent 生成 SQL 拿到數(shù)據(jù)第二步對比歷史數(shù)據(jù)找出異常點(diǎn)第三步關(guān)聯(lián)維度分析定位下鉆方向第四步生成自然語言解釋。問題出在第三步和第四步。關(guān)聯(lián)維度分析需要模型自己決定查哪些維度這個(gè)過程不可控。模型可能查了無關(guān)維度浪費(fèi)調(diào)用次數(shù)也可能漏掉關(guān)鍵維度給出錯(cuò)誤結(jié)論。自然語言解釋需要模型編故事但編得對不對沒人能實(shí)時(shí)驗(yàn)證。我的解決方案是把可解釋的部分固化把不可控的部分暴露出來讓用戶確認(rèn)。具體來說維度分析用預(yù)定義的規(guī)則引擎而不是讓模型自由發(fā)揮。規(guī)則引擎根據(jù)業(yè)務(wù)邏輯決定在什么情況下應(yīng)該下鉆到哪個(gè)維度。模型只負(fù)責(zé)生成解釋文本不負(fù)責(zé)決定分析路徑。同時(shí)所有生成的解釋都會(huì)記錄操作日志包括用戶問了什么、模型做了什么分析、最終給出的結(jié)論是什么。這樣事后可以追溯也可以用來優(yōu)化模型。數(shù)據(jù)工具調(diào)用從單點(diǎn)到工作流數(shù)據(jù)分析的人做 Agent最容易犯的錯(cuò)誤是把所有工具調(diào)用寫在一起。比如一個(gè)銷售分析 Agent用戶問一個(gè)問題Agent 要查數(shù)據(jù)、做對比、生成圖表、寫解釋。這四個(gè)步驟如果寫成一個(gè)函數(shù)代碼會(huì)很長而且一旦某個(gè)環(huán)節(jié)出錯(cuò)整個(gè)流程就崩了。更好的做法是把每個(gè)工具調(diào)用拆成獨(dú)立步驟用工作流管理。我最近在用的方案是 LangGraph它允許你把 Agent 流程定義成有向圖每個(gè)節(jié)點(diǎn)是一個(gè)工具調(diào)用邊是流轉(zhuǎn)邏輯。這樣做的好處是每個(gè)節(jié)點(diǎn)可觀測你可以看到每一步花了多少時(shí)間、調(diào)用了什么模型、返回了什么結(jié)果。每個(gè)節(jié)點(diǎn)可重試如果某個(gè)工具調(diào)用失敗可以單獨(dú)重試不影響其他步驟。每個(gè)節(jié)點(diǎn)可替換如果某個(gè)步驟的模型效果不好可以單獨(dú)替換不需要重寫整個(gè)流程。from langgraph.graph import StateGraph, END # 定義狀態(tài) class AnalysisState(TypedDict): question: str sql: str data: pd.DataFrame insight: str chart_url: str # 定義節(jié)點(diǎn) def generate_sql(state: AnalysisState) - AnalysisState: # 調(diào)用模型生成 SQL state[sql] llm.generate_sql(state[question]) return state def execute_query(state: AnalysisState) - AnalysisState: # 執(zhí)行 SQL注入權(quán)限條件 state[data] db.execute(inject_permissions(state[sql])) return state def generate_insight(state: AnalysisState) - AnalysisState: # 基于數(shù)據(jù)生成洞察 state[insight] llm.generate_insight(state[data]) return state # 構(gòu)建工作流 workflow StateGraph(AnalysisState) workflow.add_node(generate_sql, generate_sql) workflow.add_node(execute_query, execute_query) workflow.add_node(generate_insight, generate_insight) workflow.add_edge(generate_sql, execute_query) workflow.add_edge(execute_query, generate_insight) workflow.add_edge(generate_insight, END) app workflow.compile()這個(gè)結(jié)構(gòu)看起來比單函數(shù)復(fù)雜但它給你的是可維護(hù)性。權(quán)限控制、日志記錄、錯(cuò)誤處理都可以加在對應(yīng)的節(jié)點(diǎn)里而不是整個(gè)流程里打補(bǔ)丁。項(xiàng)目案例從 Demo 到可維護(hù)項(xiàng)目去年我?guī)F(tuán)隊(duì)做了一個(gè)智能分析 Agent最初版本就是一個(gè) Demo用戶問問題Agent 生成 SQL查庫返回結(jié)果。內(nèi)部測試沒問題就準(zhǔn)備上線。上線前做了一次代碼審查發(fā)現(xiàn)了三個(gè)問題第一沒有權(quán)限控制。所有用戶都能查到所有數(shù)據(jù)包括敏感指標(biāo)。這個(gè)問題如果不在上線前解決風(fēng)險(xiǎn)很大。第二沒有操作日志。用戶問了什么、模型返回了什么、數(shù)據(jù)從哪張表查的全部沒有記錄。出了問題沒法追查。第三沒有結(jié)果校驗(yàn)。模型生成的 SQL 沒有經(jīng)過驗(yàn)證就直接執(zhí)行有注入風(fēng)險(xiǎn)也有性能風(fēng)險(xiǎn)。我們花了兩周時(shí)間做了以下改造權(quán)限控制方面我們在 SQL 生成前注入用戶權(quán)限條件并在數(shù)據(jù)返回后二次校驗(yàn)確保沒有越權(quán)數(shù)據(jù)泄露。操作日志方面我們在每個(gè)節(jié)點(diǎn)加了日志記錄包括輸入、輸出、耗時(shí)、模型調(diào)用次數(shù)。日志集中存儲(chǔ)支持按用戶、按時(shí)間、按問題類型查詢。結(jié)果校驗(yàn)方面我們加了一個(gè) SQL 解析器在生成 SQL 后檢查是否有危險(xiǎn)操作如 DROP、DELETE以及查詢復(fù)雜度是否超出閾值。改造后的 Agent上線后運(yùn)行了三個(gè)月處理了上萬次查詢沒有出現(xiàn)權(quán)限泄露或數(shù)據(jù)錯(cuò)誤。團(tuán)隊(duì)反饋是可觀測性提升后排查問題從幾小時(shí)縮短到幾分鐘。這個(gè)案例的核心結(jié)論是Demo 和產(chǎn)品的差距不在模型能力在工程化細(xì)節(jié)??偨Y(jié)數(shù)據(jù)分析轉(zhuǎn)大模型優(yōu)勢在業(yè)務(wù)理解短板在工程化思維。很多分析師做 Agent習(xí)慣的是出結(jié)果但 Agent 面對的是真實(shí)用戶和真實(shí)風(fēng)險(xiǎn)權(quán)限、日志、可觀測性不是可選項(xiàng)是必選項(xiàng)。我的建議是先做一個(gè)能跑通的 Demo驗(yàn)證你的場景是否可行。然后停下來不要急著加功能先把權(quán)限控制、操作日志、結(jié)果校驗(yàn)這三件事做好。這三件事做好了你的 Agent 才是一個(gè)可以交給團(tuán)隊(duì)用的產(chǎn)品而不只是一個(gè)演示。技術(shù)能力決定你能走多快工程化能力決定你能走多遠(yuǎn)。數(shù)據(jù)分析轉(zhuǎn)大模型這是一次機(jī)會(huì)也是一次升級(jí)。資料展示下面是我整理的AI大模型學(xué)習(xí)資料和工具包預(yù)覽適合收藏后按主題逐步學(xué)習(xí)。如果你想看完整資料目錄可以在評論區(qū)留言「資料」也歡迎告訴我你更關(guān)注AI大模型里的哪類內(nèi)容。