Dasturlash

Monty-go: Go tilidagi pure WASM wrapper, LLM tomonidan yozilgan Python kodini xavfsiz bajarish

30-avgust, 2026, 19:572 ko'rish7 daqiqa o'qish
Monty-go: Go tilidagi pure WASM wrapper, LLM tomonidan yozilgan Python kodini xavfsiz bajarish

Yapay zeka modellari ko'p hollarda vositalar bilan sequentially (ketma-ket) murojaat qilish orqali ma'lumot oladi, hisoblash qiladi yoki tashqi xizmatlarga murojaat qiladi. Har bir qadam alohida model chaqiruvini talab qiladi, bu jarayonni sekinlaydi, xarajatlarni oshiradi va amaliyotda tinchlikka sabab bo'lishi mumkin. Monty-go bu muammoni hal qilish uchun yangilangan yechimdir: LLM Python kodini yozadi, shu kod Go tilidagi funksiyalarni chaqiradi, monty-go esa kodni WebAssembly (WASM) ichida sandboxda bajaradi, har bir tashqi funksiya chaqiruvida to'xtatadi va Go callback orqali natijani qaytaradi.

Monty-go nima?

Monty-go — Bu fugue-labs tomonidan ishlab chiqilgan, Go tilidagi kutubxona. U Pydantic loyihasidagi Monty Python interpreterini to'liq Go kodidan (pure-Go) iborat WASM ikkilik fayliga o'zgartirib, wazero kutubxonasini yordamida Go dastur ichida yuklaydi. Bunday yechim CGO, konteyner yoki subprocess foydalanishni talab qilmasligi tufayli, dastur birlashtirilgan ikkilik fayl sifatida tarqaladi, uning hajmi faqat 2,9 MB.

go get github.com/fugue-labs/monty-go

Asosiy afzalliklari:

  • Hech qanday tashqi konteyner yoki Docker kerak emas.
  • CGO bog'liqligi yo'q, bu korsatkich platformalar bilan moslikni oshiradi.
  • Subprocess chaqirishlari yo'q, demek tizim xavfsizligi yuqori.
  • WASM orqali sub-millisecond (bir millisekunddan tez) ishga tushirish va tozalash.

LLM agentlar uchun muammo va monty-go yechimi

Klassik vosita chaqirish patterni quyidagicha ko‘rinadi:

Agent → tool_call("search", {query: "weather london"}) → result
Agent → tool_call("search", {query: "weather tokyo"})  → result
Agent → tool_call("compare", {a: result1, b: result2}) → result
  1. Agent → tool_call("search", {query: "weather london"}) → natija
  2. Agent → tool_call("search", {query: "weather tokyo"}) → natija
  3. Agent → tool_call("compare", {a: natija1, b: natija2}) → natija

Ushbu usul har bir vosita uchun alohida model chaqiruvini talab qiladi, bu tezlik va xarajatlarni salbiy ta'sir qiladi. Monty-go bilan LLM bitta model chaqiruvida quyidagi Python kodini generatsiya qilishi mumkin:

london = search(query="weather london")
tokyo = search(query="weather tokyo")
compare(a=london, b=tokyo)

Ushbu kod ichida har bir search va compare funksiyalari Go tarafida e'lon qilinmonty-go tomonidan aniqlangan tashqi funksiya deb hisoblanadi. Monty-go kodni WASM ichida bajaradi, lekin har bir tashqi funksiya uchrashganda to'xtatadi, Go callback funksiyasi chaqiriladi, uning natiji monty-go ga qaytariladi va kod davom etadi. Natijada bitta model chaqiruvida marhamat bajariladi.

london = search(query="weather london")
tokyo = search(query="weather tokyo")
compare(a=london, b=tokyo)

Monty-go ishlash prinsipi

Monty-go ishlash siklini tushuntirish uchun asosiy komponentlarni ko‘rib chiqaylik:

  • Runner – montygo.New() funksiyasi yordamida yaralanuvchi obyekt, WASM instansiyasini boshqaradi.
  • Execute metodi – Python kodni, kirish parametrlarini va tashqi funksiya qo‘llab-quvvatlash sozlamalarini qabul qiladi.
  • WithExternalFunc – Go funksiyalarini monty-go ga ulash, ularning nomini va argumentlarini belgilash.
  • WithLimits – xotira, vaqt, rekursiya va allocation chegaralarini o‘rnatish, bu cheksiz siljik yoki xotira bombalari oldini oladi.
  • WithPrintFunc – Pythonning print() chiqishini Go tarafida yakunlash.
  • WithOsCallFunc – fayl tizini yoki muhit murojaatlarini Go callback orqali filtrlash.

