0Pricing
AI Engineering Academy · บทเรียน

เริ่มต้นใช้งาน Pinecone

สร้างดัชนี Pinecone เพิ่มหรืออัปเดตเวกเตอร์พร้อมข้อมูลกำกับ ดำเนินการค้นหาความคล้ายคลึงด้วยตัวกรอง และจัดการเนมสเปซเพื่อแยกกลุ่มข้อมูลต่าง ๆ

เริ่มต้นใช้งาน Pinecone เป็นบทเรียน AI Engineering Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน AI Engineering Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส AI Engineering Academy มีบทเรียนทั้งหมด 4 บทเรียน

Pinecone คืออะไร

Pinecone เป็นฐานข้อมูลเวกเตอร์ที่มีผู้ดูแลเต็มรูปแบบ ซึ่งจัดการโครงสร้างพื้นฐาน การขยายขนาด และการสำรองข้อมูลโดยอัตโนมัติ คุณโต้ตอบกับระบบผ่าน SDK ของ Python โดยส่งเวกเตอร์และเมทาดาทาผ่านการเรียก API Pinecone จัดเก็บข้อมูลเหล่านี้ไว้บนเซิร์ฟเวอร์ของตนและตอบคำค้นหาความคล้ายคลึงด้วยเวลาแฝงต่ำ แม้จะมีเวกเตอร์หลายพันล้านตัว

มีระดับการใช้งานฟรีที่เพียงพอสำหรับการเรียนรู้และปริมาณงานจริงขนาดเล็ก

การติดตั้ง SDK ของ Pinecone

ติดตั้งไคลเอนต์ Pinecone และเริ่มต้นใช้งานด้วยคีย์ API ของคุณ จัดเก็บคีย์ API ไว้ในตัวแปรสภาพแวดล้อม — อย่าเขียนข้อมูลลับลงในไฟล์ต้นฉบับโดยตรง คลาส Pinecone เป็นจุดเริ่มต้นหลักสำหรับการดำเนินการทั้งหมด

# pip install pinecone-client
import os
from pinecone import Pinecone

pc = Pinecone(api_key=os.environ['PINECONE_API_KEY'])

# List existing indexes to verify connection
existing = pc.list_indexes().names()
print('Existing indexes:', existing)

การสร้างดัชนี Pinecone

ดัชนีของ Pinecone คือคอลเลกชันที่จัดเก็บเวกเตอร์ของคุณ เมื่อสร้างดัชนี คุณต้องระบุ dimension (ต้องตรงกับโมเดลเอ็มเบดดิงของคุณ) และ metric สำหรับคำนวณความคล้ายคลึง สำหรับเอ็มเบดดิงของ OpenAI ให้ใช้ dimension=1536 และ metric='cosine'

การสร้างดัชนีเป็นแบบทำซ้ำกี่ครั้งก็ให้ผลลัพธ์เดิม: ข้อมูลจำเพาะแบบ serverless จะสร้างดัชนีตามต้องการโดยไม่จัดสรรความจุไว้ล่วงหน้า

from pinecone import Pinecone, ServerlessSpec
import os

pc = Pinecone(api_key=os.environ['PINECONE_API_KEY'])

index_name = 'my-rag-index'

if index_name not in pc.list_indexes().names():
    pc.create_index(
        name=index_name,
        dimension=1536,         # text-embedding-3-small dimension
        metric='cosine',
        spec=ServerlessSpec(
            cloud='aws',
            region='us-east-1'
        )
    )
    print(f'Created index: {index_name}')
else:
    print(f'Index already exists: {index_name}')

index = pc.Index(index_name)

การทำ Upsert เวกเตอร์พร้อมเมทาดาทา

Pinecone ใช้การดำเนินการ upsert (แทรกหรืออัปเดต) เวกเตอร์แต่ละตัวต้องมีสตริง id ที่ไม่ซ้ำกัน มี values (เอ็มเบดดิงในรูปแบบรายการเลขทศนิยม) และมี metadata ซึ่งเป็นทางเลือก (พจนานุกรมของฟิลด์ที่ใช้กรองได้) หากคุณทำ upsert ด้วย id ที่มีอยู่ เวกเตอร์เดิมจะถูกแทนที่

from openai import OpenAI

oai = OpenAI()

documents = [
    {'id': 'doc-001', 'text': 'What is RAG and how does it work?', 'category': 'faq'},
    {'id': 'doc-002', 'text': 'Pinecone is a managed vector database.', 'category': 'docs'},
    {'id': 'doc-003', 'text': 'OpenAI embeddings have 1536 dimensions.', 'category': 'docs'}
]

texts = [d['text'] for d in documents]
resp = oai.embeddings.create(model='text-embedding-3-small', input=texts)

