เริ่มต้นใช้งาน 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- เหตุใดคุณจึงต้องมีฐานข้อมูลเวกเตอร์
- เริ่มต้นใช้งาน Pinecone
- pgvector: เวกเตอร์ฝังตัวใน PostgreSQL
- การเลือกและทดสอบประสิทธิภาพแหล่งจัดเก็บเวกเตอร์