Rust 实现 LangChain
用 Rust 实现 LangChain:langchainrust 框架介绍
前言
在大语言模型(LLM)应用开发领域,LangChain 已经成为 Python 生态中最流行的框架之一。但对于追求高性能和内存安全的开发者来说,Rust 语言的魅力不言而喻。今天给大家介绍一个用 Rust 实现的 LangChain 风格框架——langchainrust,它提供了构建 LLM 应用所需的核心组件,同时保持了 Rust 语言的零成本抽象和内存安全特性。
GitHub 地址:https://github.com/atliliw/langchainrust
项目背景
随着 ChatGPT、Claude 等大语言模型的普及,越来越多的开发者需要在自己的应用中集成 LLM 能力。LangChain 提供了一套优雅的抽象,包括提示词模板、链式调用、Agent、工具调用等概念,大大简化了 LLM 应用的开发。
langchainrust 的目标是把这些优秀的抽象带到 Rust 生态中,让 Rust 开发者也能享受到便捷的 LLM 应用开发体验。无论是构建智能对话系统、知识库问答,还是自动化工具调用,langchainrust 都能提供强有力的支持。
核心特性
1. LLM 支持
框架提供了统一的 LLM 抽象接口,目前支持:
- OpenAI 兼容接口:支持所有 OpenAI 兼容的 API(包括各种代理服务)
- Qwen(通义千问):阿里云的大语言模型
- 模型路由:根据问题难度自动选择合适的模型,优化成本和性能
模型路由是一个很实用的功能。你可以配置多个模型,每个模型设置一个系数(1-10),系统会根据问题的复杂度自动选择最合适的模型。简单问题用便宜的模型,复杂问题才用强大的模型,有效控制 API 调用成本。
use langchainrust::llms::{LLM, OpenAIConfig, ModelConfig};
let models = vec![
ModelConfig::OpenAI(OpenAIConfig {
model: "gpt-3.5-turbo".to_string(),
factor: 1, // 便宜、快速
..
}),
ModelConfig::OpenAI(OpenAIConfig {
model: "gpt-4".to_string(),
factor: 8, // 强大、昂贵
..
}),
];
2. Agent 与工具调用
Agent 是 langchainrust 的核心组件之一。ReActAgent 实现了 ReAct(Reasoning and Acting)范式,能够:
- 自动判断是否需要使用工具
- 解析工具调用指令并执行
- 支持多轮对话和记忆管理
- 可选的工具使用——LLM 自主决定
一个很大的亮点是工具调用的可选性。Agent 不是被动地必须使用工具,而是让 LLM 自己判断:如果直接回答更好,就直接回答;如果需要工具辅助,才调用工具。这更符合真实场景的需求。
use langchainrust::agent::{AgentExecutor, ReActAgent};
use langchainrust::tools::Calculator;
use std::sync::Arc;
let tools: Vec<Arc<dyn Tool>> = vec![Arc::new(Calculator)];
let agent = ReActAgent::new(llm, tools.clone(), None);
let executor = AgentExecutor::new(Box::new(agent), tools);
// LLM 会自己判断是否需要计算器
let result = executor.run("37 乘以 48 等于多少?").await?;
3. RAG 检索增强生成
RAG(Retrieval-Augmented Generation)是当前 LLM 应用最热门的技术之一。langchainrust 提供了完整的 RAG 组件:
- 文档分割:RecursiveCharacterSplitter、FixedSizeSplitter、RegexSplitter
- 向量存储:InMemoryVectorStore(可扩展支持其他向量数据库)
- 嵌入模型:可插拔的 EmbeddingModel 接口
- 检索器:SimilarityRetriever 支持带过滤条件的语义检索
RAG 的工作流程是:先将文档分割成小块,通过嵌入模型转换为向量存储到向量数据库。当用户提问时,系统会先从向量数据库中检索相关文档,然后将这些文档作为上下文提供给 LLM,让 LLM 基于检索到的内容生成答案。
use langchainrust::retrieval::{
Document, InMemoryVectorStore, RecursiveCharacterSplitter,
SimilarityRetriever, TextSplitter,
};
// 分割文档
let splitter = RecursiveCharacterSplitter::new(500, 50);
let chunks = splitter.split_document(&doc)?;
// 创建检索器
let retriever = SimilarityRetriever::new(vector_store, embedding_model);
retriever.add_documents(chunks).await?;
// 与 Agent 结合使用
let agent = ReActAgent::with_retriever(llm, tools, memory, retriever, 3);
4. 任务规划(Task Planning)
这是 langchainrust 的一个特色功能。对于复杂的任务,系统可以自动将其分解为多个子任务,依次执行,最后汇总结果。
比如用户问:“分析这个项目的代码质量,写测试用例,运行测试,生成报告”。系统会:
- 规划阶段:LLM 将问题分解为子任务
- 执行阶段:依次执行每个子任务(可依赖前一个任务的结果)
- 汇总阶段:将所有子任务结果整合为最终答案
use langchainrust::agent::{PlannedExecutor, ReActAgent};
let executor = PlannedExecutor::new(llm, agent, tools)
.with_max_sub_tasks(5) // 最多 5 个子任务
.with_verbose(true); // 打印执行过程
let result = executor
.run("调研 Rust 异步编程最佳实践,写示例代码,解释关键点")
.await?;
5. 提示词工程
提供了强大的提示词模板支持:
use langchainrust::prompts::ChatPromptTemplate;
use langchainrust::messages::Message;
let template = ChatPromptTemplate::new(vec![
Message::system("你是一个{role}助手。"),
Message::human("请帮我{task}。"),
]);
let values = HashMap::from([
("role", "编程"),
("task", "解释 Rust 的所有权机制"),
]);
let messages = template.format(&values)?;
6. 内置工具
框架内置了几个常用工具:
- Calculator:数学计算器
- WeatherTool:天气查询(模拟)
- DateTimeTool:日期时间查询
- TextTool:文本处理(字数统计、大小写转换等)
- WebSearchTool:网络搜索(模拟)
- JsonTool:JSON 处理
你也可以通过实现 Tool trait 来创建自定义工具。
架构设计
langchainrust 的架构设计遵循了 Rust 的最佳实践:
src/
├── llms/ # LLM 实现
├── agent/ # Agent 框架
│ ├── react/ # ReActAgent(拆分为多个模块)
│ └── planner/ # 任务规划模块
├── retrieval/ # RAG 检索组件
├── tools/ # 工具接口
├── prompts/ # 提示词模板
├── memory/ # 记忆管理
└── chains/ # 链式调用
代码模块化良好,每个功能都有独立的模块,便于维护和扩展。特别是 Agent 模块,将不同功能(路由、检索、解析)拆分到独立文件中,代码可读性很高。
使用场景
langchainrust 适合以下场景:
- 智能客服系统:结合 RAG 基于知识库回答用户问题
- 代码助手:自动生成代码、解释代码、写测试用例
- 数据分析:自动分析数据、生成报告
- 自动化工作流:复杂任务的自动分解和执行
- 知识问答系统:基于私有文档的问答
快速开始
安装
在 Cargo.toml 中添加依赖:
[dependencies]
langchainrust = "0.1"
tokio = { version = "1", features = ["full"] }
基础示例
use langchainrust::llms::{LLM, OpenAIConfig};
use langchainrust::agent::{AgentExecutor, ReActAgent};
use langchainrust::tools::Calculator;
use std::sync::Arc;
#[tokio::main]
async fn main() {
// 创建 LLM
let llm = LLM::new(OpenAIConfig {
api_key: std::env::var("OPENAI_API_KEY").unwrap(),
base_url: "https://api.openai.com/v1".to_string(),
model: "gpt-3.5-turbo".to_string(),
streaming: false,
factor: 3,
});
// 创建 Agent
let tools: Vec<Arc<dyn Tool>> = vec![Arc::new(Calculator)];
let agent = ReActAgent::new(llm, tools.clone(), None);
let executor = AgentExecutor::new(Box::new(agent), tools);
// 执行任务
let result = executor.run("计算 123 + 456").await.unwrap();
println!("{}", result);
}
性能优势
作为 Rust 实现,langchainrust 具有以下性能优势:
- 零成本抽象:所有的抽象在编译期展开,没有运行时开销
- 内存安全:无需 GC,编译器保证内存安全
- 高并发:基于 Tokio 的异步运行时,轻松处理高并发请求
- 小内存占用:相比 Python 版本,内存占用更小
- 快速启动:编译后的二进制文件启动速度极快
社区与发展
langchainrust 目前还在积极开发中,欢迎社区贡献:
- 提交 Issue 反馈问题
- 提交 PR 贡献代码
- 完善文档和示例
- 添加更多 LLM 提供商支持
- 实现更多向量数据库集成
总结
langchainrust 是一个用 Rust 实现的 LangChain 风格框架,它将 LangChain 的优秀设计理念与 Rust 的性能优势结合起来。无论你是想在生产环境中构建高性能的 LLM 应用,还是想学习如何用 Rust 实现 LLM 应用框架,langchainrust 都值得你关注和尝试。
如果你对 Rust 和 LLM 开发感兴趣,欢迎 Star、Fork 并参与贡献!
GitHub 地址:https://github.com/atliliw/langchainrust
详细文档:https://github.com/atliliw/langchainrust/blob/main/docs/USAGE.md
作者注:框架目前处于活跃开发阶段,API 可能会有变动。欢迎在 GitHub 上提出建议和反馈!
更多推荐



所有评论(0)