การกรองข้อมูลกำกับสำหรับการค้นหาแบบผสม
ผสานความคล้ายของเวกเตอร์กับตัวกรองแบบมีโครงสร้าง เช่น วันที่ ผู้เขียน และแท็ก เพื่อให้ค้นคืนข้อมูลได้แม่นยำและสอดคล้องกับบริบท
การกรองข้อมูลกำกับสำหรับการค้นหาแบบผสม เป็นบทเรียน AI Agents ฟรีบน CoddyKit นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน AI Agents และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส AI Agents มีบทเรียนทั้งหมด 4 บทเรียน
บางส่วนของบทเรียนนี้ยังไม่ได้รับการแปล และแสดงเป็นภาษาอังกฤษ
เหตุใดจึงต้องกรอง
vector search ล้วนจะส่งคืนชิ้นส่วน K รายการที่คล้ายกันที่สุด แม้ว่าชิ้นส่วนเหล่านั้นจะมาจากผู้เช่าระบบ ภาษาหรือเอกสารที่ไม่ถูกต้องก็ตาม
ตัวกรองข้อมูลเมตาจะจำกัดขอบเขตของ search ให้อยู่ในส่วนย่อยที่เกี่ยวข้อง ทำให้ได้ทั้งความแม่นยำและความครอบคลุม
การจัดเก็บข้อมูลเมตา
แนบพจนานุกรมข้อมูลเมตาเข้ากับทุกชิ้นส่วนขณะนำเข้าข้อมูล
metadata = {
'tenant_id': 'acme',
'language': 'en',
'source': 'help-docs',
'updated_at': '2024-08-12',
'tags': ['shipping', 'returns']
}
for k, v in metadata.items():
print(f"{k}: {v}")
Filtering in Pinecone
results = index.query(
vector=query_vec,
top_k=5,
filter={
'tenant_id': 'acme',
'language': 'en'
}
)ตัวกรองช่วงค่า
ฐานข้อมูลเวกเตอร์ส่วนใหญ่รองรับตัวกรองช่วงค่าด้วย
filter = {
'updated_at': {'$gte': '2024-01-01'},
'score': {'$gt': 0.5}
}
print(filter)
In and Not-In
filter = {
'tags': {'$in': ['shipping', 'returns']},
'archived': {'$ne': True}
}
print(filter)
การกรองใน Qdrant
Qdrant มีภาษาสำหรับการกรองที่มีความสามารถสูง
from qdrant_client.models import Filter, FieldCondition, MatchValue
filter = Filter(must=[
FieldCondition(key='tenant_id', match=MatchValue(value='acme')),
FieldCondition(key='language', match=MatchValue(value='en'))
])
results = client.search(
collection_name='docs',
query_vector=query_vec,
query_filter=filter,
limit=5
)การกรองล่วงหน้าเทียบกับการกรองภายหลัง
มีสองแนวทาง
- การกรองล่วงหน้า — ใช้ตัวกรอง THEN จึงทำการค้นหา (ถูกต้อง แต่อาจช้าหากไม่มีดัชนีข้อมูลเมตา)
- การกรองภายหลัง — ทำการค้นหาแล้วตัดรายการที่ไม่ตรงเงื่อนไขออก (รวดเร็ว แต่อาจไม่เหลือผลลัพธ์เลย)
ระบบใช้งานจริงจะใช้การกรองล่วงหน้าร่วมกับดัชนีข้อมูลเมตาที่เหมาะสม
เวกเตอร์แบบผสมและคีย์เวิร์ด
ผสานการค้นหาเชิงความหมายเข้ากับการค้นหาด้วยคีย์เวิร์ดแบบดั้งเดิมของ BM25 ทำงานทั้งสองแบบแล้วรวมคะแนนเข้าด้วยกัน (การรวมอันดับแบบส่วนกลับเป็นมาตรฐาน)
def rrf(vec_results, bm25_results, k=60):
scores = defaultdict(float)
for rank, doc in enumerate(vec_results):
scores[doc.id] += 1 / (k + rank)
for rank, doc in enumerate(bm25_results):
scores[doc.id] += 1 / (k + rank)
return sorted(scores.items(), key=lambda x: -x[1])การรองรับหลายผู้เช่า
ในระบบ SaaS ทุก query ต้องกรองด้วย tenant_id ควรกำหนดค่าไว้ตายตัวในตัวห่อหุ้มการดึงข้อมูล เพื่อไม่ให้ลืมโดยเด็ดขาด
def search(query, tenant_id, top_k=5):
return index.query(
vector=embed(query),
top_k=top_k,
filter={'tenant_id': tenant_id}
)การควบคุมสิทธิ์ผ่านข้อมูลเมตา
จัดเก็บสิทธิ์ของผู้ใช้และบทบาทไว้ในข้อมูลเมตา
metadata = {
'visibility': 'public', # or 'internal', 'restricted'
'department': 'engineering',
'allowed_roles': ['engineer', 'manager']
}
# At query time:
filter = {'allowed_roles': {'$contains': current_user_role}}การเพิ่มน้ำหนักตามความใหม่
หากต้องการให้เอกสารใหม่ได้รับความสำคัญมากกว่า ให้ retrieve รายการที่เป็นไปได้จำนวนมากขึ้น แล้วคำนวณคะแนนใหม่ตามความใหม่
candidates = index.query(vector=query_vec, top_k=50)
scored = [
(c.score * recency_factor(c.metadata['updated_at']), c)
for c in candidates
]
scored.sort(reverse=True)
final = scored[:5]ระวังความหลากหลายของข้อมูลเมตา
ข้อมูลเมตาที่มีค่าจำนวนมากและไม่ซ้ำกัน (หลายล้านค่า) ทำให้ดัชนีมีขนาดใหญ่ หากทำได้ควรรวมค่าล่วงหน้า เช่น จัดเก็บปี-เดือนแทนการประทับเวลาเต็มรูปแบบสำหรับการกรองตามเวลา
ตัวกรองที่ทำงานเสมอ
ตัวกรองใดที่เอเจนต์แบบหลายผู้เช่าทุกรายการต้องใส่ไว้ ALWAYS
สรุปทบทวน
ตัวกรองข้อมูลเมตาจะจำกัดขอบเขตของ search ผสานเข้ากับการทำงานแบบผสม (เวกเตอร์ + BM25) เพื่อให้ได้ผลลัพธ์ที่ดีที่สุด การรองรับหลายผู้เช่าและการควบคุมสิทธิ์ต่างพึ่งพาสิ่งนี้
คำถามที่พบบ่อย
บทเรียน “การกรองข้อมูลกำกับสำหรับการค้นหาแบบผสม” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “การกรองข้อมูลกำกับสำหรับการค้นหาแบบผสม” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส AI Agents ให้อัปเกรดเป็น CoddyKit PRO คอร์ส AI Agents มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “การกรองข้อมูลกำกับสำหรับการค้นหาแบบผสม”
ผสานความคล้ายของเวกเตอร์กับตัวกรองแบบมีโครงสร้าง เช่น วันที่ ผู้เขียน และแท็ก เพื่อให้ค้นคืนข้อมูลได้แม่นยำและสอดคล้องกับบริบท คุณปฏิบัติ AI Agents ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน AI Agents หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน AI Agents บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน
บทเรียน “การกรองข้อมูลกำกับสำหรับการค้นหาแบบผสม” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน AI Agents นี้ได้ไหม
ได้ บทเรียน AI Agents ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- เปรียบเทียบ Pinecone, Weaviate และ Qdrant
- การกรองข้อมูลกำกับสำหรับการค้นหาแบบผสม
- การอัปเดตและลบเวกเตอร์
- การเลือกเมตริกระยะทาง (cosine, L2, dot)