|
ingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;font-size: inherit;letter-spacing: 0.1em;border-width: 0px;border-style: solid;border-color: hsl(var(--border));text-align: left;line-height: 1.75;color: rgb(15, 76, 129);">GenAIScript 是微软开源的,允许你使用 JavaScript 语法编写和管理 LLM prompts 的强大工具。它与 VS Code 深度集成,提供便捷的开发环境,并支持多种 LLM 模型。通过 " rompt 即代码" 的理念,GenAIScript 简化了 LLM 应用的开发流程,并提升了效率。本文将带你深入了解 GenAIScript,从入门到最佳实践,并通过实例展示其强大功能。  ingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;display: table;padding: 0.3em 1em;color: rgb(255, 255, 255);background: rgb(15, 76, 129);border-radius: 8px;box-shadow: rgba(0, 0, 0, 0.1) 0px 4px 6px;">GenAIScript 简介ingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;font-size: 16px;color: rgb(63, 63, 63);">ingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;font-size: 16px;letter-spacing: 0.1em;color: rgb(63, 63, 63);text-align: left;">ingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;font-size: inherit;color: rgb(15, 76, 129);">GenAIScript 的优势:ingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;font-size: 16px;color: rgb(63, 63, 63);" class="list-paddingleft-1">ingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;text-indent: -1em;display: block;margin: 0.5em 8px;">•ingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;font-size: inherit;color: rgb(15, 76, 129);">Prompt 即代码:以编程方式构建和管理 prompt,提高了 prompt 的可重用性和可维护性。 ingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;text-indent: -1em;display: block;margin: 0.5em 8px;">•与 VS Code 深度集成:提供了便捷的开发、调试、测试和运行环境。 •支持多种 LLM 模型:连接 GitHub Models、GitHub Copilot、开源模型等,提供灵活的选择。 •丰富的功能:包括文件读写、数据处理、LLM 工具和代理、RAG、安全检测等,涵盖 LLM 应用开发的各个方面。 GenAIScript 的应用场景: •自动化文档处理:例如翻译、摘要、审查等。 •代码生成和分析:例如生成代码注释、进行代码审查、修复代码错误等。 •数据提取和分析:例如从非结构化数据中提取关键信息、进行情感分析等。 •构建聊天机器人和 AI 代理:创建更智能、更具交互性的对话体验。
核心代码逻辑:Prompt 即代码GenAIScript 的核心在于其"Prompt 即代码" 的理念。它将 LLM prompt 转化为可编程、可管理的 JavaScript 代码,让开发者可以像编写普通代码一样构建和操作 prompt。 最基本的 prompt 创建方式如下: $`Writea'helloworld'poem.` $函数在这里充当了一个模板标签,将字符串内容转换为发送给 LLM 的 prompt。
GenAIScript 支持将变量、文件内容等动态地嵌入到 prompt 中: //读取文件 constfile=awaitworkspace.readText("data.txt"); //定义变量DATA,并将文件内容赋值给它 def("DATA",file); //构建prompt,引用变量DATA $`AnalyzeDATAandextractdatainJSONandsaveittodata.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获取当前选中文件的内容 constfile=def("FILE",env.files); //构建prompt,引用变量FILE $`Summarize${file}inonesentence.`
在 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":"TranslateMakeCodedocumentation", "group":"Translation", temperature:0//temperature为0表示生成结果更确定性 })
//获取命令行参数中的目标语言,默认为French constlangName=env.vars.lang||"French" //获取待翻译的文件内容 constfile=env.files[0] //将文件内容定义为变量ORIGINAL,并指定语言为markdown def("ORIGINAL",file,{language:"markdown"})
//构建prompt,设定LLM的角色和专业领域 $`YouareanexpertatComputerScienceeducation. YouareanexpertatwritingMakeCodedocumentationandtutorials. Youareanexpert${langName}translator.`
//构建第二个prompt,描述翻译任务,并给出具体的翻译规则 $`TranslatethedocumentationinORIGINALto${langName}. -Donottranslateheaderstartingwith~//保留以~开头的标题 -DoNOTtranslatecodein\`blocks\`,\`typescript\`,\`spy\`or\`python\`.However,youcantranslatecomments.//保留代码块,但可以翻译注释 -Donottranslate@variable@or@unplugged//保留特定标识符 -Translate\`##{<text>}\`as\`##{<translatedtext>}\`//翻译标题中的文本 -Whenyouencounterasnippetlike"\`\`||<namespace>:<text>||\`\`",DONOTtranslate<namespace>butDOtranslate<text>.//翻译特定格式的文本,保留命名空间 \`\`||<namespace>:<text>||\`\`-->\`\`||<namespace>:<translatedtext>||\`\`//示例 ...`//其他翻译规则
|