חיפוש ארגוני חכם מבוסס AI

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

תחומי פיתוח AI

שאלות נפוצות

העבודות האחרונות

  • פיתוח אפליקציית ווב עבור FEEDME
    פיתוח אפליקציית ווב עבור FEEDME
    1365
  • פיתוח חנות מקוונת לחברת FURNORO
    פיתוח חנות מקוונת לחברת FURNORO
    1330
  • עיצוב לוגו לחברת B2B Advance
    עיצוב לוגו לחברת B2B Advance
    776
  • פיתוח אפליקציית ווב עבור Enviok
    פיתוח אפליקציית ווב עבור Enviok
    1077
  • פיתוח לוגו חברת AIDER
    פיתוח לוגו חברת AIDER
    1022
  • פיתוח CRM עבור Chasseurs
    פיתוח CRM עבור Chasseurs
    1113

בחברה של 500 עובדים, הידע מפוזר על פני 7–12 מערכות בו-זמנית: Confluence, SharePoint, Jira, דואר אלקטרוני ארגוני, 1C, מערכות CRM פנימיות, שרתי קבצים. עובד מבלה בממוצע 2.5 שעות ביום בחיפוש מידע — זו לא מטאפורה, אלא נתונים מ-McKinsey Global Institute. הבעיה המרכזית היא לא שהנתונים קיימים, אלא שלא ניתן למצוא אותם באמצעות חיפוש מילות מפתח רגיל: מסמך נקרא 'Regulation_v3_final_FINAL2', והשאילתה היא 'איך להזמין נסיעת עסקים'. אנו מפתחים חיפוש מסמכים מבוסס בינה מלאכותית — מערכת שפותר את הבעיה הזו באמצעות הבנה סמנטית של השאילתה וחיפוש היברידי בכל המקורות בו-זמנית.

גישה טכנולוגית

בעיות שאנו פותרים

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

  • דיוק נמוך בחיפוש מילות מפתח: מספר החלק 'A-123' נח�ש כמילה רגילה, ללא הבנה שמדובר במספר חלק.
  • חוסר הקשר: השאילתה 'תקציב שיווק' צריכה להתחשב בכך שהמשתמש הוא ראש מחלקה, לא מתמחה.
  • פרצות אבטחה: עובד רואה מסמכים שאין לו גישה אליהם אם ACL לא מיושם.

למה AI Enterprise Search יעיל יותר מחיפוש רגיל

חיפוש וקטורי טהור עובד היטב על שאילתות דומות סמנטית, אך גרוע על התאמות מדויקות: מספרי חלקים, שמות, תאריכים. השאילתה 'חוזה עם Romashka LLC מתאריך 12 במרץ' מניבה תוצאות טובות יותר באמצעות BM25, בעוד 'נוהל לטיפול באירוע פרצת נתונים' עובד טוב יותר באמצעות חיפוש וקטורי. הגישה ההיברידית משלבת את החוזקות של שתי השיטות.

סוג חיפוש חוזקות חולשות
מילות מפתח (BM25) התאמות מדויקות, מספרי חלקים, תאריכים לא מבין מילים נרדפות, הקשר
וקטורי (Embeddings) סמנטיקה, מילים נרדפות, הכללות חלש על מונחים נדירים, התחלה קרה
היברידי (שלנו) המיטב משני העולמות, דירוג מחדש עם CrossEncoder יישום מורכב יותר, דורש כוונון עדין
from qdrant_client import QdrantClient
from rank_bm25 import BM25Okapi
from sentence_transformers import SentenceTransformer, CrossEncoder
import numpy as np

