Heim  >  Artikel  >  Web-Frontend  >  Suche und (LLM) Transformation

Suche und (LLM) Transformation

DDD
DDDOriginal
2024-09-19 06:22:32891Durchsuche

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"])

zu

host.exec(`cmd arg0 arg1 arg2`)`

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

host\.exec\s*\([^,]+,\s*\[[^\]]+\]\s*\)

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

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`)
  • 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`)

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)

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

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

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

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

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'

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!

Stellungnahme:
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