Recreando el proyecto de fin de semana de Andrej Karpathy: un motor de búsqueda de películas |  de Leonie Monigatti |  noviembre de 2023

Para permitir búsqueda basada en palabras clave, puedes usar un .withBm25() consulta de búsqueda en las propiedades ['title', 'director', 'genres', 'actors', 'keywords', 'description', 'plot']. Puedes ceder la propiedad. 'title' un peso mayor especificando 'title^3'.

async function get_keyword_results(text) {
let data = await client.graphql
.get()
.withClassName('Movies')
.withBm25({query: text,
properties: ['title^3', 'director', 'genres', 'actors', 'keywords', 'description', 'plot'],
})
.withFields(['title', 'poster_link', 'genres', 'year', 'director', 'movie_id'])
.withLimit(num_movies)
.do()
.then(info => {
return info
})
.catch(err => {
console.error(err)
})
return data;
}

Para permitir búsqueda semántica, puedes usar un .withNearText() consulta de busqueda. Esto vectorizará automáticamente la consulta de búsqueda y recuperará sus películas más cercanas en el espacio vectorial.

async function get_semantic_results(text) {
let data = await client.graphql
.get()
.withClassName('Movies')
.withFields(['title', 'poster_link', 'genres', 'year', 'director', 'movie_id'])
.withNearText({concepts: [text]})
.withLimit(num_movies)
.do()
.then(info => {
return info
})
.catch(err => {
console.error(err)
});
return data;
}

Para permitir búsqueda híbrida, puedes usar un .withHybrid() consulta de busqueda. El alpha : 0.5 significa que la búsqueda de palabras clave y la búsqueda semántica tienen el mismo peso.

async function get_hybrid_results(text) {
let data = await client.graphql
.get()
.withClassName('Movies')
.withFields(['title', 'poster_link', 'genres', 'year', 'director', 'movie_id'])
.withHybrid({query: text, alpha: 0.5})
.withLimit(num_movies)
.do()
.then(info => {
return info
})
.catch(err => {
console.error(err)
});
return data;
}

Paso 3: obtenga recomendaciones de películas similares

Para obtener recomendaciones de películas similares, puede hacer una .withNearObject() consulta de búsqueda, como se muestra en la queries.js archivo. Al pasar la película idla consulta devuelve el num_movies = 20 películas más cercanas a la película dada en el espacio vectorial.

async function get_recommended_movies(mov_id) {
let data = await client.graphql
.get()
.withClassName('Movies')
.withFields(['title', 'genres', 'year', 'poster_link', 'movie_id'])
.withNearObject({id: mov_id})
.withLimit(20)
.do()
.then(info => {
return info;
})
.catch(err => {
console.error(err)
});
return data;
}

Paso 4: ejecuta la demostración

Finalmente, envuelva todo muy bien en una aplicación web con la icónica década de 2000. GeoCiudades estético (no voy a aburrirte con cosas del frontend) y ¡listo! ¡Estás listo!

Para ejecutar la demostración localmente, clone el repositorio de GitHub.

git clone git@github.com:weaviate-tutorials/awesome-moviate.git

Navegue hasta el directorio de la demostración y configure un entorno virtual.

python -m venv .venv             
source .venv/bin/activate

Asegurate que establezca las variables de entorno para su $OPENAI_API_KEY en su entorno virtual. Además, ejecute el siguiente comando en el directorio para instalar todas las dependencias necesarias en su entorno virtual.

pip install -r requirements.txt

A continuación, configure su OPENAI_API_KEY en el docker-compose.yml archivo y ejecute el siguiente comando para ejecutar Weaviate localmente a través de Docker.

docker compose up -d

Una vez que su instancia de Weaviate esté en funcionamiento, ejecute el add_data.py archivo para poblar su base de datos vectorial.

python add_data.py

Antes de poder ejecutar su aplicación, instale todos los módulos de nodo necesarios.

npm install

Finalmente, ejecute el siguiente comando para iniciar su aplicación de motor de búsqueda de películas localmente.

npm run start

Ahora navega hasta http://localhost:3000/ y comienza a jugar con tu aplicación.

Este artículo ha recreado el divertido proyecto de fin de semana de Andrej Karpathy de un motor de búsqueda/sistema de recomendación de películas. A continuación podéis ver un breve vídeo del acabado. demo en vivo:

Demostración en vivo en https://awesome-moviate.weaviate.io/

A diferencia del proyecto original, este proyecto utiliza una base de datos vectorial para almacenar las incrustaciones. Además, la funcionalidad de búsqueda se amplió para permitir también búsquedas semánticas e híbridas.

Si juegas con él, notarás que no es perfecto, pero tal como ha dicho Karpathy:

“Funciona ~ está bien, tengo que ajustarlo un poco más”.

Puedes encontrar el código fuente abierto del proyecto en GitHub y modifíquelo si lo desea. Algunas sugerencias para futuras mejoras podrían ser jugar con la vectorización de diferentes propiedades, ajustar la ponderación entre la búsqueda de palabras clave y la búsqueda semántica o cambiar el modelo de incrustación con una alternativa de código abierto.

Suscríbete gratis para recibir una notificación cuando publique una nueva historia.

Encuéntrame en LinkedIn, Gorjeoy Kaggle!