ברוכים הבאים לסדרת RAG המתקדמת: בניית צ'אט עם מערכת המסמכים שלך
בסרטון הראשון של הסדרה החדשה שלנו על Advanced RAG (Retrieval Augmented Generation), נחקור את הארכיטקטורה של צ'אט בסיסי עם מערכת המסמכים או צינור ה-RAG שלך. נלך מעבר ליסודות ונדון בטכניקות מתקדמות יותר לשיפור הצינור.
היסודות של צינור RAG
נתחיל עם היסודות של צינור RAG. הארכיטקטורה מורכבת מהמרכיבים הבאים:
- טוען מסמכים: רכיב זה טוען את המסמכים, כגון קבצי PDF, שישמשו במערכת הצ'אט.
- Chunking: המסמכים מפוצלים לנתחים קטנים יותר כדי להתאים לחלון ההקשר של מודל השפה (LLM).
- הטבעות: הטבעות מחושבות עבור כל נתח, אשר מאוחסנות לאחר מכן בחנות וקטורית ליצירת אינדקס סמנטי.
- אחזור: כאשר משתמש שואל שאלה, המערכת מחשבת הטמעות עבור השאילתה ומבצעת חיפוש סמנטי במאגר הידע (חנות וקטור) כדי לאחזר מסמכים או נתחים רלוונטיים.
- דירוג מחדש: המסמכים או הנתחים שאוחזרו מדורגים מחדש בהתאם לרלוונטיות.
- הדור: השאלה וההקשר (מסמכים מדורגים מחדש או נתחים) מוזנים ל-LLM כדי ליצור תגובות.
זוהי סקירה בסיסית של אופן הפעולה של צינור RAG. אם אתה מתחיל מוחלט, אל תדאג! יש לנו סדרה של סרטונים על יצירת צינורות RAG שתוכלו לבדוק.
היכרות עם חיפוש היברידי
בסדרה חדשה זו, נתמקד בשיפור צינור RAG הבסיסי. הנושא הראשון שנחקור הוא חיפוש היברידי.
חיפוש היברידי כולל הוספת שני רכיבים לצינור RAG:
- חיפוש מבוסס מילות מפתח: בנוסף לחיפוש סמנטי באמצעות הטמעות, אנו מבצעים גם חיפוש מסורתי מבוסס מילות מפתח על הנתחים הזמינים.
- אנסמבל רטריבר: במקום להשתמש רק ברטריבר מבוסס הטמעה, אנו משלבים את התוצאות הן מהחיפוש מבוסס מילות מפתח והן מהרטריבר מבוסס ההטמעה. האנסמבל רטריבר הזה מאפשר לנו להקצות משקלים שונים לכל שיטת חיפוש, מה שהופך אותה לחזקה יותר.
כעת, לאחר שיש לנו סקירה כללית של הארכיטקטורה והתוספת של חיפוש היברידי, בואו נסתכל על דוגמה לקוד.
דוגמה לקוד
לפני שנצלול לתוך הקוד, ודא שהחבילות הדרושות מותקנות אצלך. אנחנו נשתמש rank_bm25 לחיפוש היברידי, unstructuredIO לקריאת קבצי PDF, ו chromaDB ליצירת החנות הוקטורית. אם אתה עובד עם מסמכים סרוקים, מומלצות חבילות נוספות לאינטראקציה עם מסמכים סרוקים ולביצוע זיהוי תווים אופטי (OCR).
לאחר התקנת החבילות, נוכל לטעון אותן בקוד שלנו. הנה דוגמא:
ייבוא rank_bm25 ייבוא unstructuredIO ייבוא chromaDB מ-lchaintools ייבוא ChatPromptTemplate, OutputParser, RunnablePassThrough מ-lchaintools ייבוא EmbeddingModelAPI, LLMModelAPI
בדוגמה זו, אנו משתמשים בגרסה האחרונה של LChain. אנו מייבאים את החבילות והמודולים הדרושים עבור צינור ה-RAG שלנו, כולל תבנית הנחיות הצ'אט, מנתח פלט, מעבר ניתן להרצה, ממשק API של מודל הטבעה וממשק API של מודל LLM.
לאחר מכן, עלינו לטעון את קובץ ה-PDF ולהמיר אותו לגושים. הנה דוגמא:
pdf_loader = unstructuredIO.PDFLoader() docs = pdf_loader.load_file('data/example.pdf') chunk_size = 800 חפיפה = 100 מפצל = unstructuredIO.RecursiveCharTextSplitter(chunk_size = splitter) chunks(docs)
בקטע קוד זה, אנו משתמשים במטען PDF כדי לטעון את קובץ ה-PDF. לאחר מכן אנו מגדירים את גודל הנתח והחפיפה לפיצול המסמכים לנתחים. מפצל טקסט תווים רקורסיבי משמש ליצירת הנתחים.
כעת, נעבור ליצירת ההטמעות וחנות הוקטורים:
embedding_model = EmbeddingModelAPI('hugging_face_token') vector_store = chromaDB.VectorStore(embedding_model) vector_store.create_vector_store(chunks)
בדוגמה זו, אנו יוצרים מודל הטמעה באמצעות ממשק ה-API של Hugging Face. לאחר מכן אנו משתמשים במודל ההטמעה ובנתחים כדי ליצור את החנות הוקטורית.
לאחר מכן, הגדרנו את המאחזרים הן לחיפוש מבוסס הטבעה והן לחיפוש מבוסס מילות מפתח:
embedding_retriever = vector_store.create_retriever(num_chunks=3) keyword_retriever = rank_bm25.BM25Retriever(chunks, num_chunks=3) ensemble_retriever = rank_bm25.EnsembleRetriever([embedding_retriever], 0.7)
בקטע קוד זה, אנו יוצרים את המאחזרים הן עבור החיפוש המבוסס על הטבעה והן עבור החיפוש המבוסס על מילות מפתח. האנסמבל רטריבר משלב את התוצאות משני הרטריברים, כאשר לכל אחד מהם מוקצים משקלים שונים.
לבסוף, הגדרנו את מודל ה-LLM ואת תבנית ההנחיה:
llm_model = LLMModelAPI('hugging_face_token') prompt_template = ChatPromptTemplate( system_prompt="אתה עוזר בינה מלאכותית שעוקבת אחר ההוראות בצורה מצוינת. השתמש בהקשר הבא כדי לענות על שאלת המשתמש:", user_prompt="מהו כוונון הוראות?", assistant_prompt ="", ) output_parser = OutputParser() chat_template = llm_model.create_chat_template( prompt_template, output_parser, retriever=ensemble_retriever, )
בקטע קוד זה, אנו יוצרים את מודל ה-LLM באמצעות ממשק ה-API של Hugging Face. לאחר מכן הגדרנו את תבנית ההנחיה עבור הצ'אט, כולל הנחיית המערכת, הנחיית המשתמש והנחיית העוזר. מנתח הפלט משמש לניתוח תגובת המודל.
עם הכל מוגדר, אנו יכולים כעת להפעיל את הצ'אט:
user_input = "מהו כוונון הוראות?" תגובה = chat_template.invoke(user_input)
בדוגמה זו, אנו מספקים את הקלט של המשתמש ומתקשרים ל- לעורר פונקציה בתבנית הצ'אט כדי לקבל את תגובת המודל.
סיכום
בסרטון זה, חקרנו את הארכיטקטורה של צינור RAG בסיסי והצגנו את הרעיון של חיפוש היברידי. סיפקנו גם דוגמה לקוד כיצד ליישם חיפוש היברידי באמצעות ספריית LChain. על ידי שילוב של חיפוש מבוסס מילות מפתח וחיפוש מבוסס הטמעה, נוכל לשפר את ביצועי מערכת הצ'אט ולספק תגובות מדויקות יותר.
אם מצאתם סרטון זה שימושי, הקפידו להירשם לערוץ שלנו לסרטונים נוספים בסדרה זו. אם אתה זקוק לסיוע בפרויקטים שלך, אנו מציעים שירותי ייעוץ. עיין בקישורים בתיאור למידע נוסף.
תודה שצפיתם, ונתראה בסרטון הבא!




