パート 1 では pgvector セットアップを使用した PostgreSQL について説明し、パート 2 では OpenAI 埋め込みを使用したベクトル検索を実装しました。この最後のパートでは、Ollama! を使用してローカルでベクトル検索を実行する方法を説明します。 ✨
Ollama を使用すると、以下を使用して AI モデルをローカルで実行できます。
Ollama で nomic-embed-text モデルを使用します。これにより、768 次元のベクトルが作成されます (OpenAI の 1536 次元と比較して)。
Ollama を Docker セットアップに追加するには、このサービスを 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:
次に、サービスを開始してモデルをプルします。
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" }'
データベースを更新して 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);
新規インストールの場合は、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 );
requirements.txt を更新して Ollama Python ライブラリをインストールします:
ollama==0.3.3
Ollama 埋め込みを追加するためのload_data.py の更新例を次に示します。
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)
これはわかりやすくするために簡略化されたバージョンであることに注意してください。完全なソースコードはここにあります。
ご覧のとおり、Ollama API の構造は OpenAI の構造に似ています!
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);
大規模なデータセットを処理する場合、GPU サポートにより埋め込みの生成が大幅に高速化されます。詳細については、Ollama Docker イメージを参照してください。
Ollama ライブラリは、Ollama サービスの場所を知る必要があります。 data_loader サービスで OLLAMA_HOST 環境変数を設定します:
data_loader: environment: - OLLAMA_HOST=ollama
モデルを手動でプルします:
docker compose exec ollama ollama pull nomic-embed-text
あるいは、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 |
このチュートリアルでは、Ollama を使用してローカル ベクトル検索を設定する方法のみを説明しました。実際のアプリケーションには、次のような追加機能が含まれることがよくあります。
FastAPI で構築されたシンプルな API を含む完全なソース コードは、GitHub で入手できます。 PR とフィードバックは大歓迎です!
ご質問またはフィードバックがありますか?以下にコメントを残してください。 ?
以上がOllama を使用したベクトル検索の実装部分の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。