Rumah >pembangunan bahagian belakang >Tutorial Python >Bahagian Melaksanakan Carian Vektor dengan Ollama

Bahagian Melaksanakan Carian Vektor dengan Ollama

Barbara Streisand
Barbara Streisandasal
2024-11-29 04:37:12197semak imbas

Part Implementing Vector Search with Ollama

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! ✨


Kandungan

  • Kandungan
  • Kenapa Ollama?
  • Menyediakan Ollama dengan Docker
  • Kemas Kini Pangkalan Data
  • Pelaksanaan
  • Pertanyaan Carian
  • Petua Prestasi
  • Menyelesaikan masalah
  • OpenAI lwn. Ollama
  • Selesaikan

Kenapa Ollama? ?

Ollama membolehkan anda menjalankan model AI secara setempat dengan:

  • Pengendalian luar talian untuk privasi data yang lebih baik
  • Tiada kos API
  • Masa respons yang pantas

Kami akan menggunakan model nomic-embed-text dalam Ollama, yang mencipta vektor 768 dimensi (berbanding dengan 1536 dimensi OpenAI).

Menyediakan Ollama dengan Docker ?

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 ?

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
);

Perlaksanaan ?

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 ?

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;

Petua Prestasi ?

Tambah Indeks

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

Keperluan Sumber

  • RAM: ~2GB untuk model
  • Pertanyaan pertama: Jangkakan sedikit kelewatan untuk pemuatan model
  • Pertanyaan seterusnya: ~50ms masa tindak balas

Sokongan GPU

Jika memproses set data yang besar, sokongan GPU boleh mempercepatkan penjanaan pembenaman. Untuk butiran, rujuk imej Ollama Docker.

Menyelesaikan masalah ?

Ralat Sambungan Ditolak

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

Ralat Model Tidak Ditemui

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(). Semak di sini untuk butiran lanjut.

Penggunaan Memori Tinggi

  • Mulakan semula perkhidmatan Ollama
  • Pertimbangkan untuk menggunakan model yang lebih kecil

OpenAI lwn. 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

Bungkus?

Tutorial ini hanya merangkumi cara menyediakan carian vektor tempatan dengan Ollama. Aplikasi dunia nyata selalunya termasuk ciri tambahan seperti:

  • Pengoptimuman pertanyaan dan prapemprosesan
  • Carian hibrid (menggabungkan dengan carian teks penuh)
  • Integrasi dengan antara muka web
  • Pertimbangan keselamatan dan prestasi

Kod sumber penuh, termasuk API ringkas yang dibina dengan FastAPI, tersedia di GitHub. PR dan maklum balas adalah dialu-alukan!

Sumber:

  • Dokumentasi Ollama
  • Perpustakaan Ollama Python
  • Model Pembenaman Ollama

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!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn