藉助AI助手分析LlamaIndex的工作流視覺化

努力的小雨發表於2024-12-08

接續上次的討論,我們上次主要分析了LlamaIndex工作流的核心流程,當前還剩下一行程式碼需要關注,那就是關於工作流的視覺化。今天我們的目標是深入理解這一視覺化部分的主要流程,並且對其大體的實現方式進行簡要的瞭解和探討。

為了幫助大家更好地掌握這一內容,我們先回顧一下上次討論的程式碼內容,具體如下:

from llama_index.utils.workflow import draw_all_possible_flows

if __name__ == "__main__":
    import asyncio

    asyncio.run(main())

    draw_all_possible_flows(MyWorkflow, filename="multi_step_workflow.html")

實際上,後面使用了一個network封裝的方式。為了更好地理解這一點,我們可以藉助AI助手來幫助我們深入瞭解相關的細節和原理。

視覺化

底層邏輯

我們直接向AI助手詢問這段程式碼的整體邏輯。從目前的反饋來看,AI助手的回答已經相當全面,經過簡短的閱讀後,便能夠對程式碼的基本思路有一個清晰的瞭解。

image

我來總結一下這個過程,基本可以概括為以下幾個重要步驟:

  1. 首先,我們需要建立一個整體的畫布,作為整個流程的基礎框架。
  2. 接下來,系統將識別所有標註了特定註解的方法,並提取出與這些註解相關的配置資訊,以確保後續操作能夠基於正確的上下文進行。
  3. 在這一步中,我們將利用之前獲取的註解方法,逐一新增反映這些方法的節點,構建出一個完整的節點圖。
  4. 隨後,我們將為已經新增的所有節點之間建立連線,形成一個系統的結構,透過邊的連線關係進一步明確各節點之間的關聯性。
  5. 最後,將所有繪製的內容和結構輸出到使用者指定的HTML檔案中,以便於使用者檢視和使用。

Network是啥

pyvis 是一個功能強大的 Python 庫,專門用於建立動態和互動式的網路視覺化圖形。該庫中的核心元件是 Network 類,透過這一類,使用者不僅可以構建複雜的網路結構,新增各種節點和邊,還可以靈活地設定網路的佈局和樣式,以滿足不同的視覺化需求。

基本用法

如果你對相關內容還不是很熟悉,完全不用擔心,你可以直接請求我們的AI助手為您生成一個入門示例,這樣你就可以透過實際操作來理解和掌握。這樣的方式不僅簡單明瞭,而且非常有效。

image

我把它生成的程式碼直接拿出來。

from pyvis.network import Network

# 建立一個 Network 物件
net = Network(directed=True, height="750px", width="100%")

# 新增節點
net.add_node("Hello", label="Hello", color="#E27AFF", shape="ellipse")
net.add_node("World", label="World", color="#90EE90", shape="ellipse")

# 新增邊
net.add_edge("Hello", "World")

# 顯示網路圖
net.show("hello_world.html", notebook=False)

效果非常出色,如下圖所示:

image

既然Python已經可以實現這一功能,那麼我們可以推測Java也一定具備相關的生態系統。因此,不妨嘗試使用Java版本來探索是否存在更為優雅或高效的解決方案。

Java圖視覺化

我們對現有的方案並不十分了解,因此不妨直接向AI助手諮詢,尋求其幫助來生成一些可能的解決方案。

image

經過實際測試後,我發現問題的根源在於,Maven的依賴庫中根本就沒有這個依賴。因此,無法順利完成編譯和執行。綜合來看,AI助手在處理Python程式碼時表現得相當友好,生成的程式碼通常能夠在第一次嘗試時順利執行,幾乎不需要做太多修改或除錯。而對於像Java這樣具有嚴格語法規範和複雜依賴管理的語言來說,AI助手在生成程式碼時可能會遇到一些挑戰,需要開發者在使用過程中額外投入一定的精力去調整和除錯。

儘管如此,AI助手對於初學者來說依然是一個非常不錯的工具,尤其是對於快速入門程式設計的學習者。如果你是程式設計新手並且想要快速上手,建議可以先從Python這樣的動態語言開始

這裡我上網搜尋後,改正一下:

<dependency>
    <groupId>net.sf.jung</groupId>
    <artifactId>jung-api</artifactId>
    <version>2.1.1</version>
</dependency>
<dependency>
    <groupId>net.sf.jung</groupId>
    <artifactId>jung-graph-impl</artifactId>
    <version>2.1.1</version>
</dependency>
<dependency>
    <groupId>net.sf.jung</groupId>
    <artifactId>jung-visualization</artifactId>
    <version>2.1.1</version>
