gollm
Go 语言 LLM 统一封装库,一行代码切换 OpenAI/Anthropic/Claude 等多模
加载项目详情…
本应用为开源项目,仅供学习研究,请遵守其开源协议。
Go 语言 LLM 统一封装库,一行代码切换 OpenAI/Anthropic/Claude 等多模
加载项目详情…
本应用为开源项目,仅供学习研究,请遵守其开源协议。
在 Go 语言生态中,调用大语言模型(LLM)长期面临一个尴尬局面:每个模型提供商(OpenAI、Anthropic、Ollama、Mistral……)都有自己的 SDK、不同的接口设计、不同的参数命名规则。想从 GPT-4 切换到 Claude,往往意味着重写大半业务代码。
gollm(Go + LLM = gollm)正是为解决这一痛点而生。它是一个纯 Go 编写的 LLM 统一封装库,作者是 teilomillet,目前已在 GitHub 收获超过 600 颗星,被标注为 Apache-2.0 开源协议。项目名称取自希伯来神话中的魔像(Golem)——传说中用咒语赋予泥土生命的魔法生物,正如 gollm 用大语言模型为 Go 程序注入「智能灵魂」。
图1:gollm GitHub 仓库主页
作者 Ed Zynda 在一段 YouTube 视频中解释了他的创作动机:作为一名 Go 开发者,他在构建 AI 应用时发现市面上的 LLM SDK 各自为政,切换模型需要大量重复工作。于是他从 Python 生态中借鉴了类似 LangChain 的设计思路,但以更轻量的方式移植到 Go 语言,最终形成了 gollm 这个项目。
项目的设计哲学强调简单而不简陋——不做臃肿的链式调用框架,而是专注于:统一接口、灵活的 Prompt 管理、以及开发者日常真正需要的高阶能力(链式推理、模型对比、Prompt 优化)。
gollm 最大的价值在于抽象了一层统一的 LLM 接口。当前支持的模型提供商包括:
切换 Provider 只需改动几行配置:
// 切换到 Claude
llm, _ := gollm.NewLLM(
gollm.SetProvider("anthropic"),
gollm.SetModel("claude-3-5-sonnet"),
gollm.SetAPIKey(os.Getenv("ANTHROPIC_API_KEY")),
)
// 切换到 Groq
llm, _ = gollm.NewLLM(
gollm.SetProvider("groq"),
gollm.SetModel("llama-3.1-70b-versatile"),
gollm.SetAPIKey(os.Getenv("GROQ_API_KEY")),
)
这对于需要在不同模型之间快速切换、进行效果对比、或做成本优化的团队来说,极为实用。
gollm 提供了比原生 API 丰富得多的 Prompt 构建方式:
prompt := gollm.NewPrompt(
"Explain the concept of recursion",
gollm.WithContext("Target audience: programming beginners"),
gollm.WithDirectives("Be concise", "Include code examples"),
gollm.WithOutput("Structure with sections: Definition, Example, Pitfalls"),
gollm.WithMaxLength(1000),
)
支持系统消息、用户消息、助手消息的分离构建,还可以携带示例(Few-shot Learning)、JSON Schema 输出约束、以及多模态内容(图片+文本)。
gollm 还内置了一个 Prompt 自动优化器。它会先用当前 LLM 评估 Prompt 的效果,然后生成改进版本,反复迭代直到达到设定的质量阈值。开发者可以自定义评估指标(如「创意性」、「准确性」)和评分体系:
optimizer := optimizer.NewPromptOptimizer(
llm, initialPrompt, taskDescription,
optimizer.WithCustomMetrics(
optimizer.Metric{Name: "Creativity", Description: "How original"},
),
optimizer.WithRatingSystem("numerical"),
optimizer.WithThreshold(0.8),
)
optimized, _ := optimizer.OptimizePrompt(ctx)
同一个 Prompt 在不同模型上的表现可能差异巨大。gollm 内置了 CompareModels 工具,可以同时向多个 Provider 发送请求,收集响应并按自定义规则验证,返回结构化对比结果。这对于模型选型和 A/B 测试非常有价值。
通过 SetMemory() 启用对话记忆功能,gollm 自动维护对话历史,并在每次请求时注入上下文。它支持两种模式:结构化消息(推荐,兼容 API 级别的 Prompt 缓存,可降低成本)和扁平化 Prompt(传统模式,兼容旧用法)。Anthropic 用户还能使用原生 Prompt Caching(缓存类型设为 ephemeral)来进一步节省 tokens。
LLM 输出 JSON 结构化数据时,常面临格式不稳定的问题。gollm 支持基于 JSON Schema 的输出验证:
prompt := gollm.NewPrompt("Analyze pros and cons of remote work.")
response, _ := llm.Generate(ctx, prompt, gollm.WithJSONSchemaValidation())
// response 必定符合预设 schema,无需手动解析
通过 Stream() 方法支持流式响应,适用于聊天机器人等需要实时展示打字效果的场景。
gollm 的代码组织非常清晰,核心目录结构如下:
| 目录/文件 | 职责 |
|---|---|
providers/ | 各个 LLM Provider 的具体实现(如 openai.go、anthropic.go),每个文件实现 Provider 接口 |
llm/ | 核心 LLM 接口定义、Prompt 结构、TokenStream 流式响应 |
config/ | 配置管理,支持环境变量、NewConfig() 链式设置 |
optimizer/ | Prompt 优化器实现 |
presets/ | 预置高阶函数(ChainOfThought、QuestionAnswer、Summarize 等) |
assess/ | 模型评估框架 |
examples/ | 30+ 完整使用示例,覆盖从基础到高级的全部场景 |
cmd/gollm/ | CLI 工具入口 |
核心接口 LLM 定义了 Generate(同步生成)、Stream(流式生成)、GenerateWithSchema(结构化输出)等方法,所有 Provider 实现都遵循这一接口契约。Provider 接口则负责各自的 API 请求构建(不同 Provider 的 HTTP Body 格式差异极大)。
依赖方面,gollm 只依赖少数几个经过社区验证的库:invopop/jsonschema(JSON Schema 生成)、go-playground/validator(配置验证)、caarlos0/env(环境变量解析)、pkoukk/tiktoken-go(Token 计数)。没有引入过于小众的依赖,维护性较好。
gollm 定位为开发库,不是独立服务。安装极为简单:
go get github.com/teilomillet/gollm
前提条件:Go 1.22+,以及目标 LLM Provider 的 API Key(通过环境变量注入)。项目自带 30+ examples,涵盖了几乎所有主流用法:basic_usage、function_calling、streaming、mixture_of_agents、batch_prompt_optimizer、vision 等。开发者克隆项目后,可以直接运行 examples 中的代码,快速验证效果。
⚠️ 注意:gollm 本身不提供 Web UI,它是一个纯后台库,需要开发者自行集成到自己的 Go 应用中。如果需要 Web 界面,建议配合 Gin/Fiber 等 Go Web 框架构建 API 服务。
ToolCall 相关类型,但文档和示例相对较少,不如 OpenAI SDK 成熟。gollm 的出现填补了 Go 生态在 LLM 统一封装层面的空白。在 Go 越来越广泛用于后端微服务、云原生场景的背景下,能够在 Go 代码中无缝切换不同 LLM Provider,意味着 AI 能力可以更低成本地嵌入到高性能后端服务中。相比 Python 的重量级框架,gollm 的轻量设计更符合 Go 的工程哲学——简单、显式、高效。
截至目前(2026年6月),668 颗星、持续维护的版本迭代、覆盖主流 LLM Provider 的广度,使其成为 Go 开发者接入大语言模型的首选工具包之一。