Selbsthosting von Embeddings für DiscourseAI

Das Plugin Discourse AI verfügt über viele Funktionen, die Embeddings erfordern, wie z. B. verwandte Themen, KI-Suche, Vorschläge für KI-Helfer-Kategorien und -Tags usw. Obwohl Sie eine Drittanbieter-API verwenden können, wie z. B. API-Schlüssel für OpenAI konfigurieren, API-Schlüssel für Cloudflare Workers AI konfigurieren oder API-Schlüssel für Google Gemini konfigurieren, haben wir Discourse AI von Anfang an so entwickelt, dass es nicht an diese gebunden ist.

Ausführung mit HuggingFace TEI

HuggingFace bietet ein hervorragendes Container-Image, mit dem Sie schnell loslegen können.

Zum Beispiel:

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

Damit sollten Sie eine lokale Instanz von BAAI/bge-large-en-v1.5, einem sehr leistungsfähigen Open-Source-Modell, eingerichtet haben.

Sie können überprüfen, ob es funktioniert, mit

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

Dies sollte im Normalbetrieb ein Array von Gleitkommazahlen zurückgeben.

Verfügbarmachung für Ihre Discourse-Instanz

Meistens werden Sie dies aufgrund der GPU-Beschleunigung auf einem dedizierten Server ausführen. Wenn Sie dies tun, empfehle ich die Ausführung eines Reverse-Proxys, die TLS-Terminierung und die Sicherung des Endpunkts, sodass er nur von Ihrer Discourse-Instanz aufgerufen werden kann.

Konfiguration von DiscourseAI

Discourse AI enthält Website-Einstellungen zur Konfiguration des Inferenzservers für Open-Source-Modelle. Sie sollten ihn über den Tab “Embeddings” in den Admin-Einstellungen des KI-Plugins auf Ihren Server verweisen.

11 „Gefällt mir“

Sollte das Modell bge-m3 für mehrsprachige (oder nicht-englische) Websites funktionieren?

Ja, ich habe damit in der Woche gespielt, als es stillschweigend auf GitHub geteilt wurde, und es funktioniert gut. Ich warte immer noch darauf, wie es in den MTEB-Bestenlisten landet, da es dort, als ich das letzte Mal nachgesehen habe, nicht vorhanden war.

Das gesagt, wir haben große gehostete Discourse-Instanzen, die das mehrsprachige Plugin verwenden, das mitgeliefert wird, e5, und es leistet sehr gute Arbeit.

1 „Gefällt mir“

Danke, hatten Sie vor, Open-Source-Endpunkte für Embeds zu aktivieren? Ich versuche, diese Modelle auf Huggingface zu verwenden.

Entschuldigung, ich verstehe nicht, was Sie hier vermitteln wollen. Dieses Thema ist eine Anleitung zur Ausführung von Open-Source-Modellen für Discourse AI-Einbettungen.

Oh, entschuldigen Sie das. Ich versuche, ein Open-Source-Modell von HuggingFace über einen benutzerdefinierten Endpunkt zu verwenden, und ich frage mich, ob das möglich ist oder ob es in naher Zukunft geplant ist, dies zu ermöglichen :slight_smile:

Um zu überprüfen, ob es funktioniert, funktioniert der folgende Befehl für mich (mit dem Modell BAAI/bge-m3):

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

Übrigens können Sie auch die Swagger-Weboberfläche unter http://localhost:8081/docs/ verwenden.

2 „Gefällt mir“

Dies ist auch ein schöner Embeddings-Server:

1 „Gefällt mir“

Um Speicherplatz zu sparen, ist es möglich, quantisierte Embeddings zu verwenden? Ich möchte binär quantisierte Embeddings verwenden, um die Speichergröße wirklich zu reduzieren. Nach einigen Tests erziele ich eine Leistung von >90 % bei 32-facher geringerer Speicherung!

1 „Gefällt mir“

Wir speichern Embeddings standardmäßig mit halber Genauigkeit (halber Speicherplatz) und verwenden binäre Quantisierung für Indizes (32x kleiner) seit einigen Wochen. Ein einfaches Update Ihrer Website auf die neueste Version sollte daher eine deutliche Reduzierung des Festplattenspeicherbedarfs bewirken.

3 „Gefällt mir“

Könnten Sie bitte auch Folgendes hinzufügen:

zu den unterstützten Einbettungsmodellen?

Wir planen, Embeddings auf die gleiche Weise konfigurierbar zu machen wie LLMs, sodass bald jedes Modell kompatibel sein wird.

4 „Gefällt mir“

Wenn jemand anderes Probleme mit Endpunkten im lokalen Netzwerk hat, z. B. 192.168.x.x – es scheint, dass diese von Discourse blockiert werden (vermutlich aus Sicherheitsgründen) und die Blockierung umgangen werden muss. Ich habe Stunden damit verbracht, das herauszufinden!

