ホームページ > バックエンド開発 > Python チュートリアル > Ollama を使用したベクトル検索の実装部分

Ollama を使用したベクトル検索の実装部分

Barbara Streisand
リリース: 2024-11-29 04:37:12
オリジナル
102 人が閲覧しました

Part Implementing Vector Search with Ollama

パート 1 では pgvector セットアップを使用した PostgreSQL について説明し、パート 2 では OpenAI 埋め込みを使用したベクトル検索を実装しました。この最後のパートでは、Ollama! を使用してローカルでベクトル検索を実行する方法を説明します。 ✨


コンテンツ

  • 内容
  • なぜオラマなのか?
  • Docker を使用した Ollama のセットアップ
  • データベースの更新
  • 実装
  • 検索クエリ
  • パフォーマンスのヒント
  • トラブルシューティング
  • OpenAI vs. オラマ
  • まとめ

なぜオラマなのか? ?

Ollama を使用すると、以下を使用して AI モデルをローカルで実行できます。

  • オフライン操作によるデータプライバシーの向上
  • API コストなし
  • 速い応答時間

Ollama で nomic-embed-text モデルを使用します。これにより、768 次元のベクトルが作成されます (OpenAI の 1536 次元と比較して)。

Docker を使用して Ollama をセットアップしますか?

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);
ログイン後にコピー

リソース要件

  • RAM: モデルの場合は最大 2GB
  • 最初のクエリ: モデルの読み込みに若干の遅延が予想されます
  • 後続のクエリ: ~50ms の応答時間

GPUのサポート

大規模なデータセットを処理する場合、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() 関数を使用して、Python コード内でモデルを自動的にプルするスクリプトを追加することもできます。詳細については、こちらをご確認ください。

メモリ使用量が多い

  • Ollama サービスを再起動します
  • より小さいモデルの使用を検討してください

OpenAI vs. オラマ ⚖️

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 を使用してローカル ベクトル検索を設定する方法のみを説明しました。実際のアプリケーションには、次のような追加機能が含まれることがよくあります。

  • クエリの最適化と前処理
  • ハイブリッド検索 (全文検索との組み合わせ)
  • Web インターフェースとの統合
  • セキュリティとパフォーマンスに関する考慮事項

FastAPI で構築されたシンプルな API を含む完全なソース コードは、GitHub で入手できます。 PR とフィードバックは大歓迎です!

リソース:

  • オラマのドキュメント
  • Ollama Python ライブラリ
  • Ollama 埋め込みモデル

ご質問またはフィードバックがありますか?以下にコメントを残してください。 ?

以上がOllama を使用したベクトル検索の実装部分の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:dev.to
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート