Aller au contenu
A simplified 2D digital illustration displays a plain folder with several file icons above it, each symbolizing a different file type—PDF, Markdown, Python, and CSV—distinguished by subtle color differences. The files float in a curved arc above the folder. Shapes like divided rectangles and arrows suggest data comparison or file differences. A small cogwheel icon represents automation. The scene uses only five solid colors, with sharp boundaries and very minimal detail. All items are spaced apart on a blank, transparent background, with no text, people, shading, or three-dimensional effects.

Contexte (env+def)

AI generated translation.

Les informations sur le contexte d’exécution du script sont disponibles dans l’objet global env.

L’objet global env contient des propriétés qui fournissent des informations sur le contexte d’exécution du script. env est alimenté automatiquement par le moteur d’exécution GenAIScript.

Le tableau env.files contient tous les fichiers inclus dans le contexte d’exécution. Ce contexte est défini implicitement par l’utilisateur selon :

  • l’option files de script
script({
files: "**/*.pdf",
})

ou plusieurs chemins

script({
files: ["src/*.pdf", "other/*.pdf"],
})
  • l’endroit de l’UI où l’outil est lancé

  • les arguments de fichiers du CLI.

Les fichiers sont stockés dans env.files qui peut être injecté dans l’invite.

  • avec def
def("FILE", env.files)
  • filtré,
def("DOCS", env.files, { endsWith: ".md" })
def("CODE", env.files, { endsWith: ".py" })
  • directement dans un appel $
$`Summarize ${env.files}.

Dans ce cas, l’invite est automatiquement agrandie avec un appel à def et la valeur de env.files.

// expanded
const files = def("FILES", env.files, { ignoreEmpty: true })
$`Summarize ${files}.

La propriété vars contient les variables qui ont été définies dans le contexte d’exécution du script.

// grab locale from variable or default to en-US
const locale = env.vars.locale || "en-US"

En savoir plus sur les variables.

La fonction def("FILE", file) est une abréviation pour générer une sortie de variable entourée de bornes (fence).

def("FILE", file)

Cela rend approximativement :

FILE:
```file="filename"
file content
```

ou si le modèle supporte les balises XML (voir formats de fences) :

<FILE file="filename">
file content
</FILE>

La fonction def peut aussi être utilisée avec un tableau de fichiers, comme env.files.

def("FILE", env.files)

Vous pouvez spécifier la langue du texte contenu dans def. Cela peut aider GenAIScript à optimiser l’affichage du texte.

// hint that the output is a diff
def("DIFF", gitdiff, { language: "diff" })

La fonction def retourne un nom de variable qui peut être utilisé dans l’invite. Le nom pourrait être formaté différemment pour s’adapter à la préférence du modèle.

const f = def("FILE", file)
$`Summarize ${f}.`

Comme un script peut être exécuté sur un dossier entier, il est souvent utile de filtrer les fichiers selon

  • leur extension
def("FILE", env.files, { endsWith: ".md" })
  • ou en utilisant un glob :
def("FILE", files, { glob: "**/*.{md,mdx}" })

Par défaut, si def est utilisé avec un tableau vide de fichiers, il annulera l’invite. Vous pouvez changer ce comportement en définissant ignoreEmpty à true.

def("FILE", env.files, { endsWith: ".md", ignoreEmpty: true })

Vous pouvez extraire du contenu autour d’un numéro de ligne spécifique en utilisant l’option line. Ceci est particulièrement utile lorsque vous voulez vous concentrer sur une zone d’intérêt spécifique dans de gros fichiers.

// Se concentrer sur la ligne 25 avec un contexte dynamique
def("FUNCTION_CODE", fileContent, { line: 25 })

L’option line calcule dynamiquement le contexte environnant basé sur la taille du fichier :

  • Très petits fichiers (≤20 lignes) : Inclure la plupart du contenu
  • Petits fichiers (≤100 lignes) : 15 lignes de chaque côté
  • Fichiers moyens (≤500 lignes) : 25 lignes de chaque côté
  • Gros fichiers (≤2000 lignes) : 50 lignes de chaque côté
  • Très gros fichiers (>2000 lignes) : 75 lignes de chaque côté

Lorsque combinée avec maxTokens, l’option line effectue un calcul intelligent de la plage basé sur les tokens :

// Se concentrer sur la ligne 25 avec contrainte de budget de tokens
def("FUNCTION_CODE", fileContent, { line: 25, maxTokens: 500 })