vectors = [
    {
        'id': doc['id'],
        'values': resp.data[i].embedding,
        'metadata': {'text': doc['text'], 'category': doc['category']}
    }
    for i, doc in enumerate(documents)
]

index.upsert(vectors=vectors)
print(f'Upserted {len(vectors)} vectors')

การค้นหาดัชนี Pinecone

หากต้องการค้นหา ให้สร้างเอ็มเบดดิงจากคำค้นของคุณแล้วเรียก index.query() พร้อมเวกเตอร์คำค้นและ top_k เพื่อระบุจำนวนผลลัพธ์ที่ต้องการให้ส่งกลับ ตั้งค่า include_metadata=True เพื่อรับเมทาดาทาที่จัดเก็บไว้กลับมาพร้อมกับ id และคะแนนของผลลัพธ์ที่ตรงกัน

from openai import OpenAI

oai = OpenAI()

query = 'How many dimensions do OpenAI embeddings have?'
q_resp = oai.embeddings.create(model='text-embedding-3-small', input=query)
q_vec = q_resp.data[0].embedding

results = index.query(
    vector=q_vec,
    top_k=3,
    include_metadata=True
)

for match in results['matches']:
    score = match['score']
    text = match['metadata']['text']
    print(f'{score:.4f}: {text}')

การกรองตามเมทาดาทา

Pinecone รองรับ การกรองล่วงหน้า — จำกัดการค้นหาไว้เฉพาะเวกเตอร์ที่ตรงกับเงื่อนไขเมทาดาทาก่อนเรียกใช้ ANN ใช้พารามิเตอร์ filter พร้อมตัวดำเนินการรูปแบบ MongoDB: $eq, $in, $gt, $lt, $and, $or

โปรดทำดัชนีฟิลด์เมทาดาทาที่คุณวางแผนจะใช้กรองทุกครั้งเมื่อสร้างดัชนี เพื่อให้การกรองมีประสิทธิภาพ

# Filter to only 'docs' category results
results = index.query(
    vector=q_vec,
    top_k=5,
    filter={
        'category': {'$eq': 'docs'}
    },
    include_metadata=True
)

print(f'Filtered results: {len(results["matches"])}')
for m in results['matches']:
    print(f'  [{m["metadata"]["category"]}] {m["metadata"]["text"][:60]}')

เนมสเปซสำหรับแยกข้อมูล

เนมสเปซของ Pinecone แบ่งดัชนีเดียวออกเป็นส่วนที่แยกจากกัน คำค้นในเนมสเปซหนึ่งจะไม่ส่งผลลัพธ์จากอีกเนมสเปซกลับมา ทำให้เนมสเปซเหมาะอย่างยิ่งสำหรับระบบ RAG แบบหลายผู้เช่า ซึ่งลูกค้าแต่ละรายควรค้นหาได้เฉพาะเอกสารของตนเอง

ทั้ง upsert และ query รองรับสตริง namespace ที่เป็นทางเลือก เนมสเปซเริ่มต้นคือสตริงว่าง

# Upsert into a specific namespace
index.upsert(
    vectors=[{'id': 'doc-001', 'values': q_vec, 'metadata': {'text': 'Tenant A doc'}}],
    namespace='tenant-a'
)

# Query only tenant-a's documents
results = index.query(
    vector=q_vec,
    top_k=5,
    namespace='tenant-a',
    include_metadata=True
)
print(f'Tenant-A results: {len(results["matches"])}')

การทำ Batch Upsert สำหรับคลังข้อมูลขนาดใหญ่

เมื่อจัดทำดัชนีเอกสารหลายพันรายการ ให้แบ่งเวกเตอร์เป็นชุด ชุดละไม่เกิน 100 เวกเตอร์ ต่อการเรียก upsert (ขนาดชุดที่ Pinecone แนะนำ) ชุดที่ใหญ่กว่านี้อาจติดข้อจำกัดด้านขนาด เนื่องจากข้อมูลที่ส่งในแต่ละคำขอมีขนาดจำกัดประมาณ 4MB

def batch_upsert(index, vectors, batch_size=100):
    total = len(vectors)
    for start in range(0, total, batch_size):
        batch = vectors[start:start + batch_size]
        index.upsert(vectors=batch)
        print(f'Upserted {min(start + batch_size, total)}/{total}')

# Usage:
# batch_upsert(index, all_vectors, batch_size=100)

การตรวจสอบสถิติของดัชนี

