上下文(环境+定义)
关于脚本执行上下文的信息可在全局对象 env 中获取。
环境 (env)
env 全局对象包含提供脚本执行上下文信息的属性。
env 由 GenAIScript 运行时自动填充。
env.files
env.files 数组包含执行上下文中的所有文件。上下文由用户根据以下内容隐式定义:
scriptfiles选项
script({ files: "**/*.pdf",})或多个路径
script({ files: ["src/*.pdf", "other/*.pdf"],})-
启动工具的UI位置
-
CLI 文件参数。
文件存储在env.files中,可以注入到提示词中。
- 使用
def
def("FILE", env.files)- 已过滤,
def("DOCS", env.files, { endsWith: ".md" })def("CODE", env.files, { endsWith: ".py" })- 直接在
$调用中使用
$`Summarize ${env.files}.在这种情况下,提示会自动扩展为def调用和env.files的值。
// expandedconst files = def("FILES", env.files, { ignoreEmpty: true })$`Summarize ${files}.env.vars
vars属性包含已在脚本执行上下文中定义的变量。
// grab locale from variable or default to en-USconst locale = env.vars.locale || "en-US"了解更多关于variables的信息。
定义 (def)
def("FILE", file) 函数是生成围栏变量输出的简写方式。
def("FILE", file)它大致渲染为
FILE:
```file="filename"file content```或者如果模型支持XML标签(参见fence formats):
<FILE file="filename">file content</FILE>def 函数也可以与文件数组一起使用,例如 env.files。
def("FILE", env.files)语言
您可以指定def中包含的文本语言。这可以帮助GenAIScript优化文本的渲染效果。
// hint that the output is a diffdef("DIFF", gitdiff, { language: "diff" })引用
def 函数返回一个可在提示中使用的变量名。
该名称可能会根据模型的偏好进行不同的格式化。
const f = def("FILE", file)
$`Summarize ${f}.`文件过滤器
由于脚本可能在完整文件夹上执行,因此基于文件进行过滤通常很有用
- 他们的扩展
def("FILE", env.files, { endsWith: ".md" })- 或者使用一个glob:
def("FILE", files, { glob: "**/*.{md,mdx}" })空文件
默认情况下,如果def与空文件数组一起使用,它将取消提示。您可以通过将ignoreEmpty设置为true来覆盖此行为。
def("FILE", env.files, { endsWith: ".md", ignoreEmpty: true })maxTokens
可以通过def函数限制生成的token数量。当输出过大且模型有token限制时,这非常有用。
maxTokens选项可以设置为一个数字,用于限制每个单独文件生成的token数量。
def("FILE", env.files, { maxTokens: 100 })数据过滤器
def 函数会特殊处理数据文件,例如 CSV 和 XLSX。它会自动将数据转换为 markdown 表格格式以提高分词效率。
sliceHead, 保留前N行
def("FILE", env.files, { sliceHead: 100 })sliceTail, 保留最后N行
def("FILE", env.files, { sliceTail: 100 })sliceSample, 保留N行的随机样本
def("FILE", env.files, { sliceSample: 100 })提示缓存
您可以使用cacheControl: "ephemeral"来指定提示可以缓存较短时间,并启用提示缓存优化功能,该功能由不同的LLM提供商以不同方式支持。
$`...`.cacheControl("ephemeral")def("FILE", env.files, { cacheControl: "ephemeral" })了解更多关于prompt caching的信息。
安全性:提示注入检测
您可以使用配置的内容安全提供程序安排检查提示注入/jail break。
def("FILE", env.files, { detectPromptInjection: true })预测输出
某些模型,如OpenAI的gpt-4o和gpt-4o-mini,支持指定预测输出(存在一些限制)。这有助于降低模型响应的延迟,特别是当大部分响应内容可以提前预知时。 在要求LLM编辑特定文件时,这个功能会很有帮助。
设置prediction: true标志以在def调用时启用它。请注意,只能预测单个文件。
def("FILE", env.files[0], { prediction: true })数据定义 (defData)
defData 函数提供了额外的格式化选项,用于将数据对象转换为文本表示形式。它支持将对象渲染为 YAML、JSON 或 CSV(格式化为 Markdown 表格)。
// render to markdown-ified CSV by defaultdefData("DATA", data)
// render as yamldefData("DATA", csv, { format: "yaml" })defData 函数还支持对输入行和列进行切片的功能。
headers, 要包含的列名列表sliceHead, 从开头包含的行数或字段数sliceTail,从末尾开始包含的行数或字段数sliceSample, 随机选取的行数或字段数distinct, 基于这些列名去重数据的列表query, 一个用于过滤数据的jq查询
defData("DATA", data, { sliceHead: 5, sliceTail: 5, sliceSample: 100,})你也可以利用parsers.tidyData的数据过滤功能。
差异定义 (defDiff)
比较两段数据并让LLM分析差异是非常常见的做法。使用差异对比是一种自然压缩信息的好方法,因为我们只关注不同之处!
defDiff 负责以有助于LLM推理的方式格式化差异。它的行为类似于 def 并为差异分配一个名称。
// diff filesdefDiff("DIFF", env.files[0], env.files[1])
// diff stringsdefDiff("DIFF", "cat", "dog")
// diff objectsdefDiff("DIFF", { name: "cat" }, { name: "dog" })你可以利用parsers.diff中的差异对比功能。