ปัญญาประดิษฐ์ทั่วไป
พลังของการจัดอันดับใหม่และการดึงข้อมูลแบบสองขั้นตอนสำหรับการดึงข้อมูลรุ่นเสริม
ข้อมูลโค้ดนี้สาธิตวิธีกำหนดค่าและใช้โมเดล jina-colbert-v1-en สำหรับการจัดทำดัชนีคอลเลกชันเอกสาร โดยใช้ประโยชน์จากความสามารถในการจัดการบริบทขนาดยาวได้อย่างมีประสิทธิภาพ
การใช้การดึงข้อมูลแบบสองขั้นตอนด้วยการจัดอันดับใหม่
ตอนนี้เรามีความเข้าใจในหลักการเบื้องหลังการดึงข้อมูลและการจัดอันดับใหม่แบบสองขั้นตอนแล้ว เรามาสำรวจการใช้งานจริงในบริบทของระบบ RAG กันดีกว่า เราจะใช้ประโยชน์จากไลบรารีและเฟรมเวิร์กยอดนิยมเพื่อสาธิตการบูรณาการเทคนิคเหล่านี้
การตั้งค่าสิ่งแวดล้อม
ก่อนที่เราจะเจาะลึกโค้ด เรามาตั้งค่าสภาพแวดล้อมการพัฒนาของเรากันก่อน เราจะใช้ Python และไลบรารี NLP ยอดนิยมหลายแห่ง รวมถึง Hugging Face Transformers, Sentence Transformers และ LanceDB
# Install required libraries !pip install datasets huggingface_hub sentence_transformers lancedb
การเตรียมข้อมูล
เพื่อจุดประสงค์ในการสาธิต เราจะใช้ชุดข้อมูล “ai-arxiv-chunked” จากชุดข้อมูล Hugging Face ซึ่งมีเอกสาร ArXiv มากกว่า 400 ฉบับเกี่ยวกับการเรียนรู้ของเครื่อง การประมวลผลภาษาธรรมชาติ และโมเดลภาษาขนาดใหญ่
from datasets import load_dataset dataset = load_dataset("jamescalam/ai-arxiv-chunked", split="train") <pre>
ต่อไป เราจะประมวลผลข้อมูลล่วงหน้าและแบ่งออกเป็นส่วนเล็กๆ เพื่อความสะดวกในการเรียกค้นและประมวลผลอย่างมีประสิทธิภาพ
from transformers import AutoTokenizer tokenizer = AutoTokenizer.from_pretrained("bert-base-uncased") 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 chunked_data = [] for doc in dataset: text = doc["chunk"] chunked_texts = chunk_text(text) chunked_data.extend(chunked_texts)
สำหรับขั้นตอนการดึงข้อมูลเบื้องต้น เราจะใช้โมเดล Sentence Transformer เพื่อเข้ารหัสเอกสารและการสืบค้นของเราให้เป็นการแสดงเวกเตอร์หนาแน่น จากนั้นทำการค้นหาเพื่อนบ้านที่ใกล้ที่สุดโดยประมาณโดยใช้ฐานข้อมูลเวกเตอร์ เช่น LanceDB
from sentence_transformers import SentenceTransformer from lancedb import lancedb # Load Sentence Transformer model model = SentenceTransformer('all-MiniLM-L6-v2') # Create LanceDB vector store db = lancedb.lancedb('/path/to/store') db.create_collection('docs', vector_dimension=model.get_sentence_embedding_dimension()) # Index documents for text in chunked_data: vector = model.encode(text).tolist() db.insert_document('docs', vector, text) from sentence_transformers import SentenceTransformer from lancedb import lancedb # Load Sentence Transformer model model = SentenceTransformer('all-MiniLM-L6-v2') # Create LanceDB vector store db = lancedb.lancedb('/path/to/store') db.create_collection('docs', vector_dimension=model.get_sentence_embedding_dimension()) # Index documents for text in chunked_data: vector = model.encode(text).tolist() db.insert_document('docs', vector, text)
ด้วยการจัดทำดัชนีเอกสารของเรา เราสามารถดำเนินการดึงข้อมูลเบื้องต้นได้โดยการค้นหาเพื่อนบ้านที่ใกล้ที่สุดกับเวกเตอร์แบบสอบถามที่กำหนด
from transformers import AutoTokenizer tokenizer = AutoTokenizer.from_pretrained("bert-base-uncased") 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 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() # Rerank initial documents reranked_docs = reranker.rerank(query, initial_docs)
พื้นที่ reranked_docs
ขณะนี้รายการมีเอกสารที่เรียงลำดับใหม่ตามความเกี่ยวข้องกับแบบสอบถาม ตามที่กำหนดโดย ColBERT จัดอันดับใหม่
การเสริมและการสร้าง
เมื่อมีเอกสารที่ได้รับการจัดอันดับใหม่และเกี่ยวข้องอยู่ในมือ เราก็สามารถดำเนินการในขั้นตอนการเพิ่มและการสร้างไปป์ไลน์ RAG ได้ เราจะใช้โมเดลภาษาจากไลบรารี Hugging Face Transformers เพื่อสร้างคำตอบสุดท้าย
from transformers import AutoTokenizer, AutoModelForSeq2SeqLM tokenizer = AutoTokenizer.from_pretrained("t5-base") model = AutoModelForSeq2SeqLM.from_pretrained("t5-base") # Augment query with reranked documents augmented_query = query + " " + " ".join(reranked_docs[:3]) # Generate response from language model 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) print(response)