AGI และ AI แห่งอนาคต
พลังของ Rerankers และการค้นหาที่มีหลายขั้นตอนสำหรับการสร้างเนื้อหาที่เพิ่มขึ้นโดยการค้นหา

By
Aayush Mittal มิตตาล
เมื่อพูดถึงการประมวลผลภาษาธรรมชาติ (NLP) และการค้นหาข้อมูล ความสามารถในการค้นหาข้อมูลที่เกี่ยวข้องอย่างมีประสิทธิภาพและแม่นยำเป็นสิ่งสำคัญ เมื่อภาคส่วนนี้ต่อเนื่องไป การพัฒนาวิธีการและเทคนิคใหม่ๆ เพื่อปรับปรุงประสิทธิภาพของระบบการค้นหาข้อมูล โดยเฉพาะอย่างยิ่งในบริบทของ การสร้างเนื้อหาที่เพิ่มขึ้นโดยการค้นหา (RAG) เทคนิคหนึ่งที่เรียกว่าการค้นหาที่มีหลายขั้นตอนพร้อมกับ rerankers ได้ปรากฏขึ้นเป็นวิธีแก้ปัญหาที่มีประสิทธิภาพเพื่อแก้ไขข้อจำกัดที่ซ่อนอยู่ของวิธีการค้นหาทั่วไป
ในบทความนี้ เราจะพูดถึงความซับซ้อนของการค้นหาที่มีหลายขั้นตอนและ rerankers โดยสำรวจหลักการ พื้นฐาน วิธีการนำไปใช้ และประโยชน์ที่พวกมันให้ในการปรับปรุงความแม่นยำและประสิทธิภาพของระบบ RAG เราจะให้ตัวอย่างเชิงปฏิบัติและโค้ดเพื่ออธิบายแนวคิดและอำนวยความเข้าใจที่ลึกซึ้งยิ่งขึ้นเกี่ยวกับเทคนิคที่ทันสมัยนี้
การทำความเข้าใจการสร้างเนื้อหาที่เพิ่มขึ้นโดยการค้นหา (RAG)
ก่อนที่จะพูดถึงรายละเอียดของการค้นหาที่มีหลายขั้นตอนและ rerankers มาทำความเข้าใจกับแนวคิดของการสร้างเนื้อหาที่เพิ่มขึ้นโดยการค้นหา (RAG) กันก่อน RAG เป็นเทคนิคที่ขยายความสามารถและความรู้ของโมเดลภาษาขนาดใหญ่ (LLM) โดยการให้พวกมันเข้าถึงแหล่งข้อมูลภายนอก เช่น ฐานข้อมูลหรือคอลเลกชันเอกสาร อ้างอิงเพิ่มเติมจากบทความ “การดูอย่างลึกเกี่ยวกับการสร้างเนื้อหาที่เพิ่มขึ้นโดยการค้นหาใน LLM“
กระบวนการ RAG ทั่วไปประกอบด้วยขั้นตอนต่อไปนี้:
- คำถาม: ผู้ใช้ถามคำถามหรือให้คำแนะนำแก่ระบบ
- การค้นหา: ระบบค้นหาในฐานข้อมูลเวกเตอร์หรือคอลเลกชันเอกสารเพื่อหาข้อมูลที่เกี่ยวข้องกับคำถามของผู้ใช้
- การเพิ่มข้อมูล: ข้อมูลที่ค้นหามาได้รวมกับคำถามหรือคำแนะนำของผู้ใช้เดิม
- การสร้าง: โมเดลภาษาประมวลผลข้อมูลที่เพิ่มขึ้นและสร้างคำตอบ โดยใช้ข้อมูลภายนอกเพื่อปรับปรุงความแม่นยำและความครอบคลุมของผลลัพธ์
แม้ว่า RAG จะเป็นเทคนิคที่มีประสิทธิภาพ แต่ก็ไม่ได้ปราศจากความท้าทาย หนึ่งในประเด็นหลักอยู่ที่ขั้นตอนการค้นหา โดยวิธีการค้นหาทั่วไปอาจล้มเหลวในการระบุเอกสารที่เกี่ยวข้องมากที่สุด ส่งผลให้โมเดลภาษาสามารถสร้างคำตอบที่ไม่เหมาะสมหรือไม่ถูกต้องได้
ความจำเป็นของการค้นหาที่มีหลายขั้นตอนและ rerankers
วิธีการค้นหาทั่วไป เช่น ที่อาศัยการตรงกันของคำสำคัญหรือแบบจำลองเวกเตอร์ มักต้องดิ้นรนเพื่อจับความสัมพันธ์ทางภาษาที่ซับซ้อนระหว่างคำถามและเอกสาร สิ่งนี้อาจส่งผลให้เอกสารที่ค้นหามาได้เพียงผิวเผินหรือพลาดข้อมูลสำคัญที่สามารถปรับปรุงคุณภาพของคำตอบที่สร้างขึ้นได้
เพื่อแก้ไขความท้าทายนี้ นักวิจัยและผู้ปฏิบัติงานได้หันมาใช้การค้นหาที่มีหลายขั้นตอนพร้อมกับ rerankers วิธีนี้ประกอบด้วยกระบวนการที่มีสองขั้นตอน:
- การค้นหาตามขั้นตอนแรก: ในขั้นตอนแรก ระบบจะค้นหาเซตของเอกสารที่อาจเกี่ยวข้องในขนาดที่ค่อนข้างใหญ่ โดยใช้วิธีการค้นหาที่เร็วและมีประสิทธิภาพ เช่น แบบจำลองเวกเตอร์หรือการค้นหาที่อาศัยคำสำคัญ
- การเรียงลำดับใหม่: ในขั้นตอนที่สอง ระบบจะใช้โมเดลการเรียงลำดับใหม่ที่ซับซ้อนกว่าเพื่อจัดเรียงเอกสารที่ค้นหามาได้ใหม่ตามความเกี่ยวข้องกับคำถาม โดยนำเอกสารที่เกี่ยวข้องมากที่สุดมาไว้ด้านหน้า
โมเดลการเรียงลำดับใหม่ ซึ่งมักเป็นเครือข่ายประสาทหรือสถาปัตยกรรมที่อาศัยทรานส์ฟอร์เมอร์ จะได้รับการฝึกฝนเพื่อประเมินความเกี่ยวข้องของเอกสารกับคำถาม โดยใช้ความสามารถในการเข้าใจภาษาที่ลึกซึ้งและความสัมพันธ์ทางภาษาและบริบท ระหว่างคำถามและเอกสาร ส่งผลให้ได้การเรียงลำดับที่แม่นยำและเกี่ยวข้องมากขึ้น
ประโยชน์ของการค้นหาที่มีหลายขั้นตอนและ rerankers
การนำการค้นหาที่มีหลายขั้นตอนพร้อมกับ rerankers ไปใช้ให้ได้ผลลัพธ์ที่ดีหลายประการในบริบทของระบบ RAG:
- ความแม่นยำที่ดีขึ้น: โดยการเรียงลำดับเอกสารที่ค้นหามาได้ใหม่และนำเอกสารที่เกี่ยวข้องมากที่สุดมาไว้ด้านหน้า ระบบสามารถให้ข้อมูลที่แม่นยำและถูกต้องมากขึ้นแก่โมเดลภาษา ส่งผลให้ได้คำตอบที่มีคุณภาพสูงขึ้น
- การลดปัญหาออกนอกโดเมน: โมเดลการเรียงลำดับใหม่สามารถฝึกฝนได้โดยใช้ข้อมูลเฉพาะโดเมน ซึ่งช่วยลดปัญหา “ออกนอกโดเมน” และปรับปรุงความเกี่ยวข้องของเอกสารที่ค้นหามาได้ในโดเมนเฉพาะ
- การปรับขนาด: วิธีการที่มีหลายขั้นตอนช่วยให้สามารถปรับขนาดได้ดีโดยใช้วิธีการค้นหาที่เร็วและเบาในขั้นตอนแรก และสำรองขั้นตอนการเรียงลำดับใหม่ที่ต้องใช้การประมวลผลมากขึ้นสำหรับเซตเอกสารที่เล็กกว่า
- ความยืดหยุ่น: โมเดลการเรียงลำดับใหม่สามารถถูกเปลี่ยนหรืออัปเดตได้อย่างอิสระจากวิธีการค้นหาตามขั้นตอนแรก ทำให้ระบบมีความยืดหยุ่นและสามารถปรับตัวให้เข้ากับความต้องการที่เปลี่ยนแปลงได้
ColBERT: การโต้ตอบที่มีประสิทธิภาพและประสิทธิผลในระยะหลัง
หนึ่งในโมเดลที่โดดเด่นในด้านการเรียงลำดับใหม่คือ ColBERT (การโต้ตอบที่มีบริบทในระยะหลังบน BERT) ColBERT เป็นโมเดลการเรียงลำดับเอกสารที่ใช้ความสามารถในการเข้าใจภาษาลึกซึ้งของ BERT และแนะนำกลไกโต้ตอบใหม่ที่เรียกว่า “การโต้ตอบในระยะหลัง”
กลไกการโต้ตอบในระยะหลังของ ColBERT ช่วยให้สามารถค้นหาและจัดเรียงเอกสารได้อย่างมีประสิทธิภาพและแม่นยำ โดยการประมวลผลคำถามและเอกสารแยกจากกันจนถึงขั้นตอนสุดท้ายของกระบวนการค้นหา โดยเฉพาะ ColBERT จะเข้ารหัสคำถามและเอกสารโดยใช้ BERT แล้วจึงใช้ขั้นตอนโต้ตอบที่เบาแต่มีประสิทธิภาพเพื่อสร้างความคล้ายคลึงที่ละเอียดระหว่างคำถามและเอกสาร
การออกแบบการโต้ตอบในระยะหลังของ ColBERT มีประโยชน์หลายประการ รวมถึงประสิทธิภาพการคำนวณที่ดีขึ้น การปรับขนาดที่ดีขึ้นตามขนาดของคอลเลกชันเอกสาร และความสามารถในการใช้งานจริงในสถานการณ์จริง นอกจากนี้ ColBERT ยังได้รับการปรับปรุงด้วยเทคนิค เช่น การดูแลที่ไม่มีเสียงและความกดทับของส่วนที่เหลือ (ใน ColBERTv2) ซึ่งช่วยให้กระบวนการฝึกอบรมและลดขนาดโมเดลลงในขณะเดียวกันก็รักษาความสามารถในการค้นหาที่สูงไว้
การนำการค้นหาที่มีหลายขั้นตอนพร้อมกับ rerankers ไปใช้
ทีนี้ที่เรามีความเข้าใจเกี่ยวกับหลักการเบื้องหลังของการค้นหาที่มีหลายขั้นตอนและ rerankers แล้ว มาทำความเข้าใจเกี่ยวกับการนำไปใช้จริงภายในระบบ RAG กัน เราจะใช้ไลบรารีและเฟรมเวิร์กที่เป็นที่นิยมเพื่อแสดงการรวมเทคนิคเหล่านี้
การเตรียมสภาพแวดล้อม
ก่อนที่จะเริ่มเขียนโค้ด เราต้องเตรียมสภาพแวดล้อมการพัฒนา เราจะใช้ Python และไลบรารี NLP ที่เป็นที่นิยมหลายตัว รวมถึง Hugging Face Transformers, Sentence Transformers และ LanceDB
# ติดตั้งไลบรารีที่จำเป็น !pip install datasets huggingface_hub sentence_transformers lancedb
การเตรียมข้อมูล
เพื่อการแสดงตัวอย่าง เราจะใช้เซตข้อมูล “ai-arxiv-chunked” จาก Hugging Face Datasets ซึ่งมีเอกสารมากกว่า 400 ฉบับจาก ArXiv ในหัวข้อการเรียนรู้ของเครื่อง, การประมวลผลภาษาธรรมชาติ และโมเดลภาษาขนาดใหญ่
from datasets import load_dataset <p>dataset = load_dataset("jamescalam/ai-arxiv-chunked", split="train")</p> &lt;pre&gt;
ต่อไป เราจะประมวลผลข้อมูลและแบ่งออกเป็นชิ้นเล็กๆ เพื่ออำนวยความสะดวกในการค้นหาและประมวลผล
from transformers import AutoTokenizer <p>tokenizer = AutoTokenizer.from_pretrained("bert-base-uncased")</p> <p>def chunk_text(text, chunk_size=512, overlap=64): tokens = tokenizer.encode(text, return_tensors="pt", truncation=True) chunks = tokens.split(chunk_size - overlap) texts = [tokenizer.decode(chunk) for chunk in chunks] return texts</p> <p>chunked_data = [] for doc in dataset: text = doc["chunk"] chunked_texts = chunk_text(text) chunked_data.extend(chunked_texts)</p>
สำหรับการค้นหาตามขั้นตอนแรก เราจะใช้โมเดล Sentence Transformer เพื่อเข้ารหัสเอกสารและคำถามเป็นตัวแทนเวกเตอร์ที่มีความหนาแน่น และจากนั้นใช้การค้นหาที่ใกล้ที่สุดโดยประมาณโดยใช้ฐานข้อมูลเวกเตอร์ เช่น LanceDB
from sentence_transformers import SentenceTransformer from lancedb import lancedb <p># โหลดโมเดล Sentence Transformer model = SentenceTransformer('all-MiniLM-L6-v2')</p> <p># สร้างฐานข้อมูลเวกเตอร์ LanceDB db = lancedb.lancedb('/path/to/store') db.create_collection('docs', vector_dimension=model.get_sentence_embedding_dimension())</p> <p># อินเด็กซ์เอกสาร for text in chunked_data: vector = model.encode(text).tolist() db.insert_document('docs', vector, text)</p> <p>from sentence_transformers import SentenceTransformer from lancedb import lancedb</p> <p># โหลดโมเดล Sentence Transformer model = SentenceTransformer('all-MiniLM-L6-v2')</p> <p># สร้างฐานข้อมูลเวกเตอร์ LanceDB db = lancedb.lancedb('/path/to/store') db.create_collection('docs', vector_dimension=model.get_sentence_embedding_dimension())</p> <p># อินเด็กซ์เอกสาร for text in chunked_data: vector = model.encode(text).tolist() db.insert_document('docs', vector, text)
เมื่อเอกสารถูกอินเด็กซ์แล้ว เราสามารถทำการค้นหาตามขั้นตอนแรกได้โดยการค้นหาสมาชิกที่ใกล้ที่สุดของเวกเตอร์คำถาม
from transformers import AutoTokenizer <p>tokenizer = AutoTokenizer.from_pretrained("bert-base-uncased")</p> <p>def chunk_text(text, chunk_size=512, overlap=64): tokens = tokenizer.encode(text, return_tensors="pt", truncation=True) chunks = tokens.split(chunk_size - overlap) texts = [tokenizer.decode(chunk) for chunk in chunks] return texts</p> <p>chunked_data = [] for doc in dataset: text = doc["chunk"] chunked_texts = chunk_text(text) chunked_data.extend(chunked_texts)
การเรียงลำดับใหม่
หลังจากการค้นหาตามขั้นตอนแรก เราจะใช้โมเดลการเรียงลำดับใหม่เพื่อจัดเรียงเอกสารที่ค้นหามาได้ใหม่ตามความเกี่ยวข้องกับคำถาม ในตัวอย่างนี้ เราจะใช้ ColBERT ซึ่งเป็นโมเดลการเรียงลำดับที่เร็วและแม่นยำซึ่งออกแบบมาเฉพาะสำหรับการจัดอันดับเอกสาร
from lancedb.rerankers import ColbertReranker reranker = ColbertReranker() <p># การเรียงลำดับใหม่ของเอกสารตามขั้นตอนแรก reranked_docs = reranker.rerank(query, initial_docs)
รายการ reranked_docs ตอนนี้มีเอกสารที่จัดเรียงใหม่ตามความเกี่ยวข้องกับคำถาม ตามที่โมเดลการเรียงลำดับใหม่ของ ColBERT ระบุ
การเพิ่มข้อมูลและสร้าง
ด้วยเอกสารที่จัดเรียงใหม่และเกี่ยวข้องที่มีในมือแล้ว เราสามารถดำเนินการต่อไปยังขั้นตอนการเพิ่มข้อมูลและสร้างของพายพัน RAG ได้ เราจะใช้โมเดลภาษาจากไลบรารี Hugging Face Transformers เพื่อสร้างคำตอบสุดท้าย
from transformers import AutoTokenizer, AutoModelForSeq2SeqLM <p>tokenizer = AutoTokenizer.from_pretrained("t5-base") model = AutoModelForSeq2SeqLM.from_pretrained("t5-base")</p> <p># การเพิ่มข้อมูลคำถามด้วยเอกสารที่จัดเรียงใหม่ augmented_query = query + " " + " ".join(reranked_docs[:3])</p> <p># การสร้างคำตอบจากโมเดลภาษา input_ids = tokenizer.encode(augmented_query, return_tensors="pt") output_ids = model.generate(input_ids, max_length=500) response = tokenizer.decode(output_ids[0], skip_special_tokens=True)</p> print(response)
ในโค้ดตัวอย่างด้านบน เราเพิ่มข้อมูลคำถามเดิมด้วยเอกสารที่จัดเรียงใหม่สามอันดับแรก โดยสร้าง augmented_query จากนั้นเราจะส่งคำถามที่เพิ่มข้อมูลนี้ไปยังโมเดลภาษา T5 ซึ่งจะสร้างคำตอบโดยอาศัยบริบทที่ให้มา
ตัวแปร response จะมีคำตอบสุดท้าย ซึ่งใช้ข้อมูลภายนอกจากเอกสารที่ค้นหามาและจัดเรียงใหม่เพื่อสร้างคำตอบที่แม่นยำและครอบคลุมมากขึ้นสำหรับคำถามเดิม
เทคนิคขั้นสูงและข้อพิจารณา
ในขณะที่การนำไปใช้ที่เราครอบคลุมให้พื้นฐานที่ดีสำหรับการรวมการค้นหาที่มีหลายขั้นตอนและ rerankers เข้ากับระบบ RAG มีเทคนิคขั้นสูงและข้อพิจารณาบางประการที่สามารถปรับปรุงประสิทธิภาพและความแข็งแกร่งของแนวทางนี้ได้
- การขยายคำถาม: เพื่อปรับปรุงการค้นหาตามขั้นตอนแรก คุณสามารถใช้เทคนิคการขยายคำถาม ซึ่งเกี่ยวข้องกับการเพิ่มคำศัพท์ที่เกี่ยวข้องหรือวลีเข้ากับคำถามเดิม ซึ่งสามารถช่วยให้ค้นหาเซตของเอกสารที่มีศักยภาพในการเกี่ยวข้องที่หลากหลายมากขึ้น
- การเรียงลำดับใหม่แบบアンซัมเบิล: แทนที่จะพึ่งพาโมเดลการเรียงลำดับใหม่เพียงตัวเดียว คุณสามารถรวมโมเดลการเรียงลำดับใหม่หลายตัวเข้าด้วยกันเป็นアンซัมเบิล โดยใช้ความแข็งแกร่งของแต่ละโมเดลเพื่อปรับปรุงประสิทธิภาพโดยรวม
- การปรับโมเดลการเรียงลำดับใหม่ให้เหมาะสม: ในขณะที่โมเดลการเรียงลำดับใหม่ที่ได้รับการฝึกฝนแล้วสามารถมีประสิทธิภาพได้ การปรับโมเดลเหล่านี้ให้เหมาะสมกับข้อมูลเฉพาะโดเมนสามารถปรับปรุงความสามารถในการจับข้อมูลทางภาษาและสัญญาณความเกี่ยวข้องเฉพาะโดเมนได้
- การค้นหาที่มีหลายขั้นตอนแบบเรียงซ้ำ: ในบางกรณี การค้นหาที่มีหลายขั้นตอนเพียงครั้งเดียวอาจไม่เพียงพอ คุณสามารถสำรวจแนวทางแบบเรียงซ้ำ โดยที่ผลลัพธ์ของโมเดลภาษาใช้ในการปรับปรุงคำถามและกระบวนการค้นหา ส่งผลให้ระบบมีความโต้ตอบและพลวัตมากขึ้น
- การสร้างสมดุลระหว่างความเกี่ยวข้องและความหลากหลาย: ในขณะที่โมเดลการเรียงลำดับใหม่มุ่งเน้นในการส่งเสริมเอกสารที่เกี่ยวข้องมากที่สุด การสร้างสมดุลระหว่างความเกี่ยวข้องและความหลากหลายเป็นสิ่งสำคัญ การรวมเทคนิคที่ส่งเสริมความหลากหลายสามารถช่วยป้องกันไม่ให้ระบบมีความแคบหรือเอนเอียงไปทางแหล่งข้อมูลใดแหล่งข้อมูลหนึ่งมากเกินไป
- มาตรการประเมิน: เพื่อประเมินประสิทธิภาพของแนวทางการค้นหาที่มีหลายขั้นตอนพร้อมกับ rerankers คุณจะต้องกำหนดมาตรการประเมินที่เหมาะสม ซึ่งอาจรวมถึงมาตรการประเมินแบบดั้งเดิมสำหรับการค้นหาข้อมูล เช่น ความแม่นยำ, การเรียกคืน และค่าเฉลี่ยของอันดับผกผัน (MRR) รวมถึงมาตรการที่ปรับให้เหมาะสมกับกรณีการใช้งานของคุณ
สรุป
การสร้างเนื้อหาที่เพิ่มขึ้นโดยการค้นหา (RAG) ได้พัฒนาเป็นเทคนิคที่มีประสิทธิภาพในการเพิ่มความสามารถของโมเดลภาษาขนาดใหญ่โดยการใช้แหล่งข้อมูลภายนอก อย่างไรก็ตาม วิธีการค้นหาทั่วไปมักต้องดิ้นรนในการระบุเอกสารที่เกี่ยวข้องมากที่สุด ส่งผลให้ประสิทธิภาพของระบบลดลง
การค้นหาที่มีหลายขั้นตอนพร้อมกับ rerankers เสนอวิธีแก้ปัญหาที่น่าสนใจสำหรับความท้าทายนี้ โดยการรวมการค้นหาตามขั้นตอนแรกที่รวดเร็วเข้ากับโมเดลการเรียงลำดับใหม่ที่ซับซ้อนกว่า แนวทางนี้สามารถปรับปรุงความแม่นยำและความเกี่ยวข้องของเอกสารที่ค้นหามาได้ ส่งผลให้ได้คำตอบที่มีคุณภาพสูงขึ้นจากโมเดลภาษา
ฉันใช้เวลาที่ผ่านมา 5 ปีในการศึกษาสิ่งที่น่าสนใจเกี่ยวกับ Machine Learning และ Deep Learning ความเชี่ยวชาญและความหลงใหลของฉันทำให้ฉันเข้าร่วมในโครงการพัฒนาซอฟต์แวร์มากกว่า 50 โครงการที่มีความหลากหลาย โดยมุ่งเน้นไปที่ AI/ML ความอยากรู้อยากเห็นของฉันยังทำให้ฉันสนใจในด้าน Natural Language Processing ซึ่งเป็นสาขาที่ฉันต้องการสำรวจต่อไป
ค้นพบเพิ่มเติม


ปัญหาหน่วยความจำของ AI: ทำไมการเปลี่ยนแปลงบริบทที่มีประสิทธิภาพจึงมีความสำคัญ และอะไรที่ต้องทำเพื่อให้ได้ผล


ทำไม RAG ชีวเวชของท่านซ่อนข้อขัดแย้งจากท่าน


การติดตั้งแพ็คเกจ Python เป็นดัชนีของการนำ AI ไปใช้ในท้องถิ่น


สาเหตุจริงที่ทำให้ RAG Pipeline ของคุณเกิด Hallucination


2026 คาดการณ์ – โอเพ่นซอร์สจะขี่คลื่น AI เข้าสู่ยุคทองใหม่


ทำไมแอปสมัยใหม่ส่วนใหญ่จะไม่มีประโยชน์ในยุค AI

