Autohosting di Embeddings per DiscourseAI

Il plugin Discourse AI dispone di molte funzionalità che richiedono gli embedding per funzionare, come Argomenti Correlati, Ricerca AI, Suggerimento Categoria e Tag AI, ecc. Sebbene sia possibile utilizzare un’API di terze parti, come Configura chiavi API per OpenAI, Configura chiavi API per Cloudflare Workers AI o Configura chiavi API per Google Gemini, abbiamo creato Discourse AI fin dal primo giorno per non essere vincolati a queste.

Esecuzione con HuggingFace TEI

HuggingFace fornisce un’ottima immagine container che ti permette di essere operativo rapidamente.

Ad esempio:

mkd ir -p /opt/tei-cache
docker run --rm --gpus all --shm-size 1g -p 8081:80 \
  -v /opt/tei-cache:/data \
  ghcr.io/huggingface/text-embeddings-inference:latest \
  --model-id BAAI/bge-large-en-v1.5

Questo dovrebbe metterti in funzione con un’istanza locale di BAAI/bge-large-en-v1.5, un modello open-source con prestazioni molto buone.
Puoi verificare se funziona con

curl http://localhost:8081/ \
    -X POST \
    -H 'Content-Type: application/json' \
    "{ \"inputs\": \"Testing string for embeddings\" }"

che dovrebbe restituire un array di float in condizioni operative normali.

Rendilo disponibile per la tua istanza Discourse

Nella maggior parte dei casi, lo eseguirai su un server dedicato a causa dell’accelerazione GPU. Quando lo fai, consiglio di eseguire un reverse proxy, eseguire la terminazione TLS e proteggere l’endpoint in modo che possa essere connesso solo dalla tua istanza Discourse.

Configurazione di DiscourseAI

Discourse AI include impostazioni del sito per configurare il server di inferenza per i modelli open-source. Dovresti puntarlo al tuo server utilizzando la scheda Embedding nelle impostazioni di amministrazione del plugin AI.

11 Mi Piace

Il modello bge-m3 dovrebbe funzionare per siti multilingue (o non in inglese)?

Sì, ci ho giocato la settimana in cui è stato condiviso silenziosamente su GitHub e funziona bene. Sto ancora aspettando di vedere come si posizionerà nelle classifiche MTEB, dato che non c’era l’ultima volta che ho controllato.

Detto questo, abbiamo grandi istanze Discourse ospitate che utilizzano il plugin multilingue che viene fornito, e5, e funziona molto bene.

1 Mi Piace

Grazie, avevate in programma di abilitare endpoint personalizzati open-source per gli embed? Sto cercando di utilizzare questi modelli su Huggingface.

Mi dispiace, non capisco cosa stai cercando di comunicare qui. Questo argomento è una guida su come eseguire modelli open-source per gli embedding di Discourse AI.

Oh, mi dispiace. Sto cercando di usare un modello open-source da HuggingFace con un endpoint personalizzato e mi chiedo se sia possibile o se sia previsto per il prossimo futuro :slight_smile:

Per verificare che funzioni, il seguente comando funziona per me (con il modello BAAI/bge-m3):

curl -X 'POST' \
  'http://localhost:8081/embed' \
  -H 'Content-Type: application/json' \
  -d '{ "inputs": "Testing string for embeddings"}'

Tra l’altro, puoi anche usare l’interfaccia web di Swagger su http://localhost:8081/docs/.

2 Mi Piace

Questo è anche un bel server di embedding:

1 Mi Piace

Per risparmiare spazio, è possibile utilizzare embedding quantizzati? Vorrei utilizzare embedding quantizzati binari per ridurre davvero le dimensioni di archiviazione. Avendo fatto alcuni test, ottengo prestazioni superiori al 90% con uno spazio di archiviazione 32 volte inferiore!

1 Mi Piace

Stiamo memorizzando gli embedding utilizzando la precisione dimezzata (metà spazio di archiviazione) e utilizzando la quantizzazione binaria per gli indici (32 volte più piccoli) per impostazione predefinita da alcune settimane, quindi aggiornare il tuo sito all’ultima versione dovrebbe ridurre notevolmente l’utilizzo del disco.

3 Mi Piace

Potresti anche aggiungere:

ai modelli di embedding supportati?

