想用 Go 语言开发大模型应用却找不到好用的框架?本文深度解析 LangChainGo,手把手教你快速上手,涵盖 RAG、智能体等核心场景,助你轻松跨入 AI 开发大门!

在人工智能大行其道的今天,提到 LLM(大语言模型)应用开发,很多人脑海中浮现的第一反应就是 Python 。确实,Python 拥有得天独厚的生态。但随着 AI 应用进入"工程化"下半场,开发者们开始面临新的挑战:并发性能瓶颈、部署环境复杂、内存消耗大......
这时候,Go 语言的优势便凸显了出来。其天生的并发处理能力(Goroutines)、极低的资源占用以及单二进制文件部署的便捷性,使其成为构建生产级微服务架构的最佳选择。
那么,有没有一种方案,既能拥有 LangChain 那样强大的编排能力,又能享受 Go 语言的高性能?
答案就是:langchaingo。
什么是 langchaingo?
langchaingo (项目地址:https://github.com/tmc/langchaingo)是 LangChain 框架在 Go 语言环境下的社区实现。它并非简单的代码翻译,而是深度结合了 Go 语言的特性(如 Context、Interfaces 和 Concurrency),为开发者提供了一套标准化的工具集。
通过 langchaingo,你可以轻松实现:
- 模型抽象:统一调用 OpenAI、Google Gemini、Anthropic、Ollama(本地模型)等。
- 提示词管理:灵活定制 Prompt Template。
- 链式调用(Chains) :将多个 LLM 任务串联。
- 检索增强生成(RAG) :连接向量数据库,实现基于私有知识库的问答。
- 智能代理(Agents) :让 AI 拥有"手和脚",学会调用外部 API。
快速上手
准备好你的 Go 环境,我们直接进入实战。
1. 安装依赖
bash
go get github.com/tmc/langchaingo
2. 基础调用示例(OpenAI)
只需几行代码,即可实现与大模型的对话。请确保你已设置环境变量 OPENAI_API_KEY。
go
package main
import (
"context"
"fmt"
"log"
"github.com/tmc/langchaingo/llms"
"github.com/tmc/langchaingo/llms/openai"
)
func main() {
ctx := context.Background()
// 初始化模型
llm, err := openai.New(
openai.WithBaseURL("https://api.deepseek.com/v1"),
openai.WithModel("deepseek-chat"),
)
if err != nil {
log.Fatal(err)
}
// 发起提问
prompt := "请用一句话介绍 Go 语言的优势。"
completion, err := llm.Call(ctx, prompt,
llms.WithTemperature(0.7),
)
if err != nil {
log.Fatal(err)
}
fmt.Println("AI 回复:", completion) // AI 回复: Go 语言以简洁的语法、高效的并发模型和出色的性能,成为构建高并发、分布式系统的理想选择。
}
3. 使用 Ollama 运行本地模型
不想花钱买 API?langchaingo 对 Ollama 的支持非常完美,让你在本地也能跑 AI。
go
llm, err := ollama.New(ollama.WithModel("llama3"))
// 剩下的代码与上面一致,无缝切换!
核心组件深度解析
要写出复杂的 AI 应用,只懂 Call 是不够的。我们需要深入 langchaingo 的骨架。
1. 提示词模板(Prompts)
在生产中,我们很少直接拼接字符串。langchaingo 提供了 prompts 包,支持变量替换:
go
template := "你是一个专业的{{.role}}。请解释什么是{{.subject}}。"
prompt := prompts.NewPromptTemplate(template, []string{"role", "subject"})
finalPrompt, _ := prompt.Format(map[string]any{
"role": "资深后端工程师",
"subject": "协程泄漏",
})
2. 文档加载与分块(Document Loaders & Splitters)
RAG 的核心是将长文章拆解。langchaingo 支持 PDF、Text、HTML 等格式加载,并提供 textsplitter 递归地按字符或 Token 进行拆分,确保每一块信息都能被模型精准消化。
go
package main
import (
"context"
"fmt"
"log"
"os"
"github.com/tmc/langchaingo/documentloaders"
"github.com/tmc/langchaingo/textsplitter"
)
func main() {
ctx := context.Background()
file, err := os.Open("knowledge.txt")
if err != nil {
log.Fatal("无法打开文件:", err)
}
defer file.Close()
// 文档加载,也可以使用 NewHTML, NewPDF 等
loader := documentloaders.NewText(file)
// 初始化分块器
splitter := textsplitter.NewRecursiveCharacter(
textsplitter.WithChunkSize(500), // 每个分块的最大字符数
textsplitter.WithChunkOverlap(50), // 相邻分块重叠的字符数,保证上下文连贯
)
// 加载并分块,docs 中的内容后面可用于嵌入向量数据库
docs, err := loader.LoadAndSplit(ctx, splitter)
if err != nil {
log.Fatal("文档分块失败:", err)
}
fmt.Printf("分块后的文档数量: %d\n", len(docs))
}
3. 向量数据库(Vector Stores)
这是 AI 的"长期记忆"。langchaingo 支持多种主流数据库:
- Milvus / Pinecone:云原生大规模向量检索。
- Chroma / Weaviate:开源热门选择。
- Postgres (pgvector) :老牌数据库的 AI 升级版。
常用案例展示
案例一:RAG 企业级私有知识库问答
这是目前 langchaingo 最火的使用场景。流程如下:
- 读取:加载公司的 PDF 文档。
- 切片:将文档切成 500 字的小块。
- 嵌入(Embedding) :将文字转为向量数字。
- 存储:存入向量数据库。
- 检索:用户提问时,先从数据库找最相关的片段,再交给 LLM 总结。
代码片段:
go
// 简单的检索流程
result, err := chains.Run(ctx,
retrievalQAChain,
"根据文档,公司的年假政策是什么?",
)
案例二:智能 API 代理(Agent & Tools)
想让 AI 帮你查询天气或者查数据库?你需要定义 Tools。
go
package main
import (
"context"
"fmt"
"github.com/tmc/langchaingo/agents"
"github.com/tmc/langchaingo/chains"
"github.com/tmc/langchaingo/tools"
"log"
"github.com/tmc/langchaingo/llms/openai"
)
type WeatherTool struct{}
func (w *WeatherTool) Name() string {
return "get_weather"
}
func (w *WeatherTool) Description() string {
return "根据城市名获取天气"
}
func (w *WeatherTool) Call(ctx context.Context, input string) (string, error) {
// 调用实际天气查询服务
return input + ":26.5度,晴天", nil
}
func main() {
ctx := context.Background()
// 初始化模型
llm, err := openai.New(
openai.WithBaseURL("https://api.deepseek.com/v1"),
openai.WithModel("deepseek-chat"),
)
if err != nil {
log.Fatal(err)
}
// 创建智能体
agent := agents.NewOpenAIFunctionsAgent(llm, []tools.Tool{&WeatherTool{}})
executor := agents.NewExecutor(agent)
res, _ := chains.Run(ctx, executor, "成都今天冷吗?")
fmt.Println("AI 回复:", res) // AI 回复: 根据天气预报,成都今天气温26.5度,晴天。这个温度不算冷,属于比较舒适的温度。
}
Agent 会根据用户的问题"成都今天冷吗?"自动判断是否需要调用 WeatherTool 中的 Call 函数。
为什么选择 Go 而非 Python?
虽然 Python 库更多,但在以下场景下,langchaingo + Go 简直是降维打击:
-
高并发 API 服务:
在处理数千个并发对话请求时,Go 的内存占用极低。Python 的多进程/多线程模型在处理 I/O 密集型任务时,往往需要更复杂的配置和更多的服务器资源。
-
云原生兼容性:
Go 编译后的程序非常小,非常适合放入 Docker 镜像中,在 Kubernetes 集群里快速扩缩容。
-
类型安全:
在大规模重构 AI 逻辑时,Go 的静态类型检查能帮你规避掉 80% 的低级错误。
-
边缘计算:
如果你需要在嵌入式设备或私有化轻量级网关上跑 AI 逻辑,Go 是不二之选。
结语
langchaingo 正在迅速成熟,它弥补了 Go 语言在 AI 编排领域的空白。无论你是想做一款 AI 驱动的 SaaS 产品,还是想为现有的微服务增加智能化能力,langchaingo 都是一个稳健、高效的选择。