上下文(环境+定义)
关于脚本执行上下文的信息可在全局对象 env
中获取。
环境 (env
)
env
全局对象包含提供脚本执行上下文信息的属性。
env
由 GenAIScript 运行时自动填充。
env.files
env.files
数组包含执行上下文中的所有文件。上下文由用户根据以下内容隐式定义:
script
files
选项
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
中的差异对比功能。