Bahagian 1 meliputi PostgreSQL dengan persediaan pgvector dan Bahagian 2 melaksanakan carian vektor menggunakan pembenaman OpenAI. Bahagian akhir ini menunjukkan cara menjalankan carian vektor secara setempat menggunakan Ollama! ✨
Ollama membolehkan anda menjalankan model AI secara setempat dengan:
Kami akan menggunakan model nomic-embed-text dalam Ollama, yang mencipta vektor 768 dimensi (berbanding dengan 1536 dimensi OpenAI).
Untuk menambahkan Ollama pada persediaan Docker anda, tambahkan perkhidmatan ini ke 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:
Kemudian, mulakan perkhidmatan dan tarik model:
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" }'
Kemas kini pangkalan data untuk menyimpan benam 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);
Untuk pemasangan baharu, kemas kini 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 );
Kemas kini requirements.txt untuk memasang pustaka Ollama Python:
ollama==0.3.3
Berikut ialah contoh kemas kini untuk load_data.py untuk menambah benam 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)
Perhatikan bahawa ini ialah versi ringkas untuk kejelasan. Kod sumber penuh ada di sini.
Seperti yang anda lihat, struktur API Ollama adalah serupa dengan OpenAI!
Pertanyaan carian untuk mendapatkan semula item yang serupa menggunakan benam 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);
Jika memproses set data yang besar, sokongan GPU boleh mempercepatkan penjanaan pembenaman. Untuk butiran, rujuk imej Ollama Docker.
Perpustakaan Ollama perlu tahu di mana untuk mencari perkhidmatan Ollama. Tetapkan pembolehubah persekitaran OLLAMA_HOST dalam perkhidmatan data_loader:
data_loader: environment: - OLLAMA_HOST=ollama
Tarik model secara manual:
docker compose exec ollama ollama pull nomic-embed-text
Sebagai alternatif, anda boleh menambah skrip untuk menarik model secara automatik dalam kod Python anda menggunakan fungsi 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 |
Tutorial ini hanya merangkumi cara menyediakan carian vektor tempatan dengan Ollama. Aplikasi dunia nyata selalunya termasuk ciri tambahan seperti:
Kod sumber penuh, termasuk API ringkas yang dibina dengan FastAPI, tersedia di GitHub. PR dan maklum balas adalah dialu-alukan!
Soalan atau maklum balas? Tinggalkan komen di bawah! ?
Atas ialah kandungan terperinci Bahagian Melaksanakan Carian Vektor dengan Ollama. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!