Pinecone
→ 返回 向量数据库
Pinecone 是全托管的云端向量数据库,无需自建和运维,开箱即用,适合快速构建 AI 应用原型和生产服务。
与自建方案对比
| 维度 | Pinecone(托管) | Milvus / Qdrant(自建) |
|---|
| 运维成本 | 零,全托管 | 需自行部署和维护 |
| 启动速度 | 快,注册即用 | 需搭建环境 |
| 费用 | 按用量计费,规模大时贵 | 仅基础设施费用 |
| 数据控制 | 数据在 Pinecone 云端 | 数据完全自控 |
| 适用场景 | 快速原型、中小规模 | 企业私有化、大规模 |
核心概念
| 概念 | 说明 |
|---|
| Index | 存储向量的基本单元,类似 Collection |
| Namespace | Index 内的逻辑分区,用于多租户隔离 |
| Record | 一条向量记录,包含 id、values、metadata |
| Metadata | 随向量存储的标量数据,用于过滤 |
索引类型
| 类型 | 说明 |
|---|
| Serverless | 按查询量计费,自动扩缩容,推荐新项目 |
| Pod-based | 固定规格 Pod,适合高吞吐稳定负载 |
Python SDK 示例
初始化
from pinecone import Pinecone, ServerlessSpec
pc = Pinecone(api_key="your-api-key")
pc.create_index(
name="documents",
dimension=1536,
metric="cosine",
spec=ServerlessSpec(cloud="aws", region="us-east-1")
)
index = pc.Index("documents")
写入向量(Upsert)
vectors = [
{
"id": "chunk_0",
"values": get_embedding("向量数据库简介..."),
"metadata": {"source": "doc_001", "content": "向量数据库简介..."}
}
]
index.upsert(vectors=vectors, namespace="production")
相似度查询
results = index.query(
vector=get_embedding("什么是向量数据库?"),
top_k=5,
namespace="production",
include_metadata=True
)
for match in results.matches:
print(f"score: {match.score:.4f} content: {match.metadata['content']}")
元数据过滤
results = index.query(
vector=query_vec,
top_k=5,
filter={"source": {"$eq": "doc_001"}},
include_metadata=True
)
# 多条件
results = index.query(
vector=query_vec,
top_k=5,
filter={"$and": [
{"source": {"$in": ["doc_001", "doc_002"]}},
{"chunk_index": {"$gte": 2}}
]},
include_metadata=True
)
删除
index.delete(ids=["chunk_0", "chunk_1"], namespace="production")
index.delete(filter={"source": {"$eq": "doc_001"}}, namespace="production")
Namespace 多租户模式
# 不同用户数据写入不同 namespace,互不干扰
index.upsert(vectors=user_a_vectors, namespace="user_a")
index.upsert(vectors=user_b_vectors, namespace="user_b")
results = index.query(vector=query_vec, top_k=5, namespace="user_a")
LangChain 集成
from langchain_pinecone import PineconeVectorStore
from langchain_openai import OpenAIEmbeddings
embeddings = OpenAIEmbeddings(model="text-embedding-3-small")
vectorstore = PineconeVectorStore(index_name="documents", embedding=embeddings)
vectorstore.add_texts(texts=chunks, metadatas=metadatas)
docs = vectorstore.similarity_search("什么是 RAG?", k=5)
相关