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.
- 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`)
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)
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
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) }
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
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!