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 ! ✨
Ollama vous permet d'exécuter des modèles d'IA localement avec :
Nous utiliserons le modèle nomic-embed-text dans Ollama, qui crée des vecteurs à 768 dimensions (par rapport aux 1536 dimensions d'OpenAI).
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:
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" }'
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);
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 );
Mettez à jour exigences.txt pour installer la bibliothèque Ollama Python :
ollama==0.3.3
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)
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ê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;
CREATE INDEX ON items USING ivfflat (embedding_ollama vector_cosine_ops) WITH (lists = 100);
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.
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
Tirez le modèle manuellement :
docker compose exec ollama ollama pull nomic-embed-text
Vous pouvez également ajouter un script pour extraire automatiquement le modèle dans votre code Python à l'aide de la fonction ollama.pull(
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 |
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 :
Le code source complet, y compris une simple API construite avec FastAPI, est disponible sur GitHub. Les PR et les commentaires sont les bienvenus !
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!