Rumah  >  Artikel  >  hujung hadapan web  >  Carian Dan (LLM) Transformasi

Carian Dan (LLM) Transformasi

DDD
DDDasal
2024-09-19 06:22:32998semak imbas

Search And (LLM) Transform

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.

  • gabungkan argumen panggilan fungsi ke dalam rentetan tunggal
- const { stdout } = await host.exec("git", ["diff"])
+ const { stdout } = await host.exec(`git diff`)
  • gabungkan hujah dan gunakan sintaks ${} untuk menginterpolasi pembolehubah
- 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`)

Cari

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)

Mengira Transformasi

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

Berubah

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)
}

Parameter

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

Berlari

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!

Kenyataan:
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 sebelumnya:Sumbangan PertamaArtikel seterusnya:Sumbangan Pertama