spinny:~/writing $ less rag-langchain-deep-dive.md
12Τα Large Language Models (LLMs) όπως GPT-4 και Claude είναι εξαιρετικά ισχυρά, αλλά υποφέρουν από έναν θεμελιώδη περιορισμό: η γνώση τους είναι παγωμένη στη στιγμή της εκπαίδευσης. Το **Retrieval-Augmented Generation (RAG)** λύνει ακριβώς αυτό το πρόβλημα συνδυάζοντας τη δημιουργική δύναμη των LLMs με τη δυνατότητα ανάκτησης πληροφοριών από εξωτερικές πηγές.34## Το Πρόβλημα: Περιορισμοί LLM561. **Στατική γνώση**: Ένα LLM γνωρίζει μόνο τι είδε κατά την εκπαίδευση.72. **Ψευδαισθήσεις**: Όταν ένα LLM δεν γνωρίζει την απάντηση, τείνει να κατασκευάζει μία.83. **Χωρίς πρόσβαση σε ιδιωτικά δεδομένα**: Ένα γενικό LLM δεν έχει πρόσβαση στην εσωτερική τεκμηρίωσή σας.910## Τι είναι το RAG;1112Το RAG είναι μια αρχιτεκτονική που εμπλουτίζει το prompt με πληροφορίες ανακτημένες από εξωτερική βάση γνώσεων.1314```mermaid15graph LR16 User["User"] -- "Question" --> Retriever17 Retriever -- "Search relevant\ndocuments" --> VectorStore["Vector Store"]18 VectorStore -- "Relevant\ndocuments" --> Retriever19 Retriever -- "Context + Question" --> LLM20 LLM -- "Grounded\nresponse" --> User21```2223## Πώς Λειτουργεί το RAG2425### Φάση 1: Ευρετηρίαση2627```mermaid28graph TD29 A["Documents\n(PDF, HTML, MD, DB)"] --> B["Document Loader"]30 B --> C["Text Splitter"]31 C --> D["Text Chunks"]32 D --> E["Embedding Model"]33 E --> F["Numerical Vectors"]34 F --> G["Vector Store\n(ChromaDB, Pinecone, FAISS)"]35```3637### Φάση 2: Retrieval + Generation38391. Η ερώτηση μετατρέπεται σε embedding.402. Το Vector Store βρίσκει τα πιο σχετικά chunks.413. Τα ανακτημένα chunks εισάγονται στο prompt ως πλαίσιο.424. Το LLM δημιουργεί απάντηση βάσει του πλαισίου.4344## Κατασκευή RAG Pipeline με LangChain4546```bash47pip install langchain langchain-openai langchain-community chromadb48```4950```python51from langchain_community.document_loaders import PyPDFLoader, WebBaseLoader, DirectoryLoader, TextLoader5253pdf_loader = PyPDFLoader("docs/manual.pdf")54pdf_docs = pdf_loader.load()55web_loader = WebBaseLoader("https://docs.example.com/guide")56web_docs = web_loader.load()57dir_loader = DirectoryLoader("./knowledge_base", glob="**/*.md", loader_cls=TextLoader)58md_docs = dir_loader.load()59all_docs = pdf_docs + web_docs + md_docs60```6162```python63from langchain.text_splitter import RecursiveCharacterTextSplitter6465text_splitter = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=200, separators=["\n\n", "\n", ". ", " ", ""])66chunks = text_splitter.split_documents(all_docs)67```6869```python70from langchain_openai import OpenAIEmbeddings71from langchain_community.vectorstores import Chroma7273embedding_model = OpenAIEmbeddings(model="text-embedding-3-small")74vectorstore = Chroma.from_documents(documents=chunks, embedding=embedding_model, persist_directory="./chroma_db")75retriever = vectorstore.as_retriever(search_type="similarity", search_kwargs={"k": 4})76```7778```python79from langchain_openai import ChatOpenAI80from langchain_core.prompts import ChatPromptTemplate81from langchain_core.runnables import RunnablePassthrough82from langchain_core.output_parsers import StrOutputParser8384llm = ChatOpenAI(model="gpt-4o", temperature=0)85prompt = ChatPromptTemplate.from_template("""86Answer the question based only on the provided context.87If the context does not contain enough information, say you don't know.8889Context:90{context}9192Question: {question}9394Answer:95""")9697def format_docs(docs):98 return "\n\n".join(doc.page_content for doc in docs)99100rag_chain = (101 {"context": retriever | format_docs, "question": RunnablePassthrough()}102 | prompt | llm | StrOutputParser()103)104105response = rag_chain.invoke("How does authentication work in the system?")106```107108## Προχωρημένες Τεχνικές RAG109110Multi-Query Retrieval, Contextual Compression, Hybrid Search και Conversational RAG.111112```python113from langchain.retrievers import MultiQueryRetriever114multi_retriever = MultiQueryRetriever.from_llm(retriever=vectorstore.as_retriever(), llm=llm)115```116117```python118from langchain.retrievers import EnsembleRetriever119from langchain_community.retrievers import BM25Retriever120121bm25_retriever = BM25Retriever.from_documents(chunks)122bm25_retriever.k = 4123semantic_retriever = vectorstore.as_retriever(search_kwargs={"k": 4})124hybrid_retriever = EnsembleRetriever(retrievers=[bm25_retriever, semantic_retriever], weights=[0.4, 0.6])125```126127## Βέλτιστες Πρακτικές1281291. **Επιλέξτε σωστό μέγεθος chunk**: Πειραματιστείτε με 500-1500 tokens.1302. **Χρησιμοποιήστε μεταδεδομένα εγγράφων**.1313. **Αξιολογήστε ποιότητα**: Χρησιμοποιήστε [RAGAS](https://docs.ragas.io/).1324. **Διαχειριστείτε ενημερώσεις εγγράφων**.1335. **Προσθέστε re-ranker**.134135## Συμπέρασμα136137Το RAG έχει γίνει η τυπική αρχιτεκτονική για AI εφαρμογές που χρειάζονται πρόσβαση σε συγκεκριμένη, ενημερωμένη γνώση. Το LangChain απλοποιεί σημαντικά την υλοποίηση.138
:RAG και LangChain: Ένας Πλήρης Οδηγός για Retrieval-Augmented Generationlines 1-138 (END) — press q to close