大家好!我是 [数擎 AI],一位热爱探索新技术的前端开发者,在这里分享前端和 Web3D、AI 技术的干货与实战经验。如果你对技术有热情,欢迎关注我的文章,我们一起成长、进步! 开发领域:前端开发 | AI 应用 | Web3D | 元宇宙
技术栈:JavaScript、React、ThreeJs、WebGL、Go
经验经验:6 年+ 前端开发经验,专注于图形渲染和 AI 技术
开源项目:智简未来、数擎AI 、LangChainDemo
一、前言
人工智能应用正在快速发展,LangChain 作为 AI 应用的“编排框架”,在 Python 与 JavaScript 生态中已经大放异彩。
如果你是 Golang 开发者,想要利用 Go 的并发性能、生态和工程化能力来构建 AI 应用,那么 LangChainGo 就是你的不二之选。
这篇文章将带你从入门到进阶,掌握 LangChainGo 的核心能力,最终实现一个完整的 AI 应用。
二、LangChainGo 简介
LangChainGo 是 LangChain 的 Go 语言实现,其目标与 Python 版一致:
- 提供 统一的 LLM 接口(支持 OpenAI、Azure、Anthropic 等)。
- 提供 链(Chain)与代理(Agent) 机制,让你快速构建复杂 AI 流程。
- 支持 工具集成(检索、数据库、知识库、外部 API)。
优势
- Go 的 高性能并发 能力非常适合需要处理大量请求的 AI 应用。
- 天然适合和 微服务、云原生架构 融合。
- 工程化强,部署方便。
可以理解为:Python 版 LangChain 更适合科研与快速原型,而 Go 版 LangChainGo 则更适合高并发生产环境。
三、快速入门
1. 安装
go get github.com/tmc/langchaingo
安装完成后,即可在 Go 项目中直接使用 LangChainGo 提供的各类组件。
- 大词言模型
在 LangChain 中,LLM(大语言模型)是最底层的能力,所有功能都基于它来实现。 下面的示例展示了如何在 LangChainGo 中调用 OpenAI 模型,并通过 System Prompt 设定 AI 的角色。
package main
import (
"context"
"fmt"
"github.com/tmc/langchaingo/llms"
"github.com/tmc/langchaingo/llms/openai"
)
var (
apiKey = "sk-xxxxxxxxxxxxxxxxxxxx"
url = "https://poloai.top/v1"
)
func main() {
llm, err := openai.New(openai.WithToken(apiKey), openai.WithBaseURL(url))
if err != nil {
panic(err)
}
rsp, err := llm.GenerateContent(context.Background(), []llms.MessageContent{
llms.TextParts(llms.ChatMessageTypeSystem, "你是一个诗人"),
llms.TextParts(llms.ChatMessageTypeHuman, "请用一句诗来描述你"),
})
if err != nil {
panic(err)
}
fmt.Println(rsp.Choices[0].Content)
}
在这个例子中,我们让 AI 扮演“诗人”的身份,然后向它提问。 这种 角色设定 能让 AI 的回答更符合场景化需求。
- Prompts —— 提示词模板
Prompt 工程是 AI 应用的核心竞争力。通过模板化的方式,我们可以 参数化生成 Prompt,从而批量化或动态化地构建对话。
package main
import (
"context"
"fmt"
"github.com/tmc/langchaingo/llms"
"github.com/tmc/langchaingo/llms/openai"
"github.com/tmc/langchaingo/prompts"
)
var (
apiKey = "sk-xxxxxxxxxxxxxxxxxxxx"
url = "https://poloai.top/v1"
)
func main() {
ctx := context.Background()
llm, err := openai.New(openai.WithToken(apiKey), openai.WithBaseURL(url))
if err != nil {
panic(err)
}
template := prompts.NewPromptTemplate(
"请你为{{.dep}}部门新入职员工{{.name}} 设计一个自我介绍",
[]string{"dep", "name"},
)
staff := map[string]any{
"name": "数擎Ai",
"dep": "产品研发",
}
prompt, err := template.FormatPrompt(staff)
if err != nil {
panic(err)
}
text, err := llms.GenerateFromSinglePrompt(ctx, llm, prompt.String())
if err != nil {
panic(err)
}
fmt.Println(text)
}
在这个示例中:
通过 模板化的 Prompt,我们可以复用提示词逻辑。
只需要传入不同的参数(如 name、dep),就能自动生成符合场景的提示。
这让 Prompt 工程标准化,避免了硬编码。
- Chains —— 链式调用
Chain 就像流水线,把多个步骤组合在一起:输入 → 处理 → 输出。 这种模式非常适合场景化的 AI 应用,例如“先生成内容 → 再翻译 → 最后总结”。
package main
import (
"context"
"fmt"
"github.com/tmc/langchaingo/chains"
"github.com/tmc/langchaingo/llms/openai"
"github.com/tmc/langchaingo/prompts"
)
var (
apiKey = "sk-xxxxxxxxxxxxxxxxxxxx"
url = "https://poloai.top/v1"
format = "要求:用中文输出,内容自然流畅,不要包含任何奇怪的符号、特殊空格或控制字符。"
template = "请你为{{.dep}}部门新入职员工{{.name}}设计一个自我介绍 "
templateInputValue = []string{"dep", "name"}
)
func main() {
ctx := context.Background()
llm, err := openai.New(openai.WithToken(apiKey), openai.WithBaseURL(url))
if err != nil {
panic(err)
}
promptTemplate := prompts.NewPromptTemplate(template, templateInputValue)
// 生成链
chain := chains.NewLLMChain(llm, promptTemplate)
call, err := chains.Call(ctx, chain, map[string]any{
"name": "数擎Ai",
"dep": "产品研发",
})
if err != nil {
panic(err)
}
fmt.Println(call)
}
这里通过 LLMChain 把 PromptTemplate + LLM 组合起来,实现了“链式调用”。 这种方式让我们可以快速扩展成多步骤任务,例如:
生成介绍 → 翻译 → 格式化
用户问题 → 检索 → LLM 回答
- 总结 Agents —— 智能代理
Agent 是 LangChain 最强大的功能,它让 AI 不再局限于对话,而是能 自主调用工具 来完成任务。
常见的应用场景包括:
判断是否需要调用外部 API
是否需要搜索数据库
是否要进行数学计算
是否需要多轮推理
package main
import (
"context"
"fmt"
"github.com/tmc/langchaingo/agents"
"github.com/tmc/langchaingo/chains"
"github.com/tmc/langchaingo/llms/openai"
"github.com/tmc/langchaingo/tools"
"github.com/tmc/langchaingo/tools/serpapi"
"log"
)
var (
apiKey = "sk-xxxxxxxxxxxxxxxxxxxx"
url = "https://poloai.top/v1"
serpapiKey = "xxxxx"
)
func handlePanic(err error) {
if err != nil {
log.Fatal(err)
}
}
func main() {
ctx := context.Background()
llm, err := openai.New(openai.WithToken(apiKey), openai.WithBaseURL(url))
handlePanic(err)
// 定义工具
tool, err := serpapi.New(serpapi.WithAPIKey(serpapiKey))
handlePanic(err)
// 定义计算
calculator := new(tools.Calculator)
t := []tools.Tool{tool, calculator}
executor := agents.NewExecutor(agents.NewOneShotAgent(llm, t))
run, err := chains.Run(ctx, executor, "贵州数擎科技有限公司")
handlePanic(err)
fmt.Println(run)
}
在这个例子中:
-
定义了 SerpAPI(搜索引擎)工具和 Calculator(计算器)工具。
-
Agent 根据问题内容,自动决定是否调用工具。
-
最终得到更精准的结果,而不是纯粹的“猜测”。
总结
通过以上五个部分,我们完整体验了 LangChainGo 的 四大核心功能: LLMs —— 统一调用大模型。
Prompts —— 提示词模板化。
Chains —— 把多个步骤组合成流水线。
Agents —— 让 AI 主动使用工具,成为真正的“智能体”。
如果你是 Golang 开发者,想进入 AI 应用开发领域,LangChainGo 提供了一个非常适合的工程化选择:
高性能适合微服务和云原生工程实践友好 未来你可以基于此快速搭建 智能客服、知识库问答、搜索增强生成(RAG) 等应用,真正实现从 入门到精通。