Membina perpustakaan mesin negeri dengan bantuan daripada alatan AI

Barbara Streisand
Lepaskan: 2024-11-27 13:02:11
asal
156 orang telah melayarinya

Hanya kerana bosan, sementara menunggu sesi temuduga susulan saya, saya membina perpustakaan mesin negara, dikuasakan oleh genruler. Saya membina satu pada masa lalu, tepatnya, semasa kerja pertama saya selepas tamat pengajian. Pelaksanaan ini secara longgar berdasarkan reka bentuk yang digubal oleh penyelia saya ketika itu. Projek ini juga bertujuan untuk mempamerkan cara peraturan DSL boleh digunakan.

Menurut ringkasan berguna yang dikembalikan oleh carian Google pada mesin keadaan terhingga (penekanan saya)

A “mesin keadaan terhingga” bermaksud model pengiraan di mana sistem hanya boleh berada dalam bilangan keadaan berbeza yang terhad pada bila-bila masa dan peralihan antara keadaan ini dicetuskan oleh input tertentu, pada asasnya membenarkan ia untuk memproses maklumat berdasarkan satu set syarat yang ditetapkan tanpa kemungkinan mempunyai bilangan keadaan yang tidak terhingga; “terhingga” di sini merujuk kepada set terhad kemungkinan keadaan sistem boleh wujud dalam.

Pustaka menerima kamus yang mewakili skema mesin keadaan terhingga. Sebagai contoh, kami ingin membina sistem penjejakan pesanan

Building state machine library with help from AI tools
Rajah mesin keadaan terhingga yang dijana oleh Graphviz

Dan skema akan kelihatan seperti ini (dalam bentuk YAML yang dipotong untuk kejelasan)

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)

    ...
Salin selepas log masuk
Salin selepas log masuk

Oleh itu, untuk menetapkan segala-galanya, kami memanggil

import genstates
import yaml
import order_processor

with open("states.yaml") as schema:
  machine = genstates.Machine(yaml.safe_load(schema), order_processor)
Salin selepas log masuk

Jadi dalam contoh fiksyen ini, kami akan menerima beberapa muatan apabila terdapat perubahan dalam pesanan. Sebagai contoh, apabila penjual mengakui pesanan, kami mendapat

{
  "is_authorized": true,
  ...
}
Salin selepas log masuk

Kami kemudiannya boleh menyemak melalui perpustakaan

state = machine.initial # assume the order is created

transition = machine.get_transition(state, "order_authorization")

assert transition.check_condition(payload)
Salin selepas log masuk

Semakan juga menjalankan semakan pengesahan tambahan jika ditakrifkan dalam skema. Ini berguna jika anda berhasrat untuk mengembalikan mesej ralat kepada pemanggil.

try:
  assert transition.check_condition(payload)
except ValidationFailedError as e:
  logger.exception(e)
Salin selepas log masuk

Kadangkala, kita tahu bahawa setiap kali muatan tiba, ia sepatutnya mencetuskan peralihan, tetapi kita tidak selalu tahu yang mana satu. Oleh itu, kami hanya menyampaikannya ke Machine.progress

try:
  state = machine.progress(state, payload)
except ValidationFailedError as e:
  logger.exception(e)
Salin selepas log masuk

Setelah mengetahui keadaan apa yang pesanan itu harus berkembang, kita boleh mula menulis kod untuk bekerja pada logik

# 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()
Salin selepas log masuk

Sebaik-baiknya, saya juga boleh mengekstrak logik pemprosesan, itulah sebab saya mengimport pesanan_pemproses pada mulanya. Dalam definisi keadaan kebenaran, kami turut menentukan tindakan

authorized:
    name: authorized
    action: authorize_order
    ...
Salin selepas log masuk

Jadi dalam modul order_processor, kami mentakrifkan fungsi baharu yang dipanggil authorized_order

def authorize_order(payload):
    # do the processing here instead
    pass
Salin selepas log masuk

Supaya perkara berikut mungkin berlaku, apabila kod pengurusan negeri dipisahkan daripada logik pemprosesan yang lain

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)

    ...
Salin selepas log masuk
Salin selepas log masuk

