דילוג לתוכן הראשי

מדריך: כך בונים RAG בעברית עם Qwen 3.8 בקוד פתוח, צעד אחר צעד

מדריך מעשי לבניית מערכת RAG בעברית על תשתית מקומית: אינדוקס מסמכים, embeddings שתומכים בעברית, וחיבור למודל קוד פתוח, בלי לשלוח דאטה לענן.

איתי רוזןאיתי רוזןכתב מודלים וכלים
·5 דק׳ קריאה·5 צפיות
0:00 / 6:50
מפתח יושב מול מסך עם טרמינל ועורך קוד, לצדו ערימת מסמכים מודפסים בעברית וכוס קפה

ארגונים ישראליים רבים רוצים צ'אטבוט שעונה על שאלות מתוך המסמכים הפנימיים שלהם: נהלים, חוזים, מפרטים טכניים. הבעיה: רוב המדריכים ברשת מניחים תוכן באנגלית וענן אמריקאי, בעוד שבארץ הדאטה בעברית ולעיתים אסור לו לצאת מהרשת הארגונית. במדריך הזה נבנה מערכת RAG (Retrieval-Augmented Generation) שרצה כולה מקומית, עם רכיבים בקוד פתוח שמתמודדים היטב עם עברית.

מה בונים ולמה דווקא ככה

RAG היא ארכיטקטורה שבה המודל לא מסתמך רק על מה שלמד באימון, אלא מקבל בזמן אמת קטעים רלוונטיים מתוך מאגר המסמכים שלכם. התהליך מתחלק לשניים: שלב אינדוקס חד-פעמי שבו המסמכים נחתכים לקטעים והופכים לווקטורים, ושלב שאילתה שבו שאלת המשתמש מומרת לווקטור, המערכת שולפת את הקטעים הקרובים ביותר, והמודל מנסח תשובה על בסיסם בלבד.

בתור מנוע השפה נשתמש ב-Qwen 3.8 27B, המודל המולטימודלי בקוד פתוח ששוחרר לאחרונה עם context window של 262K טוקנים. היתרון הכפול שלו לצרכים שלנו: ביצועים חזקים בשפות שאינן אנגלית, כולל עברית, ורישיון שמאפשר הרצה מסחרית מקומית. חלון ההקשר הענק מאפשר לדחוף לתוך הפרומפט עשרות קטעי מסמכים בלי לחשוש מחיתוך.

הכנת הסביבה: מה צריך לפני שמתחילים

  • מכונה עם GPU בעל לפחות 24GB זיכרון (למשל RTX 4090 או A10) להרצת הגרסה הקוונטית של Qwen 3.8 27B; בלי GPU אפשר להתחיל עם גרסה קטנה יותר ממשפחת Qwen
  • Ollama או vLLM כשרת ההרצה המקומי של המודל
  • מסד נתונים וקטורי: Qdrant או ChromaDB, שניהם בקוד פתוח ורצים ב-Docker
  • מודל embeddings רב-לשוני שתומך בעברית, כמו multilingual-e5-large או BGE-M3
  • Python 3.11 ומעלה עם הספריות langchain או llama-index לפי העדפה

אל תשתמשו במודלי embeddings שאומנו על אנגלית בלבד. הם יחזירו תוצאות שליפה גרועות על טקסט עברי, וזו הסיבה מספר אחת לכישלון פרויקטי RAG בארץ. תמיד בדקו שהמודל מופיע במדדי MTEB הרב-לשוניים עם תמיכה מפורשת בעברית.

שלב האינדוקס: מחלקים, ממירים, שומרים

החלק הקריטי ביותר הוא חיתוך המסמכים (chunking). בעברית מומלץ לחתוך לפי פסקאות או כותרות ולא לפי מספר תווים קבוע, כי משפט עברי שנחתך באמצע מאבד הקשר במהירות בגלל המבנה התחבירי הדחוס. גודל התחלתי טוב: קטעים של 500 עד 800 טוקנים עם חפיפה של 100 טוקנים בין קטעים סמוכים.

from sentence_transformers import SentenceTransformer
from qdrant_client import QdrantClient
from qdrant_client.models import PointStruct, VectorParams, Distance

embedder = SentenceTransformer("intfloat/multilingual-e5-large")
client = QdrantClient(url="http://localhost:6333")

client.recreate_collection(
    collection_name="docs_he",
    vectors_config=VectorParams(size=1024, distance=Distance.COSINE),
)

# chunks = רשימת קטעי טקסט בעברית אחרי חיתוך
vectors = embedder.encode([f"passage: {c}" for c in chunks])
client.upsert(
    collection_name="docs_he",
    points=[PointStruct(id=i, vector=v.tolist(), payload={"text": c})
            for i, (v, c) in enumerate(zip(vectors, chunks))],
)

שימו לב לקידומת passage: בקידוד הקטעים. משפחת המודלים e5 אומנה עם קידומות כאלה (query: לשאילתות, passage: למסמכים), והשמטה שלהן פוגעת משמעותית באיכות השליפה. זה פרט קטן שמדריכים רבים מפספסים.

מסך מחשב מציג לוח בקרה של מסד נתונים וקטורי עם גרפים של אוסף מסמכים, לצדו מחברת עם תרשים ארכיטקטורה משורטט ביד
אחרי האינדוקס: מסד הנתונים הווקטורי מכיל את כל קטעי המסמכים כווקטורים הניתנים לחיפוש סמנטי

שלב השאילתה: מחברים את המודל

כשמגיעה שאלה מהמשתמש, ממירים אותה לווקטור עם אותו מודל embeddings, שולפים את 5 עד 10 הקטעים הקרובים ביותר, ובונים פרומפט שמנחה את המודל לענות רק מתוך ההקשר. הנה החיבור ל-Qwen 3.8 שרץ מקומית דרך Ollama:

import ollama

query = "מה מדיניות החזרת הציוד בסיום העסקה?"
q_vec = embedder.encode(f"query: {query}")
hits = client.search(collection_name="docs_he", query_vector=q_vec.tolist(), limit=6)
context = "\n---\n".join(h.payload["text"] for h in hits)

response = ollama.chat(model="qwen3.8:27b", messages=[
    {"role": "system", "content": "ענה בעברית אך ורק על סמך ההקשר המצורף. אם התשובה אינה בהקשר, אמור שאינך יודע."},
    {"role": "user", "content": f"הקשר:\n{context}\n\nשאלה: {query}"},
])
print(response["message"]["content"])
רוב הפרויקטים שאנחנו רואים נכשלים לא בגלל המודל אלא בגלל שליפה גרועה. מי שמשקיע שבוע בכוונון ה-chunking וה-embeddings לעברית מקבל מערכת טובה פי כמה ממי שקופץ ישר למודל הכי גדול
מהנדס AI בחברת אינטגרציה ישראלית

הזווית הישראלית: רגולציה, עברית וכסף

למה בכלל להתאמץ עם תשתית מקומית כשיש API בענן? שלוש סיבות שרלוונטיות במיוחד לארץ. ראשית, ארגונים בתחומי הבריאות, הביטחון והפיננסים כפופים להנחיות הגנת פרטיות שמקשות על שליחת מסמכים לשרתים בחו"ל, ופתרון self-hosted סוגר את הסוגיה מהשורש. שנית, עלויות: מערכת שעונה על מאות שאילתות ביום מצדיקה במהירות GPU מקומי לעומת תשלום פר טוקן. שלישית, עברית: כשהכול רץ אצלכם, אפשר לבצע fine-tuning עתידי על הטרמינולוגיה הספציפית של הארגון בלי לחשוף דאטה.

לפני שמרחיבים לכל הארגון, בנו סט בדיקה של 30 עד 50 שאלות אמיתיות עם תשובות ידועות מראש, והריצו אותו אחרי כל שינוי בהגדרות. זו הדרך היחידה לדעת אם שינוי בגודל ה-chunks או במודל ה-embeddings באמת שיפר משהו.

מה הלאה: שדרוגים שכדאי לשקול

  1. הוסיפו reranker רב-לשוני (כמו BGE-reranker) שמדרג מחדש את הקטעים שנשלפו ומעלה את הדיוק משמעותית
  2. שלבו חיפוש היברידי: BM25 מילולי לצד חיפוש וקטורי, שימושי במיוחד לשמות מוצרים ומספרי סעיפים בעברית
  3. נצלו את היכולות המולטימודליות של Qwen 3.8 לאינדוקס טבלאות ותרשימים מתוך קובצי PDF סרוקים
  4. הוסיפו שכבת ציטוט מקורות בתשובות, כך שכל תשובה מפנה למסמך ולעמוד הרלוונטי

מערכת בסיסית כמו שתיארנו כאן ניתנת להקמה ביום עבודה אחד, והיא נקודת פתיחה מצוינת לפיילוט פנים-ארגוני. ההשקעה האמיתית מתחילה אחר כך, באיטרציות על איכות השליפה מול שאלות אמיתיות של משתמשים. מי שמתחיל עכשיו עם תשתית קוד פתוח שומר לעצמו גם את הגמישות לעבור למודל חזק יותר ברגע שישוחרר, בלי לשכתב שום דבר מלבד שורת ההגדרה של המודל.

שאלות נפוצות

מה זה RAG ולמה צריך את זה?

RAG (Retrieval-Augmented Generation) היא שיטה שבה מודל שפה מקבל בזמן אמת קטעים רלוונטיים ממאגר המסמכים שלכם ועונה על בסיסם. כך מקבלים תשובות מדויקות על מידע פנימי ועדכני, בלי לאמן מודל מחדש ועם פחות הזיות.

האם RAG עובד טוב בעברית?

כן, בתנאי שבוחרים מודל embeddings רב-לשוני שתומך בעברית (כמו multilingual-e5-large או BGE-M3) ומודל שפה עם ביצועים חזקים בעברית. חיתוך מסמכים לפי פסקאות במקום לפי מספר תווים קבוע משפר משמעותית את התוצאות בעברית.

כמה עולה להריץ מערכת RAG מקומית?

העלות העיקרית היא חומרה: GPU עם 24GB זיכרון מספיק להרצת מודל קוד פתוח בסדר גודל של 27B פרמטרים בגרסה קוונטית. עבור ארגון עם מאות שאילתות ביום, ההשקעה מתקזזת במהירות מול תשלום פר טוקן ל-API בענן.

#RAG#Qwen 3.8#עיבוד שפה בעברית#Ollama#קוד פתוח#מסדי נתונים וקטוריים
מה דעתכם?

דרגו את הכתבה

הדירוג עוזר לנו לדעת מה שווה לכם.

תגובות

התגובה חייבת להיות בעברית ומתפרסמת מיד.
  1. היו הראשונים להגיב.

עוד בנושא