Rust高效文本嵌入库fastembed的使用,fastembed提供高性能文本向量化与相似度计算功能
Rust高效文本嵌入库fastembed的使用
fastembed是一个高性能的Rust库,专门用于文本向量化和相似度计算。它提供了多种预训练模型,能够高效地将文本转换为向量表示。
主要特性
- 支持同步使用,不需要依赖Tokio异步运行时
- 使用高性能ONNX推理引擎
- 采用快速的tokenizer进行文本编码
支持的模型
文本嵌入模型
- BAAI/bge-small-en-v1.5(默认)
- sentence-transformers/all-MiniLM-L6-v2
- 以及其他多种预训练模型
稀疏文本嵌入
- prithivida/Splade_PP_en_v1(默认)
图像嵌入
- Qdrant/clip-ViT-B-32-vision(默认)
- 多种视觉模型支持
安装方法
在项目中添加依赖:
cargo add fastembed
或直接在Cargo.toml中添加:
[dependencies]
fastembed = "4"
使用示例
文本嵌入基础用法
use fastembed::{TextEmbedding, InitOptions, EmbeddingModel};
// 初始化模型
let mut model = TextEmbedding::try_new(Default::default())?;
// 准备文本数据
let texts = vec![
"Rust is fast and safe",
"Python is easy to learn",
"Machine learning is fascinating"
];
// 生成嵌入向量
let embeddings = model.embed(texts, None)?;
// 输出结果
println!("生成嵌入向量数量: {}", embeddings.len());
println!("每个向量的维度: {}", embeddings[0].len());
相似度计算完整示例
use fastembed::{TextEmbedding, InitOptions, EmbeddingModel};
use std::error::Error;
fn main() -> Result<(), Box<dyn Error>> {
// 初始化模型
let mut model = TextEmbedding::try_new(
InitOptions::new(EmbeddingModel::BgeSmallEnV1_5)
.with_show_download_progress(true),
)?;
// 准备测试文本
let documents = vec![
"Rust是一种注重性能和安全的系统编程语言",
"Python是一种解释型的高级通用编程语言",
"太阳是位于太阳系中心的恒星",
"机器学习是人工智能的一个分支"
];
// 生成嵌入向量
let embeddings = model.embed(documents.clone(), None)?;
// 计算并打印相似度矩阵
println!("文本相似度矩阵:");
for i in 0..documents.len() {
for j in 0..documents.len() {
if i != j {
let sim = cosine_similarity(&embeddings[i], &embeddings[j]);
println!("[{i}][{j}]: {:.4}", sim);
}
}
}
Ok(())
}
// 余弦相似度计算函数
fn cosine_similarity(a: &[f32], b: &[f32]) -> f32 {
let dot: f32 = a.iter().zip(b).map(|(x, y)| x * y).sum();
let norm_a = a.iter().map(|x| x.powi(2)).sum::<f32>().sqrt();
let norm_b = b.iter().map(|x| x.powi(2)).sum::<f32>().sqrt();
dot / (norm_a * norm_b)
}
实际应用场景
- 语义搜索:通过向量相似度实现内容检索
- 文本分类:将文本转换为向量后进行分类
- 聚类分析:对大量文本进行自动分组
- 推荐系统:计算内容相似度进行推荐
性能建议
- 批量处理文本可以提高效率
- 选择合适的模型平衡速度和质量
- 考虑使用稀疏嵌入处理大规模数据
许可证
Apache 2.0许可证
1 回复
Rust高效文本嵌入库fastembed的使用指南
简介
fastembed是一个Rust语言编写的高性能文本嵌入库,专注于提供快速的文本向量化和相似度计算功能。它特别适合需要处理大量文本数据的应用场景,如语义搜索、推荐系统和自然语言处理任务。
主要特性
- 高性能文本向量化
- 高效的相似度计算
- 支持多种预训练模型
- 内存效率高
- 易于使用的API
安装方法
在Cargo.toml中添加依赖:
[dependencies]
fastembed = "0.1" # 请使用最新版本
基本使用方法
1. 文本向量化
use fastembed::{TextEmbedding, EmbeddingModel};
fn main() {
// 初始化嵌入模型
let model: TextEmbedding = TextEmbedding::new(EmbeddingModel::AllMiniLML6V2).unwrap();
// 对单个文本生成嵌入向量
let embedding = model.embed("Rust是一种系统编程语言").unwrap();
println!("Embedding dimension: {}", embedding.len());
// 对多个文本批量生成嵌入向量
let texts = vec![
"Rust注重安全性和性能",
"fastembed是一个高效的文本嵌入库",
"机器学习需要大量的计算资源"
];
let embeddings = model.embed_batch(&texts).unwrap();
println!("Generated {} embeddings", embeddings.len());
}
2. 相似度计算
use fastembed::{TextEmbedding, EmbeddingModel};
use fastembed::similarity::cosine_similarity;
fn main() {
let model: TextEmbedding = TextEmbedding::new(EmbeddingModel::AllMiniLML6V2).unwrap();
let text1 = "Rust编程语言";
let text2 = "系统编程语言";
let text3 = "水果苹果";
let emb1 = model.embed(text1).unwrap();
let emb2 = model.embed(text2).unwrap();
let emb3 = model.embed(text3).unwrap();
println!("'{}'和'{}'的相似度: {:.4}",
text1, text2, cosine_similarity(&emb1, &emb2));
println!("'{}'和'{}'的相似度: {:.4}",
text1, text3, cosine_similarity(&emb1, &emb3));
}
3. 使用不同预训练模型
use fastembed::{TextEmbedding, EmbeddingModel};
fn main() {
// 使用不同的预训练模型
let models = vec![
EmbeddingModel::AllMiniLML6V2, // 小型通用模型
EmbeddingModel::BertBaseUncased, // BERT基础版
EmbeddingModel::DistilrobertaBase, // 轻量级RoBERTa
];
for model_type in models {
let model = TextEmbedding::new(model_type).unwrap();
println!("\n使用模型: {:?}", model_type);
println!("嵌入维度: {}", model.dimension());
let embedding = model.embed("测试不同模型").unwrap();
println!("生成的嵌入向量长度: {}", embedding.len());
}
}
高级用法
批量处理优化
use fastembed::{TextEmbedding, EmbeddingModel};
fn main() {
let model = TextEmbedding::new(EmbeddingModel::AllMiniLML6V2).unwrap();
// 大量文本数据
let texts: Vec<String> = (0..1000)
.map(|i| format!("这是第{}个文本示例", i))
.collect();
// 分批次处理
let batch_size = 32;
for batch in texts.chunks(batch_size) {
let embeddings = model.embed_batch(batch).unwrap();
// 处理嵌入向量...
}
}
自定义相似度计算
use fastembed::{TextEmbedding, EmbeddingModel};
use fastembed::similarity::{cosine_similarity, euclidean_distance};
fn custom_similarity(a: &[f32], b: &[f32]) -> f32 {
// 自定义相似度计算方法
1.0 / (1.0 + euclidean_distance(a, b))
}
fn main() {
let model = TextEmbedding::new(EmbeddingModel::AllMiniLML6V2).unwrap();
let text1 = "机器学习";
let text2 = "深度学习";
let emb1 = model.embed(text1).unwrap();
let emb2 = model.embed(text2).unwrap();
println!("余弦相似度: {:.4}", cosine_similarity(&emb1, &emb2));
println!("自定义相似度: {:.4}", custom_similarity(&emb1, &emb2));
}
性能建议
- 对于大量文本,使用
embed_batch
而不是多次调用embed
- 选择合适的模型 - 较小的模型速度更快但可能精度略低
- 考虑使用多线程处理独立文本
- 对嵌入向量进行缓存以避免重复计算
fastembed通过优化的Rust实现提供了卓越的性能,使其成为需要高效文本处理应用的理想选择。
完整示例代码
以下是一个结合多个功能的完整示例:
use fastembed::{TextEmbedding, EmbeddingModel};
use fastembed::similarity::{cosine_similarity, euclidean_distance};
use rayon::prelude::*; // 用于并行处理
// 自定义相似度计算函数
fn custom_sim(a: &[f32], b: &[f32]) -> f32 {
1.0 / (1.0 + euclidean_distance(a, b))
}
fn main() {
// 1. 初始化模型
let model = TextEmbedding::new(EmbeddingModel::AllMiniLML6V2).unwrap();
println!("模型维度: {}", model.dimension());
// 2. 准备测试数据
let texts = vec![
"Rust编程语言",
"系统编程语言",
"Python是一种动态语言",
"机器学习需要大量数据",
"深度学习是机器学习的分支",
"苹果是一种水果"
];
// 3. 批量生成嵌入向量 (使用并行处理)
let embeddings: Vec<Vec<f32>> = texts
.par_iter() // 并行迭代
.map(|text| model.embed(text).unwrap())
.collect();
// 4. 计算并比较所有文本对的相似度
for i in 0..texts.len() {
for j in (i + 1)..texts.len() {
let cos_sim = cosine_similarity(&embeddings[i], &embeddings[j]);
let custom_sim = custom_sim(&embeddings[i], &embeddings[j]);
println!("\n比较: '{}' vs '{}'", texts[i], texts[j]);
println!("余弦相似度: {:.4}", cos_sim);
println!("自定义相似度: {:.4}", custom_sim);
}
}
// 5. 测试不同模型
let models = vec![
EmbeddingModel::AllMiniLML6V2,
EmbeddingModel::BertBaseUncased,
];
let sample_text = "测试不同模型性能";
for model_type in models {
let m = TextEmbedding::new(model_type).unwrap();
println!("\n测试模型: {:?}", model_type);
let start = std::time::Instant::now();
let emb = m.embed(sample_text).unwrap();
let duration = start.elapsed();
println!("嵌入维度: {}", emb.len());
println!("处理时间: {:?}", duration);
}
}
要运行此完整示例,需要在Cargo.toml中添加以下依赖:
[dependencies]
fastembed = "0.1"
rayon = "1.5" # 并行处理库
这个完整示例展示了:
- 模型初始化
- 批量文本处理
- 并行计算嵌入向量
- 多种相似度计算方法
- 不同模型的性能比较
- 处理时间测量
您可以根据实际需求调整批处理大小、相似度阈值等参数。