
Contexte (env+def)
Les informations sur le contexte d’exécution du script sont disponibles dans l’objet global env
.
Environnement (env
)
Section intitulée « Environnement (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.
env.files
Section intitulée « env.files »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
descript
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
.
// expandedconst files = def("FILES", env.files, { ignoreEmpty: true })$`Summarize ${files}.
env.vars
Section intitulée « env.vars »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-USconst locale = env.vars.locale || "en-US"
En savoir plus sur les variables.
Définition (def
)
Section intitulée « Définition (def) »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 diffdef("DIFF", gitdiff, { language: "diff" })
Référencement
Section intitulée « Référencement »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}.`
Filtres de fichiers
Section intitulée « Filtres de fichiers »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}" })
Fichiers vides
Section intitulée « Fichiers vides »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 })
Extraction basée sur les lignes
Section intitulée « Extraction basée sur les lignes »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 dynamiquedef("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é
Support du budget de tokens
Section intitulée « Support du budget de tokens »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 tokensdef("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
Règles de priorité
Section intitulée « Règles de priorité »Les plages de lignes explicites ont la priorité sur l’option line
:
// lineStart/lineEnd remplacent l'option line et maxTokensdef("EXPLICIT_WINS", codeFile, { lineStart: 10, lineEnd: 20, line: 50, maxTokens: 100}) // Utilise les lignes 10-20
maxTokens
Section intitulée « maxTokens »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.
Filtres de données
Section intitulée « Filtres de données »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 })
Mise en cache de l’invite
Section intitulée « Mise en cache de l’invite »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.
Sécurité : détection d’injection d’invite
Section intitulée « Sécurité : détection d’injection d’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 })
Sortie prédite
Section intitulée « Sortie prédite »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 })
Définition de données (defData
)
Section intitulée « Définition de données (defData) »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 defaultdefData("DATA", data)
// render as yamldefData("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 à incluresliceHead
, nombre de lignes ou de champs à inclure du débutsliceTail
, nombre de lignes ou de champs à inclure de la finsliceSample
, nombre de lignes ou de champs à choisir aléatoirementdistinct
, liste des noms de colonnes pour dédupliquer les donnéesquery
, 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
.
Définition de diff (defDiff
)
Section intitulée « Définition de diff (defDiff) »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 filesdefDiff("DIFF", env.files[0], env.files[1])
// diff stringsdefDiff("DIFF", "cat", "dog")
// diff objectsdefDiff("DIFF", { name: "cat" }, { name: "dog" })
Vous pouvez exploiter la fonctionnalité de diff via parsers.diff
.