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

การจัดอันดับใหม่ด้วยตัวเข้ารหัสไขว้กับ Cohere และ BGE

ผสานปลายทาง rerank ของ Cohere และโมเดล BGE-reranker เพื่อให้คะแนนคู่คำค้นหา-เอกสาร และจัดเรียงส่วนข้อมูลอันดับต้น ๆ ใหม่ตามความเกี่ยวข้องจริง

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

ตัวเข้ารหัสแบบไขว้คืออะไร

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

# Bi-encoder: separate encoding
query_vec = encoder.encode(query)          # [768] vector
doc_vec = encoder.encode(document)         # [768] vector
score = cosine_similarity(query_vec, doc_vec)  # compare independently

# Cross-encoder: joint encoding
combined_input = '[CLS] ' + query + ' [SEP] ' + document + ' [SEP]'
logits = cross_encoder.forward(combined_input)  # score from joint attention
# The model attends from every query token to every document token

API จัดอันดับใหม่ของ Cohere

Cohere Rerank คือ API สำหรับจัดอันดับใหม่ด้วยตัวเข้ารหัสแบบไขว้บนระบบคลาวด์ ซึ่งรับคำค้นหาและรายการข้อความเอกสารได้สูงสุด 1,000 รายการ แล้วส่งคืนคะแนนความเกี่ยวข้อง API นี้ใช้โมเดลตัวเข้ารหัสแบบไขว้ขนาดใหญ่ที่ฝึกด้วยชุดข้อมูลการจัดอันดับคุณภาพสูง และมักทำได้ดีกว่าตัวเข้ารหัสแบบไขว้ขนาดเล็กที่โฮสต์เองในการทดสอบมาตรฐานส่วนใหญ่ ค่าบริการของ API คิดตามจำนวนเอกสารที่จัดอันดับใหม่ทุก 1,000 รายการ

import cohere

co = cohere.Client('YOUR_COHERE_API_KEY')

candidates = [
    'How to configure pgvector in PostgreSQL for vector search',
    'BM25 scoring formula and hyperparameters explained',
    'Installing and using the pgvector extension for embeddings',
    'Hybrid search combining BM25 and dense retrieval',
]

result = co.rerank(
    model='rerank-english-v3.0',
    query='pgvector setup guide',
    documents=candidates,
    top_n=3,
    return_documents=True,
)

for item in result.results:
    print(f'Score {item.relevance_score:.4f}: {item.document.text[:60]}')

Cohere Rerank ในกระบวนการ RAG

การผสาน Cohere Rerank เข้ากับกระบวนการ RAG ทำตามรูปแบบง่าย ๆ ดังนี้ ดึงรายการที่เป็นไปได้ 20–50 รายการจากคลังเวกเตอร์ ดึงข้อความของรายการเหล่านั้นออกมา เรียกใช้ API จัดอันดับใหม่ของ Cohere แล้วเลือกผลลัพธ์อันดับต้น ๆ ตามจำนวนที่ต้องการเพื่อส่งต่อให้ LLM โดยทั่วไปจะมีเวลาแฝงเพิ่มขึ้น 100–300 มิลลิวินาที ซึ่งยอมรับได้เมื่อความแม่นยำที่ดีขึ้นช่วยให้คำตอบสุดท้ายดีขึ้น

import cohere
from openai import OpenAI

co = cohere.Client('COHERE_KEY')
client = OpenAI()

def rag_with_rerank(question: str, retriever, top_k: int = 5) -> str:
    # Stage 1: coarse retrieval
    candidates = retriever.invoke(question)  # returns 30 docs
    texts = [doc.page_content for doc in candidates]

    # Stage 2: Cohere re-ranking
    rerank_result = co.rerank(
        model='rerank-english-v3.0',
        query=question,
        documents=texts,
        top_n=top_k,
    )
    top_texts = [texts[r.index] for r in rerank_result.results]
    context = '\n\n'.join(top_texts)

    # Stage 3: generation
    response = client.chat.completions.create(
        model='gpt-4o-mini',
        messages=[
            {'role': 'system', 'content': 'Answer using only the provided context.'},
            {'role': 'user', 'content': f'Context:\n{context}\n\nQuestion: {question}'},
        ],
    )
    return response.choices[0].message.content

BGE Reranker: ทางเลือกแบบโอเพนซอร์ส

