Dify 搭建私有數(shù)據(jù)可視化智能體,效果直逼 ChatGPT 原創(chuàng)
前幾天寫的文章??《Trae + Dify 10分鐘構(gòu)建 Data McpServer 與 Agent ,和 Excel 說再見!》??,跟大家一起實現(xiàn)了簡單的大模型數(shù)據(jù)處理,返回的最后結(jié)果只是json格式的數(shù)據(jù)。今天我們做一個完整的聊天應(yīng)用,可以在聊天結(jié)果中實現(xiàn)數(shù)據(jù)可視化分析?!?/p>
標題說效果直逼ChatGPT,還是有點差距的,這差距多大呢,差不多一光年吧!畢竟我們今天做的還只是玩具?!?/p>
我們先一起來看一下ChatGPT如何實現(xiàn)數(shù)據(jù)可視化結(jié)果的呈現(xiàn)?!?/p>
很顯然,ChatGPT的思路和我們一樣,先將用戶的提問轉(zhuǎn)為Python代碼,后臺運行后,在前臺顯示。不過最后做的餅圖對中文不太友好呀!
按照這個思路,我們其實再把前幾天的Pandas代碼生成的提示詞修改成直接寫生成Pyecharts的代碼,后臺沙箱運行后,獲取最后生成的圖片或者Html文件,這是個比較容易的方案?!?/p>
但是我不太想講太多代碼,而是想讓大家多了解一下Dify這種低代碼智能體設(shè)計平臺是如何實現(xiàn)簡單的可視化的。這就需要我們繼續(xù)編排之前的工作流?!?/p>
下面就是我們要用到的Dify內(nèi)置的圖表生成工具,很容易就能清楚這三種圖表傳入的參數(shù)要求,都是字符串且格式一樣?!?/p>
下面這個Json數(shù)據(jù),是我們上一個教程,工作流輸出的最后結(jié)果格式,不能直接將其傳入到上面的dify圖表格式中。所以我們需要修改之前的工作流,對輸出結(jié)果進行處理。
{"status": "success", "data_result": {"學(xué)校": 2, "互聯(lián)網(wǎng)": 1, "物流": 1, "硬件": 1, "教育機構(gòu)": 1, "傳統(tǒng)零售": 1, "傳統(tǒng)媒體": 1, "制造業(yè)": 1}}
這里面直接選用了最省事的Python代碼格式轉(zhuǎn)化,也就是需要增加這個代碼執(zhí)行的節(jié)點。在里面填寫需要執(zhí)行的Python代碼?!?/p>
這個Python代碼我們直接問大模型就可以,Dify自帶代碼生成器,我們只需要描述清楚需求就可以了。下面是我輸入的代碼生成提示詞?!?/p>
{"status": "success", "data_result": {"學(xué)校": 2, "互聯(lián)網(wǎng)": 1, "物流": 1, "硬件": 1, "教育機構(gòu)": 1, "傳統(tǒng)零售": 1, "傳統(tǒng)媒體": 1, "制造業(yè)": 1}} 邊寫一段Pytho函數(shù)代碼,,接受json輸入,將data_result的所有key值拼接為一個字符串,每個key之間用 ";" 分隔,賦值到變量exl_ key,將data_result的所有value值拼接為一個字符串,每個value之間用 ";" 分隔,賦值到變量exl_value,將exl_key exl_value返回
直接生成的代碼還是有點小問題的,返回的變量只有一個,而Dify的餅圖工具需要兩個變量,所以我們修改了return語句,返回結(jié)果必須是dict?!?/p>
import json
def main(data: dict) -> dict:
data = json.loads(data)
exl_key = ";".join(data["data_result"].keys())
exl_value = ";".join(map(str, data["data_result"].values()))
return {'exl_key': exl_key, 'exl_value': exl_value}
上面的代碼其實有個大坑,如果大模型生成的數(shù)據(jù)格式不是{key:value,key,value}這種格式,這種代碼會報錯,這個我們下次再解決,這次先實現(xiàn)?!?/p>
這里還有一個易錯點是代碼執(zhí)行起接受的輸入變量格式的問題,默認傳入的是字符串,需要使用json庫強制轉(zhuǎn)化一下。不然會報下面的錯誤?!?/p>
OK ,現(xiàn)在我們可以整體跑一遍工作流看一下結(jié)果了?!?/p>
大功告成,這樣工作流就可以根據(jù)用戶的分析需求,生成餅圖的結(jié)果了?!?/p>
但是,如果用戶想看條形圖、折線圖該怎么實現(xiàn)呢。這里需要對工作流進行改進了。
第一是增加一個節(jié)點——參數(shù)提取,讓大模型從用戶的提示詞中查找可視化圖表的需求,是做成餅圖和柱狀圖?!?/p>
第二是增加在數(shù)據(jù)處理和可視化餅圖之間增加條件分支節(jié)點,根據(jù)參數(shù)的提取結(jié)果,選擇不同的分支。最后工作流的效果如下。
我們下面先來看參數(shù)提取器怎么設(shè)置。其實從下面的設(shè)置我們可以看到,有三個地方?!?/p>
1.輸入變量是指大模型會從用戶的提示詞這段文本中提取出需要的參數(shù)。
2.提取啥參數(shù),就是用戶的提示詞中有沒有提到想要什么樣的圖表結(jié)果,如果能提取到,賦值到新的變量exl_type?!?/p>
3.指令就是參數(shù)提取器給大模型的提示詞,這對大模型來說小菜一碟?!?/p>
這樣下一個條件分支的節(jié)點就由大模型來決定了。條件分支這個地方,看著復(fù)雜,其實很簡單,就是判斷大模型給出的圖形類型,也就是上一步新增的變量exl_type的值是啥,然后生成對應(yīng)的圖表即可?!?/p>
下面我們再看一下整體工作流的運行效果。
效果還是非常不錯的,那我們就可以把這個工作流用在大模型聊天里面了!
我們可以先將這個工作流發(fā)布為dify的內(nèi)置工具。點擊工作流右上方的發(fā)布,點擊最下方發(fā)布為工具。
注意這里是重點,敲黑板了 !這是我當(dāng)小白的時候,踩過的最大的坑,完全是自己試出來的。發(fā)布為工具的工作流,參數(shù)格式必須是文本text-input,Dify Agent應(yīng)用中,大模型才能Function Call調(diào)用,不然大模型是忽略這個工具的!
所以你的工作流中的輸入變量要調(diào)整成下面這樣!再發(fā)布為工具!
OK ,接下來我們就要把數(shù)據(jù)分析這個工作流當(dāng)做Function Call了。在dify中創(chuàng)建Agent應(yīng)用,不懂沒關(guān)系,照著做,后面見多了就明白了。我后面也會寫文仔細對比這幾個類型的區(qū)別?!?/p>
然后不需要做什么,把工具添加上就行了。
這樣就大功告成了!直接預(yù)覽調(diào)試,我們直接看結(jié)果吧!
到此,我們已經(jīng)初步完成了數(shù)據(jù)可視化智能體的構(gòu)建,還有很多細節(jié)工作需要去優(yōu)化,我們下一期再詳細說。
本文轉(zhuǎn)載自公眾號九歌AI大模型 作者:九歌AI