Misol: foydalanuvchi x * 2 + y ifodani hisoblashni xohlaydi. Kodni monty-go ga uzatish, x va y qiymatlarini map orqali uzatish, natija 25 qaytariladi. Buning ichida hech qanday tashqi funksiya chaqirilmaganligi tufayli, monty-go kodni WASM ichida to‘liq bajaradi va natijani qaytaradi.

package main

import (
    "context"
    "fmt"
    "log"

    montygo "github.com/fugue-labs/monty-go"
)

func main() {
    runner, err := montygo.New()
    if err != nil {
        log.Fatal(err)
    }
    defer runner.Close()

    result, err := runner.Execute(context.Background(),
        "x * 2 + y",
        map[string]any{"x": 10, "y": 5},
    )
    if err != nil {
        log.Fatal(err)
    }
    fmt.Println(result) // 25
}

Tashqi funksiya bilan ishlashda monty-go quyidagicha harakat qiladi:

  1. Python kod ichida get_weather("London") deb funksiya chaqiriladi.
  2. Monty-go bu chaqiruvni aniqlaydi, WASM bajarishini to'xtatadi.
  3. Go callback funksiyasi chaqiriladi, u shu yerda HTTP so‘rov yuborish, ma'lumotlar bazasidan o‘qish yoki istalgan amalni bajarishi mumkin.
  4. Callback natijani (masalan, { "city": "London", "temp": 22 }) monty-go ga qaytaradi.
  5. Monty-go natijani Python kodga o‘rnatib, bajarishni davom ettiradi.

Bu mekanizm LLM tomonidan yozilgan kodni Go funksiyalari bilan sekinliksiz, xavfsiz va predictable tarzda bog‘lashga imkon beradi.

result, err := runner.Execute(ctx,
    `
london = get_weather("London")
tokyo = get_weather("Tokyo")
f"{london['city']}: {london['temp']}°C, {tokyo['city']}: {tokyo['temp']}°C"
    `,
    nil,
    montygo.WithExternalFunc(func(ctx context.Context, call *montygo.FunctionCall) (any, error) {
        city, _ := call.Args["city"].(string)
        // Your real implementation here — HTTP call, database query, anything.
        return map[string]any{"city": city, "temp": 22}, nil
    }, montygo.Func("get_weather", "city")),
)
// result: "London: 22°C, Tokyo: 22°C"

Xavfsizlik cheklovlari

Monty-go, WASm sandboxining afzalliklarini foydalanib, bir necha darajadagi himoya taqdim etadi:

  • Vaqt chegarasiMaxDuration parametri orqali kodning necha sekund ishlashi mumkinligini belgilash.
  • Xotira chegarasiMaxMemoryBytes (masalan, 10 MB) orqali WASM instansiyasining foydalanishi mumkin bo‘lgan maksimal xotira ni cheklash.
  • Allocation chegarasiMaxAllocations parametri orqali heap allocationlar soni chegarasini o‘rnatish.
  • Rekursiya chegarasiMaxRecursionDepth orqali funksiya rekursiyasi chuqurligini cheklash.

Ushbu chegaralar cheksiz siljik, xotira bombalari yoki chuqur rekursiya hamda MontyError exceptionini tushurib, Go konteksti orqali bekor qilishni ham qo‘llab-quvvatlaydi. Agar context.Context bekor qilsa, WASM instansiyasi to‘xtatadi, bu resurs sarfini oldini oladi.

result, err := runner.Execute(ctx, code, nil,
    montygo.WithExternalFunc(func(ctx context.Context, call *montygo.FunctionCall) (any, error) {
        switch call.Name {
        case "search":
            return doSearch(call.Args)
        case "calculate":
            return doCalculate(call.Args)
        case "store":
            return doStore(call.Args)
        default:
            return nil, fmt.Errorf("unknown function: %s", call.Name)
        }
    },
        montygo.Func("search", "query"),
        montygo.Func("calculate", "expression"),
        montygo.Func("store", "key", "value"),
    ),
)

Monty-go va Gollem integratsiyasi

