npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

karibou-mlx

v1.2.10

Published

Use machine learning to get a better «friction less» user experience with karibou.ch

Downloads

148

Readme

Objectif

L'objectif d'un index est de produire des listes d'identifiants de produits (SKU) à très faible coût (CPU+MEM) qui match les besoins du clients. Quelques exemples de listes:

  • Les produits préférés d'un utilisateur.
  • Les produits de saison.
  • Les produits similaires.
  • Les produits d'une catégorie.
  • Les produits d'une thématique.
  • Les produits d'un commerçants.
  • Les produits d'un marché.
  • Les produits associés à une phrase.

Motivation

Produire des listes de produits de manière efficace (faible mémoire utilisée) et rapide (<50ms) est un élément important pour karibou.ch. Nous devons déléguer ce travail de l'application principale (karibou-api).

Specifications

1. Calcul du score d'un produit

Le score d'un produit est le résultat d'une fonction des achats dans le temps. Nous devons créer une liste des meilleurs produits selon les critères suivants.

  1. un produit souvent acheté dans le présent est très valorisé
  2. un produit acheté en petite quantité mais régulièrement est très valorisé
  3. un nouveau produit ou un produit de saison activé est très valorisé
  4. un produit souvent acheté dans le passé est moyennement valorisé
  5. un produit acheté en grande quantité une sur une commandes est moyennement valorisé

Note: Il faut prendre en compte le contexte lors de la génération d'une liste. Il faut pouvoir contraindre les données avec les commercants actifs d'un marché spécifique.

Apprentissage.

La fréquence d'achat du produit est une mesure de l'importance du produit dans l'ensemble des commandes d'un client. Elle vise à donner un poids plus important aux produits les plus fréquents, considérés comme plus discriminants.

  • Ensemble des utilisateurs {u} de 1 à N
    • contient les clients, les groupes de clients et l'utilisateur Anonymous
  • Ensemble des produits {p} de 1 à N
  • Ensemble des commandes {o} de 1 à N
  • Le nombre de commande oFreq pour un utilisateur
  • Le nombre de commandes pFreq où le produit apparaît
  • Il faut extraire les scores min/max/avg par catégories
 score =  log(attenuation * prodFreq) * prodOrders/(UserOrders+1)
  1. Model: on créé une MATRIX constituée de N lignes (utilisateurs) et M colonne (produits)
  2. Learn: on modifie notre MATRIX (produits (M) + utilisateurs (N)) avec la somme des quantités commandées dans l'historique des cmd.
  3. Score: on calcul un score pour chaque produit avec la formule précédente
  4. Mitigation: le score est attenué/amplifié en fonction du contexte de la commande

Création d'un index pour l'utilisateur Anonymous

On considère un index qui appartient à un utilisateur neutre Anonymous. Le score normalisé des produits de l'utilisateur Anonymous est le score pondéré par l'ensemble des utilisateurs. La liste des produits associée a l'utilisateur anonymous est aussi utilisée pour compléter une proposition pour un utilisateur qui n'a pas passé sufisament de commandes.

boost

On peut appliquer un boost (un facteur d'amplification) au score d'un produit pour différente situations.

  1. lorsque l'utilisateur n'a pas encore passé de commande
  2. lorsque qu'il y a un nouveau produit qui n'a pas été commandé
  3. Lorsqu'un produit est en promotion.

Note: les constantes sont à determiner et à valider

l'intérêt d'un produit s'estompe en fonction du temps

  • un produit de saison acheté récemment ~3 doit être valorisé
  • un produit perd de son intéret dans le temps jusqu'à ~ 24 mois =>
  • On doit pouvoir représenter la courbe idéale pour effectuer des tests et déterminer les bons paramêtes :fire:
 attenuation = 1 / ( timeInMonth + 0.9)^1 x 1.8 + 0.1 

Note: les constantes sont à determiner et à valider

image

Normalisation des scores entres les différents marchés

Lorsque l'on créé un nouveau marché composé de nouvelles boutiques et de boutiques d'un autre marché, les scores des produits doivent rester cohérents.

  1. On utilise les valeurs min/max/avg de chaque catégories pour déterminer les scores initiaux d'un nouveau marchés .

Penalties

La valeur subjective d'un produit est corrélée avec celle de son score. Cependant il est possible que soudainement un produit apprecié génère de l'insatisfaction (par exemple en fin de saison le produit perd un peu de sa qualité). Dans ce cas, nous proposons d'introduire une pénalité relative au nombre d'insatisfaction qui atténu la valeur du score. Cette atténuation s'estompe également avec le temps. Exemple de problème qui atténu la valeur d'un score:

  • plusieurs clients on manifestés un problème avec un même produit (ex. avocat pas assez mûr)
  • des clients n'ont pas ressus des produits commandés (mauvaise gestion des stocks)

2. Création d'un espace vectoriel (par utilisateur) pour remplacer le score

L'intégration des techniques d'apprentissage automatique et l'analyse des vecteurs d'embedding peuvent considérablement améliorer la pertinence des recommandations. Et comme depuis peu, la possibilité de créer un espace-vertoriel à N dim (1536) pour chaque produit est ultra-simplifié, nous souhaitons transformer karibou-api en un esemble d'espaces de vecteurs à 1536 dim afin de capturer des nuances plus subtiles dans les préférences des utilisateurs.

  • trouver des similarité entre produits.
  • trouver les produits associés à un text

Pour l'Index des vecteurs, nous avons plusieurs options

Models

On peut soit utiliser un modèle standard, soit utiliser un modèle fine-tuned, soit utiliser le modèle standard text-embedding-ada-002

Liens*

  • https://naturalnode.github.io/natural/ (TF-idf, Stemmers, Token, Bayes, ...)
  • https://github.com/koursaros-ai/nboost (state-of-the-art models to improve the relevance of search results)
  • https://github.com/nmslib/hnswlib (C++ nearest neighbor search)
  • https://qdrant.tech/ (the fastest vector db. also used by openai)
  • https://github.com/neuml/txtai (sqlite vector search)
  • https://github.com/asg017/sqlite-vss (sqlite vector search)

Autres

  • https://en.wikipedia.org/wiki/Vector_space_model

  • https://en.wikipedia.org/wiki/Cosine_similarity

  • https://world.openfoodfacts.org/categories

  • https://www.npmjs.com/package/stopword

  • https://fr.wikipedia.org/wiki/TF-IDF

  • https://www.desmos.com/calculator/3yogioggkp?lang=fr