spinny:~/writing $ vim rag-langchain-deep-dive.md
1~2Τα Large Language Models (LLMs) όπως GPT-4 και Claude είναι εξαιρετικά ισχυρά, αλλά υποφέρουν από έναν θεμελιώδη περιορισμό: η γνώση τους είναι παγωμένη στη στιγμή της εκπαίδευσης. Το **Retrieval-Augmented Generation (RAG)** λύνει ακριβώς αυτό το πρόβλημα συνδυάζοντας τη δημιουργική δύναμη των LLMs με τη δυνατότητα ανάκτησης πληροφοριών από εξωτερικές πηγές.3~4## Το Πρόβλημα: Περιορισμοί LLM5~61. **Στατική γνώση**: Ένα LLM γνωρίζει μόνο τι είδε κατά την εκπαίδευση.72. **Ψευδαισθήσεις**: Όταν ένα LLM δεν γνωρίζει την απάντηση, τείνει να κατασκευάζει μία.83. **Χωρίς πρόσβαση σε ιδιωτικά δεδομένα**: Ένα γενικό LLM δεν έχει πρόσβαση στην εσωτερική τεκμηρίωσή σας.9~10## Τι είναι το RAG;11~12Το RAG είναι μια αρχιτεκτονική που εμπλουτίζει το prompt με πληροφορίες ανακτημένες από εξωτερική βάση γνώσεων.13~14```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```22~23## Πώς Λειτουργεί το RAG24~25### Φάση 1: Ευρετηρίαση26~27```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```36~37### Φάση 2: Retrieval + Generation38~391. Η ερώτηση μετατρέπεται σε embedding.402. Το Vector Store βρίσκει τα πιο σχετικά chunks.413. Τα ανακτημένα chunks εισάγονται στο prompt ως πλαίσιο.424. Το LLM δημιουργεί απάντηση βάσει του πλαισίου.43~44## Κατασκευή RAG Pipeline με LangChain45~46```bash47pip install langchain langchain-openai langchain-community chromadb48```49~50```python51from langchain_community.document_loaders import PyPDFLoader, WebBaseLoader, DirectoryLoader, TextLoader52~53pdf_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```61~62```python63from langchain.text_splitter import RecursiveCharacterTextSplitter64~65text_splitter = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=200, separators=["\n\n", "\n", ". ", " ", ""])66chunks = text_splitter.split_documents(all_docs)67```68~69```python70from langchain_openai import OpenAIEmbeddings71from langchain_community.vectorstores import Chroma72~73embedding_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```77~78```python79from langchain_openai import ChatOpenAI80from langchain_core.prompts import ChatPromptTemplate81from langchain_core.runnables import RunnablePassthrough82from langchain_core.output_parsers import StrOutputParser83~84llm = 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.88~89Context:90{context}91~92Question: {question}93~94Answer:95""")96~97def format_docs(docs):98 return "\n\n".join(doc.page_content for doc in docs)99~100rag_chain = (101 {"context": retriever | format_docs, "question": RunnablePassthrough()}102 | prompt | llm | StrOutputParser()103)104~105response = rag_chain.invoke("How does authentication work in the system?")106```107~108## Προχωρημένες Τεχνικές RAG109~110Multi-Query Retrieval, Contextual Compression, Hybrid Search και Conversational RAG.111~112```python113from langchain.retrievers import MultiQueryRetriever114multi_retriever = MultiQueryRetriever.from_llm(retriever=vectorstore.as_retriever(), llm=llm)115```116~117```python118from langchain.retrievers import EnsembleRetriever119from langchain_community.retrievers import BM25Retriever120~121bm25_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```126~127## Βέλτιστες Πρακτικές128~1291. **Επιλέξτε σωστό μέγεθος chunk**: Πειραματιστείτε με 500-1500 tokens.1302. **Χρησιμοποιήστε μεταδεδομένα εγγράφων**.1313. **Αξιολογήστε ποιότητα**: Χρησιμοποιήστε [RAGAS](https://docs.ragas.io/).1324. **Διαχειριστείτε ενημερώσεις εγγράφων**.1335. **Προσθέστε re-ranker**.134~135## Συμπέρασμα136~137Το RAG έχει γίνει η τυπική αρχιτεκτονική για AI εφαρμογές που χρειάζονται πρόσβαση σε συγκεκριμένη, ενημερωμένη γνώση. Το LangChain απλοποιεί σημαντικά την υλοποίηση.138~
NORMAL · rag-langchain-deep-dive.md [readonly]138 lines · :q to close