Artikel ini menunjukkan evolusi ciri "cari dan ganti" daripada editor teks,
di mana langkah "ganti" telah digantikan dengan transformasi LLM.
Contohnya menggunakan GenAISCript.
Adalah berguna untuk menerapkan transformasi teks secara kelompok yang tidak mudah dilakukan dengan
ungkapan biasa.
Sebagai contoh, apabila kami menambah keupayaan untuk menggunakan arahan rentetan dalam
perintah exec, kami perlu menukar semua panggilan menggunakan tatasusunan argumen kepada sintaks baharu ini:
host.exec("cmd", ["arg0", "arg1", "arg2"])
kepada
host.exec(`cmd arg0 arg1 arg2`)`
Walaupun mungkin untuk memadankan panggilan fungsi ini dengan ungkapan biasa
host\.exec\s*\([^,]+,\s*\[[^\]]+\]\s*\)
bukan mudah untuk merumuskan rentetan gantian... melainkan anda boleh menerangkannya dalam bahasa semula jadi:
Convert the call to a single string command shell in TypeScript
Berikut ialah beberapa contoh transformasi yang LLM mengendalikan pembolehubah dengan betul.
- const { stdout } = await host.exec("git", ["diff"]) + const { stdout } = await host.exec(`git diff`)
- const { stdout: commits } = await host.exec("git", [ - "log", - "--author", - author, - "--until", - until, - "--format=oneline", - ]) + const { stdout: commits } = + await host.exec(`git log --author ${author} --until ${until} --format=oneline`)
Langkah carian dilakukan dengan ruang kerja.grep
yang membolehkan anda mencari corak dalam fail dengan cekap (ini adalah enjin carian yang sama
yang memberi kuasa kepada carian Kod Visual Studio).
const { pattern, glob } = env.vars const patternRx = new RegExp(pattern, "g") const { files } = await workspace.grep(patternRx, glob)
Langkah kedua ialah menggunakan ungkapan biasa pada kandungan fail
dan prakira transformasi LLM setiap padanan menggunakan gesaan sebaris.
const { transform } = env.vars ... const patches = {} // map of match -> transformed for (const file of files) { const { content } = await workspace.readText(file.filename) for (const match of content.matchAll(patternRx)) { const res = await runPrompt( (ctx) => { ctx.$` ## Task Your task is to transform the MATCH with the following TRANSFORM. Return the transformed text. - do NOT add enclosing quotes. ## Context ` ctx.def("MATCHED", match[0]) ctx.def("TRANSFORM", transform) }, { label: match[0], system: [], cache: "search-and-transform" } ) ...
Memandangkan LLM kadangkala memutuskan untuk membungkus jawapan dalam petikan, kami perlu mengalih keluarnya.
... const transformed = res.fences?.[0].content ?? res.text patches[match[0]] = transformed
Akhir sekali, dengan perubahan pra-pengiraan, kami menggunakan penggantian regex akhir kepada
tampal kandungan fail lama dengan rentetan yang diubah.
const newContent = content.replace( patternRx, (match) => patches[match] ?? match ) await workspace.writeText(file.filename, newContent) }
Skrip mengambil tiga parameter: glob fail, corak untuk dicari dan transformasi LLM untuk digunakan.
Kami mengisytiharkan parameter ini dalam metadata skrip dan mengekstraknya daripada objek env.vars.
script({ ..., parameters: { glob: { type: "string", description: "The glob pattern to filter files", default: "*", }, pattern: { type: "string", description: "The text pattern (regular expression) to search for", }, transform: { type: "string", description: "The LLM transformation to apply to the match", }, }, }) const { pattern, glob, transform } = env.vars
Untuk menjalankan skrip ini, anda boleh menggunakan pilihan --vars untuk lulus corak dan transformasi.
genaiscript run st --vars 'pattern=host\.exec\s*\([^,]+,\s*\[[^\]]+\]\s*\)' 'transform=Convert the call to a single string command shell in TypeScript'
Atas ialah kandungan terperinci Carian Dan (LLM) Transformasi. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!