首頁 > 後端開發 > 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 與 Ollama
  • 總結

為什麼是奧拉馬? ?

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
登入後複製

以下是 load_data.py 的範例更新,用於新增 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)
登入後複製

請注意,為了清楚起見,這是一個簡化版本。完整的源代碼在這裡。

如您所見,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 與 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

包起來 ?

本教學僅介紹如何使用 Ollama 設定本地向量搜尋。現實世界的應用程式通常包含附加功能,例如:

  • 查詢最佳化與預處理
  • 混合搜尋(與全文搜尋結合)
  • 與網路介面整合
  • 安全與性能考量

完整的原始程式碼,包括使用 FastAPI 建立的簡單 API,可在 GitHub 上取得。歡迎 PR 和回饋!

資源:

  • Ollama 文件
  • Ollama Python 函式庫
  • Ollama 嵌入模型

有問題或回饋嗎?請在下面發表評論! ?

以上是使用 Ollama 實現向量搜尋的部分的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:dev.to
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板