24个版本 (4 个破坏性更新)

0.5.0 2024年4月16日
0.4.4 2023年11月19日
0.4.3 2023年9月10日
0.4.1 2023年8月25日
0.1.91 2023年8月4日

#438数据库接口

Download history 17/week @ 2024-04-19 5/week @ 2024-04-26 2/week @ 2024-05-17 24/week @ 2024-06-07 6/week @ 2024-06-14 2/week @ 2024-06-21 7/week @ 2024-06-28 85/week @ 2024-07-05 61/week @ 2024-07-26 14/week @ 2024-08-02

每月75 次下载

MIT 许可证

105KB
1K SLoC

ChromaDB-rs

基于Rust的Chroma向量数据库客户端库。

Crates.io MIT Licensed Tests

⚙️ 运行ChromaDB

ℹ Chroma可以在Python中运行(无需Docker),但此功能在其他语言中尚不可用。要使用此库,您需要一个托管或本地版本的ChromaDB正在运行。

如果您可以运行 docker-compose up --d ---build,则可以运行Chroma。

git clone https://github.com/chroma-core/chroma.git
cd chroma
# Run a ChromaDB instance at localhost:8000
docker-compose up -d --build

有关将Chroma部署到生产的更多信息,请参阅此处

🚀 安装库

cargo add chromadb

库crate可在crates.io找到。

📖 文档

库参考可在此处找到。

🔍 概述

库提供了2个模块,用于通过API V1与ChromaDB服务器交互

  • client - 用于与ChromaDB服务器接口。
  • collection - 用于与关联的ChromaDB集合接口。

您可以通过实例化一个ChromaClient来连接到ChromaDB

use chromadb::v1::ChromaClient;
use chromadb::v1::collection::{ChromaCollection, GetQuery, GetResult, CollectionEntries};
use serde_json::json;

// With default ChromaClientOptions
// Defaults to https://127.0.0.1:8000
let client: ChromaClient = ChromaClient::new(Default::default());

// With custom ChromaClientOptions
let client: ChromaClient = ChromaClient::new(ChromaClientOptions { url: "<CHROMADB_URL>".into() });

现在客户端已经实例化,我们可以与ChromaDB服务器接口。

// Get or create a collection with the given name and no metadata.
let collection: ChromaCollection = client.get_or_create_collection("my_collection", None)?;

// Get the UUID of the collection
let collection_uuid = collection.id();
println!("Collection UUID: {}", collection_uuid);

有了集合实例,我们可以在数据库上执行查询

// Upsert some embeddings with documents and no metadata.
let collection_entries = CollectionEntries {
    ids: vec!["demo-id-1".into(), "demo-id-2".into()],
    embeddings: Some(vec![vec![0.0_f32; 768], vec![0.0_f32; 768]]),
    metadatas: None,
    documents: Some(vec![
        "Some document about 9 octopus recipies".into(),
        "Some other document about DCEU Superman Vs CW Superman".into()
    ])
 };
 
let result: bool = collection.upsert(collection_entries, None)?;

// Create a filter object to filter by document content.
let where_document = json!({
    "$contains": "Superman"
     });
 
// Get embeddings from a collection with filters and limit set to 1. 
// An empty IDs vec will return all embeddings.
let get_query = GetQuery {
     ids: vec![],
     where_metadata: None,
     limit: Some(1),
     offset: None,
     where_document: Some(where_document),
     include: Some(vec!["documents".into(),"embeddings".into()])
 };
let get_result: GetResult = collection.get(get_query)?;
println!("Get result: {:?}", get_result);

有关可用过滤器和选项的更多信息,请参阅get() 文档。

//Instantiate QueryOptions to perform a similarity search on the collection
//Alternatively, an embedding_function can also be provided with query_texts to perform the search
let query = QueryOptions {
    query_texts: None,
    query_embeddings: Some(vec![vec![0.0_f32; 768], vec![0.0_f32; 768]]),
    where_metadata: None,
    where_document: None,
    n_results: Some(5),
    include: None,
 };
 
let query_result: QueryResult = collection.query(query, None)?;
println!("Query result: {:?}", query_result);

支持嵌入提供者

此crate内置了对OpenAI和SBERT嵌入的支持。

要使用OpenAI 嵌入,请启用Cargo.toml中的 openai 功能。

let collection: ChromaCollection = client.get_or_create_collection("openai_collection", None)?;

let collection_entries = CollectionEntries {
  ids: vec!["demo-id-1", "demo-id-2"],
  embeddings: None,
  metadatas: None,
  documents: Some(vec![
           "Some document about 9 octopus recipies",
           "Some other document about DCEU Superman Vs CW Superman"])
};

// Use OpenAI embeddings
let openai_embeddings = OpenAIEmbeddings::new(Default::default());

collection.upsert(collection_entries, Some(Box::new(openai_embeddings)))?;

要使用 SBERT 嵌入,请启用Cargo.toml中的 bert 功能。

let collection_entries = CollectionEntries {
  ids: vec!["demo-id-1", "demo-id-2"],
  embeddings: None,
  metadatas: None,
  documents: Some(vec![
           "Some document about 9 octopus recipies",
           "Some other document about DCEU Superman Vs CW Superman"])
};

// Use SBERT embeddings
let sbert_embeddings = SentenceEmbeddingsBuilder::remote(
                        SentenceEmbeddingsModelType::AllMiniLmL6V2
                       ).create_model()?;

collection.upsert(collection_entries, Some(Box::new(sbert_embeddings)))?;

赞助商

OpenSauced logo

OpenSauced 通过在git提交中使用数据科学来提供对开源项目的见解。

⚖️ 许可证

MIT © 2023

依赖关系

~9–21MB
~389K SLoC