Heim > Web-Frontend > js-Tutorial > Hauptteil

Suche und (LLM) Transformation

DDD
Freigeben: 2024-09-19 06:22:32
Original
989 Leute haben es durchsucht

Search And (LLM) Transform

Dieser Artikel zeigt eine Weiterentwicklung der Funktion „Suchen und Ersetzen“ aus dem Texteditor
wobei der Schritt „Ersetzen“ durch eine LLM-Transformation ersetzt wurde.
Das Beispiel verwendet GenAISCript.

Es kann nützlich sein, Texttransformationen, die nicht einfach durchzuführen sind, stapelweise anzuwenden
reguläre Ausdrücke.

Zum Beispiel, als wir die Möglichkeit hinzugefügt haben, einen String-Befehl in
zu verwenden Mit dem exec-Befehl mussten wir alle Aufrufe, die Argumentarrays verwenden, in diese neue Syntax konvertieren:

host.exec("cmd", ["arg0", "arg1", "arg2"])
Nach dem Login kopieren

zu

host.exec(`cmd arg0 arg1 arg2`)`
Nach dem Login kopieren

Es ist zwar möglich, diesen Funktionsaufruf mit einem regulären Ausdruck abzugleichen

host\.exec\s*\([^,]+,\s*\[[^\]]+\]\s*\)
Nach dem Login kopieren

Es ist nicht einfach, die Ersatzzeichenfolge zu formulieren ... es sei denn, Sie können sie in natürlicher Sprache beschreiben:

Convert the call to a single string command shell in TypeScript
Nach dem Login kopieren

Hier sind einige Beispiele für Transformationen, bei denen das LLM Variablen korrekt verarbeitet hat.

  • Verketten Sie die Argumente eines Funktionsaufrufs zu einer einzigen Zeichenfolge
- const { stdout } = await host.exec("git", ["diff"])
+ const { stdout } = await host.exec(`git diff`)
Nach dem Login kopieren
  • Verketten Sie die Argumente und verwenden Sie die ${}-Syntax, um Variablen zu interpolieren
- 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`)
Nach dem Login kopieren

Suchen

Der Suchschritt erfolgt mit workspace.grep
Dies ermöglicht eine effiziente Suche nach einem Muster in Dateien (dies ist dieselbe Suchmaschine
). das unterstützt die Visual Studio Code-Suche).

const { pattern, glob } = env.vars
const patternRx = new RegExp(pattern, "g")
const { files } = await workspace.grep(patternRx, glob)
Nach dem Login kopieren

Computing-Transformationen

Der zweite Schritt besteht darin, den regulären Ausdruck auf den Dateiinhalt anzuwenden
und berechnen Sie die LLM-Transformation jeder Übereinstimmung mithilfe einer Inline-Eingabeaufforderung vorab.

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" }
        )
        ...
Nach dem Login kopieren

Da das LLM manchmal beschließt, die Antwort in Anführungszeichen zu setzen, müssen wir diese entfernen.

    ...
    const transformed = res.fences?.[0].content ?? res.text
    patches[match[0]] = transformed
Nach dem Login kopieren

Verwandeln

Abschließend wenden wir, nachdem die Transformationen vorberechnet wurden, einen endgültigen Regex-Ersatz an
an Patchen Sie den alten Dateiinhalt mit den transformierten Zeichenfolgen.

    const newContent = content.replace(
        patternRx,
        (match) => patches[match] ?? match
    )
    await workspace.writeText(file.filename, newContent)
}
Nach dem Login kopieren

Parameter

Das Skript benötigt drei Parameter: einen Datei-Glob, ein Muster, nach dem gesucht werden soll, und eine LLM-Transformation, die angewendet werden soll.
Wir deklarieren diese Parameter in den Skriptmetadaten und extrahieren sie aus dem env.vars-Objekt.

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
Nach dem Login kopieren

Läuft

Um dieses Skript auszuführen, können Sie die Option --vars verwenden, um das Muster und die Transformation zu übergeben.

genaiscript run st --vars 'pattern=host\.exec\s*\([^,]+,\s*\[[^\]]+\]\s*\)' 'transform=Convert the call to a single string command shell in TypeScript'
Nach dem Login kopieren

Das obige ist der detaillierte Inhalt vonSuche und (LLM) Transformation. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:dev.to
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!