ホームページ > バックエンド開発 > Python チュートリアル > AI ツールを活用したステート マシン ライブラリの構築

AI ツールを活用したステート マシン ライブラリの構築

Barbara Streisand
リリース: 2024-11-27 13:02:11
オリジナル
184 人が閲覧しました

フォローアップのインタビュー セッションを待っている間、退屈から、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 をインポートした理由です。認可状態の定義では、アクション
も定義しました。

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 上で稼働するようになりました。やったー!

では、AI についてはどうでしょうか?

ライブラリがある程度使えるようになったので、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 サイトの他の関連記事を参照してください。

ソース:dev.to
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート