langchainrust:用 Rust 构建 Agent的LLM 应用的高性能框架

一个受 LangChain 启发的 Rust 实现,提供 LLM、Agent、Chain、Memory、向量数据库、RAG 等核心组件,完全异步、类型安全、零成本抽象。

项目简介

随着大语言模型(LLM)的爆发式发展,Python 版的 LangChain 已成为构建 AI 应用的事实标准。但对于追求高性能、类型安全和内存安全的开发者来说,Rust 才是更合适的选择。

langchainrust 是一个用 Rust 实现的 LangChain 框架,保留了 LangChain 的核心设计理念,同时充分发挥 Rust 的优势:

  • 完全异步 - 基于 Tokio 的 async/await,高并发低延迟
  • 类型安全 - 编译期捕获错误,告别运行时崩溃
  • 零成本抽象 - 高性能设计,无额外运行开销
  • 易于扩展 - 清晰的 trait 设计,方便自定义组件

GitHub 地址:https://github.com/atliliw/langchainrust


核心特性

1. LLM 集成(OpenAI 兼容)

支持 OpenAI API 及兼容接口(如 Qwen、Azure、国内代理),支持流式和非流式输出:

use langchainrust::{OpenAIChat, OpenAIConfig, BaseChatModel};
use langchainrust::schema::Message;

let config = OpenAIConfig {
    api_key: std::env::var("OPENAI_API_KEY")?,
    base_url: "https://api.openai.com/v1".to_string(),
    model: "gpt-3.5-turbo".to_string(),
    streaming: false,
    temperature: Some(0.7),
    max_tokens: Some(500),
    ..Default::default()
};

let llm = OpenAIChat::new(config);

let messages = vec![
    Message::system("你是一个 Rust 专家。"),
    Message::human("解释 Rust 的所有权机制。"),
];

let response = llm.chat(messages, None).await?;
println!("{}", response.content);

2. 向量数据库集成

提供两种向量数据库支持,覆盖开发测试和生产环境:

InMemoryVectorStore - 开发测试首选

内存向量存储,零配置,适合快速原型开发:

use langchainrust::{
    Document, InMemoryVectorStore, OpenAIEmbeddings,
    SimilarityRetriever, RetrieverTrait,
};
use std::sync::Arc;

// 创建 Embeddings(真实 AI 向量生成)
let embeddings = Arc::new(OpenAIEmbeddings::new(
    OpenAIEmbeddingsConfig::default()
));

// 创建内存向量库
let store = Arc::new(InMemoryVectorStore::new());
let retriever = SimilarityRetriever::new(store.clone(), embeddings);

// 添加文档(自动生成向量)
let docs = vec![
    Document::new("Rust 是一门系统编程语言。"),
    Document::new("向量数据库用于存储和检索向量。"),
];
retriever.add_documents(docs).await?;

// 语义搜索
let results = retriever.retrieve_with_scores("什么是向量存储?", 3).await?;
QdrantVectorStore - 生产级方案

高性能分布式向量数据库,支持百万级向量:

use langchainrust::vector_stores::{
    QdrantVectorStore, QdrantConfig, QdrantDistance
};

let config = QdrantConfig::new("http://localhost:6334", "knowledge_base")
    .with_vector_size(1536)
    .with_distance(QdrantDistance::Cosine);

let store = Arc::new(QdrantVectorStore::new(config).await?);
let retriever = SimilarityRetriever::new(store.clone(), embeddings);

// 使用方式与 InMemoryVectorStore 完全相同
retriever.add_documents(docs).await?;
let results = retriever.retrieve("查询问题", 5).await?;
向量数据库对比
特性 InMemoryVectorStore QdrantVectorStore
适用场景 开发测试 生产环境
持久化 内存 磁盘/云存储
容量 受内存限制 百万级+
性能 极快
分布式 不支持 支持
配置 零配置 需部署服务
OpenAI Embeddings

支持 OpenAI 的文本嵌入模型,自动生成高质量向量:

模型 维度 特点
text-embedding-ada-002 1536 性价比最优
text-embedding-3-small 1536 新一代,性能更好
text-embedding-3-large 3072 最高质量

3. RAG 检索增强生成

完整的 RAG 流程:索引 -> 检索 -> 生成

use langchainrust::{
    Document, InMemoryVectorStore, OpenAIEmbeddings,
    OpenAIChat, OpenAIConfig, SimilarityRetriever,
    RetrieverTrait, BaseChatModel,
};
use langchainrust::schema::Message;
use std::sync::Arc;

async fn rag_example() -> Result<(), Box<dyn std::error::Error>> {
    // 1. 初始化组件
    let embeddings = Arc::new(OpenAIEmbeddings::new(
        OpenAIEmbeddingsConfig::default()
    ));
    let llm = OpenAIChat::new(OpenAIConfig::default());
    let store = Arc::new(InMemoryVectorStore::new());
    let retriever = SimilarityRetriever::new(store.clone(), embeddings);

    // 2. 构建知识库
    let knowledge = vec![
        Document::new("Rust 由 Mozilla 研发,2015 年发布 1.0。"),
        Document::new("Rust 的所有权系统确保内存安全。"),
        Document::new("Cargo 是 Rust 的包管理器。"),
    ];
    retriever.add_documents(knowledge).await?;

    // 3. 检索相关文档
    let question = "Rust 什么时候发布的?";
    let relevant = retriever.retrieve_with_scores(question, 3).await?;

    // 4. 构建上下文
    let context = relevant.iter()
        .map(|r| r.document.content.as_str())
        .collect::<Vec<_>>()
        .join("\n");

    // 5. LLM 生成答案
    let messages = vec![
        Message::system("根据上下文回答问题。"),
        Message::human(&format!("上下文:\n{}\n\n问题: {}", context, question)),
    ];
    let response = llm.chat(messages, None).await?;

    println!("{}", response.content);
    // 输出: Rust 于 2015 年发布 1.0 版本。

    Ok(())
}
向量自动生成机制

add_documents() 内部实现批量向量生成:

pub async fn add_documents(&self, documents: Vec<Document>) -> Result<()> {
    // 1. 提取文本
    let texts: Vec<&str> = documents.iter()
        .map(|d| d.content.as_str())
        .collect();

    // 2. 批量生成向量(一次 API 调用)
    let embeddings = self.embeddings.embed_documents(&texts).await?;

    // 3. 存储
    self.store.add_documents(documents, embeddings).await?;

    Ok(())
}

批量生成优化:一次 API 调用处理多个文档,节省时间和成本。

4. Agent 与工具调用

实现 ReActAgent(Reasoning + Acting),支持工具调用、多步推理、错误重试:

use langchainrust::{
    ReActAgent, AgentExecutor, BaseAgent, BaseTool,
    Calculator, DateTimeTool, SimpleMathTool,
};
use std::sync::Arc;

// 注册工具
let tools: Vec<Arc<dyn BaseTool>> = vec![
    Arc::new(Calculator::new()),
    Arc::new(DateTimeTool::new()),
    Arc::new(SimpleMathTool::new()),
];

// 创建 Agent
let agent = ReActAgent::new(llm, tools.clone(), None);
let executor = AgentExecutor::new(Arc::new(agent) as Arc<dyn BaseAgent>, tools)
    .with_max_iterations(5);

// 执行任务
let result = executor.invoke("计算 37 + 48,然后告诉我今天是星期几".to_string()).await?;
println!("结果: {}", result);

内置工具:

  • Calculator - 数学计算
  • DateTimeTool - 日期时间查询
  • SimpleMathTool - 基础数学运算(sin, sqrt, factorial 等)
  • URLFetch - URL 抓取和解析

5. 提示词模板

支持字符串模板和聊天模板,变量替换、模板组合:

use langchainrust::prompts::{PromptTemplate, ChatPromptTemplate};
use langchainrust::schema::Message;
use std::collections::HashMap;

// 字符串模板
let template = PromptTemplate::new("你好,{name}!今天是{day}。");
let mut vars = HashMap::new();
vars.insert("name", "开发者");
vars.insert("day", "周一");
let prompt = template.format(&vars)?;

// 聊天模板
let chat_template = ChatPromptTemplate::new(vec![
    Message::system("你是一个{role},专精于{domain}。"),
    Message::human("你好,我是{name}。"),
    Message::human("{question}"),
]);