Walau bagaimanapun, saya masih mengusahakannya sekarang dan harus melakukannya dalam keluaran seterusnya. Sementara itu, ia juga mampu melakukan sesuatu yang serupa dengan memetakan dan mengurangkan jika setiap negeri mempunyai tindakan yang ditentukan. Sila semak projek untuk kemajuan pembangunan. Dan kedua-dua genruler dan genstates kini menggunakan PyPI, yay!

Sekarang, bagaimana dengan perkara AI?

Saya memuat turun Codeium Windsurf selepas perpustakaan agak boleh digunakan. Saya akhirnya menggunakannya untuk menghilangkan kebergantungan dari genruler, dan menambahkan dokumentasi dan README pada projek itu. Untuk genstates, saya menggunakan lata untuk menghasilkan dokumentasi, README, serta ujian. Secara keseluruhannya, rasanya saya mempunyai pengaturcara pertengahan hingga senior untuk membantu saya menyelesaikan tugasan yang akan saya berikan kepada pelatih saya atau pun junior.

Kebanyakan logik teras masih datang dari hujung saya, secerdik model bahasa pada masa ini, mereka masih melakukan kesilapan di sana sini dan oleh itu, memerlukan pengawasan. Saya juga bereksperimen dengan model qwen2.5-coder:7b, dan ia berfungsi dengan baik, walaupun agak perlahan disebabkan stesen kerja saya yang buruk. Saya dapati harga yang diminta oleh Codeium adalah adil, jika saya ingin membina produk saya sendiri dan berjaya menjana wang daripadanya.

Walaupun bahagian penjanaan berfungsi dengan baik, tetapi menulis kod sebenar tidaklah sehebat itu. Saya tidak pasti sama ada Pylance berfungsi dengan baik di sana, menganggap ia adalah hak milik, atau sama ada ia disebabkan oleh penyiapan windsurf ajaib, editor saya tidak lagi dapat melakukan auto-import perpustakaan apabila saya menulis kod. Sebagai contoh, apabila saya melengkapkan fungsi reduce() secara automatik dalam kod saya, dalam vscode ia akan memasukkan secara automatik daripada import functools reduce ke dalam kod saya. Walau bagaimanapun, ini tidak berlaku dalam luncur angin, yang menjadikannya sedikit menjengkelkan. Walau bagaimanapun, memandangkan ini adalah baharu, pengalaman pengekodan harus diperbaiki dari semasa ke semasa.

Sebaliknya, saya masih mencari editor yang lebih ringan, dan zed memang menarik perhatian saya. Walau bagaimanapun, sejak Surface Book 2 saya meninggal dunia baru-baru ini, saya hanya tinggal dengan Samsung Galaxy Tab S7FE apabila saya jauh dari pejabat rumah saya. Oleh itu, vscode dengan frontend web (dan ia boleh digunakan secara mengejutkan) yang disambungkan ke stesen kerja saya masih menjadi editor utama saya (malah ia berfungsi dengan sambungan neovim).

AI Generatif yang dikuasakan oleh LLM dengan pantas mengubah kehidupan kita, tiada gunanya untuk menentangnya. Walau bagaimanapun, IMHO, kita juga harus mempunyai beberapa kekangan diri untuk tidak menggunakannya untuk segala-galanya. Ia benar-benar harus digunakan sebagai pelengkap kepada kerja inovatif atau kreatif, bukan pengganti kepada inovasi dan kreativiti.

Kita juga harus tahu apa yang dihasilkannya, bukannya menerima secara membuta tuli apa yang dilakukannya. Sebagai contoh, dalam genruler, saya membuatnya menambah baik README asal saya dengan contoh yang lebih luas. Daripada menerimanya sebagaimana adanya, saya membuatnya untuk menjana ujian untuk semua contoh yang dijana dalam README, jadi kod contoh itu lulus dan berfungsi seperti yang saya maksudkan.

Secara keseluruhan, ya, saya rasa editor yang dipertingkatkan AI Generatif ini berbaloi dengan wang yang mereka minta. Akhirnya, ini adalah alatan, ia bertujuan untuk menawarkan bantuan untuk bekerja, bukan menggantikan orang yang menekan papan kekunci.

Atas ialah kandungan terperinci Membina perpustakaan mesin negeri dengan bantuan daripada alatan AI. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:dev.to
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan