目前比較當見的線上向量資料庫有下列幾種:
- Pinecone:設計簡單、穩定高效、支援向量更新與 metadata
(免費方案足夠實驗使用) - Weaviate:開源也有雲服務、支援混合查詢(向量+關鍵字)
(有 REST 與 GraphQL API) - Qdrant Cloud:開源向量資料庫,有托管服務
(向量快取、強 metadata 支援) - Milvus/Zilliz:高性能搜尋、支援 PB 等級資料量
(適合大型部署)
Pinecone是目前比較主力的遠端向量資料庫,而且有免費的方案可以使用,所以先由Pinecone入門學習遠端向量資料庫。
📌 Pinecone 對比 FAISS 的注意事項
項目 FAISS Pinecone部署型態 本機端(記憶體) 雲端托管
向量格式 NumPy float32 陣列 Python list/float32
支援 metadata ❌(需自建對應表) ✅(可直接上傳)
儲存與擴展性 ❌(需自己處理) ✅ 自動管理、可水平擴展
Pinecone計費

🔐 建立 Pinecone 帳戶與 Index
- 前往 https://www.pinecone.io/ 註冊帳號
- 建立一個 Index(設定維度 1536,metric 使用 cosine)
- 取得 API Key 和 Environment,例如:
PINECONE_API_KEY = "your-pinecone-api-key"
PINECONE_ENVIRONMENT=gcp-starter #免費版都是這個
PINECONE_INDEX_NAME = my-rag-index #建立index時的INDEX NAME
1️⃣ 先去註冊 Pinecone 帳號
- 網址:https://www.pinecone.io/
- 用 Google 帳號或 Email 註冊即可
2️⃣ 登入後進入 Pinecone Console
- 網址:https://app.pinecone.io/
- 你會看到控制台畫面
- Starter Tier 限制:只能建 1 個 project、1 個 index,免費 2GB
3️⃣ 創建 Project(如果系統尚未自動建立)
- 預設登入會自動幫你建立一個 Starter Project
- 名稱類似
Jim
4️⃣ 建立 Index
在控制台左側選單:
- 點選「Indexes」
- 點擊右上角「Create Index」
- 填寫欄位:
欄位 建議設定
Index name 例如:my-rag-index
Configuration text-embedding-3-small
Dimensions 1536(因為 text-embedding-3-small 輸出 1536 維)
Cloud provider AWS
Region us-east-1(免費版預設)
下圖為建立Index的相關設定:

建立完成後:

