第 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
以下是 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);
如果處理大型資料集,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中文網其他相關文章!