langchaingo
tmc/langchaingo加载项目详情…
本应用为开源项目,仅供学习研究,请遵守其开源协议。
加载项目详情…
本应用为开源项目,仅供学习研究,请遵守其开源协议。
想象一下这样一支团队:后端服务全部用 Go 编写,运维体系是 Kubernetes,需要在三个月内上线一个"公司内部知识库问答"系统。团队里有 Python 专家,但没有 Python 运维经验;产品经理问的是"能不能像 LangChain 那样,几行代码就拼出一个 RAG"。
这就是 LangChainGo(tmc/langchaingo)存在的理由。它不是又一个"AI 框架",而是把 LangChain 那套可组合的 LLM 应用拼装思路,原封不动地搬进了 Go 生态:接口定义、链式组合、记忆、工具、Agent、向量库接入,全套齐活。
截至目前,这个项目在 GitHub 上已积累 9750 星标、1162 个 Fork,采用 MIT 协议,主语言 Go,最新提交还在持续。

图:LangChainGo 的"鹦鹉"图标,致敬 LangChain 的吉祥物形象
LangChain 在 2022 年底引爆了 LLM 应用开发,Python 生态随即长出大量基于它的框架。但 Go 生态长期缺位——Go 团队擅长高并发服务、静态编译和单二进制部署,却缺少一个"像模像样"的 LLM 组合层。
2023 年 2 月,tmc(Go 语言社区知名贡献者)启动了 langchaingo,定位一句话说清:"LangChain for Go, the easiest way to write LLM-based programs in Go"。这个定位精准命中了空白市场,随后项目从个人主导逐渐走向社区化——README 里明确提到"正在把开发从个人项目转向社区协作",并开设了 Discord 社区。
有意思的是,Python 侧的 LangChain 后来自己也承认了原版架构的复杂度问题,并在 0.3 之后全面转向 LCEL 表达式范式。而 langchaingo 保留了早期的接口式 + 组合式设计,虽然显得"笨重",但对 Go 开发者反而友好:一切都藏在 Go 的 interface 里,读起来就是熟悉的 Go 代码。
如果 LangChain 是一套乐高积木,那么 LangChainGo 就是一个乐高零件店,而且是那种"零件型号全、说明书厚、但每一块都严丝合缝"的店。
Model 接口下。最关键的设计是 llms.Model 接口。所有厂商差异被收敛到 functional options(WithTemperature、WithMaxTokens、WithTools、WithThinkingEffort、WithWebSearch 等),业务代码换模型只需改一行构造代码。流式输出通过 GenerateContentStream 统一暴露,多模态通过 ContentPart(文本/图片)承载,函数调用通过 llms.Tool 声明。
文档加载(documentloaders/)支持 PDF、Markdown、HTML、CSV 等格式,文本切分(textsplitter/)支持递归分割与语言感知分割,向量化走 embeddings/,检索落 vectorstores/。官方文档给出的最小 RAG 示例只有十几行:
chain := chains.NewRetrievalQAFromLLM(llm, vectorstores.ToRetriever(store, 3))
answer, err := chains.Run(ctx, chain, "What is the capital of France?")