class HybridSearchEngine:
    def __init__(self):
        self.dense_model = SentenceTransformer("intfloat/multilingual-e5-large")
        self.reranker = CrossEncoder("cross-encoder/ms-marco-MiniLM-L-6-v2")
        self.qdrant = QdrantClient(url="http://localhost:6333")
        self.bm25_index = None
        self.doc_store = {}

    def search(self, query: str, top_k: int = 20, final_k: int = 5) -> list[dict]:
        # Dense search
        query_emb = self.dense_model.encode(
            f"query: {query}",  # E5-формат
            normalize_embeddings=True
        )
        dense_results = self.qdrant.search(
            collection_name="enterprise_docs",
            query_vector=query_emb.tolist(),
            limit=top_k
        )

        # Sparse search (BM25)
        bm25_scores = self.bm25_index.get_scores(query.lower().split())
        top_bm25_ids = np.argsort(bm25_scores)[-top_k:][::-1]

        # Merge результатов (RRF - Reciprocal Rank Fusion)
        merged = self._reciprocal_rank_fusion(dense_results, top_bm25_ids)

        # Cross-encoder reranking
        pairs = [(query, self.doc_store[doc_id]["text"]) for doc_id in merged[:top_k]]
        rerank_scores = self.reranker.predict(pairs)
        reranked = sorted(
            zip(merged[:top_k], rerank_scores),
            key=lambda x: x[1],
            reverse=True
        )
        return [self.doc_store[doc_id] for doc_id, _ in reranked[:final_k]]

    def _reciprocal_rank_fusion(self, dense: list, sparse: list, k: int = 60) -> list:
        scores = {}
        for rank, item in enumerate(dense):
            doc_id = item.id
            scores[doc_id] = scores.get(doc_id, 0) + 1 / (k + rank + 1)
        for rank, doc_id in enumerate(sparse):
            scores[doc_id] = scores.get(doc_id, 0) + 1 / (k + rank + 1)
        return sorted(scores, key=scores.get, reverse=True)

הבנת שאילתות ויצירת תשובות

מערכת ה-RAG שלנו משלבת את מנוע החיפוש ההיברידי עם מודל שפה ליצירת תשובות מדויקות ממסמכי החברה.

from langchain_openai import ChatOpenAI
from langchain_core.prompts import ChatPromptTemplate

class EnterpriseSearchAssistant:
    def __init__(self, search_engine: HybridSearchEngine):
        self.search = search_engine
        self.llm = ChatOpenAI(model="gpt-4o-mini", temperature=0.1)

    def answer(self, query: str, user_context: dict) -> dict:
        # Расширение запроса для лучшего поиска
        expanded_query = self._expand_query(query, user_context)
        # Поиск по всем источникам
        results = self.search.search(expanded_query, final_k=7)
        if not results:
            return {"answer": "Документы по вашему запросу не найдены.", "sources": []}
        # Генерация ответа с цитатами
        context = "\n\n".join([
            f"[{i+1}] {r['title']} ({r['source']})\n{r['text'][:500]}"
            for i, r in enumerate(results)
        ])
        prompt = f"""Ответь на вопрос сотрудника на основе документов компании.
Используй только предоставленные документы.
Цитируй источники [1], [2] и т.д.
Если ответ неполный — скажи об этом.
Вопрос: {query}
Документы: {context}"""
        answer = self.llm.invoke(prompt).content
        return {
            "answer": answer,
            "sources": [{"id": i+1, "title": r["title"], "url": r["url"]} for i, r in enumerate(results)]
        }

יישום ואבטחה

אינדוקס מקורות

לכל מקור יש מחבר נפרד עם עדכונים מצטברים:

מקור מחבר תדירות אינדוקס מאפיינים מיוחדים
Confluence REST API (רווחים, עמודים) כל 30 דקות עיבוד סימון Confluence
SharePoint Microsoft Graph API כל שעה תמיכה ב-Word/PDF/PPTX
Jira REST API כל 15 דקות כרטיסים + תגובות
דואר אלקטרוני IMAP/Exchange בזמן אמת (webhooks) רק נשלח/נקלט
שרת קבצים Inotify / polling בעת שינוי PDF, DOCX, XLSX, TXT

כיצד אנו מבטיחים אבטחת נתונים ארגוניים

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

# При поиске фильтруем по правам пользователя
results = qdrant.search(
    collection_name="enterprise_docs",
    query_vector=query_emb,
    query_filter=Filter(
        must=[
            FieldCondition(
                key="allowed_groups",
                match=MatchAny(any=user_groups)
            )
        ]
    ),
    limit=20
)
דוגמה להגדרת בקרת גישהACL מוגדר באמצעות מטא-דאטה של מסמכים: קבוצות, תפקידים, הרשאות. מסד הנתונים הווקטורי Qdrant תומך בסינון ברמת הנקודה (מסמך), מה שמבטיח אבטחה.

