Maison > développement back-end > Tutoriel Python > Partie implémentant la recherche de vecteurs avec Ollama

Partie implémentant la recherche de vecteurs avec Ollama

Barbara Streisand
Libérer: 2024-11-29 04:37:12
original
176 Les gens l'ont consulté

Part Implementing Vector Search with Ollama

La première partie couvrait PostgreSQL avec la configuration de pgvector, et la partie 2 implémentait la recherche de vecteurs à l'aide des intégrations OpenAI. Cette dernière partie montre comment exécuter une recherche vectorielle localement à l'aide d'Ollama ! ✨


Contenu

  • Contenu
  • Pourquoi Ollama ?
  • Configurer Ollama avec Docker
  • Mises à jour de la base de données
  • Mise en œuvre
  • Requêtes de recherche
  • Conseils de performances
  • Dépannage
  • OpenAI contre Ollama
  • Conclusion

Pourquoi Ollama ? ?

Ollama vous permet d'exécuter des modèles d'IA localement avec :

  • Fonctionnement hors ligne pour une meilleure confidentialité des données
  • Aucun frais d'API
  • Délais de réponse rapides

Nous utiliserons le modèle nomic-embed-text dans Ollama, qui crée des vecteurs à 768 dimensions (par rapport aux 1536 dimensions d'OpenAI).

Configurer Ollama avec Docker ?

Pour ajouter Ollama à votre configuration Docker, ajoutez ce service à compose.yml :

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:
Copier après la connexion

Ensuite, démarrez les services et extrayez le modèle :

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"
}'
Copier après la connexion

Mises à jour de la base de données ?

Mettre à jour la base de données pour stocker les intégrations Ollama :

-- 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);
Copier après la connexion

Pour les nouvelles installations, mettez à jour 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
);
Copier après la connexion

Mise en œuvre ?

Mettez à jour exigences.txt pour installer la bibliothèque Ollama Python :

ollama==0.3.3
Copier après la connexion

Voici un exemple de mise à jour pour load_data.py pour ajouter des intégrations Ollama :

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)
Copier après la connexion

Notez qu'il s'agit d'une version simplifiée pour plus de clarté. Le code source complet est ici.

Comme vous pouvez le constater, la structure de l'API Ollama est similaire à celle d'OpenAI !

Requêtes de recherche ?

Requête de recherche pour récupérer des éléments similaires à l'aide des intégrations Ollama :

-- 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;
Copier après la connexion

Conseils de performances ?

Ajouter un index

CREATE INDEX ON items
USING ivfflat (embedding_ollama vector_cosine_ops)
WITH (lists = 100);
Copier après la connexion

Besoins en ressources

  • RAM : ~2Go pour le modèle
  • Première requête : attendez-vous à un léger retard pour le chargement du modèle
  • Requêtes ultérieures : ~50 ms de temps de réponse

Prise en charge des GPU

Si vous traitez de grands ensembles de données, la prise en charge du GPU peut considérablement accélérer la génération d'intégration. Pour plus de détails, reportez-vous à l'image Ollama Docker.

Dépannage ?

Erreur de connexion refusée

La bibliothèque Ollama a besoin de savoir où trouver le service Ollama. Définissez la variable d'environnement OLLAMA_HOST dans le service data_loader :

data_loader:
  environment:
    - OLLAMA_HOST=ollama
Copier après la connexion

Erreur de modèle introuvable

Tirez le modèle manuellement :

docker compose exec ollama ollama pull nomic-embed-text
Copier après la connexion

Vous pouvez également ajouter un script pour extraire automatiquement le modèle dans votre code Python à l'aide de la fonction ollama.pull(). Vérifiez ici pour plus de détails.

Utilisation élevée de la mémoire

  • Redémarrer le service Ollama
  • Pensez à utiliser un modèle plus petit

OpenAI contre 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

Conclure ?

Ce tutoriel explique uniquement comment configurer une recherche vectorielle locale avec Ollama. Les applications du monde réel incluent souvent des fonctionnalités supplémentaires telles que :

  • Optimisation et prétraitement des requêtes
  • Recherche hybride (combinée avec la recherche en texte intégral)
  • Intégration avec les interfaces web
  • Considérations relatives à la sécurité et aux performances

Le code source complet, y compris une simple API construite avec FastAPI, est disponible sur GitHub. Les PR et les commentaires sont les bienvenus !

Ressources:

  • Documentation Ollama
  • Bibliothèque Ollama Python
  • Modèles d'intégration Ollama

Des questions ou des commentaires ? Laissez un commentaire ci-dessous ! ?

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:dev.to
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal