想用 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. 安装依赖
1go get github.com/tmc/langchaingo 2
2. 基础调用示例(OpenAI)
只需几行代码,即可实现与大模型的对话。请确保你已设置环境变量 OPENAI_API_KEY。
1package main 2 3import ( 4 "context" 5 "fmt" 6 "log" 7 8 "github.com/tmc/langchaingo/llms" 9 "github.com/tmc/langchaingo/llms/openai" 10) 11 12func main() { 13 ctx := context.Background() 14 15 // 初始化模型 16 llm, err := openai.New( 17 openai.WithBaseURL("https://api.deepseek.com/v1"), 18 openai.WithModel("deepseek-chat"), 19 ) 20 if err != nil { 21 log.Fatal(err) 22 } 23 24 // 发起提问 25 prompt := "请用一句话介绍 Go 语言的优势。" 26 completion, err := llm.Call(ctx, prompt, 27 llms.WithTemperature(0.7), 28 ) 29 if err != nil { 30 log.Fatal(err) 31 } 32 33 fmt.Println("AI 回复:", completion) // AI 回复: Go 语言以简洁的语法、高效的并发模型和出色的性能,成为构建高并发、分布式系统的理想选择。 34} 35
3. 使用 Ollama 运行本地模型
不想花钱买 API?langchaingo 对 Ollama 的支持非常完美,让你在本地也能跑 AI。
1llm, err := ollama.New(ollama.WithModel("llama3")) 2// 剩下的代码与上面一致,无缝切换! 3
核心组件深度解析
要写出复杂的 AI 应用,只懂 Call 是不够的。我们需要深入 langchaingo 的骨架。
1. 提示词模板(Prompts)
在生产中,我们很少直接拼接字符串。langchaingo 提供了 prompts 包,支持变量替换:
1template := "你是一个专业的{{.role}}。请解释什么是{{.subject}}。" 2prompt := prompts.NewPromptTemplate(template, []string{"role", "subject"}) 3finalPrompt, _ := prompt.Format(map[string]any{ 4 "role": "资深后端工程师", 5 "subject": "协程泄漏", 6}) 7
2. 文档加载与分块(Document Loaders & Splitters)
RAG 的核心是将长文章拆解。langchaingo 支持 PDF、Text、HTML 等格式加载,并提供 textsplitter 递归地按字符或 Token 进行拆分,确保每一块信息都能被模型精准消化。
1package main 2 3import ( 4 "context" 5 "fmt" 6 "log" 7 "os" 8 9 "github.com/tmc/langchaingo/documentloaders" 10 "github.com/tmc/langchaingo/textsplitter" 11) 12 13func main() { 14 ctx := context.Background() 15 16 file, err := os.Open("knowledge.txt") 17 if err != nil { 18 log.Fatal("无法打开文件:", err) 19 } 20 defer file.Close() 21 22 // 文档加载,也可以使用 NewHTML, NewPDF 等 23 loader := documentloaders.NewText(file) 24 25 // 初始化分块器 26 splitter := textsplitter.NewRecursiveCharacter( 27 textsplitter.WithChunkSize(500), // 每个分块的最大字符数 28 textsplitter.WithChunkOverlap(50), // 相邻分块重叠的字符数,保证上下文连贯 29 ) 30 31 // 加载并分块,docs 中的内容后面可用于嵌入向量数据库 32 docs, err := loader.LoadAndSplit(ctx, splitter) 33 if err != nil { 34 log.Fatal("文档分块失败:", err) 35 } 36 fmt.Printf("分块后的文档数量: %d\n", len(docs)) 37} 38
3. 向量数据库(Vector Stores)
这是 AI 的“长期记忆”。langchaingo 支持多种主流数据库:
- Milvus / Pinecone:云原生大规模向量检索。
- Chroma / Weaviate:开源热门选择。
- Postgres (pgvector) :老牌数据库的 AI 升级版。
常用案例展示
案例一:RAG 企业级私有知识库问答
这是目前 langchaingo 最火的使用场景。流程如下:
- 读取:加载公司的 PDF 文档。
- 切片:将文档切成 500 字的小块。
- 嵌入(Embedding) :将文字转为向量数字。
- 存储:存入向量数据库。
- 检索:用户提问时,先从数据库找最相关的片段,再交给 LLM 总结。
代码片段:
1// 简单的检索流程 2result, err := chains.Run(ctx, 3 retrievalQAChain, 4 "根据文档,公司的年假政策是什么?", 5) 6
案例二:智能 API 代理(Agent & Tools)
想让 AI 帮你查询天气或者查数据库?你需要定义 Tools。
1package main 2 3import ( 4 "context" 5 "fmt" 6 "github.com/tmc/langchaingo/agents" 7 "github.com/tmc/langchaingo/chains" 8 "github.com/tmc/langchaingo/tools" 9 "log" 10 11 "github.com/tmc/langchaingo/llms/openai" 12) 13 14type WeatherTool struct{} 15 16func (w *WeatherTool) Name() string { 17 return "get_weather" 18} 19 20func (w *WeatherTool) Description() string { 21 return "根据城市名获取天气" 22} 23 24func (w *WeatherTool) Call(ctx context.Context, input string) (string, error) { 25 // 调用实际天气查询服务 26 return input + ":26.5度,晴天", nil 27} 28 29func main() { 30 ctx := context.Background() 31 32 // 初始化模型 33 llm, err := openai.New( 34 openai.WithBaseURL("https://api.deepseek.com/v1"), 35 openai.WithModel("deepseek-chat"), 36 ) 37 if err != nil { 38 log.Fatal(err) 39 } 40 41 // 创建智能体 42 agent := agents.NewOpenAIFunctionsAgent(llm, []tools.Tool{&WeatherTool{}}) 43 executor := agents.NewExecutor(agent) 44 45 res, _ := chains.Run(ctx, executor, "成都今天冷吗?") 46 fmt.Println("AI 回复:", res) // AI 回复: 根据天气预报,成都今天气温26.5度,晴天。这个温度不算冷,属于比较舒适的温度。 47} 48
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 都是一个稳健、高效的选择。
《告别 Python 依赖!用 LangChainGo 打造高性能大模型应用,Go 程序员必看!》 是转载文章,点击查看原文。