</dependency>

最後的程式碼如下:

// 建立一個有向圖
Graph<String, String> graph = new DirectedSparseGraph<>();

// 新增節點
graph.addVertex("Hello");
graph.addVertex("World");

// 新增邊
graph.addEdge("Hello to World", "Hello", "World");

// 設定佈局
Layout<String, String> layout = new CircleLayout<>(graph);

// 建立視覺化元件
BasicVisualizationServer<String, String> viz = new BasicVisualizationServer<>(layout);
viz.setPreferredSize(new Dimension(750, 750));

// 設定節點標籤
viz.getRenderContext().setVertexLabelTransformer(new ToStringLabeller());

// 設定節點顏色
Paint vertexPaint = new Color(226, 126, 255);
viz.getRenderContext().setVertexFillPaintTransformer(v -> vertexPaint);

// 顯示視窗
JFrame frame = new JFrame("Hello, World! Network");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(viz);
frame.pack();
frame.setVisible(true);

這裡其實沒有太多需要討論的內容,直接執行程式碼應該就能成功。關於AI助手提到的MVN倉庫問題,我稍微看了一下,發現問題的根源在於雖然我的 Maven 依賴中的 groupIdnet.sf.jung,但是在程式碼引入的時候,實際上使用的是 edu.uci.ics.jung.graph.Graph 這個路徑,這確實有點令人困惑。我也查了一下,這個框架的確是非常老舊了,文件資源幾乎已經不存在。

接下來,我們直接看下程式碼的效果吧。可以類比為一張靜態圖片,這裡滑鼠是無法與節點進行互動的,主要展示的是圖形結構的靜態佈局。

image

graphstream

在與一些好友交流並聽取了他們的建議後,我發現了一個非常實用的工具框架——GraphStream。GraphStream 是一個專為動態圖形建模和分析設計的 Java 庫,它提供了豐富的功能,可以幫助我們輕鬆生成、匯入、匯出圖形,進行圖形的測量、佈局最佳化,並且能夠進行視覺化展示。

經過深入瞭解後,我決定讓 AI 助手繼續協助我們生成相關程式碼。如圖所示:

image

首先,我們需要新增一些必要的依賴。為了確保程式碼能夠順利執行,我在原有依賴的基礎上,增加了一些額外的依賴項,因為在初次執行時會遇到一些報錯,尤其是缺少某些庫或版本不相容的問題。經過一些除錯和調整後,以下是解決完所有報錯後的完整依賴配置:

<dependency>
    <groupId>org.graphstream</groupId>
    <artifactId>gs-core</artifactId>
    <version>1.3</version>
</dependency>
<dependency>
    <groupId>org.graphstream</groupId>
    <artifactId>gs-algo</artifactId>
    <version>1.3</version>
</dependency>
<dependency>
    <groupId>org.graphstream</groupId>
    <artifactId>gs-ui</artifactId>
    <version>1.3</version>
</dependency>

我把程式碼複製出來,給大家一個參考:

System.setProperty("org.graphstream.ui", "swing");

Graph graph = new SingleGraph("Tutorial 1");

graph.addNode("A");
graph.addNode("B");
graph.addNode("C");
graph.addEdge("AB", "A", "B");
graph.addEdge("BC", "B", "C");
graph.addEdge("CA", "C", "A");

graph.display();

最終,經過一系列的除錯和最佳化,效果達到了預期。最終呈現的結果如圖所示,所實現的功能與之前在 Python 中完成的效果幾乎沒有差異。

image

總結

在本文的最後,我們總結了LlamaIndex工作流的視覺化部分的實現和細節,重點分析瞭如何利用Python中的pyvis庫和Java中的圖形庫,分別在兩種語言中構建和展示網路圖。透過程式碼示例,我們詳細探討了如何構建節點、新增邊並透過佈局生成互動式圖形,同時也提到了在Java中使用Jung庫和GraphStream庫時可能遇到的挑戰與解決方案。

在實際應用中,雖然AI助手能夠幫助我們加速開發和解決一些問題,但仍然需要開發者根據實際需求,結合語言的特性做出適當調整。


我是努力的小雨,一名 Java 服務端碼農,潛心研究著 AI 技術的奧秘。我熱愛技術交流與分享,對開源社群充滿熱情。同時也是一位騰訊雲創作之星、阿里雲專家博主、華為云云享專家、掘金優秀作者。

💡 我將不吝分享我在技術道路上的個人探索與經驗,希望能為你的學習與成長帶來一些啟發與幫助。

🌟 歡迎關注努力的小雨!🌟

相關文章