~/ / KI-Artikel / Lokale LLMs auf einem VPS / Ollama-Embeddings in PostgreSQL mit pgvector speichern und durchsuchen
Ollama-Embeddings in PostgreSQL mit pgvector speichern und durchsuchen
Embeddings aus dem Endpunkt /api/embed von Ollama sind für die Suche erst nützlich, wenn sie irgendwo gespeichert sind. pgvector ist eine Open-Source-Erweiterung, die PostgreSQL um die Ähnlichkeitssuche für Vektoren ergänzt. So können die Vektoren auf demselben Server in derselben Datenbank liegen wie die Texte und Ihre übrigen Daten. Dieser Artikel behandelt die Installation, das Anlegen der Tabelle, die Wahl des Abstands und des Index sowie die Einstellungen, die die Ergebnisse verändern, auf Grundlage der pgvector-README für Version 0.8.7. Danach übergibt er die Suchergebnisse an /api/chat von Ollama, damit die Antwort ihre Quellen nennt, und prüft diese Zitate. Wir haben das SQL mit pgvector 0.8.7 und PostgreSQL 16 ausgeführt, mit echten Vektoren von Ollama, und die Chat-Anfragen mit Ollama 0.40.11 und qwen2.5:7b. Vier Tools auf dieser Seite schreiben das SQL und die Anfrage und prüfen die Antwort in Ihrem Browser.
Veröffentlicht: · 10 Min. Lesezeit · Die Angaben wurden am 2026-11-05 mit der pgvector-README und dem Quellcode für Version 0.8.7 sowie mit der Dokumentation und dem Quellcode von Ollama (0.40.11) abgeglichen. Prüfen Sie die aktuelle Dokumentation, bevor Sie sich darauf verlassen.
Was pgvector zu PostgreSQL hinzufügt
Die pgvector-README beschreibt die Erweiterung als Open-Source-Ähnlichkeitssuche für Vektoren in Postgres. Sie unterstützt die exakte und die approximative Suche nach nächsten Nachbarn; Vektoren mit einfacher Genauigkeit, halber Genauigkeit sowie binäre und dünnbesetzte Vektoren; und L2-Abstand, Skalarprodukt, Kosinus-Abstand, L1-Abstand, Hamming-Abstand und Jaccard-Abstand. Da die Vektoren gewöhnliche PostgreSQL-Spalten sind, profitieren sie auch von ACID-Konformität, Point-in-Time-Recovery und JOINs.
Für eine Suche in Ihren Dokumenten speichern Sie pro Textabschnitt eine Zeile mit dem Text und seinem Vektor, erzeugen das Embedding der Frage mit demselben Modell und sortieren die Zeilen nach ihrem Abstand zum Vektor der Frage.
Installation
pgvector unterstützt PostgreSQL 13 und neuer. Die README nennt mehrere Installationswege, darunter diese:
| Methode | Was die README sagt |
|---|---|
| Aus dem Quellcode bauen | git clone --branch v0.8.7, dann make und make install (eventuell mit sudo) |
| Docker | Das Image pgvector/pgvector fügt dem Postgres-Image pgvector hinzu. Tags wie pg18-trixie oder 0.8.7-pg16 legen die Postgres-Version fest. |
| APT (Debian, Ubuntu) | sudo apt install postgresql-18-pgvector aus dem PostgreSQL-APT-Repository, wobei 18 durch Ihre Postgres-Version ersetzt wird |
| Homebrew | brew install pgvector, das pgvector nur zu den Formeln postgresql@18 und postgresql@17 hinzufügt |
Aktivieren Sie die Erweiterung danach einmal in jeder Datenbank, in der Sie sie verwenden möchten, mit CREATE EXTENSION vector;. Für diesen Artikel haben wir das Docker-Image pgvector/pgvector:0.8.7-pg16 verwendet.
Die Tabelle anlegen
Eine Spalte vom Typ vector(n) enthält Vektoren mit genau n Dimensionen, und n muss der Länge der Vektoren Ihres Embedding-Modells entsprechen. Ein Vektor mit anderer Länge wird abgelehnt: Als wir einen Vektor mit 2 Dimensionen in eine Spalte vector(3) einfügten, gab PostgreSQL "expected 3 dimensions, not 2" zurück. all-minilm liefert 384 Dimensionen, seine Spalte ist also vector(384).
Die README gibt den Speicherbedarf jedes Vektors mit 4 × Dimensionen + 8 Bytes an, wobei jedes Element eine Gleitkommazahl mit einfacher Genauigkeit ist, und erlaubt bis zu 16,000 Dimensionen in einer Spalte. Ein Index unterstützt weniger Dimensionen, wie unten gezeigt. Der Typ halfvec speichert Werte mit halber Genauigkeit in 2 × Dimensionen + 8 Bytes.
| Dimensionen | vector | halfvec |
|---|---|---|
| 384 | 1,544 Bytes | 776 Bytes |
| 768 | 3,080 Bytes | 1,544 Bytes |
| 1024 | 4,104 Bytes | 2,056 Bytes |
In unserer Testtabelle ergab pg_column_size 1,544 Bytes für vector(384) und 776 Bytes für halfvec(384), passend zur Formel. Das gilt nur für den Vektor; die Textspalte und die Indizes benötigen zusätzlichen Platz.
Die Vektoren von Ollama laden
pgvector liest einen Vektor als Text in eckigen Klammern, etwa '[1,2,3]', und die README sagt, dass alle Elemente endlich sein müssen (kein NaN, Infinity oder -Infinity). Jedes Array im Feld embeddings einer Antwort von /api/embed hat bereits diese Form, und die Antwort behält die Reihenfolge der Eingabe bei, der erste Text gehört also zum ersten Vektor.
Die README zeigt INSERT für einige Zeilen, INSERT … ON CONFLICT für Upserts und COPY für das Massenladen. Der Konverter unten ordnet Ihre Texte der Antwort zu und schreibt INSERT-Anweisungen mit maskierten Anführungszeichen. Wir haben seine Ausgabe mit Texten ausgeführt, die Anführungszeichen, Backslashes, Zeilenumbrüche und Emoji enthielten, und sie kamen unverändert zurück.
Ausprobieren: Embeddings to pgvector INSERT
Das Beispiel verwendet erfundene Vektoren der Länge 1 mit 4 Dimensionen, damit Sie sie lesen können. Echte Embeddings haben Hunderte oder Tausende Dimensionen.
3 Zeilen mit 4 Dimensionen. Texte gelesen als der Anfrage-Body für /api/embed, Vektoren als eine Antwort von Ollama /api/embed.
INSERT-Anweisungen
Führen Sie es in psql oder einem anderen Client aus. Die Zeilen werden in einer Transaktion eingefügt.
BEGIN;
INSERT INTO documents (content, embedding) VALUES
('Embeddings turn text into numeric vectors.', '[0.620186,0.410123,0.550165,0.380114]'),
('pgvector stores vectors in PostgreSQL, next to the rest of your data.', '[0.578815,0.469039,0.518937,0.419142]'),
('Ollama''s /api/embed returns one vector per input, in the same order.', '[0.119982,0.809879,-0.329951,0.46993]');
COMMIT;Vektorformat aus der pgvector-README, am 2026-11-04 mit pgvector 0.8.7 geprüft. pgvector README
Alles geschieht in Ihrem Browser. Das Tool schreibt SQL und verbindet sich mit nichts.
Den Abstand wählen
Die Dokumentation von Ollama empfiehlt für die meisten Anwendungsfälle der semantischen Suche die Kosinus-Ähnlichkeit und sagt, dass /api/embed Vektoren mit der Länge 1 zurückgibt. Für solche Vektoren bringen Kosinus-Abstand, L2-Abstand und Skalarprodukt die Zeilen in dieselbe Reihenfolge, weil der quadrierte L2-Abstand 2 minus 2 mal die Kosinus-Ähnlichkeit ist. In unserem Test mit all-minilm waren die obersten drei Zeilen bei allen dreien gleich, und der L2-Abstand von 0.931 passte zur Kosinus-Ähnlichkeit von 0.566.
Jeder Abstand hat seinen eigenen Operator. Eine Suche sortiert nach dem Operator und nimmt mit LIMIT die ersten Zeilen, und ein Index wird für eine Operatorklasse gebaut.
| Operator | Liefert | Operatorklasse des Index |
|---|---|---|
| <=> | Kosinus-Abstand. Die Kosinus-Ähnlichkeit ist 1 - (a <=> b). | vector_cosine_ops |
| <-> | L2-Abstand (euklidischer Abstand) | vector_l2_ops |
| <#> | Das negative Skalarprodukt. Mit -1 multiplizieren, um das Skalarprodukt zu erhalten. | vector_ip_ops |
| <+> | L1-Abstand | vector_l1_ops |
Die README erklärt, dass <#> das negative Skalarprodukt liefert, weil Postgres bei Operatoren nur Indexscans in ASC-Reihenfolge unterstützt. Für halfvec heißen die Operatorklassen halfvec_cosine_ops, halfvec_l2_ops und so weiter.
Exakte Suche oder ein Index
Ohne Index führt pgvector eine exakte Suche nach nächsten Nachbarn durch, die laut README einen perfekten Recall liefert. Ein approximativer Index tauscht etwas Recall gegen Geschwindigkeit, und die README warnt, dass Abfragen nach dem Hinzufügen eines Index andere Ergebnisse liefern können.
Ein Index wird nur verwendet, wenn die Abfrage ORDER BY und LIMIT enthält und das ORDER BY der Abstandsoperator selbst in aufsteigender Reihenfolge ist. ORDER BY embedding <=> $1 LIMIT 5 kann den Index nutzen; ORDER BY 1 - (embedding <=> $1) DESC kann es nicht. Die README merkt außerdem an, dass ein Table Scan bei kleinen Tabellen schneller sein kann.
| Punkt | HNSW | IVFFlat |
|---|---|---|
| Funktionsweise | Ein Graph aus mehreren Schichten | Teilt die Vektoren in Listen auf und durchsucht die Listen, die der Abfrage am nächsten liegen |
| Im Vergleich zum anderen | Besserer Kompromiss zwischen Geschwindigkeit und Recall, aber langsamer zu bauen und mit höherem Speicherbedarf | Schneller zu bauen und mit geringerem Speicherbedarf, aber ein schlechterer Kompromiss zwischen Geschwindigkeit und Recall |
| Wann man ihn anlegt | Kann auf einer leeren Tabelle angelegt werden (kein Trainingsschritt) | Nachdem die Tabelle einige Daten enthält |
| Optionen beim Bauen | m (standardmäßig 16) und ef_construction (standardmäßig 64) | lists: mit rows / 1000 beginnen bis 1M Zeilen, darüber mit sqrt(rows) |
| Option bei der Suche | hnsw.ef_search, standardmäßig 40 | ivfflat.probes, standardmäßig 1; mit sqrt(lists) beginnen |
| Dimensionen | vector bis 2,000, halfvec bis 4,000 | vector bis 2,000, halfvec bis 4,000 |
Mit pgvector 0.8.7 haben wir außerdem bestätigt, dass eine Spalte vector(2001) keinen HNSW-Index haben kann, dass IVFFlat keine Operatorklasse für den L1-Abstand hat und dass ef_construction mindestens 2 × m betragen muss. Für mehr Dimensionen nennt die FAQ der README halfvec, binäre Quantisierung und weitere Möglichkeiten.
Ausprobieren: pgvector SQL Builder
Jeder Vektor belegt 1,544 Bytes, daher belegen 10,000 Zeilen allein für die Vektoren etwa 15.4 MB (Indizes und andere Spalten nicht eingerechnet).
1. Erweiterung und Tabelle
CREATE EXTENSION IF NOT EXISTS vector; CREATE TABLE documents ( id bigserial PRIMARY KEY, content text NOT NULL, embedding vector(384) NOT NULL );
2. Index
CREATE INDEX ON documents USING hnsw (embedding vector_cosine_ops) WITH (m = 16, ef_construction = 64);
3. Suche
PREPARE erwartet den Vektor der Frage aus /api/embed als $1. Übergeben Sie ihn als Text, etwa '[0.01,-0.02,…]'.
PREPARE search_documents(vector(384)) AS
SELECT id, content, 1 - (embedding <=> $1) AS cosine_similarity
FROM documents
ORDER BY embedding <=> $1
LIMIT 5;
-- EXECUTE search_documents('[0.0123, -0.0456, ...]');Grenzen und Standardwerte aus der pgvector-0.8.7-README und dem Quellcode, geprüft am 2026-11-04. pgvector README
Alles geschieht in Ihrem Browser. Das Tool schreibt SQL und verbindet sich mit nichts.
Warum eine Suche weniger Zeilen als LIMIT liefern kann
Bei HNSW werden die Ergebnisse durch hnsw.ef_search begrenzt, standardmäßig 40. Auf einer Testtabelle mit 200 Zeilen und einem HNSW-Index lieferte LIMIT 100 nur 40 Zeilen; nach SET hnsw.ef_search = 100 waren es 100. Setzen Sie hnsw.ef_search mindestens auf die Anzahl der Zeilen, die Sie brauchen. SET LOCAL innerhalb einer Transaktion ändert den Wert nur für eine einzelne Abfrage.
Auch Filter verringern die Ergebnisse. Bei approximativen Indizes wird laut README die WHERE-Bedingung angewendet, nachdem der Index durchsucht wurde: Wenn eine Bedingung auf 10% der Zeilen zutrifft, liefert HNSW mit dem Standardwert 40 für hnsw.ef_search im Durchschnitt nur 4 Zeilen. Seit Version 0.8.0 durchsuchen iterative Indexscans (SET hnsw.iterative_scan = strict_order oder relaxed_order) mehr vom Index, bis genug Zeilen gefunden sind, höchstens jedoch hnsw.max_scan_tuples (standardmäßig 20,000).
Die README fügt hinzu, dass NULL-Vektoren nicht indiziert werden, ebenso wenig Nullvektoren beim Kosinus-Abstand.
Die Ergebnisse mit nummerierten Quellen an /api/chat übergeben
Wenn die Suche die nächsten Zeilen liefert, braucht das Modell sie in seinem Prompt. /api/chat von Ollama nimmt eine Liste von Nachrichten entgegen, jede mit einer Rolle (system, user, assistant oder tool) und ihrem content. Ein einfacher Aufbau ist eine system-Nachricht mit den Regeln und eine user-Nachricht, die die Zeilen mit jeweils einer Nummer auflistet, etwa [1] und [2], gefolgt von der Frage. Mit Nummern kann die Antwort angeben, welche Zeilen sie verwendet hat, und Sie können jede Nummer wieder ihrer Zeile zuordnen.
Um die Zitate in einer festen Form zu erhalten, geben Sie dem Feld format ein JSON Schema mit der Antwort und einer Liste von Zitaten, jedes mit der Nummer der Quelle und einer kurzen zitierten Textstelle. Die Seite zu strukturierten Ausgaben von Ollama empfiehlt, das Schema zusätzlich in den Prompt zu schreiben und die Temperatur (temperature) zu senken, zum Beispiel auf 0, damit die Ausgabe deterministischer wird. In psql sammelt die Funktion json_agg die Zeilen einer Abfrage in einem JSON-Array, das das Tool unten direkt liest.
Ausprobieren: RAG Prompt Builder
Die Beispielquellen sind von Hand in der Form geschrieben, die json_agg zurückgibt.
3 Quellen, gelesen als ein JSON-Array aus Objekten.
curl-Befehl
Sendet die Anfrage an Ollama auf diesem Rechner (localhost:11434).
curl http://localhost:11434/api/chat -d '{
"model": "qwen2.5:7b",
"messages": [
{
"role": "system",
"content": "Answer the question using only the numbered sources in the user message. Cite the number of each source you use. If the sources do not contain the answer, say that you do not know and cite nothing. Answer in the same language as the question. For each citation, give the source number and copy a short quote from that source exactly as it is written. Return JSON that matches this schema: {\"type\":\"object\",\"properties\":{\"answer\":{\"type\":\"string\"},\"citations\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"source\":{\"type\":\"integer\"},\"quote\":{\"type\":\"string\"}},\"required\":[\"source\",\"quote\"]}}},\"required\":[\"answer\",\"citations\"]}"
},
{
"role": "user",
"content": "Sources:\n\n[1] (id: 12)\nWith HNSW, hnsw.ef_search is 40 by default, so a query returns at most 40 rows unless you raise it.\n\n[2] (id: 7)\nSET LOCAL inside a transaction changes hnsw.ef_search for a single query.\n\n[3] (id: 3)\npgvector supports PostgreSQL 13 and later.\n\nQuestion: Why does my HNSW search return only 40 rows with LIMIT 100?"
}
],
"stream": false,
"format": {
"type": "object",
"properties": {
"answer": {
"type": "string"
},
"citations": {
"type": "array",
"items": {
"type": "object",
"properties": {
"source": {
"type": "integer"
},
"quote": {
"type": "string"
}
},
"required": [
"source",
"quote"
]
}
}
},
"required": [
"answer",
"citations"
]
},
"options": {
"temperature": 0
},
"truncate": false
}'Anfrage-Body (JSON)
{
"model": "qwen2.5:7b",
"messages": [
{
"role": "system",
"content": "Answer the question using only the numbered sources in the user message. Cite the number of each source you use. If the sources do not contain the answer, say that you do not know and cite nothing. Answer in the same language as the question. For each citation, give the source number and copy a short quote from that source exactly as it is written. Return JSON that matches this schema: {\"type\":\"object\",\"properties\":{\"answer\":{\"type\":\"string\"},\"citations\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"source\":{\"type\":\"integer\"},\"quote\":{\"type\":\"string\"}},\"required\":[\"source\",\"quote\"]}}},\"required\":[\"answer\",\"citations\"]}"
},
{
"role": "user",
"content": "Sources:\n\n[1] (id: 12)\nWith HNSW, hnsw.ef_search is 40 by default, so a query returns at most 40 rows unless you raise it.\n\n[2] (id: 7)\nSET LOCAL inside a transaction changes hnsw.ef_search for a single query.\n\n[3] (id: 3)\npgvector supports PostgreSQL 13 and later.\n\nQuestion: Why does my HNSW search return only 40 rows with LIMIT 100?"
}
],
"stream": false,
"format": {
"type": "object",
"properties": {
"answer": {
"type": "string"
},
"citations": {
"type": "array",
"items": {
"type": "object",
"properties": {
"source": {
"type": "integer"
},
"quote": {
"type": "string"
}
},
"required": [
"source",
"quote"
]
}
}
},
"required": [
"answer",
"citations"
]
},
"options": {
"temperature": 0
},
"truncate": false
}In der Antwort steht der Text in message.content. Wenn prompt_eval_count deutlich niedriger ist, als Sie erwarten, wurde der Prompt möglicherweise abgeschnitten.
Anfragefelder nach der API-Referenz und dem Quellcode von Ollama, geprüft mit Ollama 0.40.11 am 2026-11-05. Ollama API: /api/chat
Alles läuft in Ihrem Browser. Das Tool schreibt die Anfrage und verbindet sich mit nichts.
Wenn die Quellen nicht hineinpassen, schneidet Ollama den Anfang des Prompts ab
Die Regeln, die Zeilen und die Frage müssen alle in die Kontextlänge passen. Die Seite zur Kontextlänge von Ollama nennt einen Standardwert von 4k Tokens bei weniger als 24 GiB VRAM, und die FAQ nennt 4096 Tokens; ollama ps zeigte auf unserer Testmaschine 4096. num_ctx in options oder die Umgebungsvariable OLLAMA_CONTEXT_LENGTH ändert den Wert.
Wenn der Prompt länger ist, gibt /api/chat standardmäßig keinen Fehler zurück. Im Quellcode von Ollama (0.40.11) verwirft der Server zuerst ganze frühere Nachrichten und behält dabei die system-Nachrichten und die letzte Nachricht. Ist der verbleibende Prompt immer noch zu lang, behält er die ersten Tokens (num_keep, standardmäßig 4) und das Ende des Prompts und verwirft den Teil dazwischen. In unserem Test mit qwen2.5:7b und num_ctx 1024 wurde ein Prompt von 2,068 Tokens auf 514 gekürzt. Die system-Nachricht und die ersten Quellen gingen verloren: Stand die Antwort in Quelle [1], antwortete das Modell mit einem Codewort, das in keiner Quelle stand, und stand die Antwort in der letzten Quelle, antwortete es richtig, aber ohne die Quellennummer, die die system-Nachricht verlangt hatte. Die Antwort enthielt keinen Fehler; im Serverlog stand die Warnung "truncating input prompt".
Der Quellcode von Ollama hat für Chat-Anfragen außerdem ein Feld truncate, das auf der Seite zu /api/chat nicht aufgeführt ist. Mit "truncate": false lieferte dieselbe Anfrage HTTP 400 mit der Fehlermeldung "request (2068 tokens) exceeds the available context size (1024 tokens), try increasing it". Das Feld prompt_eval_count einer Antwort ist die Anzahl der Tokens im Prompt; im Test mit der Kürzung betrug sie 514, nicht 2,068.
Weil das Ende des Prompts erhalten bleibt, setzen Sie die Frage hinter die Quellen. Um zu erfahren, wann die Quellen nicht hineinpassen, senden Sie "truncate": false und erhöhen dann num_ctx oder senden weniger Zeilen. Ein größeres num_ctx braucht mehr Speicher.
Die Zitate prüfen
Ein Zitat lässt sich maschinell prüfen: Die Nummer muss sich auf eine gesendete Quelle beziehen, und die zitierte Textstelle sollte in dieser Quelle vorkommen. In unserem Test mit vier Quellen und qwen2.5:7b stimmten die zitierten Textstellen in den JSON-Antworten Wort für Wort mit den Quellen überein. Das beweist nicht, dass die Antwort stimmt: Auf die Frage nach der Größe eines Vektors mit 384 Dimensionen zitierte das Modell die richtige Regel (4 mal die Dimensionen plus 8 Bytes) und antwortete trotzdem 1552 Bytes statt 1,544.
Sehen Sie sich auch Antworten ohne Zitate an. Als die Quellen die Antwort nicht enthielten, antwortete das Modell einmal aus eigenem Wissen ohne Zitate und sagte ein anderes Mal, es wisse es nicht, zitierte aber trotzdem eine Quelle ohne Bezug. Wenn done_reason in der Antwort "length" ist, wurde die Antwort durch num_predict abgeschnitten, und ihr fehlen möglicherweise die Zitate.
Der Prüfer unten vergleicht nur Text. Ob eine Quelle einen Satz wirklich belegt, muss weiterhin ein Mensch beurteilen.
Ausprobieren: RAG Citation Checker
Die Beispielantwort ist von Hand geschrieben und zeigt eine zitierte Textstelle, die nicht in ihrer Quelle steht.
4 Quellen (ein JSON-Array aus Strings). Antwort gelesen als eine /api/chat-Antwort von Ollama, in der Form JSON mit Zitaten.
Tokens im Prompt (prompt_eval_count): 306
- Die zitierte Textstelle von Zitat #2 steht nicht in Quelle [4].
Zitate
| Quelle | Zitierte Textstelle | Ergebnis |
|---|---|---|
| [2] | hnsw.ef_search is 40 by default | Genau so gefunden |
| [4] | 4 bytes per dimension plus 8 | Nicht in dieser Quelle |
Das prüft nur, ob die Nummern und die zitierten Textstellen zu den Quellen passen. Es kann nicht sagen, ob die Antwort richtig ist oder ob eine Quelle einen Satz wirklich belegt.
Antwortformat nach der API-Referenz und dem Quellcode von Ollama, geprüft mit Ollama 0.40.11 am 2026-11-05. Ollama API: /api/chat
Alles läuft in Ihrem Browser. Das Tool verbindet sich mit nichts.
Arbeitsspeicher auf einem kleinen Server
Laut README baut sich ein HNSW-Index deutlich schneller auf, wenn der Graph in maintenance_work_mem passt; sie zeigt einen Hinweis an, wenn er nicht mehr hineinpasst, und warnt davor, maintenance_work_mem so hoch zu setzen, dass der Arbeitsspeicher des Servers erschöpft wird. Wie bei anderen Indizes ist es schneller, den Index nach dem Laden der Anfangsdaten anzulegen. Indizes müssen nicht in den Arbeitsspeicher passen, aber die Leistung ist wahrscheinlich besser, wenn sie es tun; SELECT pg_size_pretty(pg_relation_size('index_name')) zeigt die Größe eines Index.
Für eine kleinere Arbeitsmenge und kleinere Indizes schlägt die README halfvec, Indizierung mit halber Genauigkeit oder binäre Quantisierung vor. Wenn Ollama auf demselben Server läuft, teilen sich PostgreSQL und die Modelle denselben Arbeitsspeicher; unser Artikel über die Überwachung des Ollama-Speichers erklärt, wovon der Speicherbedarf der Modelle abhängt.
Quellen
- pgvector README (v0.8.7)
- pgvector source: HNSW limits (src/hnsw.h)
- pgvector source: IVFFlat limits (src/ivfflat.h)
- Ollama: Embeddings
- Ollama API: Generate embeddings (/api/embed)
- PostgreSQL documentation: Lexical Structure (string constants)
- Ollama API: Generate a chat message (/api/chat)
- Ollama: Structured Outputs
- Ollama: Context length
- Ollama FAQ (context window size)
- Ollama source v0.40.11: server/prompt.go (dropping earlier messages)
- Ollama source v0.40.11: llm/llama_server.go (truncating the prompt)
- Ollama source v0.40.11: api/types.go (truncate, num_keep)
- PostgreSQL documentation: Aggregate Functions (json_agg)
Als Nächstes lesen
- Embeddings mit Ollama: die Grundlagen für Suche und RAGEmbeddings mit /api/embed von Ollama erzeugen: die Modelle und ihre Größen, truncate und dimensions, Vektoren mit Länge 1 und Kosinus-Ähnlichkeit, nach der offiziellen Dokumentation.
- Den Arbeitsspeicher von Ollama auf einem kleinen VPS im Blick behaltenSehen Sie, was Ollama im Arbeitsspeicher hält, wie lange es dort bleibt und welche Einstellungen das ändern: ollama ps, keep_alive und die Grenzwerte, nach den offiziellen FAQ.
- Dify mit Ollama auf Ihrem eigenen VPS verbindenBetreiben Sie Dify auf Ihrem eigenen VPS und nutzen Sie Ollama als Modell: Installation, die Plugin-Felder, das Adressproblem in Docker und Embeddings, nach der offiziellen Dokumentation.
- Ein lokales LLM ohne teuren PC starten: Einsteigerleitfaden für den Einsatz eines VPSKein leistungsstarker PC? Mieten Sie einen VPS und betreiben Sie ein kleines lokales LLM im Browser: sechs Schritte von der Speicherschätzung bis zur geschützten Chat-Oberfläche, mit ehrlich benannten Grenzen.