在第 1 部分中,我们使用 pgvector 设置 PostgreSQL。现在,让我们看看矢量搜索实际上是如何工作的。
嵌入就像数字内容的智能摘要。两个嵌入之间的距离表明它们的相似程度。距离小表明向量非常相似,距离大表明它们相关性较低。
? Book A: Web Development (Distance: 0.2) ⬅️ Very Similar! ? Book B: JavaScript 101 (Distance: 0.3) ⬅️ Similar! ? Book C: Cooking Recipes (Distance: 0.9) ❌ Not Similar
现在,让我们用一些数据填充我们的数据库。我们将使用:
pgvector-setup/ # From Part 1 ├── compose.yml ├── postgres/ │ └── schema.sql ├── .env # New: for API keys └── scripts/ # New: for data loading ├── requirements.txt ├── Dockerfile └── load_data.py
让我们从一个从外部 API 加载数据的脚本开始。完整的脚本在这里。
OPENAI_API_KEY=your_openai_api_key
services: # ... existing db service from Part 1 data_loader: build: context: ./scripts environment: - DATABASE_URL=postgresql://postgres:password@db:5432/example_db - OPENAI_API_KEY=${OPENAI_API_KEY} depends_on: - db
docker compose up data_loader
您应该会看到 10 本编程书籍及其元数据。
连接到您的数据库:
docker exec -it pgvector-db psql -U postgres -d example_db
让我们看看嵌入实际上是什么样的:
-- View first 5 dimensions of an embedding SELECT name, (embedding::text::float[])[1:5] as first_5_dimensions FROM items LIMIT 1;
尝试简单的相似性搜索:
-- Find 3 books similar to any book about Web SELECT name, metadata FROM items ORDER BY embedding <-> ( SELECT embedding FROM items WHERE metadata->>'title' LIKE '%Web%' LIMIT 1 ) LIMIT 3;
让我们分解一下矢量搜索查询中使用的运算符:
从 JSON 字段中提取文本值。
示例:
-- If metadata = {"title": "ABC"}, it returns "ABC" SELECT metadata->>'title' FROM items;
测量两个向量之间的相似性。
示例:
-- Find similar books SELECT name, embedding <-> query_embedding as distance FROM items ORDER BY distance LIMIT 3;
接下来,我们将:
敬请关注第 3 部分:“构建矢量搜索 API”! ?
欢迎在下面发表评论! ?
以上是矢量搜索入门(第 2 部分)的详细内容。更多信息请关注PHP中文网其他相关文章!