BGE Reranker (BAAI General Embedding) คือกลุ่มโมเดลตัวเข้ารหัสแบบไขว้แบบโอเพนซอร์สจาก Beijing Academy of AI โมเดล BAAI/bge-reranker-v2-m3 รองรับการจัดอันดับใหม่หลายภาษา และได้คะแนนใกล้เคียงกับ Cohere Rerank ในการทดสอบมาตรฐานภาษาอังกฤษ ขณะทำงานภายในเครื่อง คุณสามารถใช้โมเดลนี้ร่วมกับไลบรารี sentence-transformers เพื่อจัดอันดับใหม่โดยโฮสต์ระบบเองทั้งหมดและไม่เสียค่าใช้จ่าย API

from sentence_transformers import CrossEncoder

# Load BGE reranker model
reranker = CrossEncoder(
    'BAAI/bge-reranker-v2-m3',
    max_length=512,
    device='cpu',  # use 'cuda' if GPU is available
)

def bge_rerank(query: str, documents: list[str], top_k: int = 5) -> list[dict]:
    pairs = [[query, doc] for doc in documents]
    scores = reranker.predict(pairs, show_progress_bar=False)
    ranked = sorted(
        zip(documents, scores.tolist()),
        key=lambda x: x[1],
        reverse=True,
    )
    return [{'text': doc, 'score': score} for doc, score in ranked[:top_k]]

รูปแบบต่าง ๆ ของโมเดล BGE Reranker

กลุ่มโมเดล BGE Reranker มีตัวเลือกที่แลกเปลี่ยนระหว่างขนาดและคุณภาพ bge-reranker-base (พารามิเตอร์ 278M รายการ) มีขนาดเล็กที่สุดและทำงานเร็วที่สุด bge-reranker-large (พารามิเตอร์ 560M รายการ) มีความแม่นยำมากกว่า bge-reranker-v2-m3 รองรับหลายภาษาและเป็นค่าเริ่มต้นที่แนะนำสำหรับระบบใช้งานจริง หากต้องการความแม่นยำสูงสุด bge-reranker-v2-gemma จะใช้โครงสร้างหลัก Gemma และทำคะแนนนำหน้าตัวเลือกโอเพนซอร์สส่วนใหญ่ในการทดสอบมาตรฐานภาษาอังกฤษ

# Model size vs accuracy trade-offs
models = [
    ('BAAI/bge-reranker-base',   '278M params', 'fast,   English-focused'),
    ('BAAI/bge-reranker-large',  '560M params', 'better, English-focused'),
    ('BAAI/bge-reranker-v2-m3',  '570M params', 'best for multilingual use'),
    ('BAAI/bge-reranker-v2-gemma', '2B params', 'SOTA open-source accuracy'),
]

# For most RAG applications, bge-reranker-v2-m3 offers the best
# balance of accuracy, multilingual support, and inference speed on CPU

การประมวลผลคำทำนายของตัวเข้ารหัสแบบไขว้เป็นชุด

โดยค่าเริ่มต้น ตัวเข้ารหัสแบบไขว้จะประมวลผลคู่ (คำค้นหา, เอกสาร) ทีละคู่ แต่การทำนายเป็นชุดช่วยเพิ่มปริมาณงานได้อย่างมากด้วยการประมวลผลหลายคู่ผ่านโมเดลพร้อมกัน พารามิเตอร์ batch_size ควบคุมจำนวนคู่ที่ประมวลผลร่วมกัน บน GPU ขนาดชุด 32–128 เป็นค่าที่ใช้กันทั่วไป บน CPU การใช้ชุดเล็กลงที่ 4–16 จะช่วยลดการใช้หน่วยความจำ ขณะยังเพิ่มปริมาณงานเมื่อเทียบกับการประมวลผลตามลำดับ

def batch_rerank(reranker, query: str, documents: list[str],
                 top_k: int = 5, batch_size: int = 32) -> list[dict]:
    pairs = [[query, doc] for doc in documents]

    # Batch prediction
    all_scores = reranker.predict(
        pairs,
        batch_size=batch_size,
        show_progress_bar=len(pairs) > 100,
    )

    ranked = sorted(
        zip(documents, all_scores.tolist()),
        key=lambda x: x[1],
        reverse=True,
    )
    return [{'text': doc, 'score': score} for doc, score in ranked[:top_k]]

การผสาน CrossEncoderReranker กับ LangChain