ใช้ index.describe_index_stats() เพื่อตรวจสอบจำนวนเวกเตอร์ที่จัดเก็บอยู่ในแต่ละเนมสเปซและจำนวนเวกเตอร์ทั้งหมด ซึ่งมีประโยชน์สำหรับยืนยันว่าการทำ upsert เสร็จสมบูรณ์และติดตามการเติบโตของดัชนีในระยะยาว

stats = index.describe_index_stats()

print(f'Total vectors: {stats["total_vector_count"]}')
print(f'Namespaces:')
for ns, info in stats.get('namespaces', {}).items():
    print(f'  {ns!r}: {info["vector_count"]} vectors')

การลบและอัปเดตเวกเตอร์

ใช้ index.delete(ids=[...]) เพื่อลบเวกเตอร์ที่ระบุด้วย id หากต้องการอัปเดตเวกเตอร์ (เช่น เมื่อมีการแก้ไขเอกสาร) เพียงทำ upsert ด้วย id เดิม Pinecone จะเขียนทับรายการที่มีอยู่

หากต้องการลบเวกเตอร์ทั้งหมดในเนมสเปซ (เช่น เพื่อจัดทำดัชนีใหม่หลังรีเฟรชทั้งหมด) ให้ใช้ index.delete(delete_all=True, namespace='...')

# Delete specific vectors by id
index.delete(ids=['doc-001', 'doc-002'])

# Update a vector (upsert overwrites by id)
index.upsert(vectors=[{
    'id': 'doc-003',
    'values': q_vec,            # new embedding
    'metadata': {'text': 'Updated content.'}
}])

# Delete all vectors in a namespace
# index.delete(delete_all=True, namespace='tenant-a')

ราคาและระดับการใช้งานฟรีของ Pinecone

Pinecone มีระดับ serverless ฟรีพร้อมพื้นที่จัดเก็บ 2GB ซึ่งเพียงพอสำหรับเวกเตอร์ประมาณ 300,000 ตัวที่มี 1536 มิติ หลังจากนั้น ราคาแบบ serverless จะคิดตามหน่วยการอ่านและหน่วยการเขียนที่ใช้ไป

สำหรับปริมาณงานจริง ให้ประมาณค่าใช้จ่ายรายเดือนโดยคำนวณ: (จำนวนคำค้นต่อวัน × 30 × ค่าใช้จ่ายต่อคำค้น) + (จำนวนเวกเตอร์ทั้งหมด × ค่าพื้นที่จัดเก็บ) Serverless มักคุ้มค่ากว่าแผนที่ใช้พ็อดสำหรับปริมาณงานที่มีการใช้งานผันแปร

ตรวจสอบความเข้าใจอย่างรวดเร็ว

ทดสอบความเข้าใจแนวคิดวิศวกรรม AI จากบทเรียนนี้

สรุปบทเรียน

ในบทเรียนนี้ คุณได้เรียนรู้ว่า ดัชนี Pinecone ต้องใช้มิติและเมทริกที่ตรงกับโมเดลเอ็มเบดดิงของคุณ การดำเนินการ upsert ใช้ id ที่ไม่ซ้ำกัน ดังนั้นการอัปเดตเอกสารจึงทำได้ง่าย ๆ ด้วยการทำ upsert ซ้ำโดยใช้ id เดิม และ เนมสเปซช่วยแยกคอลเลกชันเวกเตอร์ภายในดัชนีเดียวสำหรับกรณีใช้งานแบบหลายผู้เช่า ต่อไป เราจะสำรวจ pgvector ซึ่งนำการค้นหาเวกเตอร์มาไว้ใน PostgreSQL โดยตรง

คำถามที่พบบ่อย

บทเรียน “เริ่มต้นใช้งาน Pinecone” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “เริ่มต้นใช้งาน Pinecone” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส AI Engineering Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส AI Engineering Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “เริ่มต้นใช้งาน Pinecone”

สร้างดัชนี Pinecone เพิ่มหรืออัปเดตเวกเตอร์พร้อมข้อมูลกำกับ ดำเนินการค้นหาความคล้ายคลึงด้วยตัวกรอง และจัดการเนมสเปซเพื่อแยกกลุ่มข้อมูลต่าง ๆ คุณปฏิบัติ AI Engineering Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน AI Engineering Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน AI Engineering Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน

บทเรียน “เริ่มต้นใช้งาน Pinecone” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน AI Engineering Academy นี้ได้ไหม

ได้ บทเรียน AI Engineering Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. เหตุใดคุณจึงต้องมีฐานข้อมูลเวกเตอร์
  2. เริ่มต้นใช้งาน Pinecone
  3. pgvector: เวกเตอร์ฝังตัวใน PostgreSQL
  4. การเลือกและทดสอบประสิทธิภาพแหล่งจัดเก็บเวกเตอร์
← กลับไปที่ AI Engineering Academy