Langkau ke kandungan
cd /blog

Penambahbaikan Kendiri Rekursif Bahasa: Menggilap Code Intelligence Merentasi ~280 Bahasa

[Seni Bina][Bahasa][Ejen]

> Kami menyokong code intelligence untuk ~280 bahasa. Tiada manusia yang mampu mengaudit itu secara manual. Jadi kami membina gelung penambahbaikan kendiri rekursif bahasa — semak rawak, LLM-sebagai-hakim, baiki satu perkara, sahkan semula — dan menjalankannya dengan sepasukan ejen terasing sehingga pengekstrakan benar-benar betul, bukan sekadar hijau.

Angka dalam penulisan ini mencerminkan sistem pada masa penerbitan (Mei 2026). Lihat halaman pasukan kami untuk angka terkini.

Maguyva mengekstrak simbol, rujukan, dan graf kebergantungan daripada kod sumber dalam lebih kurang 280 bahasa. Setiap bahasa adalah handler tree-sitter tersuai — query, heuristik, kes tepi — dan setiap handler boleh salah secara halus dengan caranya sendiri. Panggilan method dipancarkan sebagai bacaan. Fungsi diatributkan kepada skop pelingkung yang salah. Hubungan yang sebenarnya tidak wujud.

Anda tidak boleh mengauditnya secara manual. Tiada pasukan yang mampu membaca output pengekstrakan merentasi 280 grammar dan mengesan edge yang buruk. Jadi soalan yang menarik bukanlah “adakah pengekstrakan kami betul” — tetapi “bagaimana anda ketahui ia salah, pada skala seluas ini, tanpa manusia dalam setiap gelung.” Jawapan kami ialah penambahbaikan kendiri rekursif bahasa: gelung kualiti yang dipacu oleh ejen bahasa, LLM yang bertindak sebagai hakim, dan satu peraturan yang kami terus pelajari semula: hijau tidak sama dengan betul.

Hijau bukan bermakna betul

Setiap bahasa mempunyai suite fixture, dan gate pelepasan menilainya merentasi lima dimensi — ketepatan, integriti struktur, kelengkapan, kualiti, dan prestasi. Sesuatu bahasa menjadi GREEN hanya apabila, pada fixture-nya, precision ≥ 0.95, recall ≥ 0.99, dan F1 ≥ 0.97, dengan sekurang-kurangnya 20 edge yang dijangka untuk keyakinan statistik. Di bawah itu ia menjadi YELLOW atau RED, dan tidak dikeluarkan.

Gate itu perlu tetapi tidak mencukupi. Fixture mengesahkan terhadap fixture yang kami tulis sendiri. Ia mengekod kes-kes yang sudah kami fikirkan. Sesuatu handler boleh sempurna pada fixture-nya tetapi masih mengacau-balaukan corak yang hanya muncul dalam kod sebenar — satu idiom macro, method bersempadan generik, satu ciri bahasa yang tiada siapa menulis fixture untuknya. GREEN bermaksud fixture lulus. Ia tidak bermaksud repositori sebenar diekstrak dengan bersih. Jadi gelung itu perlu meninggalkan fixture dan melihat ke alam liar.

Gelung dalaman: semak rawak, hakim, baiki, buktikan

Gelung teras berjalan satu bahasa pada satu masa:

        ┌──────────────────────────────────────────────────────────┐
        │                                                          │
        ▼                                                          │
  1. corpus run ── clone real-world repos, extract relationships   │
        │                                                          │
        ▼                                                          │
  2. spot-check 100 edges (seed 42, then seed 123 to cross-check)  │
        │                                                          │
        ▼                                                          │
  3. LLM judge classifies every sampled edge:                      │
        CORRECT · FALSE_POSITIVE · TYPE_ERROR ·                    │
        SCOPE_ERROR · METADATA_ERROR                               │
        │                                                          │
        ▼                                                          │
  4. fix ONE thing — handler .py, .scm query, or config           │
        │                                                          │
        ▼                                                          │
  5. re-validate — F1 + re-classify + manifest diff (no regressions)│
        │                                                          │
   better? ──no──► revert, try a different fix ────────────────────┤
        │ yes                                                       │
        ▼                                                           │
  6. promote the fix into fixtures (a permanent regression guard) ──┘

Beberapa perkara menjadikan ini berfungsi berbanding sekadar bergelut tanpa hala tuju.

Hakimnya adalah ejen itu sendiri, bukan panggilan API. Apabila kami berkata “LLM-sebagai-hakim,” maksud kami ejen bahasa itu sendiri membaca setiap edge yang disampel berbanding sumber sebenar dan mengklasifikasikannya dengan rubrik lima kategori yang tetap: adakah edge ini betul, positif palsu, hubungan yang betul dengan jenis yang salah, terikat pada skop yang salah, atau membawa metadata yang salah? Rubrik itu adalah keseluruhan permainan — “kadar ralat 23%” tidak bermakna sehingga anda tahu sama ada itu kecacatan sebenar atau hakim tersalah kira.

Baiki satu perkara, kemudian buktikan. Setiap iterasi menukar tepat satu aset yang boleh disunting, kemudian menjalankan semula terhadap harness tetap dan mengekalkan perubahan itu hanya jika F1 bertambah baik dan pengklasifikasian semula kelihatan lebih baik. Jika tidak, ia dikembalikan. Tiada kelompok suntingan spekulatif, tiada “sepatutnya lebih baik.” Sesuatu perubahan mesti membuktikan haknya atau ia dibuang. Dan apabila sesuatu pembaikan kekal, ia dinaikkan taraf ke dalam suite fixture — supaya bug yang dibaikinya tidak dapat kembali secara senyap. Langkah kenaikan taraf itulah yang menjadikan gelung ini rekursif dan bukan sekadar berulang: setiap pusingan mengukuhkan oracle yang disahkan oleh pusingan seterusnya.