LangChain มี CrossEncoderReranker เป็นตัวบีบอัดเอกสารที่ผสานการจัดอันดับใหม่ด้วยตัวเข้ารหัสแบบไขว้เข้ากับรูปแบบ ContextualCompressionRetriever ซึ่งช่วยให้คุณครอบตัวดึงข้อมูลที่มีอยู่ด้วยขั้นตอนการจัดอันดับใหม่ได้โดยใช้โค้ดเพียงไม่กี่บรรทัด และนำไปเชื่อมต่อกับสายงาน LCEL ใด ๆ ที่รับส่วนเชื่อมต่อของตัวดึงข้อมูลได้

from langchain.retrievers.document_compressors import CrossEncoderReranker
from langchain_community.cross_encoders import HuggingFaceCrossEncoder
from langchain.retrievers import ContextualCompressionRetriever
from langchain_community.vectorstores import FAISS
from langchain_openai import OpenAIEmbeddings

# Base retriever (coarse stage)
base_retriever = FAISS.from_documents(
    documents, OpenAIEmbeddings()
).as_retriever(search_kwargs={'k': 30})

# Re-ranker (fine stage)
model = HuggingFaceCrossEncoder(model_name='BAAI/bge-reranker-v2-m3')
compressor = CrossEncoderReranker(model=model, top_n=5)

# Combined two-stage retriever
two_stage_retriever = ContextualCompressionRetriever(
    base_compressor=compressor,
    base_retriever=base_retriever,
)

docs = two_stage_retriever.invoke('how does hybrid search work?')

การตีความคะแนนและการกำหนดเกณฑ์

คะแนนจากตัวเข้ารหัสแบบไขว้ไม่มีมาตราส่วนสากลเดียวกัน ตัวจัดอันดับใหม่ BGE ส่งออกลอจิตดิบ (มักอยู่ในช่วง -10 ถึง +10) ขณะที่ Cohere ส่งคืนคะแนนความเกี่ยวข้องที่ปรับให้อยู่ในช่วง 0 ถึง 1 คุณสามารถใช้เกณฑ์คะแนนขั้นต่ำเพื่อคัดเอกสารที่มีความเกี่ยวข้องต่ำมากออกจากบริบทที่จะส่งให้ LLM ซึ่งช่วยลดสัญญาณรบกวนได้อีก เริ่มต้นด้วยเกณฑ์ที่เปอร์เซ็นไทล์ที่ 25 ของคะแนน แล้วปรับตามผลลัพธ์

def rerank_with_threshold(reranker, query, documents, top_k=5, min_score=-2.0):
    pairs = [[query, doc] for doc in documents]
    scores = reranker.predict(pairs)

    scored_docs = [
        {'text': doc, 'score': float(score)}
        for doc, score in zip(documents, scores)
        if float(score) >= min_score  # filter low-relevance docs
    ]

    scored_docs.sort(key=lambda x: x['score'], reverse=True)

    if not scored_docs:
        return []  # nothing passed the threshold
    return scored_docs[:top_k]

Cohere กับ BGE: ควรเลือกอะไร

ใช้ Cohere Rerank เมื่อคุณต้องการ API ที่มีผู้ให้บริการจัดการ ต้องการความแม่นยำสูงสุดกับข้อมูลระดับองค์กรภาษาอังกฤษ และต้องการหลีกเลี่ยงโครงสร้างพื้นฐาน GPU ใช้ BGE Reranker เมื่อคุณต้องโฮสต์ระบบเองเพื่อรักษาความเป็นส่วนตัวของข้อมูล ต้องการไม่มีค่า API ต่อคำค้นหา ต้องการรองรับหลายภาษา หรือต้องการทำงานแบบออฟไลน์ ทั้งสองแบบได้คะแนน NDCG ใกล้เคียงกันในการทดสอบมาตรฐานส่วนใหญ่ ดังนั้นตัวเลือกจึงขึ้นอยู่กับความต้องการด้านโครงสร้างพื้นฐานและรูปแบบค่าใช้จ่ายเป็นหลัก

การจัดอันดับใหม่ของเนื้อหาหลายภาษา

หากคลังเอกสารหรือผู้ใช้ของคุณครอบคลุมหลายภาษา ให้เลือกตัวเข้ารหัสแบบไขว้หลายภาษา bge-reranker-v2-m3 รองรับมากกว่า 100 ภาษา และ Cohere Rerank ก็มีโมเดลหลายภาษาเช่นกัน นอกจากนี้ยังรองรับการจัดอันดับใหม่ข้ามภาษา เช่น การให้คะแนนคำค้นหาภาษาอังกฤษกับเอกสารภาษาฝรั่งเศสหรือสเปน ซึ่งมีประโยชน์ในการใช้งานระดับองค์กรทั่วโลกที่ฐานความรู้มีหลายภาษา

