什么是 gptscript?
在传统的 LLM 应用开发中,我们通常在“纯提示词(Prompting)”和“硬编码(Hard-coding)”之间做选择。前者灵活但不可预测,后者稳定但缺乏灵活性。gptscript 旨在打破这一僵局。
gptscript 是一门专门为 AI 设计的脚本语言,它允许开发者将自然语言的灵活性与编程语言的结构化控制(如循环、条件判断、变量赋值)结合在一起。简单来说,它让你可以编写一个 .gpt 脚本文件,在这个文件中,你可以像写 Bash 脚本一样调用 LLM,同时通过定义自定义函数(Tools)来扩展 AI 的能力。
核心设计理念
gptscript 的核心逻辑是:将 LLM 视为一个可编程的运行时(Runtime)。
- 自然语言作为指令:脚本中的每一行如果没有特殊标记,都被视为给 LLM 的指令。
- 结构化控制流:支持变量定义、条件分支和循环,解决了 LLM 在处理复杂多步任务时容易“迷路”的问题。
- 可扩展的工具集:你可以用 Go、TypeScript 或 Python 编写具体的函数,然后通过 gptscript 调用这些函数,实现从“对话”到“执行”的跨越。
- 状态管理:脚本在执行过程中维护上下文状态,使得多步推理的结果可以被精确地传递给下一步。
快速上手实例
为了让你直观感受 gptscript 的威力,我们来看几个从简单到复杂的场景。
场景一:简单的链式任务
假设你需要一个脚本:先总结一篇长文章,然后将其翻译成法文,最后生成一个推特推文。
workflow.gpt
# 步骤1:总结内容
let summary = "请总结以下文章的核心观点,要求不超过100字:{{article_content}}"
# 步骤2:翻译
let translation = "将以下总结翻译成法语:{{summary}}"
# 步骤3:生成推文
"基于以下法语总结,写一条吸引人的推特,并加上相关标签:{{translation}}"
在这个例子中,let 关键字定义了变量,LLM 的输出被存储在变量中,并在后续步骤中通过 {{}} 引用。
场景二:结合自定义工具(Tool Use)
gptscript 最强大的地方在于它可以调用外部函数。假设你定义了一个名为 get_weather 的 Go 函数。
weather_report.gpt
# 调用自定义工具获取实时天气
let weather_data = get_weather(city: "Shanghai")
# 让 AI 根据数据生成人性化的建议
"当前上海的天气数据是 {{weather_data}}。请根据这个天气,给用户推荐一套合适的穿衣方案,并提醒是否需要带伞。"
场景三:复杂逻辑控制(条件判断)
你可以根据 LLM 的判断结果来决定执行路径。
content_filter.gpt
let analysis = "分析以下文本是否包含敏感词或违规内容,仅回答 'YES' 或 'NO':{{user_input}}"
if (analysis == "YES") {
"文本包含违规内容,已拦截。请遵守社区规范。"
} else {
"文本通过审核。请将其改写得更加专业且具有商业感:{{user_input}}"
}
开发者视角:如何集成到 Go 项目中?
由于 gptscript 提供了强大的 Go SDK,你可以轻松地将其集成到你的后端服务中。
1. 安装依赖
go get github.com/gptscript-ai/gptscript
2. 基础集成代码
package main
import (
"fmt"
"github.com/gptscript-ai/gptscript"
)
func main() {
// 1. 初始化运行时
runtime := gptscript.NewRuntime()
// 2. 定义一个自定义工具 (Tool)
// 假设这是一个查询数据库的函数
runtime.RegisterFunction("get_user_balance", func(args map[string]interface{}) (interface{}, error) {
userID := args["userId"].(string)
// 模拟数据库查询
return fmt.Sprintf("用户 %s 的余额为 100.00 USD", userID), nil
})
// 3. 编写 gpt 脚本
script := `
let balance = get_user_balance(userId: "user_123")
"用户查询结果如下:{{balance}}。请用礼貌的语气告知用户,并建议他们如何通过理财增加余额。"
`
// 4. 执行脚本
result, err := runtime.Execute(script)
if err != nil {
panic(err)
}
fmt.Println(result)
}
gptscript vs 传统 LangChain/AutoGPT
| 维度 | 传统 Agent 框架 (如 LangChain) | gptscript |
|---|---|---|
| 定义方式 | 通过复杂的 Python 类和链式调用定义 | 通过类似脚本的 .gpt 文件定义 |
| 可读性 | 逻辑隐藏在代码深处,非开发人员难以维护 | 逻辑直观,接近自然语言,易于审计 |
| 控制力 | 依赖 LLM 的 ReAct 循环,有时不可控 | 显式的控制流(if/let),确定性更高 |
| 部署 | 需要运行完整的 Python 环境 | 编译为 Go 二进制文件,极高性能且轻量 |
适用场景
- 复杂的工作流自动化:当你需要 AI 完成一个包含 5 个以上步骤的任务,且每一步都有严格的前后依赖时。
- 低代码 AI 平台:你可以允许非技术用户编写
.gpt脚本,而你提供底层的 Go 函数库,实现“插件化”的 AI 能力。 - 确定性 AI 代理:在需要严格控制执行路径(例如金融审批流、企业内部合规检查)的场景下。
- 快速原型开发:无需编写大量胶水代码,直接通过脚本定义 AI 行为。
总结
gptscript 不仅仅是一个库,它提供了一种新的编程范式:将 LLM 视为一种特殊的“指令集”,而将传统的编程语言(如 Go)作为其“外设驱动”。通过这种解耦,开发者可以获得极高的开发效率,同时确保 AI 任务的结构化和可预测性。如果你厌倦了在 Prompt 中写冗长的“Step 1… Step 2…”,那么 gptscript 将是你构建下一代 AI 应用的利器。



还没有评论,来说两句吧...