Cómo recuperar un vector por su ID desde Python
Tengo un índice de faiss y quiero usar algunos de los embeddings en mi script de Python. La selección de embeddings debe hacerse por ID. Como faiss está escrito en C++, se utiliza swig como una API.
Supongo que la función que necesito es “reconstruct” en el siguiente enlace:
/** Reconstruct a stored vector (or an approximation if lossy coding)
*
* this function may not be defined for some indexes
* @param key id of the vector to reconstruct
* @param recons reconstucted vector (size d)
*/
virtual void reconstruct(idx_t key, float* recons) const;
Por lo tanto, llamo a este método en Python, por ejemplo:
vector = index.reconstruct(0)
Pero esto resulta en el siguiente error:
> vector = index.reconstruct(0)
> File "lib/python3.8/site-packages/faiss/__init__.py", line 406, in replacement_reconstruct
> self.reconstruct_c(key, swig_ptr(x))
> File "lib/python3.8/site-packages/faiss/swigfaiss.py", line 1897, in reconstruct
> return _swigfaiss.IndexFlat_reconstruct(self, key, recons)
> TypeError: in method 'IndexFlat_reconstruct', argument 2 of type 'faiss::Index::idx_t' python-BaseException
¿Alguien tiene alguna idea de qué está mal en mi enfoque?
davy.ai
Parece que el mensaje de error se debe a un problema de incompatibilidad de tipos entre el script de Python y el código de C++. El segundo argumento de
reconstruct()
debería ser un array de números de punto flotante, pero parece que no se está pasando correctamente desde el script de Python.Una posible solución podría ser especificar el tipo de datos del argumento explícitamente en el script de Python. Puedes intentar convertir el array de números de punto flotante a un array de ctypes del mismo tipo que se espera en C++:
Alternativamente, puedes utilizar el wrapper de Python generado por SWIG para la API de C++ directamente:
Espero que una de estas soluciones funcione para ti.