1 „Gefällt mir“

@Falco das wäre großartig. In der Zwischenzeit, wenn ich versuchen wollte, ein neues Einbettungsmodell hinzuzufügen, muss ich nur Folgendes hinzufügen:

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

und lib/embeddings/vector_representations/base.rb ändern, um das neue Modell einzuschließen, oder gibt es noch etwas anderes, das ich ändern muss?

@Falco Ich habe mich daran versucht, das Modell hinzuzufügen und eine Pull-Anfrage gesendet. Entschuldigung, falls ich etwas falsch gemacht habe, da ich kein wirklicher SW-Entwickler bin. Ich hoffte, Sie könnten es vielleicht überprüfen und sehen, ob es für die Aufnahme in Frage kommt.

Leider konnte ich es nicht mit TEI zum Laufen bringen. Ich konnte das all-mpnet mit TEI zum Laufen bringen, aber ich glaube, etwas ist falsch mit dem, was ich getan habe, um mxbai zum Laufen zu bringen.

Übrigens, gibt es eine Chance, https://github.com/michaelfeil/infinity als Embedding-Server zu unterstützen?

EDIT: Ich sehe, dass das unübersichtlich wird, da die HNSW-Indizes in der Datenbank fest kodiert zu sein scheinen, sodass neue Modelle am Ende angehängt werden müssen, um die Reihenfolge nicht zu stören, und jedes neue Modell muss seinen eigenen Index hinzufügen.

Ich empfehle wirklich, ein paar Wochen zu warten, bis wir die Unterstützung für konfigurierbare Embeddings ausliefern.

Das sollte funktionieren, wenn wir konfigurierbare Embeddings ausliefern, aber aus Neugier, was würde das gegenüber GitHub - huggingface/text-embeddings-inference: A blazing fast inference solution for text embeddings models bringen?

Ich habe mich nicht mit TEI auf dem Laufenden gehalten und werde daher keine Vorteile erwähnen, die ich nicht kürzlich getestet habe, aber von den Dingen, die ich kürzlich gesehen habe:\n\n* Hardwareunterstützung: infinity hat eine bessere GPU-Unterstützung als TEI\n* infinity server kann mehrere Embedding-Modelle auf einem einzigen Server hosten (es sei denn, ich habe dies in TEI übersehen)\n\nEs ist sehr gut. Wenn Sie es noch nicht ausprobiert haben, sollten Sie es sich ansehen!

1 „Gefällt mir“

Ein Freund hat mir gerade diesen Thread per DM geschickt.

Einige Pro/Contra:

  • Infinity unterstützt Multi-Modal-Embeddings (aka Senden von Bildern/Audio)
  • AMD GPU-Unterstützung
  • Mehrere Modelle im selben Container unterstützt (Steuerung des Modells über den model-Parameter).
  • Mehr Datentypen, z. B. int8-Quantisierung der Gewichte (meist ist dies irrelevant, der Aktivierungsspeicher ist größer)
  • Neue Modelle erscheinen oft über “Custom Modeling Code”, der im Huggingface-Repository ausgeliefert wird. Infinity liest diesen PyTorch-Code bei Bedarf. Dies hilft Ihnen, wiederholte Anfragen nach “Können Sie XYZ-Modelle unterstützen” zu vermeiden.
  • Mehr unterstützte Modelle (z. B. debertav2 für Mixedbread)

Contra:

  • Die Startzeit von TEI ist besser
3 „Gefällt mir“

Hallo Michael :wave:

@roman war beschäftigt damit, unsere Embedding-Konfiguration umzustrukturieren unter:

Wir sollten sehr, sehr bald fertig sein, und sobald das erledigt ist, wird die Unterstützung für Infinity trivial sein.

Ich denke immer noch viel über Multi-Model-Embeddings nach, es gibt Ihnen eine Abkürzung, wenn Sie versuchen, RAG auf PDFs durchzuführen, da Sie es einfach in Bilder verarbeiten und jedes Bild einbetten, wodurch die Notwendigkeit von OCR oder teurem Bild-zu-Text, das von LLM angetrieben wird, vermieden wird.

Sobald wir diesen PR erledigt haben, werden wir mehr als glücklich sein, Infinity-Unterstützung (und Multi-Model-Unterstützung) in die Embedding-Konfiguration aufzunehmen.

Danke fürs Vorbeischauen :hugs:

4 „Gefällt mir“

Ich frage mich, ob die Implementierung von LiteLLM-Unterstützung eine Abkürzung darstellen könnte, da Sie dann von allen über LiteLLM unterstützten Modellen profitieren würden. Andere Projekte scheinen dies einzubetten.