מה זה RAG ולמה צריך אותו?
LLMs כמו GPT-4 יודעים הרבה — אבל הם לא מכירים את המסמכים הפנימיים שלך, הנהלים, הקטלוג. RAG פותר את זה בצורה אלגנטית בלי לעשות Fine-tuning יקר.
ללא RAG
- LLM לא מכיר את מסמכיך
- Fine-tuning יקר ולא עדכני
- הלוצינציות גבוהות
עם RAG
- תשובות מבסיס הנתונים שלך
- עדכון בזמן אמת
- ציטוט מקורות מדויק
מימוש מלא — שלב אחר שלב
שלב 1: טעינת מסמכים
from langchain_community.document_loaders import PyPDFLoader, DirectoryLoader
loader = DirectoryLoader("./docs/", glob="**/*.pdf", loader_cls=PyPDFLoader)
docs = loader.load()
print(f"טענו {len(docs)} מסמכים")
שלב 2: Chunking חכם
from langchain.text_splitter import RecursiveCharacterTextSplitter
splitter = RecursiveCharacterTextSplitter(
chunk_size=1000, chunk_overlap=200,
separators=["\n\n", "\n", ".", " "]
)
chunks = splitter.split_documents(docs)
print(f"פוצל ל-{len(chunks)} קטעים")
שלב 3: Embeddings ו-Vector Store
from langchain_openai import OpenAIEmbeddings
from langchain_community.vectorstores import Chroma
embeddings = OpenAIEmbeddings(model="text-embedding-3-small")
vectorstore = Chroma.from_documents(chunks, embeddings, persist_directory="./chroma_db")
שלב 4: RAG Chain
from langchain_openai import ChatOpenAI
from langchain.chains import create_retrieval_chain
from langchain.chains.combine_documents import create_stuff_documents_chain
from langchain_core.prompts import ChatPromptTemplate
llm = ChatOpenAI(model="gpt-4o-mini", temperature=0)
system_prompt = """ענה על השאלה בעברית, מבוסס אך ורק על ההקשר הנתון.
אם המידע לא נמצא, אמור זאת במפורש.
הקשר: {context}"""
prompt = ChatPromptTemplate.from_messages([
("system", system_prompt), ("human", "{input}")
])
chain = create_stuff_documents_chain(llm, prompt)
retriever = vectorstore.as_retriever(search_kwargs={"k": 5})
rag_chain = create_retrieval_chain(retriever, chain)
response = rag_chain.invoke({"input": "מה מדיניות החזרות?"})
print(response["answer"])
lightbulb
מעבר לייצור עם Pinecone
Chroma מצוינת לפיתוח. לייצור עם מיליוני מסמכים — עבור ל-Pinecone לביצועים גבוהים וסקאלביליות.
Advanced RAG טכניקות
Hybrid Search — שילוב BM25 וVectors
from langchain_community.retrievers import BM25Retriever
from langchain.retrievers import EnsembleRetriever
bm25 = BM25Retriever.from_documents(chunks); bm25.k = 5
vector_ret = vectorstore.as_retriever(search_kwargs={"k": 5})
hybrid = EnsembleRetriever(retrievers=[bm25, vector_ret], weights=[0.4, 0.6])
Re-ranking — סדר עדיפויות מדויק
from langchain.retrievers.document_compressors import CrossEncoderReranker
from langchain_community.cross_encoders import HuggingFaceCrossEncoder
from langchain.retrievers import ContextualCompressionRetriever
model = HuggingFaceCrossEncoder(model_name="BAAI/bge-reranker-base")
compressor = CrossEncoderReranker(model=model, top_n=3)
reranking_retriever = ContextualCompressionRetriever(
base_compressor=compressor, base_retriever=hybrid
)
הצעד הבא: Pinecone בייצור
לפרויקטים ב-Production, Pinecone מציעה ביצועים גבוהים ו-managed infrastructure.