第 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中文网其他相关文章!