יישום Retrieval-Augmented Generation עבור צ'אטבוטים ארגוניים
צ'אטבוט AI טיפוסי שאומן רק על נתונים כלליים אינו מכיר את המוצר שלך. הוא ממציא תשובות – הוא הוזה. RAG (Retrieval-Augmented Generation) – תבנית ארכיטקטונית – פותר בעיה זו: הבוט מוצא קטעים רלוונטיים ממאגר הידע שלך (תיעוד, שאלות נפוצות, מאמרים) ומייצר תשובות אך ורק מהם. התוצאה: תשובות מדויקות וניתנות לאימות ללא הזיות. רקורד שלנו: למעלה מ-5 שנות פיתוח מערכות NLP, יותר מ-10 בוטי RAG שהוטמעו. עלות היישום מחושבת באופן אישי, ומבטיחה החזר השקעה מהיר. עלויות יישום טיפוסיות נעות בין $5,000 עבור הגדרה בסיסית ל-$25,000 עבור מערכת ייצור מלאה, כאשר רוב הלקוחות רואים החזר השקעה תוך 6 חודשים. לדוגמה, יישום טיפוסי עולה $15,000 וחוסך $120,000 בשנה בעלויות תמיכה.
לדוגמה, חברה עם 5000 עמודים של תיעוד טכני בזבזה 20 שעות אדם בשבוע על מענה לשאלות חוזרות. לאחר הטמעת בוט RAG, הזמן ירד לשעתיים, ודיוק התשובות עלה על 95%. עלויות התמיכה קוצצו ב-$120,000 בשנה. בהשוואה לצ'אטבוט שאלות נפוצות מסורתי, מערכת RAG מדויקת פי 5 ומפחיתה הזיות ב-90%. הבוט משתמש רק בנתונים מאומתים, מה שמבטל סיכון לדליפת מידע. RAG גם אמינה פי 10 מחיפוש מילות מפתח מסורתי. יישום RAG מהיר פי 3 מאימון מודל מותאם אישית.
כיצד פועלת מערכת RAG
RAG מורכבת ממספר רכיבים. בצע את השלבים הבאים לבניית מערכת RAG:
- איסוף מקורות נתונים – תיעוד, שאלות נפוצות, מאמרי מאגר ידע, עמודי אתר, PDF, פניות תמיכה.
- בניית צינור קליטה – טעינה, חלוקה לקטעים, ואינדוקס של מסמכים.
- יצירת embeddings – המרת קטעי טקסט לייצוגים וקטוריים.
- אחסון במסד נתונים וקטורי – אחסון embeddings ואפשור חיפוש סמנטי.
- יישום שליפה – על שאלת משתמש, מציאת הקטעים הרלוונטיים ביותר (top-N).
- יצירת תשובה – שליחת הקטעים שנשלפו + השאלה ל-LLM וקבלת התשובה.
כל שלב מכוונן בנפרד עבור נפח הנתונים ודרישות המהירות שלך.
צינור קליטה
חלוקת מסמכים היא שלב קריטי. קטעים קטנים מדי מאבדים הקשר; קטעים גדולים מדי מפחיתים את דיוק החיפוש. אופטימלי: 500–1000 טוקנים עם חפיפה של 100–200 טוקנים.
קוד: טעינה וחלוקת מסמכים
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain.document_loaders import (
WebBaseLoader,
PyPDFLoader,
UnstructuredMarkdownLoader
)
def load_and_chunk_documents(sources: list[dict]) -> list:
documents = []
for source in sources:
if source["type"] == "url":
loader = WebBaseLoader(source["path"])
elif source["type"] == "pdf":
loader = PyPDFLoader(source["path"])
elif source["type"] == "markdown":
loader = UnstructuredMarkdownLoader(source["path"])
docs = loader.load()
documents.extend(docs)
splitter = RecursiveCharacterTextSplitter(
chunk_size=800,
chunk_overlap=150,
separators=["\n\n", "\n", ". ", " ", ""]
)
return splitter.split_documents(documents) Embeddings ומסד נתונים וקטורי
מודלי Embedding:
-
from langchain.text_splitter import RecursiveCharacterTextSplitter from langchain.document_loaders import ( WebBaseLoader, PyPDFLoader, UnstructuredMarkdownLoader ) def load_and_chunk_documents(sources: list[dict]) -> list: documents = [] for source in sources: if source["type"] == "url": loader = WebBaseLoader(source["path"]) elif source["type"] == "pdf": loader = PyPDFLoader(source["path"]) elif source["type"] == "markdown": loader = UnstructuredMarkdownLoader(source["path"]) docs = loader.load() documents.extend(docs) splitter = RecursiveCharacterTextSplitter( chunk_size=800, chunk_overlap=150, separators=["\n\n", "\n", ". ", " ", ""] ) return splitter.split_documents(documents)(OpenAI) – 1536 ממדים, $0.02 לכל מיליון טוקנים, יחס מחיר/ביצועים מצוין -
text-embedding-3-small– 3072 ממדים, טוב יותר לשאילתות מורכבות -
text-embedding-3-large(מקומי, Hugging Face) – חינמי, טוב לרוסית
מאגרי נתונים וקטוריים:
| פתרון | סוג | היקף | תכונות |
|---|---|---|---|
| pgvector | הרחבת PostgreSQL | עד 10M וקטורים | SQL מוכר, טרנזקציות |
| Qdrant | אירוח עצמי / ענן | מאות מיליונים | סינון מטען (Payload) |
| Weaviate | אירוח עצמי / ענן | מאות מיליונים | ממשק GraphQL |
| Pinecone | SaaS | כל היקף | מנוהל במלואו |
| Chroma | תהליך פנימי / שרת | עד 1M | קל להתחלה |
לאתר עם עומס בינוני ועד 100,000 מסמכים – pgvector או Qdrant. אין צורך להקים שירות נפרד.
import psycopg2
from pgvector.psycopg2 import register_vector
import numpy as np
def store_embeddings(chunks: list, embeddings: list[list[float]]):
conn = psycopg2.connect(DATABASE_URL)
register_vector(conn)
cur = conn.cursor()
cur.execute("""
CREATE TABLE IF NOT EXISTS documents (
id SERIAL PRIMARY KEY,
content TEXT,
embedding vector(1536),
metadata JSONB,
source_url TEXT,
created_at TIMESTAMP DEFAULT NOW()
)
""")
cur.execute("CREATE INDEX IF NOT EXISTS documents_embedding_idx ON documents USING ivfflat (embedding vector_cosine_ops) WITH (lists = 100)")
for chunk, embedding in zip(chunks, embeddings):
cur.execute(
"INSERT INTO documents (content, embedding, metadata, source_url) VALUES (%s, %s, %s, %s)",
(chunk.page_content, np.array(embedding), json.dumps(chunk.metadata), chunk.metadata.get("source", ""))
)
conn.commit()
חיפוש: סמנטי והיברידי
חיפוש סמנטי מחזיר קטעים לפי דמיון קוסינוס של embeddings. עבור שאילתות מדויקות (SKU, שמות) הוא לפעמים מפספס – ואז אנו מוסיפים חיפוש היברידי עם אינדקס טקסט מלא (BM25).
def hybrid_search(query: str, top_k: int = 5) -> list[dict]:
# Семантический поиск
query_embedding = get_embedding(query)
conn = psycopg2.connect(DATABASE_URL)
register_vector(conn)
cur = conn.cursor()
cur.execute("""
SELECT content, source_url, metadata, 1 - (embedding <=> %s::vector) AS similarity
FROM documents
WHERE 1 - (embedding <=> %s::vector) > 0.75
ORDER BY embedding <=> %s::vector
LIMIT %s
""", (query_embedding, query_embedding, query_embedding, top_k * 2))
semantic_results = cur.fetchall()
# Полнотекстовый поиск
cur.execute("""
SELECT content, source_url, ts_rank(to_tsvector('russian', content), query) AS rank
FROM documents, to_tsquery('russian', %s) query
WHERE to_tsvector('russian', content) @@ query
ORDER BY rank DESC
LIMIT %s
""", (prepare_ts_query(query), top_k * 2))
keyword_results = cur.fetchall()
# Reciprocal Rank Fusion
return reciprocal_rank_fusion(semantic_results, keyword_results, top_k) יצירה: ניסוח התשובה
from openai import OpenAI
client = OpenAI()
SYSTEM_PROMPT = """Ты помощник службы поддержки компании. Отвечай ТОЛЬКО на основе предоставленного контекста. Если ответа нет в контексте — честно скажи об этом. Не придумывай информацию. Указывай источник из контекста."""
def generate_answer(query: str, context_chunks: list[dict]) -> dict:
context = "\n\n".join([
f"[Источник: {c['source']}]\n{c['content']}" for c in context_chunks
])
response = client.chat.completions.create(
model="gpt-4o-mini",
messages=[
{"role": "system", "content": SYSTEM_PROMPT},
{"role": "user", "content": f"Контекст:\n{context}\n\nВопрос: {query}"}
],
temperature=0.1,
max_tokens=800
)
sources = list({c["source"] for c in context_chunks if c.get("source")})
return {
"answer": response.choices[0].message.content,
"sources": sources,
"chunks_used": len(context_chunks)
} דירוג מחדש והערכת איכות
חיפוש וקטורי מחזיר מועמדים לפי דמיון קוסינוס, אך הקטע הקרוב ביותר סמנטית אינו תמיד השימושי ביותר. דירוג מחדש עם Cross-encoder מעריך מחדש את המועמדים תוך התחשבות בשאלה, ודוחף קטעים רלוונטיים לראש. אנו משתמשים במודל multilingual-e5-large. מדדי מערכת RAG כוללים Faithfulness, Answer Relevance, Context Recall ו-Context Precision. להערכה אנו משתמשים ב-RAGAS ו-LangSmith. ניטור נכון מבטיח איכות יציבה.
עדכון אינדקס
כאשר תוכן האתר משתנה, יש לחשב מחדש את ה-embeddings. אסטרטגיות:
- אינדוקס מלא – פעם ביום, עבור עד 50,000 מסמכים לוקח 15–30 דקות.
- אינדוקס מצטבר – כאשר עמוד מתעדכן, מחק קטעים ישנים לפי source_url, הוסף חדשים. מתאים ל-CMS עם webhooks בפרסום.
- מחיקה רכה – סמן קטעים מיושנים עם דגל, אל תמחק מיד. מאפשר שחזור במקרה של שגיאה.
ציר זמן ליישום RAG
צירי הזמן תלויים בנפח הנתונים ובדרישות. שלבים משוערים:
| שלב | משך |
|---|---|
| צינור קליטה + embeddings + pgvector | 5–7 ימים |
| שליפה + יצירה בסיסית | 3–4 ימים |
| חיפוש היברידי + דירוג מחדש | 3–4 ימים |
| ממשק צ'אט באתר (וידג'ט) | 4–5 ימים |
| אינדוקס מצטבר | 2–3 ימים |
| מדדי איכות + ניטור | 3–4 ימים |
בוט RAG מינימלי בר-קיימא עם מקור נתונים יחיד – שבועיים. מערכת ייצור עם מקורות מרובים, חיפוש היברידי וניטור – 4–5 שבועות.
מה כלול בעבודה
כאשר אתה מזמין יישום RAG, אתה מקבל:
- צינור קליטה מלא עבור מקורות הנתונים שלך
- מאגר וקטורי (pgvector או Qdrant)
- חיפוש סמנטי והיברידי
- יצירת תשובות עם ייחוס מקור
- דירוג מחדש לשיפור הדיוק
- אינטגרציה עם האתר (וידג'ט צ'אט)
- תיעוד ארכיטקטורה והתקנה
- הדרכת עובדים לשימוש במערכת
- אחריות ל-3 חודשים על תפעול המערכת
יש לנו ניסיון ביישום RAG עבור חנויות מסחר אלקטרוני, פורטלים ארגוניים וצוותי תמיכה. השלמנו יותר מ-10 פרויקטים.
להזמנת יישום RAG סוהר, צור קשר להערכת פרויקט. קבל ייעוץ.