Prevediamo di rendere gli embedding configurabili allo stesso modo in cui abbiamo fatto con gli LLM, quindi presto qualsiasi modello sarà compatibile.

4 Mi Piace

Se qualcun altro ha problemi con gli endpoint sulla rete locale, ad esempio 192.168.x.x, sembra che questi siano bloccati da Discourse (presumibilmente per motivi di sicurezza) e che il blocco debba essere aggirato. Ho perso qualche ora per capirlo!

1 Mi Piace

@Falco sarebbe fantastico. Nel frattempo, se volessi provare ad aggiungere un nuovo modello di embedding, devo solo aggiungere:

 lib/embeddings/vector_representations/mxbai-embed-xsmall-v1.rb
 lib/tokenizer/mxbai-embed-xsmall-v1.rb
 tokenizers/mxbai-embed-xsmall-v1.json

e modificare lib/embeddings/vector_representations/base.rb per includere il nuovo modello, o c’è qualcos’altro che devo cambiare?

@Falco Ho provato ad aggiungere il modello e ho inviato una pull request. Mi scuso se ho fatto qualcosa di sbagliato, dato che non sono un vero sviluppatore SW. Speravo che potessi dargli un’occhiata e vedere se va bene per l’inclusione.

Sfortunatamente, non sono riuscito a farlo funzionare con TEI. Sono riuscito a far funzionare all-mpnet con TEI, ma penso che ci sia qualcosa di sbagliato in quello che ho fatto per far funzionare mxbai.

A proposito, c’è qualche possibilità di supportare https://github.com/michaelfeil/infinity come server di embedding?

EDIT: Vedo che questo sarà complicato poiché gli indici HNSW nel database sembrano essere codificati in modo fisso, quindi i nuovi modelli devono essere aggiunti alla fine per evitare di interrompere l’ordinamento e ogni nuovo modello deve aggiungere il proprio indice.

Ti raccomando vivamente di aspettare un paio di settimane finché non spediremo il supporto per gli embedding configurabili.

Questo dovrebbe funzionare bene quando spediremo gli embedding configurabili, ma per curiosità cosa porterebbe rispetto a GitHub - huggingface/text-embeddings-inference: A blazing fast inference solution for text embeddings models?

Non mi sono aggiornato su TEI, quindi non menzionerò i vantaggi che non ho testato di recente, ma tra le cose che ho visto di recente:

  • Supporto hardware: infinity ha un supporto GPU migliore di TEI
  • Il server infinity può ospitare più modelli di embedding su un singolo server (a meno che non mi sia sfuggito questo in TEI)

È molto bello. Se non l’hai provato, dovresti dargli un’occhiata!

1 Mi Piace

Un amico mi ha appena inviato questo thread tramite DM.

Pro/Contro:

  • infinity supporta embedding multimodali (ovvero invia immagini/audio) a
  • supporto GPU AMD
  • più modelli supportati nello stesso container (controlla il modello tramite il parametro model).
  • più dtypes, ad esempio quantizzazione int8 dei pesi (principalmente questo è irrilevante, la memoria di attivazione è maggiore)
  • nuovi modelli spesso escono tramite “codice di modellazione personalizzato” spedito nel repository huggingface. Infinity legge questo codice pytorch se necessario. Questo ti aiuterà ad evitare la richiesta “puoi supportare modelli xyz” su base continuativa)
  • più modelli supportati (ad esempio debertav2 per mixedbread)

Contro:

  • il tempo di avvio a freddo di TEI è migliore
3 Mi Piace

Ciao Michael :wave:

@roman è stato impegnato a ristrutturare la nostra configurazione di embedding su:

Dovremmo finire molto, molto presto, una volta fatto questo, aggiungere il supporto per infinity dovrebbe essere banale.

Penso ancora molto all’embedding multimodale, ti dà una scorciatoia quando cerchi di fare RAG su PDF perché lo elabori semplicemente in immagini e incorpori ogni immagine evitando la necessità di OCR o costosi strumenti da immagine a testo basati su LLM.

Una volta che avremo completato questa PR, saremo più che felici di aggiungere il supporto infinity (e il supporto multimodale) alla configurazione di embedding.

Grazie per essere passato :hugs:

4 Mi Piace

Mi chiedo se la creazione del supporto litellm possa offrire una scorciatoia, poiché si beneficia di tutti i modelli supportati tramite litellm. Altri progetti sembrano incorporarlo.