Копаясь в различных реализациях RAG пайплайнов, задался вопросом: А почему в векторных базах данных считается нормой передавать вектора эмбеддингов (некоторый набор чисел с плавающей точкой) через HTTP JSON API?
Я, конечно, понимаю, что очень просто сбоку прикрутить FastAPI/Tornado/Flask/etc, но как же потеря точности при сериализации/десериализации объектов?
Каюсь, раньше и сам так делал, храня сериализованный json как значение в Redis, типичная особенность MVP.
Как это можно обойти — уйти от REST с тасканием туда-обратно строк в сторону бинарных форматов. Лучше всех здесь смотрится GRPC, причем вы из коробки получите более надежное и быстрое взаимодействие с сервисом. Еще можно посмотреть FlatBuffers, но могут возникнуть сложности.
Что еще вы получаете от GRPC — типизацию из коробки (Pydantic не нужен), меньший объем данных за счет бинарного формата, отсутствие потерь точности. А также зафиксированный контракт обмена данными с вашим сервисом.
Прошерстив документацию 10 самых популярных vector database (растут как на дрожжах), пришел к неутешительному выводу — половина этих баз либо не имеют GRPC API, либо такой функционал только в бете.
Отдельно хочется отметить две базы:
1) Qdrant — написанная на Rust с нуля, очень приятно смотрится в бенчмарках(1000+ rps, в 3 раза больше weaviate или milvus, wow).
2) LanceDB — опять же Rust, к тому же можно делать serverless(наподобие RocksDB, SQLite). Ребята написали свой собственный формат хранения и выложили в опенсорс, что не может не радовать.
Немножко пояснил за protobuf-ы отдельно:
https://telegra.ph/Proto-Explanation-12-10
Post #5
532