GenAIScript 是微软开源的,允许你使用 JavaScript 语法编写和管理 LLM prompts 的强大工具。 它与 VS Code 深度集成,提供便捷的开发环境,并支持多种 LLM 模型。通过 "Prompt 即代码" 的理念,GenAIScript 简化了 LLM 应用的开发流程,并提升了效率。本文将带你深入了解 GenAIScript,从入门到最佳实践,并通过实例展示其强大功能。
GenAIScript 简介
GenAIScript 的优势:
• Prompt 即代码: 以编程方式构建和管理 prompt,提高了 prompt 的可重用性和可维护性。
• 与 VS Code 深度集成: 提供了便捷的开发、调试、测试和运行环境。
• 支持多种 LLM 模型: 连接 GitHub Models、GitHub Copilot、开源模型等,提供灵活的选择。
• 丰富的功能: 包括文件读写、数据处理、LLM 工具和代理、RAG、安全检测等,涵盖 LLM 应用开发的各个方面。
GenAIScript 的应用场景:
• 自动化文档处理: 例如翻译、摘要、审查等。
• 代码生成和分析: 例如生成代码注释、进行代码审查、修复代码错误等。
• 数据提取和分析: 例如从非结构化数据中提取关键信息、进行情感分析等。
• 构建聊天机器人和 AI 代理: 创建更智能、更具交互性的对话体验。
核心代码逻辑:Prompt 即代码
GenAIScript 的核心在于其 "Prompt 即代码" 的理念。它将 LLM prompt 转化为可编程、可管理的 JavaScript 代码,让开发者可以像编写普通代码一样构建和操作 prompt。
最基本的 prompt 创建方式如下:
$`Write a 'hello world' poem.`
$
函数在这里充当了一个模板标签,将字符串内容转换为发送给 LLM 的 prompt。
GenAIScript 支持将变量、文件内容等动态地嵌入到 prompt 中:
// 读取文件
const file = await workspace.readText("data.txt");
// 定义变量 DATA,并将文件内容赋值给它
def("DATA", file);
// 构建 prompt,引用变量 DATA
$`Analyze DATA and extract data in JSON and save it to data.json.`
def
函数不仅引入了文件内容,还会对其进行优化,以适应目标 LLM 的特性。同时,GenAIScript 也能智能地解析 LLM 的输出,并自动提取 data.json
文件。
GenAIScript 入门
安装与配置
推荐使用 VS Code 插件,可以获得更好的开发体验,包括语法高亮、代码补全、调试等功能。你也可以使用命令行工具。
1. 在 VS Code 中打开 Extensions Marketplace (Ctrl+Shift+X)。
2. 搜索 "GenAIScript" 并安装。
3. 安装完成后,需要在 VS Code 的设置中配置 LLM 模型的访问密钥等信息。参考配置文档:GenAIScript 配置文档
编写第一个 GenAIScript
创建一个以 .genai.mjs
或 .genai.mts
为后缀的文件,例如 summarize.genai.mjs
:
// 定义文件变量 FILE,使用 env.files 获取当前选中文件的内容
const file = def("FILE", env.files);
// 构建 prompt,引用变量 FILE
$`Summarize ${file} in one sentence.`
在 VS Code 中右键点击文件,选择 "Run GenAIScript" 即可运行脚本。env.files
会自动获取你所选中的文件内容作为输入。
GenAIScript 最佳实践
• 提供充足的上下文: 使用
def
函数将相关文档和数据引入 prompt,为 LLM 提供更丰富的背景信息,使其更好地理解任务。• 专注于单一任务: 避免在一个 GenAIScript 中处理过于复杂的任务。将复杂任务分解成多个小的、专注的脚本,更易于调试和维护。
• 组合多个脚本: 利用 GenAIScript 的 CLI 或其他工具,将多个脚本组合成一个完整的工作流程,实现更复杂的功能。
• 选择合适的 LLM: 根据任务需求、性能和成本,选择最合适的 LLM 模型。
• 利用 Schema 定义结构化数据: 使用
defSchema
定义预期的数据结构,可以更有效地从 LLM 输出中提取信息,并提高输出的可靠性。• 善用工具和代理: GenAIScript 支持自定义工具和代理,可以扩展 LLM 的能力,使其能够执行更复杂的操作,例如访问外部 API、执行代码等。
• 测试和评估: 使用 GenAIScript 内置的测试和评估功能,可以确保 prompt 的质量和可靠性。
GenAIScript 实例:文档翻译
MakeCode 文档翻译案例充分展现了 GenAIScript 的实用价值。由于 MakeCode 文档中包含许多自定义宏和语法,传统的翻译工具难以处理。GenAIScript 通过定制 prompt,成功地解决了这个问题。
实例实现说明:
该脚本的目标是将 MakeCode 文档翻译成不同的语言。它利用 GenAIScript 的 $
函数构建 prompt,并利用 def
函数将待翻译的文档内容传入 prompt。脚本中定义了详细的翻译规则,以指导 LLM 正确地翻译文档,并保留 MakeCode 文档中的自定义宏和语法。通过命令行参数 lang
可以指定目标语言,结合 GitHub Actions 可以实现自动化翻译流程。
代码示例:
// 定义脚本元数据,包括标题、分组和 temperature
script({
"title": "Translate MakeCode documentation",
"group": "Translation",
temperature: 0 // temperature 为 0 表示生成结果更确定性
})
// 获取命令行参数中的目标语言,默认为 French
const langName = env.vars.lang || "French"
// 获取待翻译的文件内容
const file = env.files[0]
// 将文件内容定义为变量 ORIGINAL,并指定语言为 markdown
def("ORIGINAL", file, { language: "markdown" })
// 构建 prompt,设定 LLM 的角色和专业领域
$`You are an expert at Computer Science education.
You are an expert at writing MakeCode documentation and tutorials.
You are an expert ${langName} translator.`
// 构建第二个 prompt,描述翻译任务,并给出具体的翻译规则
$`Translate the documentation in ORIGINAL to ${langName}.
- Do not translate header starting with ~ // 保留以 ~ 开头的标题
- Do NOT translate code in \`blocks\`, \`typescript\`, \`spy\` or \`python\`. However, you can translate comments. // 保留代码块,但可以翻译注释
- Do not translate @variable@ or @unplugged // 保留特定标识符
- Translate \`## {<text>}\` as \`## {<translated text>}\` // 翻译标题中的文本
- When you encounter a snippet like "\`\`||<namespace>:<text>||\`\`", DO NOT translate <namespace> but DO translate <text>. // 翻译特定格式的文本,保留命名空间
\`\`||<namespace>:<text>||\`\` --> \`\`||<namespace>:<translated text>||\`\` // 示例
...` // 其他翻译规则
相关链接
• GenAIScript 官方文档: https://microsoft.github.io/genaiscript/
• GenAIScript GitHub 仓库: https://github.com/microsoft/genaiscript
• VS Code 插件: https://marketplace.visualstudio.com/items?itemName=ms-genai.genai