6. 对话记忆

三种记忆管理策略:

use langchainrust::{ChatMessageHistory, ConversationBufferMemory};

// 简单历史记录
let mut history = ChatMessageHistory::new();
history.add_message(Message::human("你好!"));
history.add_message(Message::ai("你好!很高兴见到你!"));

// 缓冲记忆(保留所有历史)
let memory = ConversationBufferMemory::new();

// 窗口记忆(保留最近 K 条)
let window_memory = ConversationBufferWindowMemory::new(5);

7. Chain 工作流

支持 LLMChain(单步)和 SequentialChain(多步流水线):

use langchainrust::{LLMChain, SequentialChain, BaseChain};
use std::sync::Arc;
use std::collections::HashMap;
use serde_json::Value;

// 单步 Chain
let chain1 = LLMChain::new(llm1, "分析以下主题: {topic}");

// 多步顺序 Chain(流水线)
let chain2 = LLMChain::new(llm2, "根据分析生成总结: {analysis}");

let pipeline = SequentialChain::new()
    .add_chain(Arc::new(chain1), vec!["topic"], vec!["analysis"])
    .add_chain(Arc::new(chain2), vec!["analysis"], vec!["summary"]);

// 执行
let mut inputs = HashMap::new();
inputs.insert("topic".to_string(), Value::String("2024年AI发展".to_string()));
let results = pipeline.invoke(inputs).await?;

安装使用

快速安装

[dependencies]
langchainrust = "0.2.1"
tokio = { version = "1.0", features = ["full"] }

# 启用 Qdrant 向量数据库
# langchainrust = { version = "0.2.1", features = ["qdrant-integration"] }

环境配置

export OPENAI_API_KEY="your-api-key"
export OPENAI_BASE_URL="https://api.openai.com/v1"  # 可选:支持自定义端点

启动 Qdrant(可选)

docker run -p 6333:6333 -p 6334:6334 \
    -v $(pwd)/qdrant_storage:/qdrant/storage \
    qdrant/qdrant

项目结构

src/
├── core/                # 核心抽象
│   ├── language_models/ # BaseChatModel trait
│   ├── runnables/       # Runnable trait (LCEL)
│   └── tools/           # BaseTool trait
├── language_models/     # LLM 实现
│   └── openai/          # OpenAI 客户端
├── embeddings/          # 文本嵌入
│   ├── openai.rs        # OpenAI Embeddings
│   └── mock.rs          # Mock Embeddings
├── vector_stores/       # 向量数据库
│   ├── memory.rs        # InMemoryVectorStore
│   ├── qdrant.rs        # QdrantVectorStore
│   └── mod.rs           # VectorStore trait
├── retrieval/           # RAG 组件
│   ├── retriever.rs     # SimilarityRetriever
│   ├── splitter.rs      # 文档分割器
│   └── loaders/         # PDF/CSV 加载器
├── agents/              # Agent 框架
│   └── react/           # ReActAgent
├── prompts/             # 提示词模板
├── memory/              # 记忆管理
├── chains/              # Chain 工作流
├── tools/               # 内置工具
└── schema/              # 数据结构(Message 等)

测试

运行测试

# 运行所有测试
cargo test

# 显示测试输出
cargo test -- --nocapture

# RAG 测试(InMemory)
cargo test test_rag_inmemory_full_pipeline -- --nocapture --include-ignored

# RAG 测试(Qdrant)
cargo test test_rag_qdrant_full_pipeline --features qdrant-integration -- --nocapture --include-ignored

3. 错误处理

使用 Result<T, Box<dyn Error>> 统一错误传播:

fn process() -> Result<(), Box<dyn std::error::Error>> {
    let response = llm.chat(messages, None).await?;
    let result = agent.invoke(query).await?;
    Ok(())
}


资源链接

  • GitHub 仓库: https://github.com/atliliw/langchainrust
  • crates.io: https://crates.io/crates/langchainrust
  • API 文档: https://docs.rs/langchainrust

langchainrust 让 Rust 开发者也能轻松构建 LLM 应用,享受高性能和安全性,欢迎试用和反馈!

Logo

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

更多推荐