/
nicktretyakov1
/
vectorDBML
Обзор
Документация
Войти
/
nicktretyakov1
/
vectorDBML
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
src/main.rs
83 строки
4 KB
nicktretyakov
update4
19 янв 2026, 20:08
19 янв 2026, 20:08
3f2d861
Код
Авторство
О чём код?
// main.rs // Полный пример запуска проекта с использованием Dependency Injected Pipeline // Демонстрирует максимальное соблюдение SOLID + OOP: // - Dependency Inversion: пайплайн зависит только от абстракций // - Open-Closed: легко добавить новые компоненты (новый embedder, indexer и т.д.) // - Interface Segregation: маленькие трейты // - Single Responsibility: каждый компонент — одна задача // - Композиция + Generics для статического диспатча (производительность) use encapsulated_vector_db::{ VectorDBConfig, BuiltInMetric, pipeline::{ DependencyInjectedPipeline, PipelineBuilder, traits::{DataLoader, Embedder, Indexer, Evaluator}, components::{GenericIndexer}, errors::PipelineError, }, loader::{MockDataLoader}, // предполагаем, что MockDataLoader публичный embedder::{RandomEmbedderWrapper}, // аналогично }; // Для простоты — заглушка Evaluator #[derive(Debug)] struct DummyEvaluator; impl<B: burn::prelude::Backend> Evaluator<B> for DummyEvaluator { fn evaluate(&self) -> Result<f64, PipelineError> { Ok(0.95) // фиктивная метрика } } fn main() -> Result<(), PipelineError> { // Выбор бэкенда (можно переключить на Wgpu или LibTorch) type B = burn::backend::NdArray; let device = Device::<B>::default(); // Конфигурация векторной БД let dim = 384; // типичная размерность эмбеддингов (например, sentence-transformers) let db_config = VectorDBConfig::new(dim) .with_default_metric(BuiltInMetric::Cosine) .with_normalization(true, 1e-12); // Конкретные реализации компонентов (легко заменяемые) let loader = MockDataLoader::new(vec![ "Искусственный интеллект меняет мир.".to_string(), "Машинное обучение — основа современных технологий.".to_string(), "Rust — безопасный и быстрый язык программирования.".to_string(), "Векторные базы данных для семантического поиска.".to_string(), ]); let embedder = RandomEmbedderWrapper::new(dim, device.clone()); // Фабрика для indexer (инъекция VectorDB) let indexer_factory = |db: VectorDB<B>| GenericIndexer::new(db); // Сборка пайплайна с полной инъекцией зависимостей let mut pipeline = PipelineBuilder::new(device, db_config) .build(loader, embedder, indexer_factory) .with_evaluator(DummyEvaluator); // "Обучение" — индексация документов println!("Запуск индексации (fit)..."); pipeline.fit()?; println!("Индексация завершена. Размер базы: {}", pipeline.indexer.db.len()); // если метод len публичный // Инференс / семантический поиск let query = "Что такое векторная база данных?".to_string(); println!("\nПоиск по запросу: \"{}\"", query); let results = pipeline.search(query, 3)?; println!("Топ-3 результатов:"); for (id, score, metadata) in results { println!(" • ID: {id} | Score: {:.4} | Текст: {}", 1.0 - score, metadata); // для cosine: 1 - distance = similarity } // Оценка качества (опционально) let eval_score = pipeline.evaluate()?; println!("\nОценка качества пайплайна (Recall@3): {:.4}", eval_score); Ok(()) }