想用 Go 语言开发大模型应用却找不到好用的框架?本文深度解析 LangChainGo,手把手教你快速上手,涵盖 RAG、智能体等核心场景,助你轻松跨入 AI 开发大门!
在人工智能大行其道的今天,提到 LLM(大语言模型)应用开发,很多人脑海中浮现的第一反应就是 Python 。确实,Python 拥有得天独厚的生态。但随着 AI 应用进入“工程化”下半场,开发者们开始面临新的挑战: 并发性能瓶颈、部署环境复杂、内存消耗大…
这时候, Go 语言 的优势便凸显了出来。其天生的并发处理能力(Goroutines)、极低的资源占用以及单二进制文件部署的便捷性,使其成为构建生产级微服务架构的最佳选择。
那么,有没有一种方案,既能拥有 LangChain 那样强大的编排能力,又能享受 Go 语言的高性能?
答案就是: langchaingo 。
langchaingo
(项目地址:
https://github.com/tmc/langchaingo
)是 LangChain 框架在 Go 语言环境下的社区实现。它并非简单的代码翻译,而是深度结合了 Go 语言的特性(如
Context
、
Interfaces
和
Concurrency
),为开发者提供了一套标准化的工具集。
通过 langchaingo,你可以轻松实现:
准备好你的 Go 环境,我们直接进入实战。
go get github.com/tmc/langchaingo
只需几行代码,即可实现与大模型的对话。请确保你已设置环境变量
OPENAI_API_KEY
。
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 语言以简洁的语法、高效的并发模型和出色的性能,成为构建高并发、分布式系统的理想选择。
}
不想花钱买 API?langchaingo 对 Ollama 的支持非常完美,让你在本地也能跑 AI。
llm, err := ollama.New(ollama.WithModel("llama3"))
// 剩下的代码与上面一致,无缝切换!
要写出复杂的 AI 应用,只懂
Call
是不够的。我们需要深入 langchaingo 的骨架。
在生产中,我们很少直接拼接字符串。langchaingo 提供了
prompts
包,支持变量替换:
template := "你是一个专业的{{.role}}。请解释什么是{{.subject}}。"
prompt := prompts.NewPromptTemplate(template, []string{"role", "subject"})
finalPrompt, _ := prompt.Format(map[string]any{
"role": "资深后端工程师",
"subject": "协程泄漏",
})
RAG 的核心是将长文章拆解。langchaingo 支持 PDF、Text、HTML 等格式加载,并提供
textsplitter
递归地按字符或 Token 进行拆分,确保每一块信息都能被模型精准消化。
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))
}
这是 AI 的“长期记忆”。langchaingo 支持多种主流数据库:
这是目前 langchaingo 最火的使用场景。流程如下:
代码片段:
// 简单的检索流程
result, err := chains.Run(ctx,
retrievalQAChain,
"根据文档,公司的年假政策是什么?",
)
想让 AI 帮你查询天气或者查数据库?你需要定义 Tools 。
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
函数。
虽然 Python 库更多,但在以下场景下, langchaingo + Go 简直是降维打击:
高并发 API 服务 :
在处理数千个并发对话请求时,Go 的内存占用极低。Python 的多进程/多线程模型在处理 I/O 密集型任务时,往往需要更复杂的配置和更多的服务器资源。
云原生兼容性 :
Go 编译后的程序非常小,非常适合放入 Docker 镜像中,在 Kubernetes 集群里快速扩缩容。
类型安全 :
在大规模重构 AI 逻辑时,Go 的静态类型检查能帮你规避掉 80% 的低级错误。
边缘计算 :
如果你需要在嵌入式设备或私有化轻量级网关上跑 AI 逻辑,Go 是不二之选。
langchaingo 正在迅速成熟,它弥补了 Go 语言在 AI 编排领域的空白。无论你是想做一款 AI 驱动的 SaaS 产品,还是想为现有的微服务增加智能化能力,langchaingo 都是一个稳健、高效的选择。