學習LLM大語言模型之路(九) - RAG檢索增強生成-使用遠端向量資料庫(Pinecone)

更新於 發佈於 閱讀時間約 17 分鐘

目前比較當見的線上向量資料庫有下列幾種:

  1. Pinecone:設計簡單、穩定高效、支援向量更新與 metadata
    (免費方案足夠實驗使用)
  2. Weaviate:開源也有雲服務、支援混合查詢(向量+關鍵字)
    (有 REST 與 GraphQL API)
  3. Qdrant Cloud:開源向量資料庫,有托管服務
    (向量快取、強 metadata 支援)
  4. Milvus/Zilliz:高性能搜尋、支援 PB 等級資料量
    (適合大型部署)

Pinecone是目前比較主力的遠端向量資料庫,而且有免費的方案可以使用,所以先由Pinecone入門學習遠端向量資料庫。

📌 Pinecone 對比 FAISS 的注意事項

項目 FAISS Pinecone

部署型態 本機端(記憶體) 雲端托管

向量格式 NumPy float32 陣列 Python list/float32

支援 metadata ❌(需自建對應表) ✅(可直接上傳)

儲存與擴展性 ❌(需自己處理) ✅ 自動管理、可水平擴展


Pinecone計費

raw-image


🔐 建立 Pinecone 帳戶與 Index

  1. 前往 https://www.pinecone.io/ 註冊帳號
  2. 建立一個 Index(設定維度 1536,metric 使用 cosine)
  3. 取得 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 帳號

2️⃣ 登入後進入 Pinecone Console

  • 網址:https://app.pinecone.io/
  • 你會看到控制台畫面
  • Starter Tier 限制:只能建 1 個 project、1 個 index,免費 2GB

3️⃣ 創建 Project(如果系統尚未自動建立)

  • 預設登入會自動幫你建立一個 Starter Project
  • 名稱類似 Jim

4️⃣ 建立 Index

在控制台左側選單:

  1. 點選「Indexes」
  2. 點擊右上角「Create Index」
  3. 填寫欄位:

欄位 建議設定

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的相關設定:

raw-image

建立完成後:

raw-image

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
raw-image


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

raw-image


連結 "http://127.0.0.1:8000/docs" 執行FastAPI的Swagger,輸入:

{
"query": "python是什麼?"
}
raw-image
raw-image
{
"answer": "Python是一種廣泛使用的程式語言。"
}

總結一句話:

Pinecone 免費版對於小型 RAG 專案、個人練習、測試開發完全夠用。

此篇換成使用Pinecone做為遠端向量資料庫來完成RAG的應用,雖然只是使用了簡單的資料建立問答系統,下一篇來再進階一點,可以上傳更多不同格式的資料且記憶對話。


留言
avatar-img
留言分享你的想法!
avatar-img
宅D嘉的開發人生
21會員
50內容數
加密貨幣很有趣,遊戲開發也很有趣,AI也有點意思,身為一個跨多領域的軟體工程師,喜歡研究新鮮的事物,歡迎來到我的世界,一起坐上這艘開往未來探索新奇的列車。
宅D嘉的開發人生的其他內容
2025/06/28
一、什麼是 RAG? RAG 結合兩個階段: 檢索(Retrieval): 從外部知識庫檢索與提問語意相近的資料。 生成(Generation): 將檢索到的內容當作 context,一併輸入 LLM 中生成回答。
Thumbnail
2025/06/28
一、什麼是 RAG? RAG 結合兩個階段: 檢索(Retrieval): 從外部知識庫檢索與提問語意相近的資料。 生成(Generation): 將檢索到的內容當作 context,一併輸入 LLM 中生成回答。
Thumbnail
2025/06/21
Pydantic :資料驗證的超強幫手 Pydantic 是 Python 中強型別資料驗證與處理的標準工具,特別適合用於 API 的請求 / 回應資料結構驗證。
Thumbnail
2025/06/21
Pydantic :資料驗證的超強幫手 Pydantic 是 Python 中強型別資料驗證與處理的標準工具,特別適合用於 API 的請求 / 回應資料結構驗證。
Thumbnail
2025/06/14
FastAPI 是一個基於 Python 3.7+ 的 高效能 Web 框架,其特點是: 超高速(基於 Starlette + Pydantic) 自動產生 Swagger API 文件 嚴謹的資料驗證與型別檢查 原生支援非同步(async / await)
Thumbnail
2025/06/14
FastAPI 是一個基於 Python 3.7+ 的 高效能 Web 框架,其特點是: 超高速(基於 Starlette + Pydantic) 自動產生 Swagger API 文件 嚴謹的資料驗證與型別檢查 原生支援非同步(async / await)
Thumbnail
看更多
你可能也想看
Thumbnail
2025 vocus 推出最受矚目的活動之一——《開箱你的美好生活》,我們跟著創作者一起「開箱」各種故事、景點、餐廳、超值好物⋯⋯甚至那些讓人會心一笑的生活小廢物;這次活動不僅送出了許多獎勵,也反映了「內容有價」——創作不只是分享、紀錄,也能用各種不同形式變現、帶來實際收入。
Thumbnail
2025 vocus 推出最受矚目的活動之一——《開箱你的美好生活》,我們跟著創作者一起「開箱」各種故事、景點、餐廳、超值好物⋯⋯甚至那些讓人會心一笑的生活小廢物;這次活動不僅送出了許多獎勵,也反映了「內容有價」——創作不只是分享、紀錄,也能用各種不同形式變現、帶來實際收入。
Thumbnail
嗨!歡迎來到 vocus vocus 方格子是台灣最大的內容創作與知識變現平台,並且計畫持續拓展東南亞等等國際市場。我們致力於打造讓創作者能夠自由發表、累積影響力並獲得實質收益的創作生態圈!「創作至上」是我們的核心價值,我們致力於透過平台功能與服務,賦予創作者更多的可能。 vocus 平台匯聚了
Thumbnail
嗨!歡迎來到 vocus vocus 方格子是台灣最大的內容創作與知識變現平台,並且計畫持續拓展東南亞等等國際市場。我們致力於打造讓創作者能夠自由發表、累積影響力並獲得實質收益的創作生態圈!「創作至上」是我們的核心價值,我們致力於透過平台功能與服務,賦予創作者更多的可能。 vocus 平台匯聚了
Thumbnail
在資料分析過程中,透過衡量變數之間的線性或非線性關係,能有效探索數據集,篩選出重要特徵,並進行預測建模。本文介紹瞭如何理解數據、使用相關矩陣找出變數關聯性,以及利用互資訊評估變數之間的依賴程度,幫助資料科學家在建模過程中選擇適當的變數,提升模型效果。
Thumbnail
在資料分析過程中,透過衡量變數之間的線性或非線性關係,能有效探索數據集,篩選出重要特徵,並進行預測建模。本文介紹瞭如何理解數據、使用相關矩陣找出變數關聯性,以及利用互資訊評估變數之間的依賴程度,幫助資料科學家在建模過程中選擇適當的變數,提升模型效果。
Thumbnail
Python資料視覺化在數據分析中扮演關鍵角色,透過視覺化捕捉數據模式、趨勢和異常,透過Matplotlib等工具創建專業圖表變相對簡單和高效。
Thumbnail
Python資料視覺化在數據分析中扮演關鍵角色,透過視覺化捕捉數據模式、趨勢和異常,透過Matplotlib等工具創建專業圖表變相對簡單和高效。
Thumbnail
本文介紹了在進行資料分析時,將類別欄位轉換為數值欄位的方法,包括Label Encoding、One-Hot Encoding、Binary Encoding、Target Encoding和Frequency Encoding。每種方法的應用範例、優缺點和適用場景都有詳細說明。
Thumbnail
本文介紹了在進行資料分析時,將類別欄位轉換為數值欄位的方法,包括Label Encoding、One-Hot Encoding、Binary Encoding、Target Encoding和Frequency Encoding。每種方法的應用範例、優缺點和適用場景都有詳細說明。
Thumbnail
數據分析與解讀 隨著數據的爆炸式增長,能夠分析、解讀和應用數據的能力變得至關重要。這包括熟悉數據分析工具和技術,如統計學、數據挖掘、機器學習等。然而,僅靠短時間的數據分析並不足以提供深入見解。 要熟悉數據分析工具和技術,如統計學、數據挖掘和機器學習,可以從以下幾個方面入手: 基礎知識的學習
Thumbnail
數據分析與解讀 隨著數據的爆炸式增長,能夠分析、解讀和應用數據的能力變得至關重要。這包括熟悉數據分析工具和技術,如統計學、數據挖掘、機器學習等。然而,僅靠短時間的數據分析並不足以提供深入見解。 要熟悉數據分析工具和技術,如統計學、數據挖掘和機器學習,可以從以下幾個方面入手: 基礎知識的學習
Thumbnail
本文將延續上一篇文章,經由訓練好的VAE模型其中的解碼器,來生成圖片。 [深度學習]訓練VAE模型用於生成圖片_訓練篇 輸入產生的隨機雜訊,輸入VAE的解碼器後,生成的圖片
Thumbnail
本文將延續上一篇文章,經由訓練好的VAE模型其中的解碼器,來生成圖片。 [深度學習]訓練VAE模型用於生成圖片_訓練篇 輸入產生的隨機雜訊,輸入VAE的解碼器後,生成的圖片
Thumbnail
本文在介紹如何用Python繪製各點大小不同的散布圖及用箭頭標註特殊點
Thumbnail
本文在介紹如何用Python繪製各點大小不同的散布圖及用箭頭標註特殊點
Thumbnail
當我們在開發一個AI應用服務時, 常常會需要載入大模型, But… 我們總不可能每一次的請求就載入一次模型吧! 這樣太沒有效率了, 也非常的浪費資源, 因此我們通常會希望應用程式啟動時就能夠載入模型, 之後每一次的請求只要讓模型進行運算即可, 那麼在FastAPI的框架中究竟要如何使用呢? 首
Thumbnail
當我們在開發一個AI應用服務時, 常常會需要載入大模型, But… 我們總不可能每一次的請求就載入一次模型吧! 這樣太沒有效率了, 也非常的浪費資源, 因此我們通常會希望應用程式啟動時就能夠載入模型, 之後每一次的請求只要讓模型進行運算即可, 那麼在FastAPI的框架中究竟要如何使用呢? 首
Thumbnail
本文介紹如何用Python繪製散布圖與迴歸線
Thumbnail
本文介紹如何用Python繪製散布圖與迴歸線
Thumbnail
本文介紹了如何使用資料樞紐分析的功能來整理所需的資料,並設定圖表的中文字型,最後提供了繪圖的程式碼範例。
Thumbnail
本文介紹了如何使用資料樞紐分析的功能來整理所需的資料,並設定圖表的中文字型,最後提供了繪圖的程式碼範例。
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News