フォローアップのインタビュー セッションを待っている間、退屈から、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 をインポートした理由です。認可状態の定義では、アクション
も定義しました。
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) ...
ただし、現在も作業中なので、次のリリースで作成する予定です。一方、すべての状態にアクションが定義されている場合は、マップとリデュースに似た処理を実行することもできます。開発の進捗状況については、プロジェクトをご自由にチェックしてください。そして、genruler と genstates の両方が PyPI 上で稼働するようになりました。やったー!
ライブラリがある程度使えるようになったので、Codeium Windsurf をダウンロードしました。私は最終的にこれを使用して genruler から依存関係を取り除き、ドキュメントと README をプロジェクトに追加しました。 genstate については、カスケードを使用してドキュメント、README、およびテストを生成しました。全体として、インターンや後輩に割り当てるタスクを手伝ってくれる中堅から上級のプログラマーがそばにいるように感じます。
コアロジックのほとんどは依然として私の側から来ており、言語モデルは現時点ではインテリジェントですが、依然としてあちこちで間違いがあり、したがって監督が必要です。また、qwen2.5-coder:7b モデルも試してみましたが、私のワークステーションが貧弱なため、かなり遅いとはいえ、かなりうまく動作しました。私が独自の製品を構築し、それからなんとかお金を稼ぐのであれば、Codeium が要求する価格は公正であると思います。
生成部分は問題なく動作しますが、実際のコードを書くのはそれほどうまくいきません。 Pylance がそこで適切に動作しているのか、プロプライエタリであると考えられているのか、それともウィンドサーフィンの補完マジックによるものなのかはわかりません。コードを書くときにエディターがライブラリの自動インポートを行うことができなくなりました。たとえば、コード内でreduce()関数をオートコンプリートすると、vscodeではfunctools import reduceが魔法のようにコードに自動的に挿入されます。しかし、ウィンドサーフィンではそうはいかないので、少しイライラします。ただし、これは新しいものであることを考慮すると、コーディング エクスペリエンスは時間の経過とともに修正されるはずです。
一方で、私はまだ軽量のエディタを探しており、zed が私の注意を引きました。しかし、最近 Surface Book 2 が壊れたので、自宅のオフィスから離れているときは Samsung Galaxy Tab S7FE だけが手元に残っています。したがって、ワークステーションに接続された Web フロントエンド (そして驚くほど使いやすい) を備えた vscode が、今でも私のメインエディターです (neovim 拡張機能でも動作します)。
LLM を活用した生成 AI は私たちの生活を急速に変えつつあり、それに抵抗する意味はありません。しかし、私見ですが、それをあらゆることに使用しないように、ある程度の自制心も持つべきです。これは実際、革新的または創造的な仕事を補完するものとして使用されるべきであり、イノベーションや創造性の代替として使用されるべきではありません。
また、その動作を盲目的に受け入れるのではなく、それが何を出力しているのかを知る必要があります。たとえば、genruler では、より広範な例を使用して元の README を改善しました。これをそのまま受け入れるのではなく、README で生成されるすべてのサンプルのテストを生成するようにしました。そのため、サンプル コードは意図したとおりに通過し、動作します。
全体的に見て、はい、これらの Generative AI 強化エディターには、要求する金額に見合った価値があると思います。結局のところ、これらはツールであり、作業を補助するものであり、キーボードを打つ人の代わりをするものではありません。
以上がAI ツールを活用したステート マシン ライブラリの構築の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。