Maison > interface Web > js tutoriel > le corps du texte

Recherche et transformation (LLM)

DDD
Libérer: 2024-09-19 06:22:32
original
994 Les gens l'ont consulté

Search And (LLM) Transform

Cet article montre une évolution de la fonctionnalité "rechercher et remplacer" de l'éditeur de texte,
où l'étape "remplacer" a été remplacée par une transformation LLM.
L'exemple utilise GenAISCript.

Il peut être utile d'appliquer par lots des transformations de texte qui ne sont pas faciles à réaliser avec
expressions régulières.

Par exemple, lorsque nous avons ajouté la possibilité d'utiliser une commande de chaîne dans
la commande exec, nous devions convertir tous les appels utilisant des tableaux d'arguments vers cette nouvelle syntaxe :

host.exec("cmd", ["arg0", "arg1", "arg2"])
Copier après la connexion

à

host.exec(`cmd arg0 arg1 arg2`)`
Copier après la connexion

Bien qu'il soit possible de faire correspondre cet appel de fonction avec une expression régulière

host\.exec\s*\([^,]+,\s*\[[^\]]+\]\s*\)
Copier après la connexion

il n'est pas facile de formuler la chaîne de remplacement... à moins de pouvoir la décrire en langage naturel :

Convert the call to a single string command shell in TypeScript
Copier après la connexion

Voici quelques exemples de transformations où le LLM a correctement géré les variables.

  • concaténer les arguments d'un appel de fonction en une seule chaîne
- const { stdout } = await host.exec("git", ["diff"])
+ const { stdout } = await host.exec(`git diff`)
Copier après la connexion
  • concatène les arguments et utilise la syntaxe ${} pour interpoler les variables
- 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`)
Copier après la connexion

Recherche

L'étape de recherche se fait avec le workspace.grep
qui permet de rechercher efficacement un motif dans des fichiers (c'est le même moteur de recherche
qui alimente la recherche Visual Studio Code).

const { pattern, glob } = env.vars
const patternRx = new RegExp(pattern, "g")
const { files } = await workspace.grep(patternRx, glob)
Copier après la connexion

Calculer les transformations

La deuxième étape consiste à appliquer l'expression régulière au contenu du fichier
et précalculez la transformation LLM de chaque correspondance à l'aide d'une invite en ligne.

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" }
        )
        ...
Copier après la connexion

Puisque le LLM décide parfois de mettre la réponse entre guillemets, nous devons les supprimer.

    ...
    const transformed = res.fences?.[0].content ?? res.text
    patches[match[0]] = transformed
Copier après la connexion

Transformer

Enfin, avec les transformations pré-calculées, nous appliquons un remplacement final d'expression régulière à
corrigez l'ancien contenu du fichier avec les chaînes transformées.

    const newContent = content.replace(
        patternRx,
        (match) => patches[match] ?? match
    )
    await workspace.writeText(file.filename, newContent)
}
Copier après la connexion

Paramètres

Le script prend trois paramètres : un fichier global, un modèle à rechercher et une transformation LLM à appliquer.
Nous déclarons ces paramètres dans les métadonnées du script et les extrayons de l'objet 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
Copier après la connexion

En cours d'exécution

Pour exécuter ce script, vous pouvez utiliser l'option --vars pour transmettre le modèle et la transformation.

genaiscript run st --vars 'pattern=host\.exec\s*\([^,]+,\s*\[[^\]]+\]\s*\)' 'transform=Convert the call to a single string command shell in TypeScript'
Copier après la connexion

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:dev.to
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!