跳至内容

上下文(环境+定义)

关于脚本执行上下文的信息可在全局对象 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的值。

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

env.vars

vars属性包含已在脚本执行上下文中定义的变量。

// grab locale from variable or default to en-US
const 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 diff
def("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 函数会特殊处理数据文件,例如 CSVXLSX。它会自动将数据转换为 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 default
defData("DATA", data)
// render as yaml
defData("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 files
defDiff("DIFF", env.files[0], env.files[1])
// diff strings
defDiff("DIFF", "cat", "dog")
// diff objects
defDiff("DIFF", { name: "cat" }, { name: "dog" })

你可以利用parsers.diff中的差异对比功能。