Pengajaran yang kami terus pelajari semula: metrik melebih-lebihkan laporan

Inilah perangkapnya, dan kami terus terjerumus ke dalamnya. Metrik korpus sekunder — kekerapan sasaran yang diekstrak tidak mempunyai simbol yang boleh diselesaikan, berapa banyak simbol kelihatan “yatim,” dan sebagainya — secara besar-besaran melebih-lebihkan masalah. Kebanyakannya adalah artifak paradigma, bukan bug.

Contoh paling jelas: llvm pernah menunjukkan kadar “sumber-tanpa-simbol” sebanyak 73% dan dicap sebagai bencana. Kami menyelidik lebih dalam. Ketepatan sebenar ialah 98.5%. “Simbol yang hilang” itu hampir kesemuanya rujukan luaran yang sah — panggilan ke pustaka piawai, ke framework, ke kod yang berada di luar repositori. Metrik itu mengukur sifat bahasa, bukan kecacatan dalam handler. Bahasa seperti Zig, COBOL, dan Odin menunjukkan kadar “yatim” sebanyak 65–70% dan sepenuhnya betul; COBOL tidak mempunyai sebarang ralat sebenar.

Jika kami membiarkan angka-angka itu memacu kerja ini, kami pasti menghabiskan berminggu-minggu “membaiki” handler yang sudah pun betul dan mengabaikan bahasa yang mempunyai bug sebenar yang senyap. Kesimpulannya tegas: metrik agregat paling banter hanyalah isyarat triage yang kasar. Isyarat kualiti sebenar ialah semak rawak dengan pengklasifikasian edge — melihat edge sebenar dalam repositori sebenar dan menilainya satu demi satu. Data mengatasi gerak hati, tetapi hanya sebaik sahaja anda tahu data mana yang bercakap benar.

Gelung luar: satu pasukan, bukan maraton

Satu bahasa pada satu masa akan mengambil masa yang tidak berkesudahan merentasi kesemua 280 bahasa itu, jadi gelung dalaman dibalut dalam satu gelung luar yang menjalankan banyak secara selari.

   pick a wave of near-GREEN / high-error languages


   fan out 10–15 agents, each ISOLATED in its own git worktree,
   each grinding ONE language, committing to its own branch


   orchestrator integrates serially: file-scoped apply, then
   `manifest diff` — any cross-language regression blocks the batch


   gated push (reviewed and confirmed) ──► rotate to the next wave

Setiap ejen bekerja dalam worktree pakai buang supaya mereka tidak dapat mengganggu satu sama lain. Orchestrator mengintegrasikan pembaikan mereka satu demi satu, setiap satu di sebalik semakan regresi manifest-penuh: perubahan yang membantu bahasanya sendiri tetapi secara senyap merosakkan tiga yang lain tidak akan mendarat. Integrasi digerbang dan disahkan sebelum apa-apa pun ditolak — gate regresi menentukan apa yang selamat, manusia masih menentukan apa yang dikeluarkan. Kemudian kumpulan itu berputar ke set bahasa seterusnya dan keseluruhan proses berjalan semula.

Apa yang masih tidak sempurna

Hakim boleh tersilap, dan kesilapan itu mempunyai arah: ejen yang berjalan dengan konteks yang terlalu sedikit melebih-lebihkan laporan. Dalam satu kelompok, lapan bahasa ditandai pada ralat 5–20%; selepas pemeriksaan hanya satu yang merupakan bug sebenar khusus bahasa — selebihnya adalah kesilapan hakim akibat terlepas pandang semantik bahasa itu sendiri (satu baris sumber secara sah memancarkan beberapa edge, ikatan parameter dimodelkan sebagai assignment, bahasa rujukan-per-pengecam). Itulah sebabnya kami mengambil sampel dengan dua seed dan menyilang semak, dan mengapa percanggahan antara hakim dan fixture dianggap sebagai isyarat yang paling menarik, bukan keputusan muktamad — kadangkala fixture itulah yang salah.

Kami juga jujur tentang sasaran itu. Matlamatnya ialah sifar ralat sebenar, penuh titik — tetapi “sifar” adalah hala tuju yang kami usahakan secara berterusan, bahasa demi bahasa, bukan kotak yang ditanda. Sentiasa ada repositori lain dengan idiom lain.

Diperoleh, Bukan Didakwa

Segala yang Maguyva lakukan untuk seorang ejen — mencari simbol, menjejaki kebergantungan, menjawab soalan dengan kod yang disebut sumber — bergantung kepada pengekstrakan di sebaliknya adalah betul. Merentasi 280 bahasa, “betul” tidak boleh didakwa sahaja; ia perlu diperoleh secara berterusan berbanding kod sebenar. Gelung ini adalah cara kami memperolehnya: kitaran semak-rawak-dan-baiki yang autonomi yang mencurigai metriknya sendiri, membuktikan setiap perubahan, dan mengubah setiap pembaikan menjadi pengawal terhadap regresi seterusnya. Ia tidak glamour. Ia adalah kerja yang membolehkan kami berkata “kami menyokong bahasa anda” dan memaksudkannya dengan sungguh-sungguh. Hijau itu mudah. Betul itu diperoleh.

Bacaan berkaitan

Lagi daripada log pembinaan Maguyva