图:官方文档中展示的向量库与可观测性集成(Databerry)
agents/ 提供了 MRKL、Conversational、Structured Chat 等多种 Agent 类型,配合 tools/ 形成自主执行闭环。工具定义统一为 Tool 接口,声明式传入即可,Agent 会自行决定调用顺序。
这一点常被低估,却恰恰是 Go 生态最在意的:
context.Context,天然支持取消与超时llms.IsAuthenticationError、llms.IsRateLimitError 可精准区分llms/openai 就不会拉进 Chroma 的依赖,构建依然轻量仓库含 680 个 Go 源文件、234 个测试文件(测试占比约 34%),并自研 internal/httprr 做 HTTP 录制/回放,让 LLM 交互测试可确定性复现。文档站基于 Docusaurus,配置了 golangci-lint 双套规则与 Dependabot 自动依赖升级。
这是一个纯库项目,没有 Web UI,也不提供开箱即用的 CLI 服务。
| 维度 | 实际情况 |
|---|---|
| Web UI | 无 |
| 独立部署 | 无需部署,作为 Go module 引入即可 |
| 集成方式 | go get github.com/tmc/langchaingo + import |
| 环境要求 | Go 1.24+(go.mod 声明 go 1.26.0,toolchain go1.26.10) |
| 外部依赖 | 各厂商 API Key;用 Ollama 可完全本地化;用向量库需自备实例 |
| 典型场景 | 作为现有 Go 微服务的一个依赖模块编译进二进制 |
代码示例(官方 README):
llm, err := openai.New()
completion, err := llms.GenerateFromSinglePrompt(ctx, llm, prompt)
对 Go 团队而言,最短路径是:新建 module → go get → 配好 OPENAI_API_KEY 环境变量 → 复制 examples/ 目录里对应场景的代码跑通。
API 不稳定,破坏性变更频繁。项目至今版本号仍在 v0.1.x,意味着随时可能有 breaking change。v0.1.15 的发布说明就明确写道:llms.ThinkingConfig、llms.ContentChoice 等结构体新增了字段,未命名字面量(unkeyed literals)将无法编译,必须改用带键名写法。对于生产项目,这是实打实的维护成本。
默认模型切换带来的迁移陷阱。同一个 release 中,Google 默认嵌入模型从 text-embedding-004 换成 gemini-embedding-001,向量维度从旧值变为 3072,老索引必须全部重新嵌入,固定维度的向量列也要改结构。这类"沉默的兼容性破坏"对 RAG 场景杀伤力很大。
上游 Python 生态的版本滞后。LangChain 的能力演进很快(LCEL、LangGraph、深度集成等),langchaingo 的组合式设计并未完全跟上,某些新特性需要 Go 开发者自行实现。
Open Issues 数量偏高。当前仓库有 430 个未关闭 Issue,对于一个 9700 星的项目来说,积压比例不小,说明维护者精力有限、社区响应节奏偏慢。
项目归属仍偏个人。虽然 README 呼吁社区化并开放 Discord,但核心提交仍集中在少数维护者手中,长期看存在 bus factor 风险。
多 Agent 编排能力弱于 Python 侧。Python 版有 LangGraph 这样的图编排框架,Go 版目前主要停留在"单 Agent + 工具"层面,复杂工作流的编排需要手写。
LangChainGo 填补了 Go 生态在 LLM 应用开发上的最后一块拼图。它的意义不在于技术有多惊艳,而在于降低了 Go 团队进入 LLM 应用的迁移成本——不必为了用 LangChain 而把微服务拆出一块 Python 孤岛。
从数据看,这个项目 2023 年 2 月立项,到今天 9750 星、1600+ 贡献者、17 种 LLM 供应商、16 种向量库、8 种工具接入,说明"多模型统一接口 + 组合式架构"这套设计经受住了三年多的时间检验,也侧面验证了 LangChain 抽象层本身的价值。
对国内团队尤其有现实意义:Go 是微服务和云原生基础设施的主力语言之一,一个支持 Ollama 本地部署、支持 DashScope/通义系模型接入、也能无缝对接自建 PGVector/Milvus 的 LLM 组合层,在私有化部署场景里是相当实用的选择。
go get 之后直接跑 examples/ 里的 hello world,配好 Key 即可examples/pgvector-vectorstore-example,它自带 docker-compose.yml 和 postgres.Dockerfile,是最接近生产可用的参考实现llms/ollama + vectorstores/pgvector 组合可做到全栈本地callbacks/ 包提供了回调钩子,可接入 Databerry 等第三方许可证:MIT | 语言:Go | Star:9750 | Fork:1162 | 贡献者:160+