Heim >Backend-Entwicklung >Python-Tutorial >Teil der Implementierung der Vektorsuche mit Ollama

Teil der Implementierung der Vektorsuche mit Ollama

Barbara Streisand
Barbara StreisandOriginal
2024-11-29 04:37:12106Durchsuche

Part Implementing Vector Search with Ollama

Teil 1 behandelte PostgreSQL mit pgvector-Setup und Teil 2 implementierte die Vektorsuche mithilfe von OpenAI-Einbettungen. In diesem letzten Teil wird gezeigt, wie Sie die Vektorsuche lokal mit Ollama ausführen! ✨


Inhalt

  • Inhalt
  • Warum Ollama?
  • Ollama mit Docker einrichten
  • Datenbankaktualisierungen
  • Implementierung
  • Suchanfragen
  • Leistungstipps
  • Fehlerbehebung
  • OpenAI vs. Ollama
  • Zusammenfassung

Warum Ollama? ?

Ollama ermöglicht Ihnen die lokale Ausführung von KI-Modellen mit:

  • Offline-Betrieb für besseren Datenschutz
  • Keine API-Kosten
  • Schnelle Reaktionszeiten

Wir verwenden das nomic-embed-text-Modell in Ollama, das 768-dimensionale Vektoren erstellt (im Vergleich zu den 1536 Dimensionen von OpenAI).

Ollama mit Docker einrichten?

Um Ollama zu Ihrem Docker-Setup hinzuzufügen, fügen Sie diesen Dienst zu compose.yml hinzu:

services:
  db:
    # ... (existing db service)

  ollama:
    image: ollama/ollama
    container_name: ollama-service
    ports:
      - "11434:11434"
    volumes:
      - ollama_data:/root/.ollama

  data_loader:
    # ... (existing data_loader service)
    environment:
      - OLLAMA_HOST=ollama
    depends_on:
      - db
      - ollama

volumes:
  pgdata:
  ollama_data:

Dann starten Sie die Dienste und rufen das Modell ab:

docker compose up -d

# Pull the embedding model
docker compose exec ollama ollama pull nomic-embed-text

# Test embedding generation
curl http://localhost:11434/api/embed -d '{
  "model": "nomic-embed-text",
  "input": "Hello World"
}'

Datenbankaktualisierungen?

Aktualisieren Sie die Datenbank, um Ollama-Einbettungen zu speichern:

-- Connect to the database
docker compose exec db psql -U postgres -d example_db

-- Add a column for Ollama embeddings
ALTER TABLE items
ADD COLUMN embedding_ollama vector(768);

Aktualisieren Sie bei Neuinstallationen postgres/schema.sql:

CREATE TABLE items (
    id SERIAL PRIMARY KEY,
    name VARCHAR(255) NOT NULL,
    item_data JSONB,
    embedding vector(1536),        # OpenAI
    embedding_ollama vector(768)   # Ollama
);

Umsetzung?

Anforderungen.txt aktualisieren, um die Ollama-Python-Bibliothek zu installieren:

ollama==0.3.3

Hier ist ein Beispiel-Update für load_data.py zum Hinzufügen von Ollama-Einbettungen:

import ollama  # New import

def get_embedding_ollama(text: str):
    """Generate embedding using Ollama API"""
    response = ollama.embed(
        model='nomic-embed-text',
        input=text
    )
    return response["embeddings"][0]

def load_books_to_db():
    """Load books with embeddings into PostgreSQL"""
    books = fetch_books()

    for book in books:
        description = (
            f"Book titled '{book['title']}' by {', '.join(book['authors'])}. "
            f"Published in {book['first_publish_year']}. "
            f"This is a book about {book['subject']}."
        )

        # Generate embeddings with both OpenAI and Ollama
        embedding = get_embedding(description)                # OpenAI
        embedding_ollama = get_embedding_ollama(description)  # Ollama

        # Store in the database
        store_book(book["title"], json.dumps(book), embedding, embedding_ollama)

Beachten Sie, dass dies aus Gründen der Übersichtlichkeit eine vereinfachte Version ist. Der vollständige Quellcode ist hier.

Wie Sie sehen können, ähnelt die Ollama-API-Struktur der von OpenAI!

Suchanfragen?

Suchanfrage zum Abrufen ähnlicher Elemente mithilfe von Ollama-Einbettungen:

-- View first 5 dimensions of an embedding
SELECT
    name,
    (replace(replace(embedding_ollama::text, '[', '{'), ']', '}')::float[])[1:5] as first_dimensions
FROM items;

-- Search for books about web development:
WITH web_book AS (
    SELECT embedding_ollama FROM items WHERE name LIKE '%Web%' LIMIT 1
)
SELECT
    item_data->>'title' as title,
    item_data->>'authors' as authors,
    embedding_ollama <=> (SELECT embedding_ollama FROM web_book) as similarity
FROM items
ORDER BY similarity
LIMIT 3;

Leistungstipps?

Fügen Sie einen Index hinzu

CREATE INDEX ON items
USING ivfflat (embedding_ollama vector_cosine_ops)
WITH (lists = 100);

Ressourcenanforderungen

  • RAM: ~2 GB für das Modell
  • Erste Abfrage: Erwarten Sie eine leichte Verzögerung beim Laden des Modells
  • Nachfolgende Abfragen: ~50 ms Antwortzeit

GPU-Unterstützung

Bei der Verarbeitung großer Datensätze kann die GPU-Unterstützung die Einbettungsgenerierung erheblich beschleunigen. Einzelheiten finden Sie im Ollama Docker-Image.

Fehlerbehebung ?

Fehler „Verbindung abgelehnt“.

Die Ollama-Bibliothek muss wissen, wo sie den Ollama-Dienst finden kann. Legen Sie die Umgebungsvariable OLLAMA_HOST im data_loader-Dienst fest:

data_loader:
  environment:
    - OLLAMA_HOST=ollama

Fehler „Modell nicht gefunden“.

Modell manuell ziehen:

docker compose exec ollama ollama pull nomic-embed-text

Alternativ können Sie mit der Funktion ollama.pull() ein Skript hinzufügen, um das Modell automatisch in Ihren Python-Code zu ziehen. Weitere Einzelheiten finden Sie hier.

Hohe Speichernutzung

  • Ollama-Dienst neu starten
  • Erwägen Sie die Verwendung eines kleineren Modells

OpenAI gegen Ollama ⚖️

Feature OpenAI Ollama
Vector Dimensions 1536 768
Privacy Requires API calls Fully local
Cost Pay per API call Free
Speed Network dependent ~50ms/query
Setup API key needed Docker only

Einpacken?

Dieses Tutorial behandelte nur die Einrichtung einer lokalen Vektorsuche mit Ollama. Reale Anwendungen umfassen oft zusätzliche Funktionen wie:

  • Abfrageoptimierung und Vorverarbeitung
  • Hybridsuche (kombiniert mit Volltextsuche)
  • Integration mit Webschnittstellen
  • Sicherheits- und Leistungsaspekte

Der vollständige Quellcode, einschließlich einer einfachen, mit FastAPI erstellten API, ist auf GitHub verfügbar. PRs und Feedback sind willkommen!

Ressourcen:

  • Ollama-Dokumentation
  • Ollama Python-Bibliothek
  • Ollama-Einbettungsmodelle

Fragen oder Feedback? Hinterlassen Sie unten einen Kommentar! ?

Das obige ist der detaillierte Inhalt vonTeil der Implementierung der Vektorsuche mit Ollama. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn