出於無聊,在等待後續面試時,我建立了一個由 genruler 提供支援的狀態機庫。準確地說,是我畢業後第一份工作期間建造的。這個實現大致是基於我的主管當時起草的設計。該項目還旨在展示如何利用規則 DSL。
根據Google搜尋有限狀態機返回的有用摘要(強調我的)
「有限狀態機」是指一種計算模型,其中系統在任何給定時間只能處於有限數量的不同狀態,並且這些狀態之間的轉換由特定輸入觸發,本質上允許它根據一組定義的條件處理信息,不可能有無限數量的狀態; “有限”這裡指的是系統可以存在的有限的一組可能狀態。
該函式庫接收一個表示有限狀態機模式的字典。例如我們要建立一個訂單追蹤系統
Graphviz 產生的有限狀態機圖
架構看起來像這樣(為了清晰起見,採用截斷的 YAML 形式)
machine: initial_state: pending_payment states: pending_payment: name: pending payment transitions: order_authorization: name: order is authorized destination: authorized rule: (condition.equal (basic.field "is_authorized") (boolean.tautology)) authorized: name: authorized action: authorize_order transitions: order_partially_paid: name: order is partially paid destination: partially_paid rule: (boolean.tautology) order_fully_paid: name: order is fully paid destination: paid rule: (boolean.tautology) ...
因此,為了設定一切,我們呼叫
import genstates import yaml import order_processor with open("states.yaml") as schema: machine = genstates.Machine(yaml.safe_load(schema), order_processor)
因此,在這個虛構的範例中,每當訂單發生變化時,我們都會收到一些有效負載。例如,當賣家確認訂單時,我們得到
{ "is_authorized": true, ... }
我們可以透過圖書館查一下
state = machine.initial # assume the order is created transition = machine.get_transition(state, "order_authorization") assert transition.check_condition(payload)
如果在架構中定義,該檢查也會執行額外的驗證檢查。如果您打算向呼叫者傳回錯誤訊息,這會很有幫助。
try: assert transition.check_condition(payload) except ValidationFailedError as e: logger.exception(e)
有時,我們知道每次有效負載到達時,它都應該觸發一次轉換,但我們並不總是知道是哪一個。因此,我們只需將其傳遞給 Machine.progress
try: state = machine.progress(state, payload) except ValidationFailedError as e: logger.exception(e)
一旦知道訂單應該進展到什麼狀態,我們就可以開始寫程式碼來處理邏輯
# fetch the order from database order = Order.get(id=payload["order_id"]) current_state = machine.states[order.state] # fetch next state try: new_state = machine.progress(current_state, payload) except ValidationFailedError as e: # validation failed, do something logger.exception(e) return except MissingTransitionError as e: # can't find a valid transition from given payload logger.exception(e) return except DuplicateTransitionError as e: # found more than one transition from given payload logger.exception(e) return # do processing (example) log = Log.create(order=order, **payload) log.save() order.state = new_state.key order.save()
理想情況下,我還可以提取處理邏輯,這就是我一開始導入 order_processor 的原因。在授權狀態定義中,我們也定義了一個action
authorized: name: authorized action: authorize_order ...
因此在 order_processor 模組中,我們定義了一個新函數,名稱為authorized_order
def authorize_order(payload): # do the processing here instead pass
這樣,以下情況是可能的,其中狀態管理程式碼與其餘處理邏輯分離
machine: initial_state: pending_payment states: pending_payment: name: pending payment transitions: order_authorization: name: order is authorized destination: authorized rule: (condition.equal (basic.field "is_authorized") (boolean.tautology)) authorized: name: authorized action: authorize_order transitions: order_partially_paid: name: order is partially paid destination: partially_paid rule: (boolean.tautology) order_fully_paid: name: order is fully paid destination: paid rule: (boolean.tautology) ...
不過,我現在仍在努力,應該會在下一個版本中實現。同時,如果每個狀態都定義了一個操作,它也能夠執行類似map和reduce的操作。請隨時檢查專案的開發進度。 genruler 和 genstates 現在都在 PyPI 上,耶!
在庫有點用後我下載了 Codeium Windsurf。我最終使用它從 genruler 中去除了 hy 依賴,並向專案添加了文件和自述文件。對於發電機狀態,我使用級聯來產生文件、自述文件以及測試。總的來說,感覺我身邊有一個中高級程式設計師來幫助我完成分配給實習生甚至初級員工的任務。
大部分核心邏輯仍然來自我這邊,儘管目前的語言模型已經很聰明了,但他們仍然會犯一些錯誤,因此需要監督。我還嘗試了 qwen2.5-coder:7b 模型,它運行得相當好,儘管由於我的工作站蹩腳,速度相當慢。我發現如果我要建立自己的產品並設法從中賺錢,Codeium 要求的價格是公平的。
雖然產生部分運作正常,但編寫實際程式碼卻不那麼好。我不確定 Pylance 是否在那裡正常工作,認為它是專有的,或者是否是由於完成魔法 Windsurf 所做的,我的編輯器在我編寫程式碼時不再能夠自動導入庫。例如,當我在程式碼中自動完成 reduce() 函數時,在 vscode 中它會自動將 from functools import reduce 插入到我的程式碼中。然而,風帆衝浪卻並非如此,這使得它有點惱人。然而,考慮到這是新的,編碼體驗應該隨著時間的推移而修復。
另一方面,我仍在尋找一個更輕的編輯器,zed 確實引起了我的注意。然而,由於我的 Surface Book 2 最近壞了,當我離開家庭辦公室時,我只剩下三星 Galaxy Tab S7FE。因此,連接到我的工作站的具有 Web 前端(而且非常有用)的 vscode 仍然是我的主要編輯器(它甚至可以與 neovim 擴充功能一起使用)。
由 LLM 提供支援的生成式人工智慧正在迅速改變我們的生活,沒有理由抗拒它。然而,恕我直言,我們也應該有一些自我克制,不要把它用於所有事情。它確實應該用作創新或創造性工作的補充,而不是創新和創造力的替代方案。
我們也應該知道它在輸出什麼,而不是盲目接受它做了什麼。例如,在 genruler 中,我用更廣泛的範例改進了我原來的自述文件。我沒有按原樣接受它,而是讓它為自述文件中生成的所有範例生成測試,因此範例程式碼通過並按我的預期工作。
總的來說,是的,我確實認為這些生成式人工智慧增強編輯器確實物有所值。歸根究底,這些都是工具,它們的目的是為工作提供幫助,而不是取代敲鍵盤的人。
以上是在人工智慧工具的幫助下建立狀態機庫的詳細內容。更多資訊請關注PHP中文網其他相關文章!