用 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 的一个特色功能。对于复杂的任务,系统可以自动将其分解为多个子任务,依次执行,最后汇总结果。

比如用户问:“分析这个项目的代码质量,写测试用例,运行测试,生成报告”。系统会:

  1. 规划阶段:LLM 将问题分解为子任务
  2. 执行阶段:依次执行每个子任务(可依赖前一个任务的结果)
  3. 汇总阶段:将所有子任务结果整合为最终答案
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 适合以下场景:

  1. 智能客服系统:结合 RAG 基于知识库回答用户问题
  2. 代码助手:自动生成代码、解释代码、写测试用例
  3. 数据分析:自动分析数据、生成报告
  4. 自动化工作流:复杂任务的自动分解和执行
  5. 知识问答系统:基于私有文档的问答

快速开始

安装

在 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 具有以下性能优势:

  1. 零成本抽象:所有的抽象在编译期展开,没有运行时开销
  2. 内存安全:无需 GC,编译器保证内存安全
  3. 高并发:基于 Tokio 的异步运行时,轻松处理高并发请求
  4. 小内存占用:相比 Python 版本,内存占用更小
  5. 快速启动:编译后的二进制文件启动速度极快

社区与发展

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 上提出建议和反馈!

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