שילוב LlamaIndex לצינורות RAG במפתח מלא
לקוח מתלונן שהעוזר החכם באפליקציה הניידת שלהם נותן תשובות מיושנות. הסיבה היא שה-LLM אינו ניגש למסמכים עדכניים. אנו פותרים זאת על ידי שילוב LlamaIndex — מסגרת ל-RAG (יצירה מוגברת שליפה). הניסיון שלנו מראה שצינור שליפה מכוונן היטב מעלה את הדיוק מ-60% ל-95%, ומקצר את זמן התגובה בחצי. החיסכון בבקשות LLM מגיע ל-$500–1000 לחודש בפרויקט טיפוסי.
כיצד LlamaIndex משפר את דיוק התשובות
RAG היא טכניקה שמרחיבה את ה-LLM עם הנתונים שלך. LlamaIndex היא מסגרת שנבנתה במיוחד עבור RAG, עם תמיכה עמוקה בניתוח, חלוקה ואינדוקס. LangChain כללית יותר, אבל עבור RAG טהור, LlamaIndex נותן יותר שליטה. החיפוש ההיברידי המובנה והדירוג מחדש (Cross-Encoder) פשוטים ומהירים יותר ליישום.
ארכיטקטורת RAG לאפליקציה ניידת
הלקוח הנייד מתקשר עם השרת דרך REST API. LlamaIndex יושב על השרת ומטפל בכל המחזור: אינדוקס מסמכים → שליפה בשאילתה → יצירת תשובה עם הקשר.
[Мобильный клиент] │ POST /api/query {"question": "...", "user_id": "..."} ▼
[FastAPI Backend] │
├── [LlamaIndex QueryEngine] │ │
│ ├── [Embedding: text-embedding-3-small] │
│ ├── [VectorStore: pgvector / Pinecone] │
│ └── [LLM: gpt-4o-mini] │
└── {"answer": "...", "sources": [...]} אינדוקס מסמכים
LlamaIndex מנתח PDF, Word, Notion, Google Docs, HTML דרך [Мобильный клиент] │ POST /api/query {"question": "...", "user_id": "..."} ▼ [FastAPI Backend] │ ├── [LlamaIndex QueryEngine] │ │ │ ├── [Embedding: text-embedding-3-small] │ ├── [VectorStore: pgvector / Pinecone] │ └── [LLM: gpt-4o-mini] │ └── {"answer": "...", "sources": [...]} או קוראים ייעודיים. חלוקה — פיצול מסמך לקטעים לצורך אינדוקס:
from llama_index.core import VectorStoreIndex, SimpleDirectoryReader, Settings
from llama_index.embeddings.openai import OpenAIEmbedding
from llama_index.llms.openai import OpenAI
from llama_index.vector_stores.postgres import PGVectorStore
from llama_index.core.node_parser import SentenceSplitter
Settings.embed_model = OpenAIEmbedding(model="text-embedding-3-small")
Settings.llm = OpenAI(model="gpt-4o-mini", temperature=0.1)
Settings.node_parser = SentenceSplitter(chunk_size=512, chunk_overlap=50)
documents = SimpleDirectoryReader("./docs").load_data()
vector_store = PGVectorStore.from_params(
database=DB_NAME,
host=DB_HOST,
port=DB_PORT,
user=DB_USER,
password=DB_PASSWORD,
table_name="company_knowledge",
embed_dim=1536
)
index = VectorStoreIndex.from_documents(documents, vector_store=vector_store)גודל הקטע הוא פרמטר מפתח. 512 טוקנים עובדים היטב לתיעוד עם סעיפים שונים. לטקסטים נרטיביים ארוכים, השתמשו ב-1024–2048 עם חפיפה גדולה יותר (100–200 טוקנים).
| סוג מסמך | גודל קטע | חפיפה | המלצה |
|---|---|---|---|
| תיעוד טכני, שאלות נפוצות | 256–512 | 50 | שליפה מדויקת לשאילתות קצרות |
| טקסטים נרטיביים, מדיניות | 1024–2048 | 100–200 | כיסוי הקשר טוב יותר |
| קוד, סקריפטים של SQL | 128–256 | 20 | הימנעו מערבוב קטעים |
לפי התיעוד הרשמי של LlamaIndex, חיפוש היברידי משפר את הדיוק ב-20–30%.
כיצד עובד חיפוש היברידי
RAG נאיבי — top-K לפי דמיון קוסינוס — מחזיר לעיתים קרובות קטעים לא רלוונטיים לשאלות מורכבות. אנו מיישמים:
- חיפוש היברידי (BM25 + וקטורי): מילות מפתח לחיפוש מדויק, embeddings לסמנטיקה. מועיל במיוחד עם מונחים ספציפיים (SKU, שמות, תאריכים). בפרויקטים שלנו, דיוק תוצאות top-3 עולה ב-20–30%.
-
דירוג מחדש: שליפה ראשונית מחזירה top-20, cross-encoder מדרג מחדש ושומר top-4. Cohere Rerank היא אפשרות מנוהלת;
SimpleDirectoryReaderהוא קוד פתוח:
from llama_index.postprocessor.cohere_rerank import CohereRerank
reranker = CohereRerank(api_key=COHERE_API_KEY, top_n=4)
query_engine = index.as_query_engine(
similarity_top_k=20,
node_postprocessors=[reranker]
) - HyDE (Hypothetical Document Embeddings): לפני השליפה, אנו מייצרים תשובה היפותטית ומחפשים לפי ה-embedding שלה במקום ה-embedding של השאלה. עובד כשהשאלות והמסמכים מנוסחים בסגנונות שונים.
השוואת גישות:
| שיטה | דיוק@3 | זמן השהיה | עלות |
|---|---|---|---|
| וקטורי נאיבי | 60–70% | 50 ms | נמוכה |
| חיפוש היברידי (BM25 + וקטורי) | 75–85% | 80 ms | בינונית |
| היברידי + דירוג מחדש | 85–95% | 200 ms | גבוהה (בקשות Cohere, ~$300 לחודש) |
החיסכון בבקשות LLM בעת שימוש בדירוג מחדש מגיע ל-60%. פרויקט טיפוסי מחזיר את ההשקעה תוך 2–3 חודשים.
למה להשתמש בנתב מסמכים מרובים?
אם בסיס הידע מחולק לפי סוג (מדיניות, הוראות, שאלות נפוצות), נתב מפנה את השאילתה לתת-אינדקס המתאים. זה מפחית רעש בהקשר שנשלף:
קוד מנוע שאילתות עם נתב
from llama_index.core.tools import QueryEngineTool
from llama_index.core.query_engine import RouterQueryEngine
from llama_index.core.selectors import LLMSingleSelector
policy_engine = policy_index.as_query_engine()
faq_engine = faq_index.as_query_engine()
router = RouterQueryEngine(
selector=LLMSingleSelector.from_defaults(),
query_engine_tools=[
QueryEngineTool.from_defaults(policy_engine, description="Политики компании и регламенты"),
QueryEngineTool.from_defaults(faq_engine, description="Часто задаваемые вопросы"),
]
) איך לעדכן את האינדקס?
מסמכים משתנים. אנו בוחרים אסטרטגיה לפי נפח: אינדוקס מלא פעם ביום לקורפוסים קטנים, הוספה מצטברת דרך from llama_index.core import VectorStoreIndex, SimpleDirectoryReader, Settings from llama_index.embeddings.openai import OpenAIEmbedding from llama_index.llms.openai import OpenAI from llama_index.vector_stores.postgres import PGVectorStore from llama_index.core.node_parser import SentenceSplitter Settings.embed_model = OpenAIEmbedding(model="text-embedding-3-small") Settings.llm = OpenAI(model="gpt-4o-mini", temperature=0.1) Settings.node_parser = SentenceSplitter(chunk_size=512, chunk_overlap=50) documents = SimpleDirectoryReader("./docs").load_data() vector_store = PGVectorStore.from_params( database=DB_NAME, host=DB_HOST, port=DB_PORT, user=DB_USER, password=DB_PASSWORD, table_name="company_knowledge", embed_dim=1536 ) index = VectorStoreIndex.from_documents(documents, vector_store=vector_store) למאגרי נתונים דינמיים. LlamaIndex עוקב אחר שינויים לפי מטא-דאטה ומעדכן רק מסמכים חדשים או ששונו. זה חוסך עד 80% מזמן ומשאבים.
מה כלול בעבודה
- ביקורת בסיס המסמכים: הערכת נפחים, פורמטים, תדירות עדכון.
- בחירת אסטרטגיית חלוקה: כוונון גודל וחפיפה לנתונים הספציפיים.
- בניית צינור אינדוקס: ניתוח, embedding, טעינה ל-vector store.
- הגדרת צינור שליפה: חיפוש היברידי, דירוג מחדש, ניתוב.
- יצירת API ללקוח הנייד: FastAPI עם נקודות קצה של
cross-encoder/ms-marco-MiniLM-L-6-v2ו-from llama_index.postprocessor.cohere_rerank import CohereRerank reranker = CohereRerank(api_key=COHERE_API_KEY, top_n=4) query_engine = index.as_query_engine( similarity_top_k=20, node_postprocessors=[reranker] ). - תיעוד: דיאגרמת ארכיטקטורה, מפרט API, הוראות פריסה.
- הכשרת צוות: סדנה לתפעול וכוונון עדין.
- תמיכה לאחר השקה: חודש ראשון – ניטור דיוק ואופטימיזציה.
תהליך ולוח זמנים
- ביקורת ועיצוב (1–2 ימים): ניתוח מסמכים, בחירת ארכיטקטורה.
- אינדוקס והגדרה ראשונית (2–3 ימים): הקמת pgvector, טעינת נתונים, הרצת מנוע שאילתות בסיסי.
- אופטימיזציית שליפה (3–5 ימים): יישום חיפוש היברידי ודירוג מחדש, בדיקת A/B.
- שילוב באפליקציה הניידת (2–3 ימים): כתיבת API, בדיקה עם הלקוח.
- פריסה ותיעוד (1–2 ימים): פריסה לייצור, מסירת מסמכים.
לוחות זמנים משוערים: RAG בסיסי עם pgvector — 3–5 ימים, חיפוש היברידי עם דירוג מחדש — 1–2 שבועות, נתב מסמכים מרובים — 2–3 שבועות. העלות מחושבת בנפרד לאחר הביקורת.
טעויות נפוצות וכיצד להימנע מהן
- קטעים קטנים מדי: אובדן הקשר, תשובות שטחיות. פתרון: הגדילו ל-512–1024.
- התעלמות מדירוג מחדש: top-3 עשוי להיות לא רלוונטי. פתרון: הוסיפו דירוג מחדש, הדיוק משתפר ב-10–15%.
- ללא ניטור: הדיוק יורד אחרי חודש עקב סחיפת נתונים. פתרון: הגדירו לוגים והערכה שבועית מחדש.
קבלו ייעוץ — נעריך את הפרויקט שלכם ביום אחד. צרו קשר לגישת הדגמה לצינור RAG מוכן. ניסיון: 5+ שנים במובייל ו-NLP, 30+ פרויקטי RAG מיושמים. אנו משתמשים בפתרונות מוסמכים (OpenAI, pgvector, Cohere).