Monty-go, Gollem agent frameworki bilan ham integratsiya qilinishi mumkin. Gollem, Go tilida yasashgan agentlar uchun tayyorlash vositalari, vosita chaqirishlari va tizim boshqaruvi funksiyalarini taqdim etadi. Monty-go yordamida Gollem ichida "code-mode" vositasi yarating:

  • Go vositalari (search, calculate, store) gollem.FuncTool yordamida e'lon qilinadi.
  • NewCodeModeTool funksiyasi monty-go runnerini va e'lon qilingan vositalarni qabul qilib, LLM tomonidan yozilgan Python kodini vositalarga ulatishni ta'minlaydi.
  • Agent system promptida modelga beriladigan tushuntirishda, qaysi vositalar mavjud va ularni qanday chaqirish kerakligi ko‘rsatiladi.

Misol: agent "Q3 va Q4 daromadlarini solishtirish va o‘sish foizini hisoblash" topshirig‘ini bajarishi kerak. LLM quyidagi kodni yozadi:

result, err := runner.Execute(ctx, code, inputs,
    montygo.WithLimits(montygo.Limits{
        MaxDuration:       5 * time.Second,
        MaxMemoryBytes:    10 * 1024 * 1024, // 10 MB
        MaxAllocations:    100000,
        MaxRecursionDepth: 100,
    }),
)
q3 = search(query="Q3 revenue")
q4 = search(query="Q4 revenue")
growth = calculate(expression=f"({q4['revenue']} - {q3['revenue']}) / {q3['revenue']} * 100")

Monty-go bu kodni WASM ichida bajaradi, har bir search va calculate chaqiruvida to‘xtatadi, Go vositalarni chaqiradi, natijalarni Python kodga o‘rnatib, yakuniy natijani (q3, q4, growth) Gollem ichidagi typed output kanaliga qaytaradi. Bu jarayonda faqat bitta model chaqiruv talab qilinadi, vosita chaqirishlar soni kamayadi va agent tezroq javob beradi.

Xulosa

Monty-go — Bu LLM agentlar uchun vosita chaqirishlarini optimallashtirishga mo‘ljallangan yangilangan vosita. Pydanticning Monty Python interpreterini to’liq Go kodidan WASMga o‘tkazib, wazero yordamida Go dastur ichida yuklaydi. Bunday yondashuv CGO, konteyner yoki subprocess foydalanishini talab qilmasligi tufayli, dastur yig‘inchi ikkilik fayl sifatida tarqaladi, uning hajmi faqat 2,9 MB.

var output strings.Builder
_, err := runner.Execute(ctx, `print("step 1 done")`, nil,
    montygo.WithPrintFunc(func(s string) { output.WriteString(s) }),
)
fmt.Print(output.String()) // "step 1 done\n"

Monty-go ning asosiy quvvatlari — tashqi funksiya chaqiruvlari кезida kodni to‘xtatish, Go callback orqali ularni bajarish, natijani qayta WASM ichida davom ettirish. Bu mekanizm LLM tomonidan yozilgan Python kodni Go vositalari bilan sekinliksiz, xavfsiz va predictable tarzda bog‘lashga imkon beradi. Qo‘shimcha xavfsizlik chegaralari (vaqt, xotira, allocation, rekursiya) cheksiz siljik yoki xotira bombalari oldini oladi, kontekst orqali bekor qilishni ham qo‘llab-quvvatlaydi.

Gollem bilan integratsiya, monty-go "code-mode" vositasini taqdim etadi, bu LLM bitta model chaqiruvida murakkab vosita ketma-ketliklarini Python kodicha ifodalashini, vositalarni Go tarafida bajarishini va natijani agentning typed output kanalida qaytarishini ta'minlaydi. Natijada agentlar tezroq, arzonroq va ishonchliroq ishlaydi, vosita chaqirishlar soni kamayadi va tizim yukki pasayadi.

Monty-go, LLM-agent ekosistemasida kodni vosita sifatida ishlatish paradigmasini o‘zgartirishi mumkin: vosita ketma-ket chaqirishlari o‘rniga, model bitta marta Python kod yozadi, shu kod vositalarni Go tarafida chaqiradi, monty-go esa buni xavfsiz WASM ichida bajaradi. Bu yondashuv, agentlarning murakkab topshiriqlarni bajarishida samarali va scalable yechim taqdim etadi.

Asl manba: github.com

Manba: Hacker News
#Go #WASM #LLM #code execution #monty-go
Telegram da muhokama qilish