Pinecone:全托管向量数据库服务
FreeGuideOnline
最新
2026-07-02
bash pip install pinecone-client
更高性能的异步客户端:
```bash
pip install pinecone-client[v3]
3. 连接并创建索引
使用新版本语法初始化客户端,创建索引。
from pinecone import Pinecone, ServerlessSpec
pc = Pinecone(api_key="YOUR_API_KEY")
# 创建一个名为 "quickstart" 的索引,维度 384,采用余弦相似度
pc.create_index(
name="quickstart",
dimension=384,
metric="cosine",
spec=ServerlessSpec(
cloud="aws",
region="us-east-1"
)
)
索引创建可能需要几秒钟,随后你可以在控制台看到索引状态变为“Ready”。
4. 连接索引并插入向量
获取索引对象,然后使用 upsert 批量插入向量。
index = pc.Index("quickstart")
# 示例:插入三条向量
vectors = [
{
"id": "vec1",
"values": [0.1, 0.2, 0.3, ...], # 384 维浮点数列表
"metadata": {"genre": "action", "year": 2023}
},
{
"id": "vec2",
"values": [0.4, 0.5, 0.6, ...],
"metadata": {"genre": "comedy", "year": 2022}
},
{
"id": "vec3",
"values": [0.7, 0.8, 0.9, ...],
"metadata": {"genre": "action", "year": 2021}
}
]
index.upsert(vectors=vectors)
5. 执行相似度查询
提供查询向量,检索最相似的 top_k 个结果。
query_vector = [0.15, 0.25, 0.35, ...] # 查询用向量
results = index.query(
namespace="default", # 可选命名空间
vector=query_vector,
top_k=2,
include_values=False,
include_metadata=True
)
for match in results.matches:
print(f"ID: {match.id}, Score: {match.score}, Metadata: {match.metadata}")
查询返回的 score 对于余弦相似度而言就是相似度值(-1 到 1,越高越相似)。
高级特性详解
命名空间管理
利用命名空间实现多租户隔离或数据版本控制。插入和查询时只需指定 namespace 参数。
# 在命名空间 "tenant-a" 中插入
index.upsert(vectors=vecs, namespace="tenant-a")
# 仅在 "tenant-a" 中搜索
results = index.query(vector=query_vec, top_k=5, namespace="tenant-a")
# 列出所有命名空间
print(index.describe_index_stats().namespaces)
元数据过滤
结合 filter 参数,在搜索时限定元数据条件,实现混合搜索。支持以下操作符:
- 等值过滤:
{"genre": {"$eq": "action"}} - 列表包含:
{"genre": {"$in": ["action", "comedy"]}} - 数值比较:
{"year": {"$gte": 2022}} - 逻辑组合:
{"$and": [{"genre": "action"}, {"year": {"$gte": 2022}}]}
示例:
results = index.query(
vector=query_vec,
top_k=3,
filter={
"genre": "action",
"year": {"$gte": 2022}
},
include_metadata=True
)
更新与删除
- 更新:使用
update单条修改向量的元数据或向量值。需要提供向量 ID。 - 删除:可以按 ID 删除单条或多条,也可以按元数据过滤条件批量删除。
# 更新元数据
index.update(id="vec1", set_metadata={"genre": "thriller", "rating": 4.5})
# 按 ID 删除多条
index.delete(ids=["vec2", "vec3"])
# 按过滤条件删除(例如删除所有 year < 2020 的向量)
index.delete(filter={"year": {"$lt": 2020}})
检索与获取
不进行搜索,仅通过 ID 获取向量数据,使用 fetch 方法。
fetched = index.fetch(ids=["vec1"])
print(fetched.vectors["vec1"])
索引状态与统计
describe_index_stats 可以查看向量总数、维度数和命名空间信息,对监控很有帮助。
stats = index.describe_index_stats()
print(stats.total_vector_count)