eXplorer web corner

Sulle IA, il loro uso personale e Khoj - un RANTolo

Un po' di tempo fa, curioso come al solito, ho provato quel che allora era un nuovo progetto, Khoj, un wrapper a LLAMA (LLM aperto by Meta) per l'uso su basi di dati (documenti, note) personali. Rimasi deluso ma ero comunque curioso di provare come sono evoluti e l'ho provato sulle mie note, che sono a mio avviso un ottimo candidato, poiché tengo circa tutta la mia vita digitale in org-mode, via org-roam avviando in Emacs i miei desktop (grazie a EXWM). Le note contengono dalla definizione dell'OS (NixOS, la cui config è tangle-ata come quasi ogni altra configurazione testuale che abbia) sino alle finanze personali (Beancount via beancount-mode) passando per tutti i miei files allegati come org-attach in una root separata dalle note e annotati variamente in org-mode. Per farla breve una base eterogenea di informazione puramente testuale comoda da mangiare per qualsiasi software e vasta abbastanza da pensare di usarla con un LLM in mezzo.

Beh… No, ad oggi i risultati restano assai deludenti al punto che l'accesso diretto via org-roam-node-find piuttosto che la ricerca full-text diretta via counsel-rg (wrapper a ripgrep con risultati "as-you-type" accessibili via Emacs) non è solo semplice (zero setup, niente indicizzazione preventiva) e veloce, ma è anche usabile mentre gli LLM non lo sono ancora.

il setup NixOS

Siccome la versione di Khoj impacchettata nei Nixpkgs è vecchiotta (cosa rara in NixOS, è la distro mediamente più aggiornata con Guix System stando a Repology, ma probabilmente dovuta allo scarso uso pratico di questo progetto) ho fatto un test al volo ovvero:

  • scelto dove metterlo mkdir /tmp/khoj
  • creato l'ambiente FHS per farlo andare via default.nix
{ pkgs ? import <nixpkgs> {} }:

let fhs = pkgs.buildFHSUserEnv {
  name = "fhs-env";
  targetPkgs = pkgs: with pkgs; [
    stdenv.cc.cc.lib gcc gcc_multi
    ];
  multiPkgs = pkgs: with pkgs;
    [
      cmake
      libgcc
      llama-cpp
      python311Packages.cmake
      python311Packages.ninja
      python311Packages.pytz
      python311Packages.wheel
    ];
  runScript = "bash";
  profile = ''
    export FSH_ENV='1'
  '';
};
in pkgs.stdenv.mkDerivation {
  name = "fhs-env-shell";
  nativeBuildInputs = [ fhs ];
  shellHook = "exec fhs-env";
}

visto che direttamente via pip come quasi ogni progetto ML pythonico con dipendenze compilate non va… Serve al volo

python -m venv venv ; cd venv; source bin/activate
pip install --upgrade pip
CMAKE_ARGS="DLLAMA_CUDA=on" FORCE_CMAKE=1 pip install khoj-assistant

Ove le variabili sono per supportare CUDA visto che ho un'nvidia adatta. Ah, si, adesso vuole anche nientemeno che PostreSQL, no, non basta SQLite. e vuole pure una di lui estensione, pgvector, che per fortuna è già nei pks, quindi il lavoro è poco.

postgresql = {
  enable = true;
  extraPlugins = with pkgs.postgresql_15.pkgs; [ pgvector ];
  package = pkgs.postgresql_15;
}; # postgresql

Alché, visto che pare Khoj non ci sia uno script per far utente e DB

su - postgres
psql
 create user khoj with password 'ScegliQualcosa';
 create database khoj;
 grant all privileges on database khoj to khoj;
 ALTER DATABASE khoj OWNER TO khoj;
 exit

Oh, ho anche scordato pgvector

psql khoj
create extension vector;
alter role khoj superuser; # solo per il setup
exit

alché nella nix-shell ad pyenv attivato

export POSTGRES_USER=khoj
export POSTGRES_PASSWORD='ScegliQualcosa'
export POSTGRES_DB=khoj

# queste saranno le credenziali della WebUI amministrativa
export KHOJ_ADMIN_EMAIL="khojadmin@invalid.tld"
export KHOJ_ADMIN_PASSWORD="grumbleMumble"

# --anonymous-mode per non doversi loggare via SSO Google!
khoj --anonymous-mode

Ed ecco la scoperta, le versioni recenti non han più khoj.yml per scegliere modello, files da indicizzare ecc, è spostato nel client, quindi si dovrebbe anche configurare un client.

Siccome almeno la WebUI supporta l'upload di un singolo file da indicizzare

cat ~/org/**/*.org >>| /tmp/khoj/noteunite.org

ed ecco che passato il mega-file Khoj auto-scarica Hermes-2-Pro-Mistral-7B.Q4_K_M.gguf (4.37Gb, portando la root /tmp/khoj a 4.4Gb + 15Mb del DB PostreSQL giusto per un test stile hello world…), alcuni problemi CUDA a parte (conda li risolve) ottengo…

risultati

Davvero limitati risultati, ben lenti tra l'altro pur se su una Nvidia RTX 3060 con 12Gb di vram e 64Gb di ram di sistema, decisamente inferiori ad una semplice ripgreppata nelle note…

Provando qualche .pdf non è che migliori, certo offre qualcosa che gli strumenti classici non offrono, ad es. per i documenti pdf and co, dove potremmo usare Recoll (un frontend CLI e GUI Gtk a Xapian) od un diretto rga più lento di Recoll, ma senza indice da fare né setup alcuno e certo ben più rapido e parco di risorse di Khoj…

Si, un LLM può "rispondere" mentre soluzioni classiche vanno a parole chiave, regexp, logica booleana al massimo, ma al netto dei risultati… Sono circa inusabili a livello personale/aziendale e a livello gigante, avendo ad es. provato ChatGPT posso dire che saran forse utili a chi non sa usare strumenti IT e marginalmente nel fingere una ricerca semantica che non c'è davvero in alcuni casi, ma non me ne vogliono gli sviluppatori che comunque han tirato fuori dal cappello soluzioni impressionanti, la realtà è ben bene al di sotto della pubblicità e il grosso di quel che è pubblico appare scritto in "Silicon Valley Mode", che è di suo una vulnerabilità ed un ostacolo all'innovazione.

Forse tra 10 anni avremo risultati interessanti davvero, come quelli che oggi la pubblicità millanta per possibili già ora, ma per ora…