搜尋
首頁後端開發Python教學在人工智慧工具的幫助下建立狀態機庫

出於無聊,在等待後續面試時,我建立了一個由 genruler 提供支援的狀態機庫。準確地說,是我畢業後第一份工作期間建造的。這個實現大致是基於我的主管當時起草的設計。該項目還旨在展示如何利用規則 DSL。

根據Google搜尋有限狀態機返回的有用摘要(強調我的)

「有限狀態機」是指一種計算模型,其中系統在任何給定時間只能處於有限數量的不同狀態,並且這些狀態之間的轉換由特定輸入觸發,本質上允許它根據一組定義的條件處理信息,不可能有無限數量的狀態; “有限”這裡指的是系統可以存在的有限的一組可能狀態

該函式庫接收一個表示有限狀態機模式的字典。例如我們要建立一個訂單追蹤系統

Building state machine library with help from AI tools
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中文網其他相關文章!

陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
Python中的合併列表:選擇正確的方法Python中的合併列表:選擇正確的方法May 14, 2025 am 12:11 AM

Tomergelistsinpython,YouCanusethe操作員,estextMethod,ListComprehension,Oritertools

如何在Python 3中加入兩個列表?如何在Python 3中加入兩個列表?May 14, 2025 am 12:09 AM

在Python3中,可以通過多種方法連接兩個列表:1)使用 運算符,適用於小列表,但對大列表效率低;2)使用extend方法,適用於大列表,內存效率高,但會修改原列表;3)使用*運算符,適用於合併多個列表,不修改原列表;4)使用itertools.chain,適用於大數據集,內存效率高。

Python串聯列表字符串Python串聯列表字符串May 14, 2025 am 12:08 AM

使用join()方法是Python中從列表連接字符串最有效的方法。 1)使用join()方法高效且易讀。 2)循環使用 運算符對大列表效率低。 3)列表推導式與join()結合適用於需要轉換的場景。 4)reduce()方法適用於其他類型歸約,但對字符串連接效率低。完整句子結束。

Python執行,那是什麼?Python執行,那是什麼?May 14, 2025 am 12:06 AM

pythonexecutionistheprocessoftransformingpypythoncodeintoExecutablestructions.1)InternterPreterReadSthecode,ConvertingTingitIntObyTecode,whepythonvirtualmachine(pvm)theglobalinterpreterpreterpreterpreterlock(gil)the thepythonvirtualmachine(pvm)

Python:關鍵功能是什麼Python:關鍵功能是什麼May 14, 2025 am 12:02 AM

Python的關鍵特性包括:1.語法簡潔易懂,適合初學者;2.動態類型系統,提高開發速度;3.豐富的標準庫,支持多種任務;4.強大的社區和生態系統,提供廣泛支持;5.解釋性,適合腳本和快速原型開發;6.多範式支持,適用於各種編程風格。

Python:編譯器還是解釋器?Python:編譯器還是解釋器?May 13, 2025 am 12:10 AM

Python是解釋型語言,但也包含編譯過程。 1)Python代碼先編譯成字節碼。 2)字節碼由Python虛擬機解釋執行。 3)這種混合機制使Python既靈活又高效,但執行速度不如完全編譯型語言。

python用於循環與循環時:何時使用哪個?python用於循環與循環時:何時使用哪個?May 13, 2025 am 12:07 AM

UseeAforloopWheniteratingOveraseQuenceOrforAspecificnumberoftimes; useAwhiLeLoopWhenconTinuingUntilAcIntiment.forloopsareIdealForkNownsences,而WhileLeleLeleLeleLeleLoopSituationSituationsItuationsItuationSuationSituationswithUndEtermentersitations。

Python循環:最常見的錯誤Python循環:最常見的錯誤May 13, 2025 am 12:07 AM

pythonloopscanleadtoerrorslikeinfiniteloops,modifyingListsDuringteritation,逐個偏置,零indexingissues,andnestedloopineflinefficiencies

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

WebStorm Mac版

WebStorm Mac版

好用的JavaScript開發工具

SublimeText3 Linux新版

SublimeText3 Linux新版

SublimeText3 Linux最新版

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

Atom編輯器mac版下載

Atom編輯器mac版下載

最受歡迎的的開源編輯器

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具