5️⃣ 取得 API Key 與 Environment
- 點選「API Keys」
- 複製 API Key 與 Environment,稍後用來初始化 Pinecone。
PINECONE_API_KEY = 自己的API金鑰
PINECONE_ENVIRONMENT = gcp-starter #免費版都是這個
🛑 免費版注意事項
限制 說明
index數量限制 只能有 1 個 index
資料量限制 約 2GB
連線速率限制 每秒幾百筆請求沒問題,商用需升級
region 目前 gcp-starter 屬於預設免費版區域
程式碼實戰:
架構:
rag-project/
│
├── main.py # FastAPI 入口
├── rag.py # RAG 核心邏輯 (embedding、query、生成答案)
├── pinecone_utils.py # Pinecone 初始化、上傳、查詢
├── .env # 環境變數 (API keys)
├── requirements.txt # 依賴套件
├── README.md # 使用說明
└── .vscode/
└── launch.json # VSCode debug 設定
1️⃣ requirements.txt
fastapi
uvicorn
pydantic
openai
dotenv
pinecone
2️⃣ .env
OPENAI_API_KEY=sk-xxxx
PINECONE_API_KEY=xxxx
PINECONE_ENVIRONMENT=us-east-1
PINECONE_INDEX_NAME=my-rag-index
3️⃣ pinecone_utils.py
import os
import pinecone
from dotenv import load_dotenv
load_dotenv()
PINECONE_API_KEY = os.getenv("PINECONE_API_KEY")
PINECONE_ENVIRONMENT = os.getenv("PINECONE_ENVIRONMENT")
PINECONE_INDEX_NAME = os.getenv("PINECONE_INDEX_NAME")
# 初始化 Pinecone client v3
pc = pinecone.Pinecone(api_key=PINECONE_API_KEY)
index = pc.Index(PINECONE_INDEX_NAME)
def create_index():
# 先列出目前所有索引,避免重複建立
index_list = pc.list_indexes()
print("目前索引:", [index.name for index in index_list])
# 若尚未建立索引才建立
if PINECONE_INDEX_NAME not in [index.name for index in index_list]:
pc.create_index(
name=PINECONE_INDEX_NAME,
dimension=1536, # 根據你使用的 embedding 模型設定
metric="cosine", # 相似度計算方法
spec=pinecone.ServerlessSpec(
cloud="gcp", # 免費版選 gcp
region="us-east-1" # 免費版預設區域
)
)
print(f"索引 {PINECONE_INDEX_NAME} 建立完成")
else:
print(f"索引 {PINECONE_INDEX_NAME} 已存在")
4️⃣ rag.py
import os
import openai
from pinecone_utils import index
from pinecone import Pinecone
from dotenv import load_dotenv
# 讀取 .env
load_dotenv()
OPENAI_API_KEY = os.getenv("OPENAI_API_KEY")
# 初始化 API
openai.api_key = OPENAI_API_KEY
def get_embedding(text: str):
res = openai.embeddings.create(input=text, model="text-embedding-3-small")
return res.data[0].embedding
def upsert_documents(documents):
"""上傳文件到 Pinecone"""
vectors = []
for i, text in enumerate(documents):
res = openai.embeddings.create(input=text, model="text-embedding-3-small")
embedding = res.data[0].embedding
vectors.append({
'id': f'doc-{i}',
'values': embedding,
'metadata': {'text': text or ''}
})
index.upsert(vectors=vectors)
def retrieve_context(query: str, k: int = 3):
query_vector = get_embedding(query)
results = index.query(vector=query_vector, top_k=k, include_metadata=True)
# 確保每個 metadata['text'] 一定是 str,沒有則空字串
context_texts = [
match.metadata.get('text', '')
for match in results['matches']
]
return context_texts
def generate_answer(query: str):
context = retrieve_context(query)
prompt = f"根據以下內容回答問題:\n\n內容:\n{chr(10).join(filter(None, context))}\n\n問題:\n{query}"
res = openai.chat.completions.create(
model="gpt-4.1-nano-2025-04-14",
messages=[{"role": "user", "content": prompt}]
)
return res.choices[0].message.content.strip()
5️⃣ main.py
from fastapi import FastAPI
from contextlib import asynccontextmanager
from pydantic import BaseModel
from rag import generate_answer, upsert_documents
from pinecone_utils import create_index
# 啟動時先建立 Index 與文件
@asynccontextmanager
async def lifespan(app: FastAPI):
# 啟動階段
create_index() # 確保 index 存在
documents = [
"Python 是廣泛使用的程式語言。",
"FastAPI 是一個快速建置 API 的 Python 框架。",
"向量資料庫用於語意相似度搜尋。"
]
upsert_documents(documents) # 啟動時上傳資料
yield
# 關閉階段(目前可以不寫任何關閉邏輯)
app = FastAPI(lifespan=lifespan)
# 定義查詢請求格式
class Query(BaseModel):
query: str
# 查詢 RAG API
@app.post("/rag")
def rag_endpoint(query: Query):
answer = generate_answer(query.query)
return {"answer": answer}
6️⃣ .vscode/launch.json (Debug用)
{
"version": "0.2.0",
"configurations": [
{
"name": "FastAPI Debug",
"type": "debugpy",
"request": "launch",
"module": "uvicorn",
"args": [
"main:app",
"--reload",
"--host",
"127.0.0.1",
"--port",
"8000"
],
"envFile": "${workspaceFolder}/.env"
}
]
}
7️⃣ README.md
# RAG檢索增強生成-使用遠端向量資料庫(Pinecone)
## 1️ 建立虛擬環境(可選)
python -m venv .venv
## 2 進入虛擬環境
.venv\Scripts\Activate.ps1
## 3 安裝依賴
pip install -r requirements.txt
## 4 撰寫相關程式碼
## 5 啟動伺服器
uvicorn main:app --reload
## 6 連結網站
http://127.0.0.1:8000
啟動伺服器
uvicorn main:app --reload
連結網站
http://127.0.0.1:8000

執行程式碼後即已上傳資料到Pinecone

連結 "http://127.0.0.1:8000/docs" 執行FastAPI的Swagger,輸入:
{
"query": "python是什麼?"
}


{
"answer": "Python是一種廣泛使用的程式語言。"
}
✅ 總結一句話:
Pinecone 免費版對於小型 RAG 專案、個人練習、測試開發完全夠用。
此篇換成使用Pinecone做為遠端向量資料庫來完成RAG的應用,雖然只是使用了簡單的資料建立問答系統,下一篇來再進階一點,可以上傳更多不同格式的資料且記憶對話。