התהליך שלנו

  1. אנליטיקה וסקר מקורות: זיהוי היכן נמצאים הנתונים, הערכת נפח ותדירות שינויים.
  2. עיצוב ארכיטקטורה: בחירת מודל embedding, מסד נתונים וקטורי, הגדרת צינור עיבוד.
  3. אינדוקס נתונים: חיבור מחברים, ביצוע אינדוקס ניסיוני על 10% מהנתונים.
  4. כוונון חיפוש ודירוג מחדש: אופטימיזציה של פרמטרי RRF, הגדרת ספים ל-CrossEncoder.
  5. אינטגרציית ממשק ובוט: שילוב חיפוש בממשק אינטרנט, בוט Slack, API.
  6. בדיקות וניפוי באגים: בדיקה על שאילתות אמיתיות של עובדים, שיפור איטרטיבי.
  7. פריסה וניטור: פריסה לייצור, הגדרת לוגים ומדדים (latency p99, recall).

מה כלול

  • תיעוד ארכיטקטורה והוראות תפעול.
  • מחברים מוגדרים לכל המקורות.
  • ממשק חיפוש אינטרנטי ואינטגרציה עם מסנג'ר ארגוני.
  • הכשרת צוות (2-3 סדנאות).
  • תמיכה באחריות למשך 3 חודשים לאחר ההשקה.
  • תיעוד הגדרת בקרת גישה.

לוחות זמנים ועלות

  • פיילוט (1-2 מקורות, כ-50,000 מסמכים): 4–6 שבועות.
  • מערכת מלאה (5–8 מקורות + ממשק): 3–4 חודשים.
  • הגדרת ACL: +2–3 שבועות.

העלות מחושבת באופן אישי לאחר הסקר. בממוצע, ההשקעה מחזירה את עצמה תוך 6–12 חודשים בזכות הפחתת זמן החיפוש. עבור חברה עם 500 עובדים, אנו מעריכים חיסכון שנתי של $200,000 בהתבסס על הפחתת זמן החיפוש. הזמינו פרויקט פיילוט — השלב הראשון אורך לא יותר מיומיים לניתוח.

תוצאות ומקרה בוחן

אחד הלקוחות שלנו, חברת אחזקות יצרנית עם 1200 עובדים. אינדקסנו 340,000 מסמכים מ-Confluence, SharePoint ומערכת ניהול מסמכים מותאמת אישית. זמן טעינת האינדוקס היה 18 שעות (חד-פעמי). עדכונים שוטפים — דלתא של 30 דקות, כ-200 מסמכים, אורכים 4 דקות. דיוק ממוצע ב-top-3 (הוערך על ידי צוות משאבי אנוש על מדגם של 500 שאילתות): 78% תוצאות רלוונטיות לעומת 41% עם חיפוש מילות המפתח הקודם ב-Elasticsearch (פי 1.9 טוב יותר). על ידי אוטומציה של החיפוש, החברה השיגה חיסכון תקציבי משמעותי — כ-$150,000 בשנה.

כיצד מוערך דיוק החיפוש

ההערכה מתבצעת על שאילתות אמיתיות של עובדים. אנו יוצרים מדגם של 300–500 שאלות אופייניות, מתייגים מסמכים רלוונטיים, ומחשבים recall@k ו-precision@k. הכלי המרכזי הוא CrossEncoder, שמדרג מועמדים ומשפר את דיוק ה-top-3 ל-78%. האימות נעשה על ידי הלקוח על הנתונים שלו.

למה לבחור בנו

  • 5+ שנים בפתרונות AI ארגוניים.
  • 20+ פרויקטים של יישום חיפוש סמנטי בחברות מ-200 עד 5000 עובדים.
  • הבטחת SLA 99.9% ודיוק חיפוש של לא פחות מ-75% לפי הקריטריונים שלכם.
  • מהנדסי MLOps ו-NLP מוסמכים.

צרו קשר כדי לקבל ייעוץ לפרויקט שלכם והערכה ראשונית תוך יומיים.