langchain-rust:把 LangChain 的抽象搬进 Rust 之后,哪些部分真的能落地
🦜️🔗LangChain for Rust, the easiest way to write LLM-based programs in Rust
秒懂
- 它是什么?
- 这是 Abraxas-365 维护的 LangChain Rust 实现,MIT 许可,覆盖 LLM、Embedding、向量库、Chain、Agent 和多种文档加载器。本文只依据仓库 README 与发布记录,梳理它的实际机制、接入方式、边界条件,以及什么时候它并不是合适的选择。
- 适合谁用?
- 如果你已经在写 Rust 服务,需要在进程内直接调用 OpenAI、Azure OpenAI、Ollama 或 Anthropic,并且希望把向量检索和对话链路放在同一个二进制里,langchain-rust 的覆盖面是够用的,MIT 许可也便于商用集成。反过来,如果你的团队主要写 Python,或者需要 LangChain 生态里那些只在 Python 侧存在的集成和回调机制,为了这个库把技术栈换成 Rust 不划算。
- 能商用吗?
- 可以。MIT 是宽松许可证:你可以使用、修改并销售基于它的软件,只需保留版权和许可证声明。
- 还在维护吗?
- 在维护。仓库最近一次提交在 7 天前。
- 用什么语言写的?
- 主要是 Rust(依据 GitHub 的语言统计)。
以上回答依据项目的 GitHub 数据(最近同步于 2026年9月15日)和我们的分析,不构成法律意见。
开源项目深度解析
这个库要解决的是 Rust 里的编排问题,不是模型问题
Rust 生态里调用 LLM 的 HTTP 客户端从来不缺。缺的是把提示词模板、模型调用、向量检索、对话历史串成一条流水线的中间层。langchain-rust 补的就是这一层:README 把它定位为「the Rust language implementation of LangChain」,目标读者是已经决定用 Rust 写应用、又不想自己从零拼装这些组件的工程师。它不训练模型,不托管向量数据库,也不替你做提示词工程,它提供的是类型化的抽象,让你用 Rust 的类型系统去描述一次问答或者一次检索增强生成。对于把 LLM 能力嵌进已有 Rust 后端(比如网关、任务队列、CLI 工具)的场景,这个定位是清晰的。
从 Provider 到 Chain:数据在库内部是怎么流动的
README 的功能清单其实勾勒出了一条数据流。最底层是 LLM 与 Embeddings,两者都按 provider 分别实现,LLM 侧列出 OpenAI、Azure OpenAI、Ollama、Anthropic Claude,Embeddings 侧列出 OpenAI、Azure OpenAI、Ollama、本地 FastEmbed 和 MistralAI。往上一层是 VectorStores,列出 OpenSearch、Postgres、Qdrant、Sqlite 和 SurrealDB。再往上是 Chain,包括 LLM Chain、Conversational Chain、Conversational Retriever Simple、带向量库的 Conversational Retriever、Sequential Chain、Q&A Chain 和 SQL Chain。最上面是 Agents,目前有带工具的 Chat Agent 和 OpenAI 兼容的工具 Agent。文档加载器作为旁路输入,把 PDF、Pandoc、HTML、HTML 转 Markdown、CSV、Git commits 等来源转换成文档对象,喂给向量库或者直接喂给 Chain。这条链路里,Embeddings 负责把文本变成向量,VectorStore 负责存取,Retriever 负责召回,Chain 负责把召回结果和用户问题拼成最终提示词。理解这条分工,比记住清单里有多少个勾选框更有用,因为它决定了你换 provider 时改动的范围:换模型只动 LLM 层,换向量库只动 VectorStore 层。
接入方式:Cargo 依赖加环境变量,示例即文档
README 没有给出完整的安装章节,但从 crates.io 徽章和示例文件名可以确定分发方式:作为 crate 引入,包名 langchain-rust。真正的用法说明分散在 examples 目录里,README 对每一类能力都直接链到一个 .rs 文件,比如 llm_openai.rs、llm_ollama.rs、vector_store_qdrant.rs、conversational_retriever_chain_with_vector_store.rs、open_ai_tools_agent.rs。文档加载器部分则直接内嵌了代码,可以看到构造模式:PdfExtractLoader::from_path(path) 返回 Result,load() 是异步的,返回一个流,需要配合 futures_util::StreamExt 的 map 和 collect 消费,例如 loader.load().await.unwrap().map(|d| d.unwrap()).collect::<Vec<_>>().await。CsvLoader::from_path 额外接收一个列名 Vec<String>,HtmlToMarkdownLoader 则接收路径、基准 Url 和一个 HtmlToMarkdownOptions,后者提供 with_skip_tags 之类的配置项,README 的例子跳过了 figure 标签。这种「构造函数加 from_path、load 返回 Stream」的形态在多个加载器上是一致的,说明库内部对文档加载做了统一抽象。至于 API key 和 endpoint 怎么传,README 正文没有写,需要看对应示例文件,这一点在评估阶段要有心理准备。
Provider 覆盖是有偏向的,选型前先对照清单
支持列表看起来很长,但它对供应商的选择有明显偏好。LLM 层只有四家,国内常用的模型服务不在其中;Embeddings 层五家,其中 FastEmbed 是本地推理,不需要外部服务,这对离线或数据不出网的场景是一个实际选项。向量库层五家,Postgres 和 Sqlite 属于你很可能已经在用的存储,Qdrant 和 OpenSearch 是专门的检索系统,SurrealDB 相对小众。这里没有出现内存向量库或者纯文件方案,意味着做原型时也得先起一个真实的存储服务,除非你走 Sqlite 路线。另外,清单只说明「有对应实现」,不说明各 provider 支持哪些参数、是否支持流式输出、是否支持函数调用。这些差异只能逐个读示例文件确认,README 层面无法回答。把这份清单当成筛选的起点而不是结论,能省掉后面返工的时间。
Agent 与工具:能力存在,但边界由 README 之外的东西决定
工具部分列出了 Serpapi/Google、DuckDuckGo Search、Wolfram/Math、命令行以及 Text2Speech,Agent 部分有 Chat Agent with Tools 和 OpenAI 兼容工具 Agent。命令行工具值得单独提一句:它把一个能执行系统命令的能力交给了模型来决定调用,这在受控环境里是效率,在暴露给外部输入的服务里就是风险面。README 只列出工具存在,没有描述权限控制、超时、沙箱或者确认机制。如果你打算在生产里用命令行工具或者 Agent 循环,这些缺失的约束需要你自己在调用侧补上,而不是指望库来兜底。同样,Agent 的执行轮次上限、失败重试策略在 README 中都没有提及,属于需要读源码确认的部分。
版本节奏与维护成本:发布记录和 README 对不上
这里有一个需要直说的矛盾。仓库的最近发布记录显示 v4.6.0 与 v4.5.0 都在 2024-10-06 发布,v4.4.2 在 2024-09-10,三个版本集中在两个月内;而仓库的 last push 时间是 2026-09-08。发布标签与提交时间之间存在很长的时间差,README 里也没有变更日志、迁移指南或者版本兼容性说明。对一个已经到 4.x 的库来说,缺少迁移文档意味着跨小版本升级时你需要自己读 diff。这不是致命问题,但会改变你的依赖策略:把版本号锁死,升级时留出验证时间,比跟着最新版走更稳妥。另外,README 没有提到 MSRV(最低支持的 Rust 版本),也没有说明各 provider 对应的 API 版本,这两项在 CI 里应该由你自己固定。
许可与替代方案:MIT 之外的取舍
许可证是 MIT,这是最宽松的一类,允许修改、分发和商用,只需要保留版权声明和许可文本。对于要嵌进闭源产品的团队,这个许可不会带来额外义务。需要注意的是,MIT 只覆盖这个库本身,你通过它调用的模型服务、向量数据库、Wolfram 之类的工具各有各的条款,把这些混在一起讨论许可是不对的。至于替代方案,最直接的对比对象是 Python 版 LangChain:两者的抽象层次接近,Chain、Retriever、Agent 这些概念基本对应,差别在于 Python 版的集成数量和周边工具更多,而 langchain-rust 让你把整条链路编译进一个静态二进制,部署时不需要 Python 运行时和虚拟环境。如果你的服务已经是 Rust,引入 Python 侧方案通常意味着多一个进程、多一层 IPC 和一套额外的部署依赖;如果你的服务本来就是 Python,那这个库的唯一价值就是性能,而 README 没有提供任何性能数据来支撑这个理由。
编辑结论
如果你已经在写 Rust 服务,需要在进程内直接调用 OpenAI、Azure OpenAI、Ollama 或 Anthropic,并且希望把向量检索和对话链路放在同一个二进制里,langchain-rust 的覆盖面是够用的,MIT 许可也便于商用集成。反过来,如果你的团队主要写 Python,或者需要 LangChain 生态里那些只在 Python 侧存在的集成和回调机制,为了这个库把技术栈换成 Rust 不划算。动手之前先确认三件事:你的模型供应商是否出现在 README 的支持列表里,你要用的向量库是否在其中(Postgres、Qdrant、Sqlite、OpenSearch、SurrealDB 已列出,其他没有),以及你的 Rust 工具链能否编译当前版本。README 没有给出 MSRV,也没有给出各 provider 的 API 版本对应关系,这两点需要你自己在本地验证。
社区笔记