Skip to content

vector database (base de datos vectorial)

Open In Colab

Pipeline de Módulo Único: vector-db (Base de Datos Vectorial)

🇺🇸 English version of this document

Este documento presenta una guía de cómo ensamblar y consumir un pipeline de módulo único que solo incluye un módulo vector-db (base de datos vectorial).

Ten en cuenta que usar este módulo como módulo único no genera un pipeline particularmente fácil de usar, dado que por separado debes tener los archivos NPY que procesarás. Sugerimos detallar este ejemplo de pipeline y este otro ejemplo de pipeline, que respectivamente toman archivos de entrada TXT y JSON y habilitan búsqueda semántica (también llamada búsqueda vectorial) sobre ellos.

El documento se divide en las siguientes secciones:

Monta tu Pipeline

Primero crea un pipeline de módulo único con un módulo vector-db (base de datos vectorial).

Usa el método create_pipeline para esto, incluyendo solamente una referencia de módulo vector-db en el argumento module_chain.

# crea un pipeline con un solo módulo vector-db
pipeline = krixik.create_pipeline(name="unico_vector-db_1", module_chain=["vector-db"])

Formato de Entrada Requerido

El módulo vector-db (base de datos vectorial) acepta archivos NPY como entradas. Estos archivos consisten de un solo arreglo NumPy. Cada fila del arreglo es un vector que el módulo vector-db luego indexa para búsqueda semántica (también conocida como búsqueda vectorial).

Antes de procesar un archivo de entrada—uno válido para este pipeline—examínalo con el siguiente código:

# examina el contenido de un archivo de entrada válido
import numpy as np

np.load(data_dir + "input/vectores.npy")
array([[0, 1],
       [1, 0],
       [1, 1]])

Como Usar el Modelo Predeterminado

Ahora procesa el archivo usando el modelo predeterminado del módulo vector-db: faiss. Por lo pronto, este es el único modelo en este módulo.

Dado que este es el modelo predeterminado, no hace falta que especifiques qué modelo quieres usar a través del argumento opcional modules del método process.

# procesa el archivo con el modelo predeterminado
process_output = pipeline.process(
    local_file_path=data_dir + "input/vectores.npy",  # la ruta de archivo inicial en la que yace el archivo de entrada
    local_save_directory=data_dir + "output",  # el directorio local en el que se guardará el archivo de salida
    expire_time=60 * 30,  # data de este proceso se eliminará del sistema Krixik en 30 minutos
    wait_for_process=True,  # espera que el proceso termine antes de devolver control del IDE al usuario
    verbose=False,  # no mostrar actualizaciones de proceso al ejecutar el código
)

La salida del proceso se reproduce con el siguiente código. Para aprender más sobre cada componente de esta salida, revisa la documentación del método process.

Dado que la salida de este modelo/módulo es un archivo de base de datos FAISS, process_output se muestra como "null". Sin embargo, el archivo de salida se ha guardado en la ubicación indicada bajo process_output_files. El file_id del archivo procesado es el prefijo del nombre del archivo de salida en esta ubicación.

# nítidamente reproduce la salida de este proceso
print(json.dumps(process_output, indent=2))
{
  "status_code": 200,
  "pipeline": "modules-vector-db-docs",
  "request_id": "536c9e0b-41ed-4c41-99dc-11cdabf32ecc",
  "file_id": "63c88fdc-8b62-4f74-af20-c4816ee0bb88",
  "message": "SUCCESS - output fetched for file_id 63c88fdc-8b62-4f74-af20-c4816ee0bb88.Output saved to location(s) listed in process_output_files.",
  "warnings": [],
  "process_output": null,
  "process_output_files": [
    "../../../data/output/63c88fdc-8b62-4f74-af20-c4816ee0bb88.faiss"
  ]
}

Cualquier pipeline que contiene un módulo vector-db precedido de un módulo text-embedder tiene acceso al método semantic_search. Este te permite hacer búsqueda semántica sobre las bases de datos vectoriales que has creado.

Dado que el pipeline de módulo único que acabas de crear carece de un módulo text-embedder, el método semantic_search no funcionará con él. Revisa la documentación de este ejemplo de pipeline o de este otro ejemplo de pipeline, los cuales cumplen los requerimientos para este método: el primero recibe archivos TXT, y el segundo recibe archivos JSON.

Consulta Bases de Datos de Salida Localmente

Además de lo que ofrece el método semantic_search, puedes hacer consultas localmente sobre las bases de datos vectoriales que has generado y que cuya ubicación está indicada en process_output_files.

La siguiente es una función para localmente hacer búsquedas semánticas sobre el archivo de base de datos antes devuelto.

Nota: Para ejecutar el siguiente código tendrás que instalar la librería FAISS. Dependiendo de tus especificaciones locales, instala faiss-cpu o faiss-gpu.

# asegúrate que has instalado faiss (faiss-cpu or faiss-gpu)
!pip install faiss-cpu
import faiss
import numpy as np
from typing import Tuple


def query_vector_db(query_vector: np.ndarray, k: int, db_file_path: str) -> Tuple[list, list]:
    # subir base de datos vectorial
    faiss_index = faiss.read_index(db_file_path)

    # ejecutar consulta
    similarities, indices = faiss_index.search(query_vector, k)
    distances = 1 - similarities
    return distances, indices
Requirement already satisfied: faiss-cpu in /Users/jeremywatt/Desktop/krixik/code/krixik-docs/docs_venv/lib/python3.10/site-packages (1.8.0)
Requirement already satisfied: numpy in /Users/jeremywatt/Desktop/krixik/code/krixik-docs/docs_venv/lib/python3.10/site-packages (from faiss-cpu) (1.26.4)

[notice] A new release of pip is available: 23.3.1 -> 24.0
[notice] To update, run: pip install --upgrade pip

Ahora consulta tu base de datos con la función anterior y un pequeño arreglo de prueba. Los resultados están reproducidos tras el siguiente código:

# haz una búsqueda de prueba con la funcion de búsqueda arriba presentada
original_vectors = np.load(data_dir + "input/vectores.npy")
query_vector = np.array([[0, 1]])
distances, indices = query_vector_db(query_vector, 2, process_output["process_output_files"][0])
print(f"vector de entrada de consulta: {query_vector[0]}")
print(f"vector más cercano al original: {original_vectors[indices[0][0]]}")
print(f"distancia del vector de búsqueda a este vector: {distances[0][0]}")
print(f"segundo vector más cercano al original: {original_vectors[indices[0][1]]}")
print(f"distancia del vector de búsqueda a este vector: {distances[0][1]}")
input query vector: [0 1]
closest vector from original: [0 1]
distance from query to this vector: 0.0
second closest vector from original: [1 1]
distance from query to this vector: 0.2928932309150696