from sentence_transformers import CrossEncoder

# Multilingual BGE reranker
ml_reranker = CrossEncoder('BAAI/bge-reranker-v2-m3')

# Cross-lingual example: English query, French document
query_en = 'How to configure vector search?'
doc_fr = 'La configuration de la recherche vectorielle dans PostgreSQL'

score = ml_reranker.predict([[query_en, doc_fr]])
print(f'Cross-lingual relevance score: {float(score):.3f}')
# Positive score indicates the document is relevant to the query
# despite being in a different language

การแคชผลลัพธ์การจัดอันดับใหม่

การอนุมานด้วยตัวเข้ารหัสแบบไขว้เป็นส่วนที่ช้าที่สุดของกระบวนการสองขั้นตอน สำหรับแอปพลิเคชันที่คู่ (คำค้นหา, เอกสาร) เดิมเกิดขึ้นซ้ำบ่อย ๆ การแคชผลลัพธ์การจัดอันดับใหม่ช่วยตัดการอนุมานที่ซ้ำซ้อนได้ แฮชคู่ (คำค้นหา, document_id) เป็นคีย์แคช แล้วจัดเก็บคะแนนใน Redis พร้อม TTL อัตราการพบข้อมูลในแคชที่ 30–50 เปอร์เซ็นต์พบได้ทั่วไปในแอปพลิเคชันสนับสนุนลูกค้า ซึ่งผู้ใช้มักถามคำถามที่คล้ายกัน

import redis
import hashlib
import json

r = redis.Redis(host='localhost', port=6379)

def cached_rerank_score(reranker, query: str, doc_text: str, doc_id: str) -> float:
    cache_key = 'rerank:' + hashlib.md5((query + doc_id).encode()).hexdigest()
    cached = r.get(cache_key)
    if cached:
        return float(cached)

    score = float(reranker.predict([[query, doc_text]]))
    r.setex(cache_key, 3600, str(score))  # cache 1 hour
    return score

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

ทดสอบความเข้าใจเกี่ยวกับการจัดอันดับใหม่ด้วยตัวเข้ารหัสแบบไขว้จากบทเรียนนี้

สรุปบทเรียน

ในบทเรียนนี้ คุณได้เรียนรู้ว่า Cohere Rerank ให้บริการ API ตัวเข้ารหัสแบบไขว้บนระบบคลาวด์ที่มีความแม่นยำระดับแนวหน้า BGE Reranker เป็นทางเลือกแบบโอเพนซอร์สสำหรับการโฮสต์ระบบเอง รวมถึงเนื้อหาหลายภาษา และการประมวลผลเป็นชุดช่วยเพิ่มปริมาณงานได้อย่างมากเมื่อต้องให้คะแนนคู่ (คำค้นหา, เอกสาร) จำนวนมาก CrossEncoderReranker ของ LangChain ผสานทั้งสองแบบเข้ากับรูปแบบ ContextualCompressionRetriever ต่อไปเราจะนำการบีบอัดตามบริบทมาใช้เพื่อลดสัญญาณรบกวนในส่วนเนื้อหาที่ดึงมา

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

บทเรียน “การจัดอันดับใหม่ด้วยตัวเข้ารหัสไขว้กับ Cohere และ BGE” ฟรีหรือไม่

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

คุณจะเรียนรู้อะไรในบทเรียน “การจัดอันดับใหม่ด้วยตัวเข้ารหัสไขว้กับ Cohere และ BGE”

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

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

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

บทเรียน “การจัดอันดับใหม่ด้วยตัวเข้ารหัสไขว้กับ Cohere และ BGE” ใช้เวลานานแค่ไหน

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

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

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

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

  1. เหตุใดการดึงข้อมูลสองขั้นตอนจึงได้ผล
  2. การจัดอันดับใหม่ด้วยตัวเข้ารหัสไขว้กับ Cohere และ BGE
  3. การบีบอัดตามบริบทและการกรองความเกี่ยวข้อง
  4. การวัดผลกระทบของการจัดอันดับใหม่
← กลับไปที่ AI Engineering Academy