L’implémentation :

  • Expansion intelligente : Commence avec la ligne centrale et s’étend alternativement vers le haut/bas jusqu’à atteindre le budget de tokens
  • Comptage précis : Utilise une estimation précise des tokens pour un meilleur contrôle
  • Fallback gracieux : Revient au calcul basé sur la taille du fichier quand aucun maxTokens n’est spécifié
  • Dépassement de budget : Retourne juste la ligne centrale si elle dépasse déjà le budget de tokens

Les plages de lignes explicites ont la priorité sur l’option line :

// lineStart/lineEnd remplacent l'option line et maxTokens
def("EXPLICIT_WINS", codeFile, {
lineStart: 10,
lineEnd: 20,
line: 50,
maxTokens: 100
}) // Utilise les lignes 10-20

Il est possible de limiter le nombre de tokens générés par la fonction def. Cela peut être utile lorsque la sortie est trop volumineuse et que le modèle a une limite de tokens. L’option maxTokens peut être définie à un nombre afin de limiter le nombre de tokens générés pour chaque fichier individuel.

def("FILE", env.files, { maxTokens: 100 })

Lorsque utilisée avec l’option line, maxTokens contrôle la taille totale de la plage extraite autour de la ligne centrale plutôt que de tronquer les fichiers individuels.

La fonction def traite de façon spéciale les fichiers de données comme CSV et XLSX. Elle convertit automatiquement les données au format tableau markdown pour améliorer la tokenisation.

  • sliceHead, garder les N premières lignes
def("FILE", env.files, { sliceHead: 100 })
  • sliceTail, garder les N dernières lignes
def("FILE", env.files, { sliceTail: 100 })
  • sliceSample, garder un échantillon aléatoire de N lignes
def("FILE", env.files, { sliceSample: 100 })

Vous pouvez utiliser cacheControl: "ephemeral" pour spécifier que l’invite peut être mise en cache pour une courte période, et activer l’optimisation de cache d’invite, qui est prise en charge (différemment) selon les fournisseurs LLM.

$`...`.cacheControl("ephemeral")
def("FILE", env.files, { cacheControl: "ephemeral" })

En savoir plus sur la mise en cache de l’invite.

Vous pouvez planifier un contrôle d’injection d’invite / brèche JAI avec votre fournisseur content safety configuré.

def("FILE", env.files, { detectPromptInjection: true })

Certains modèles, comme OpenAI gpt-4o et gpt-4o-mini, prennent en charge la spécification d’une sortie prédite (avec certaines limitations). Cela aide à réduire la latence des réponses du modèle lorsque la majeure partie de la réponse est prévisible. Ceci peut être utile lorsque l’on demande au LLM de modifier des fichiers spécifiques.

Utilisez l’option prediction: true pour l’activer dans un appel à def. Notez qu’un seul fichier peut être prédit à la fois.

def("FILE", env.files[0], { prediction: true })

La fonction defData offre des options de formatage supplémentaires pour convertir un objet de données en représentation textuelle. Elle supporte la conversion des objets au format YAML, JSON, ou CSV (sous forme de tableau Markdown).

// render to markdown-ified CSV by default
defData("DATA", data)
// render as yaml
defData("DATA", csv, { format: "yaml" })

La fonction defData supporte également des fonctions pour découper les lignes et colonnes en entrée.

  • headers, liste des noms de colonnes à inclure
  • sliceHead, nombre de lignes ou de champs à inclure du début
  • sliceTail, nombre de lignes ou de champs à inclure de la fin
  • sliceSample, nombre de lignes ou de champs à choisir aléatoirement
  • distinct, liste des noms de colonnes pour dédupliquer les données
  • query, une requête jq pour filtrer les données
defData("DATA", data, {
sliceHead: 5,
sliceTail: 5,
sliceSample: 100,
})

Vous pouvez également utiliser la fonctionnalité de filtrage des données via parsers.tidyData.

Il est très courant de comparer deux ensembles de données et de demander au LLM d’analyser les différences. L’utilisation des diffs est un excellent moyen de compresser l’information naturellement car on ne se concentre que sur les différences !

La fonction defDiff se charge de formater le diff de manière adaptée au raisonnement du LLM. Elle fonctionne de façon similaire à def et assigne un nom au diff.

// diff files
defDiff("DIFF", env.files[0], env.files[1])
// diff strings
defDiff("DIFF", "cat", "dog")
// diff objects
defDiff("DIFF", { name: "cat" }, { name: "dog" })

Vous pouvez exploiter la fonctionnalité de diff via parsers.diff.