Instill-ai 簡介
從事 Instill 的管道後端專案就像在解決拼圖一樣?拼圖-除了一些拼圖不斷改變名稱!我的使命?建立一個可以重新命名 JSON 欄位而不產生衝突的元件。跟我一起分享我學習 Go、研究 Instill 組織良好的文件以及創建一個現已合併並準備就緒的解決方案的旅程! ?
Instill 需要一種動態重命名 JSON 資料結構中欄位的方法。轉折?我們必須處理重新命名的欄位可能與現有欄位發生衝突的情況。如果沒有衝突解決系統,混亂就會佔上風!
pipeline-backend 管理 Versatile Data 中的所有管道資源 管道 (VDP),用於簡化來自 開始組件,經過AI/數據/應用組件,直至結束 組件。
在?灌輸 VDP,管道是一個 DAG(有向無環圖),由 多個組件。
flowchart LR
s[Trigger] --> c1[OpenAI Component]
c1 --> c2[Stability AI Component]
c1 --> c3[MySQL Component]
c1 --> e[Response]
c2 --> e
組件充當管道中的重要構建塊。
更多請參閱組件包文檔 詳情。
管道配方指定組件的配置方式及其使用方式 相互關聯。
食譜是用 YAML 語言定義的:
flowchart LR
s[Trigger] --> c1[OpenAI Component]
c1 --> c2[Stability AI Component]
c1 --> c3[MySQL Component]
c1 --> e[Response]
c2 --> e
說實話,我開始懷疑自己能否解決這個問題,但後來 Anni 留下了讓我繼續前進的完美訊息。
一旦我適應了,為這項任務精心設計了 JSON 模式的 ChunHao 就給我開了綠燈?開始編碼。就這樣,旅程開始了!
關鍵要求是:
帶著咖啡☕和勇氣? ,我開始編碼。核心邏輯先睹為快:
首先,我建立了一個映射系統來追蹤新舊欄位名稱。這是檢測衝突的關鍵。
flowchart LR
s[Trigger] --> c1[OpenAI Component]
c1 --> c2[Stability AI Component]
c1 --> c3[MySQL Component]
c1 --> e[Response]
c2 --> e
每當偵測到衝突時,該函數都會將「_conflict」新增到新名稱中。這是一個簡單的技巧,可以確保我們的 JSON 欄位保持唯一,最重要的是,彼此友好! ✌️
欄位映射到位後,下一步是將它們套用到我們的 JSON 資料。
variable <span># pipeline input fields</span> output: <span># pipeline output fields</span> component: <component-id>: type: <component-definition-id> task: <task-id> input: <span># values for the input fields</span> condition: <condition> <span># conditional statement to execute or bypass the</span>
以下是將映射名稱套用至 JSON 資料的邏輯。結果呢?我們的數據被整齊地重命名,衝突得到解決,結構完好無損。 ?
建立組件後,刪除了草稿 PR 並得到了評論:
在熟悉了 Instill 的測試方法並學習如何創建有效的測試案例後,我繼續進行下一步。
測試時間! ?我編寫的測試涵蓋了從簡單的重命名到具有巢狀 JSON 欄位的複雜邊緣情況的所有內容。每一輪測試都會帶來進一步的改進。
func mapFields(fields map[string]string) map[string]string { newFieldMap := make(map[string]string) for oldName, newName := range fields { // Check for conflict if _, exists := newFieldMap[newName]; exists { newName += "_conflict" // Add suffix for conflicts } newFieldMap[oldName] = newName } return newFieldMap }
在這裡我想分享個人反思:測驗是這個專案中最難的部分? ? 。有時我會想,「這個測驗是否達到了預期的效果?」
就在那時,我遇到了lint問題—
他指出了問題,甚至提供了解決方案。我所要做的就是實現它,但這提醒我,即使是最小的細節也能讓程式碼順利運行。
一旦我克服了最初的障礙,測試就成了我的安全網。它讓我有信心知道我的程式碼可以在不同的場景下運作? ️♂️。它還向我表明,測試不僅僅是一個檢查步驟,它是確保我的程式碼可靠且有彈性的一種方法。
完成測試後,我推送了程式碼,準備進行審核過程。然而,我們的 CI(持續整合)檢查沒有通過。 Anni 的評論溫柔地提醒我仔細檢查我的測試案例:
「嘿@AkashJana18,你能檢查一下你的測試案例嗎?我們的CI 檢查顯示這裡還沒有通過。請先在本地進行測試,然後再推送到PR。每當您推送提交時,我們都會觸發檢查,以便您可以在我們的工程師審查您的程式碼之前發現任何問題。
那時我意識到我必須在提交之前在本地運行測試。春浩也補充:
「請在請求審核之前執行並通過。執行 $ go test ./pkg/component/operator/json/v0/... 在本機檢查。」我快速在本地運行測試,發現問題並修復它們。
慶祝一下?
這個過程讓我更加體會到本地測試的重要性,因為它確保了在提交審核之前一切都是可靠的。
合併之前,ChunHao 進行了最終審查,進行了一些調整,對測試配方進行了 QA 並更新了文件以反映新的更改。非常感謝安妮在整個過程中持續提供的支持——這帶來了巨大的改變。 ?
我學到的最大的教訓之一是協作和指導如何能夠成就或毀掉一個專案。 Instill 的版主 Anni 和 ChunHao 在我迷失於 Go 文法或苦苦尋找正確方法時為我提供了所需的指導。我們共同努力,將一個複雜的問題變成了一個乾淨、實用的解決方案。
說實話,有些時候我覺得自己已經咬得太多了。但Anni不斷的鼓勵,加上春浩的明確指示,讓我一直走在正軌上。
另一個步驟可能是將這種方法擴展到需要動態欄位名稱處理的管道的其他部分 - 因為誰不喜歡一點自動化⚙️?
憑藉 Instill 堅如磐石的文檔、ChunHao 的指導以及 Anni 的道德支持,這個計畫成為了一次奇妙的學習體驗。我從對 Go 一無所知到實現了一個準備用於生產的全功能特性(並且我有合併的 PR 來證明這一點?)。
證明:
以上是從零到合併:在 Go 中建立 JSON 重命名欄位元件的詳細內容。更多資訊請關注PHP中文網其他相關文章!