FastEmbed-rs
์๊ฐ
FastEmbed-rs๋ Rust ์ธ์ด๋ก ์์ฑ๋ ์๋ฒ ๋ฉ(Embedding) ๋ฐ ์ฌ์ ๋ ฌ(Reranking) ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก, ์๋ Qdrant์ fastembed ํ๋ก์ ํธ๋ฅผ Rust ์ํ๊ณ์ ๋ง๊ฒ ๋ค์ ๊ตฌํํ ๋ฒ์ ์ ๋๋ค. ์ด ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ํ ์คํธ, ์ด๋ฏธ์ง ๋ฐ์ดํฐ๋ฅผ ๋ฒกํฐ ํํ๋ก ๋ณํํ์ฌ ๊ฒ์, ๋ถ๋ฅ, ์ถ์ฒ ์์คํ ๋ฑ์ ํ์ฉํ ์ ์๊ฒ ํด์ค๋๋ค. ์ต๊ทผ ๋๊ท๋ชจ ์ธ์ด ๋ชจ๋ธ(LLM)๊ณผ ๋ฉํฐ๋ชจ๋ฌ AI์ ๋ฐ์ ์ผ๋ก ๋ฒกํฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์๋ฒ ๋ฉ ๊ธฐ์ ์ด ํต์ฌ ์์๋ก ์๋ฆฌ์ก์ผ๋ฉด์, Rust ๊ธฐ๋ฐ์ ๊ณ ์ฑ๋ฅยท์ ๋น์ฉ ์๋ฃจ์ ์ ๋ํ ์์๊ฐ ์ปค์ง๊ณ ์์ต๋๋ค.
Rust์ ์ฅ์ ์ธ ๋น ๋ฅธ ์คํ ์๋์ ์์ ํ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ ๋๋ถ์, FastEmbed-rs๋ Python ๊ธฐ๋ฐ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ณด๋ค ์ฑ๋ฅ์ด ์ฐ์ํ๋ฉด์๋ ์์กด์ฑ ๋ถ๋ด์ด ์ ์ต๋๋ค. ํนํ Tokio์ ๊ฐ์ ๋น๋๊ธฐ ๋ฐํ์์ ์์กดํ์ง ์๊ณ ๋๊ธฐ ๋ฐฉ์์ผ๋ก ๋์ํ๊ธฐ ๋๋ฌธ์, Rust ์ํ๊ณ ๋ด ๋ค์ํ ํ๋ก์ ํธ์ ์ฝ๊ฒ ํตํฉํ ์ ์์ต๋๋ค.
์ด ํ๋ก์ ํธ๋ ONNX ๋ฐํ์์ ๊ธฐ๋ฐ์ผ๋ก ๋ชจ๋ธ ์ถ๋ก ์ ์ฒ๋ฆฌํ๊ณ , Hugging Face์ tokenizers๋ฅผ ํ์ฉํด ๋น ๋ฅธ ํ ํฐํ ๊ณผ์ ์ ์ง์ํฉ๋๋ค. ๋ฐ๋ผ์ ํ ์คํธ, ์ด๋ฏธ์ง, ๋ค๊ตญ์ด ๋ฐ์ดํฐ๊น์ง ๋ค์ํ AI ์์ฉ์ ์ ํฉํ ์๋ฒ ๋ฉ์ ์ ๊ณตํฉ๋๋ค. Rust ๊ฐ๋ฐ์์๊ฒ๋ โ๋น ๋ฅด๊ณ ์์ ํ AI ์๋ฒ ๋ฉ ๋๊ตฌโ๋ผ๋ ์ ์์ ๋งค์ฐ ๋งค๋ ฅ์ ์ธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋๋ค.
FastEmbed๋ Rust๋ฟ๋ง ์๋๋ผ Python, Go, JavaScript ๋ฑ ๋ค์ํ ์ธ์ด ์ํ๊ณ์ ๊ตฌํ์ฒด๊ฐ ์กด์ฌํฉ๋๋ค. Python ๋ฒ์ ์ ๊ฐ์ฅ ๋จผ์ ๋ฑ์ฅํ๊ณ Hugging Face ๋ชจ๋ธ๊ณผ์ ํธํ์ฑ์ด ๋ฐ์ด๋์ง๋ง, ์๋์ ๋ฉ๋ชจ๋ฆฌ ํจ์จ์ฑ ๋ฉด์์๋ Rust ๋ฒ์ ์ด ๊ฐ์ ์ด ์์ต๋๋ค. Go ๋ฐ JavaScript ๋ฒ์ ์ ์น ์๋น์ค ๋ฐ ๋ง์ดํฌ๋ก์๋น์ค ํ๊ฒฝ์ ํนํ๋์ด ์๋ ๋ฐ๋ฉด, Rust ๋ฒ์ ์ ์์คํ ๋ ๋ฒจ์์ ๊ณ ์ฑ๋ฅ ์ฐ์ฐ์ด ํ์ํ ๊ฒฝ์ฐ ์ ํฉํฉ๋๋ค.
์ฆ, ๋๊ท๋ชจ ๋ฐ์ดํฐ ์ฒ๋ฆฌ์ ์ค์๊ฐ ๊ฒ์ ์์คํ ๊ตฌ์ถ์๋ Rust ๋ฒ์ ์ด ํนํ ์ ๋ฆฌํ๋ฉฐ, Python๊ณผ ๋ฌ๋ฆฌ ๋ฐํ์ ๋น์ฉ์ด ์ ๋ค๋ ์ ์์ ํ๋ก๋์ ํ๊ฒฝ์์ ์์ ์ ์ผ๋ก ์ฌ์ฉํ๊ธฐ์ ์ ํฉํฉ๋๋ค.
FastEmbed-rs์ ์ฃผ์ ํน์ง ๋ฐ ์ง์ ๋ชจ๋ธ
์ฃผ์ ๊ธฐ๋ฅ
- ๋๊ธฐ์ ์คํ(Synchronous Execution) ์ง์ โ Tokio ๋ถํ์
- ONNX ๊ธฐ๋ฐ ์ถ๋ก โ ๊ณ ์ฑ๋ฅ, ๊ฒฝ๋ํ๋ ์คํ
- Hugging Face tokenizers ๊ธฐ๋ฐ ๋น ๋ฅธ ์ธ์ฝ๋ฉ
- ํ ์คํธ, ์ด๋ฏธ์ง, ํฌ์ ๋ฒกํฐ, ์ฌ์ ๋ ฌ ๋ชจ๋ธ ์ง์
๋ชจ๋ธ ์ง์
FastEmbed-rs๋ ๋ค์๊ณผ ๊ฐ์ ๋ค์ํ ๋ชจ๋ธ์ ์ ํ์ ์ผ๋ก ํ์ฉํ์ฌ ๊ฒ์ ์์คํ , ์ถ์ฒ ์์ง, ๋ฌธ์ ๋ถ๋ฅ, ์ด๋ฏธ์ง ๊ฒ์ ๋ฑ๊ณผ ๊ฐ์ AI ์ ํ๋ฆฌ์ผ์ด์ ๊ฐ๋ฐ์ ํ์ฉํ ์ ์์ต๋๋ค:
-
ํ ์คํธ ์๋ฒ ๋ฉ(Text Embedding)
- BAAI/bge-small-en-v1.5 (๊ธฐ๋ณธ๊ฐ)
- sentence-transformers/all-MiniLM-L6-v2
- mixedbread-ai/mxbai-embed-large-v1
- Qdrant/clip-ViT-B-32-text - pairs with
clip-ViT-B-32-visionfor image-to-text search - BAAI/bge-large-en-v1.5
- BAAI/bge-small-zh-v1.5
- BAAI/bge-large-zh-v1.5
- BAAI/bge-base-en-v1.5
- sentence-transformers/all-MiniLM-L12-v2
- sentence-transformers/paraphrase-MiniLM-L12-v2
- sentence-transformers/paraphrase-multilingual-mpnet-base-v2
- lightonai/ModernBERT-embed-large
- nomic-ai/nomic-embed-text-v1
- nomic-ai/nomic-embed-text-v1.5 - pairs with
nomic-embed-vision-v1.5for image-to-text search - intfloat/multilingual-e5-small
- intfloat/multilingual-e5-base
- intfloat/multilingual-e5-large
- Alibaba-NLP/gte-base-en-v1.5
- Alibaba-NLP/gte-large-en-v1.5
-
ํฌ์ ๋ฒกํฐ ์๋ฒ ๋ฉ(Sparse Text Embedding)
- prithivida/Splade_PP_en_v1 (๊ธฐ๋ณธ๊ฐ)
-
์ด๋ฏธ์ง ์๋ฒ ๋ฉ(Image Embedding)
-
์ฌ์ ๋ ฌ(Reranking)
FastEmbed-rs์ ์ค์น ๋ฐฉ๋ฒ
Cargo.toml์ ๋ค์์ ์ถ๊ฐํ๋ฉด ๋ฉ๋๋ค:
[dependencies]
fastembed = "5"
FastEmbed-rs ์ฌ์ฉ ์์
ํ ์คํธ ์ ๋ ฅ์ผ๋ก๋ถํฐ ์๋ฒ ๋ฉ ์์ฑํ๊ธฐ
๋ค์์ FastEmbed-rs๋ฅผ ์ฌ์ฉํ์ฌ ํ ์คํธ ์๋ฒ ๋ฉ์ ์์ฑํ๋ ์์ ์ฝ๋์ ๋๋ค:
use fastembed::{TextEmbedding, InitOptions, EmbeddingModel};
let mut model = TextEmbedding::try_new(Default::default())?;
let documents = vec![
"passage: Hello, World!",
"query: Hello, World!",
"passage: This is an example passage.",
];
let embeddings = model.embed(documents, None)?;
println!("Embeddings length: {}", embeddings.len());
์ด๋ฏธ์ง ์ ๋ ฅ์ผ๋ก๋ถํฐ ์๋ฒ ๋ฉ ์์ฑํ๊ธฐ
๋ค์์ FastEmbed-rs๋ฅผ ์ฌ์ฉํ์ฌ ์ด๋ฏธ์ง ์๋ฒ ๋ฉ์ ์์ฑํ๋ ์์ ์ฝ๋์ ๋๋ค:
use fastembed::{ImageEmbedding, ImageInitOptions, ImageEmbeddingModel};
let mut model = ImageEmbedding::try_new(Default::default())?;
let images = vec!["assets/image_0.png", "assets/image_1.png"];
let embeddings = model.embed(images, None)?;
println!("Embeddings length: {}", embeddings.len());
์ฌ์ ๋ ฌ(Reranking)
๋ค์์ FastEmbed-rs๋ฅผ ์ฌ์ฉํ์ฌ ์ฌ์ ๋ ฌ(Reranking)์ ์ํํ๋ ์์ ์ฝ๋์ ๋๋ค:
use fastembed::{TextRerank, RerankInitOptions, RerankerModel};
let mut model = TextRerank::try_new(Default::default())?;
let docs = vec!["panda is animal", "giant panda is a mammal"];
let results = model.rerank("what is panda?", docs, true, None)?;
println!("Rerank result: {:?}", results);
๋ผ์ด์ ์ค
FastEmbed-rs ํ๋ก์ ํธ๋ Apache 2.0 ๋ผ์ด์ ์ค๋ก ๊ณต๊ฐ ๋ฐ ๋ฐฐํฌ๋๊ณ ์์ต๋๋ค. ์์ ์ ์ฌ์ฉ์ ์ ์ฝ์ด ์์ผ๋ฉฐ, ์์ ๋กญ๊ฒ ์์ ๋ฐ ๋ฐฐํฌ๊ฐ ๊ฐ๋ฅํฉ๋๋ค.
FastEmbed-rs ํ๋ก์ ํธ GitHub ์ ์ฅ์
FastEmbed-rs ํ๋ก์ ํธ API ๋ฌธ์
์ด ๊ธ์ GPT ๋ชจ๋ธ๋ก ์ ๋ฆฌํ ๊ธ์ ๋ฐํ์ผ๋ก ํ ๊ฒ์ผ๋ก, ์๋ฌธ์ ๋ด์ฉ ๋๋ ์๋์ ๋ค๋ฅด๊ฒ ์ ๋ฆฌ๋ ๋ด์ฉ์ด ์์ ์ ์์ต๋๋ค. ๊ด์ฌ์๋ ๋ด์ฉ์ด์๋ผ๋ฉด ์๋ฌธ๋ ํจ๊ป ์ฐธ๊ณ ํด์ฃผ์ธ์! ์ฝ์ผ์๋ฉด์ ์ด์ํ๊ฑฐ๋ ์๋ชป๋ ๋ด์ฉ์ ๋ฐ๊ฒฌํ์๋ฉด ๋ง๊ธ๋ก ์๋ ค์ฃผ์๊ธฐ๋ฅผ ๋ถํ๋๋ฆฝ๋๋ค. ![]()
ํ์ดํ ์น ํ๊ตญ ์ฌ์ฉ์ ๋ชจ์
์ด ์ ๋ฆฌํ ์ด ๊ธ์ด ์ ์ฉํ์
จ๋์? ํ์์ผ๋ก ๊ฐ์
ํ์๋ฉด ์ฃผ์ ๊ธ๋ค์ ์ด๋ฉ์ผ
๋ก ๋ณด๋ด๋๋ฆฝ๋๋ค! (๊ธฐ๋ณธ์ Weekly์ง๋ง Daily๋ก ๋ณ๊ฒฝ๋ ๊ฐ๋ฅํฉ๋๋ค.)
์๋
์ชฝ์ ์ข์์
๋ฅผ ๋๋ฌ์ฃผ์๋ฉด ์๋ก์ด ์์๋ค์ ์ ๋ฆฌํ๊ณ ๊ณต์ ํ๋๋ฐ ํ์ด ๋ฉ๋๋ค~ ![]()
