0Pricing
AI Agents · บทเรียน

การกรองข้อมูลกำกับสำหรับการค้นหาแบบผสม

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

การกรองข้อมูลกำกับสำหรับการค้นหาแบบผสม เป็นบทเรียน 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

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

  1. เปรียบเทียบ Pinecone, Weaviate และ Qdrant
  2. การกรองข้อมูลกำกับสำหรับการค้นหาแบบผสม
  3. การอัปเดตและลบเวกเตอร์
  4. การเลือกเมตริกระยะทาง (cosine, L2, dot)
← กลับไปที่ AI Agents