การจัดอันดับใหม่ด้วยตัวเข้ารหัสไขว้กับ 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 tokenAPI จัดอันดับใหม่ของ 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.contentBGE 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- เหตุใดการดึงข้อมูลสองขั้นตอนจึงได้ผล
- การจัดอันดับใหม่ด้วยตัวเข้ารหัสไขว้กับ Cohere และ BGE
- การบีบอัดตามบริบทและการกรองความเกี่ยวข้อง
- การวัดผลกระทบของการจัดอันดับใหม่