{"id":25111843,"url":"https://github.com/lionerav2002/rag","last_synced_at":"2026-04-05T21:04:28.475Z","repository":{"id":276212693,"uuid":"925180660","full_name":"lioneraV2002/rag","owner":"lioneraV2002","description":"A university project concerning the use of RAG(Retrieval Augmented Generation) technique and Spring framework to implement a simple financial advisor agent.","archived":false,"fork":false,"pushed_at":"2025-02-06T22:56:56.000Z","size":1459,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-04-02T10:18:08.902Z","etag":null,"topics":["agentic-ai","ai","docker","java","llms","ollama","rag","retrieval-augmented-generation","spring"],"latest_commit_sha":null,"homepage":"","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/lioneraV2002.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2025-01-31T11:41:37.000Z","updated_at":"2025-02-06T22:52:38.000Z","dependencies_parsed_at":"2025-02-06T23:22:41.394Z","dependency_job_id":"b37fd908-aee8-40f8-93c6-15eac427bf21","html_url":"https://github.com/lioneraV2002/rag","commit_stats":null,"previous_names":["lionerav2002/rag"],"tags_count":2,"template":false,"template_full_name":null,"purl":"pkg:github/lioneraV2002/rag","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lioneraV2002%2Frag","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lioneraV2002%2Frag/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lioneraV2002%2Frag/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lioneraV2002%2Frag/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/lioneraV2002","download_url":"https://codeload.github.com/lioneraV2002/rag/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lioneraV2002%2Frag/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":263966162,"owners_count":23536813,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["agentic-ai","ai","docker","java","llms","ollama","rag","retrieval-augmented-generation","spring"],"created_at":"2025-02-08T01:28:18.778Z","updated_at":"2025-12-30T22:15:57.306Z","avatar_url":"https://github.com/lioneraV2002.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"# تولید مبتنی بر بازیابی (RAG)\n\nتولید مبتنی بر بازیابی (RAG) یک چارچوب پیشرفته هوش مصنوعی است که مدل‌های زبانی بزرگ (LLMs) را با ترکیب بازیابی اطلاعات و تولید متن بهبود می‌بخشد تا پاسخ‌هایی دقیق، مبتنی بر زمینه و واقعی تولید کند. RAG محدودیت‌های LLMs مانند توهم (تولید اطلاعات نادرست یا ساختگی) و دانش ثابت را با بازیابی پویا داده‌ها از منابع خارجی برطرف می‌کند. این روش در سال 2020 توسط Lewis و همکاران معرفی شد و از آن زمان به دلیل توانایی در بهبود دقت و انعطاف‌پذیری در وظایف دانش‌محور NLP، به‌ویژه در پرس‌وجوهای باز، مورد توجه قرار گرفته است [1].\n\n## مکانیزم‌های اصلی RAG\n\nRAG از طریق یک خط لوله شامل **دریافت**، **جاسازی**، **ذخیره‌سازی**، **بازیابی**، **تقویت** و **تولید** عمل می‌کند. در ادامه، هر مرحله به‌طور مفصل با مثال‌ها، بینش‌های فنی و جزئیات پیاده‌سازی توضیح داده شده است.\n\n### 1. **دریافت اسناد**\n- **تعریف**: استخراج و پیش‌پردازش متن از اسناد منبع (مانند PDF، صفحات وب، پایگاه‌های داده).\n- **فرآیند**:\n    - بارگذاری اسناد با ابزارهایی مانند `PagePdfDocumentReader` (برای PDF)، خزنده‌های وب یا Apache Tika.\n    - پاکسازی متن: حذف نویز مانند سرصفحه‌ها، پاورقی‌ها یا تصاویر.\n    - **تکه‌تکه‌سازی (Chunking)**: تقسیم متن به قطعات کوچک‌تر (100-500 توکن) برای جای‌گیری در پنجره‌های زمینه LLM (مانند 4096 توکن برای GPT-3) و بهبود دقت بازیابی.\n- **چرا تکه‌تکه‌سازی؟** قطعات کوچک‌تر دقت را افزایش می‌دهند و نویز را کاهش می‌دهند، اما باید زمینه را حفظ کنند.\n- **روش‌های تکه‌تکه‌سازی**:\n    - **ثابت (Fixed-size)**: تعیین تعداد توکن‌ها (مثلاً 256) و همپوشانی (20 توکن) برای حفظ زمینه. مثال در LangChain:\n      ```python\n      from langchain.text_splitter import CharacterTextSplitter\n      text_splitter = CharacterTextSplitter(separator=\"\\n\\n\", chunk_size=256, chunk_overlap=20)\n      docs = text_splitter.create_documents([text])\n      ```\n    - **آگاه از محتوا (Content-aware)**: تقسیم بر اساس ساختار (مانند جملات). ابزارها:\n        - **Naive**: تقسیم با نقطه یا خط جدید (`text.split(\".\")`).\n        - **NLTK**: تقسیم جملات با دقت بیشتر.\n          ```python\n          from langchain.text_splitter import NLTKTextSplitter\n          text_splitter = NLTKTextSplitter()\n          docs = text_splitter.split_text(text)\n          ```\n        - **spaCy**: تقسیم جملات با حفظ زمینه معنایی.\n    - **بازگشتی (Recursive)**: تقسیم با جداکننده‌های مختلف تا رسیدن به اندازه مطلوب.\n      ```python\n      from langchain.text_splitter import RecursiveCharacterTextSplitter\n      text_splitter = RecursiveCharacterTextSplitter(chunk_size=256, chunk_overlap=20)\n      docs = text_splitter.create_documents([text])\n      ```\n    - **تخصصی (Specialized)**: برای محتوای ساختاریافته (مانند Markdown، LaTeX) با حفظ ساختار.\n      ```python\n      from langchain.text_splitter import MarkdownTextSplitter\n      markdown_splitter = MarkdownTextSplitter(chunk_size=100, chunk_overlap=0)\n      docs = markdown_splitter.create_documents([markdown_text])\n      ```\n- **مثال**: یک گزارش مالی 50 صفحه‌ای به قطعات 200 توکنی تقسیم می‌شود، هر کدام یک پاراگراف یا خلاصه جدول.\n- **چالش‌ها**: مدیریت جداول، تصاویر یا متن چندزبانه نیازمند ابزارهای تخصصی است.\n- **ابزارها**: Apache Tika، PDFBox، LangChain.\n\n### 2. **تولید جاسازی**\n- **تعریف**: تبدیل قطعات متن به بردارهای عددی متراکم که معنای معنایی را ضبط می‌کنند.\n- **فرآیند**:\n    - استفاده از مدل‌های جاسازی (مانند BERT، nomic-embed-text، text-embedding-ada-002 از OpenAI) برای نگاشت متن به بردارهای با ابعاد بالا (768 یا 1536).\n    - بردارها نقاطی در فضای معنایی هستند که معانی مشابه (مانند «سود» و «درآمد») نزدیک به هم هستند.\n    - **ریاضیات**: مدل جاسازی بردار $v \\in \\mathbb{R}^d$ تولید می‌کند، که $d$ تعداد ابعاد است.\n    - انواع جاسازی:\n        - **پراکنده (Sparse, e.g., TF-IDF)**: برای تطبیق کلمات کلیدی، کم‌هزینه اما معنای عمیق را ضبط نمی‌کند.\n        - **متراکم (Dense, e.g., BERT, SentenceBERT)**: معنای زمینه‌ای را ضبط می‌کند، مناسب برای RAG اما محاسباتی سنگین.\n- **مثال**: جمله «درآمد سه‌ماهه اول 10٪ افزایش یافت» به یک بردار 768 بعدی تبدیل می‌شود که به «فروش در سه‌ماهه اول رشد کرد» نزدیک است.\n- **ابزارها**: Hugging Face Transformers، Sentence-BERT، OpenAI embeddings.\n- **چالش‌ها**: ذخیره‌سازی بردارهای با ابعاد بالا؛ جاسازی‌های خاص حوزه (مانند تنظیم‌شده برای مالی) دقت را بهبود می‌دهند.\n\n### 3. **ذخیره‌سازی بردار**\n- **تعریف**: ذخیره جاسازی‌ها در یک پایگاه داده برداری برای جستجوی مشابهت کارآمد.\n- **فرآیند**:\n    - استفاده از پایگاه‌های داده مانند PostgreSQL با pgvector، Pinecone یا Weaviate.\n    - نمایه‌سازی با الگوریتم‌های HNSW (جهان کوچک قابل پیمایش سلسله‌مراتبی، O(log n)) یا IVFFlat (O(n/k)) برای جستجوی سریع همسایگی تقریبی (ANN).\n    - ذخیره متادیتا (مانند شناسه سند، شماره صفحه، متن قطعه) برای ردیابی.\n- **مثال**: ذخیره 1000 قطعه از گزارش سالانه یک شرکت در pgvector با متادیتا که هر بردار را به صفحه منبع مرتبط می‌کند.\n- **ریاضیات**: جستجوی ANN با معیارهایی مانند مشابهت کسینوسی: $cos(\\theta) = \\frac{v_1 \\cdot v_2}{\\|v_1\\| \\|v_2\\|}$\n- **چالش‌ها**: تعادل بین اندازه نمایه و سرعت جستجو؛ به‌روزرسانی جاسازی‌ها برای اسناد جدید.\n\n### 4. **بازیابی**\n- **تعریف**: جستجوی پایگاه داده برداری برای یافتن قطعات مرتبط با پرس‌وجوی کاربر.\n- **فرآیند**:\n    - جاسازی پرس‌وجو در یک بردار با همان مدل جاسازی.\n    - انجام جستجوی ANN برای بازیابی K قطعه برتر (K=3-10) بر اساس امتیازهای مشابهت.\n    - اختیاری: فیلتر بر اساس متادیتا (مانند تاریخ) یا بازمرتب‌سازی با رمزگذار متقاطع.\n- **روش‌های بازیابی**:\n    - **استاندارد/ساده**: استفاده از همان قطعات برای جاسازی و تولید.\n    - **پنجره جملات (Sentence-Window)**: تقسیم به قطعات کوچک (مانند جملات) برای جاسازی، افزودن زمینه اطراف برای تولید.\n    - **ادغام خودکار (Auto-merging)**: ترکیب قطعات کوچک‌تر به گروه‌های بزرگ‌تر اگر مشابهت کافی باشد (مانند گروه‌بندی پاراگراف‌ها).\n- **مثال**: پرس‌وجوی «سود سه‌ماهه اول چیست؟» جاسازی شده، قطعاتی درباره «درآمد» یا «سود» از گزارش‌های سه‌ماهه اول بازیابی می‌کند.\n- **ابزارها**: FAISS، Milvus، pgvector.\n- **چالش‌ها**: قطعات نامرتبط (مانند داده‌های سه‌ماهه دوم برای پرس‌وجوی سه‌ماهه اول). **راه‌حل**: جستجوی ترکیبی (کلمه کلیدی + بردار).\n\n### 5. **تقویت پرس‌وجو**\n- **تعریف**: غنی‌سازی پرس‌وجوی ورودی LLM با قطعات بازیابی‌شده برای هدایت تولید.\n- **فرآیند**:\n    - ساخت پرس‌وجو: دستورالعمل‌های سیستمی + قطعات بازیابی‌شده + پرس‌وجوی کاربر.\n    - نمونه:\n      ```\n      سیستم: شما یک مشاور مالی هستید. با استفاده از زمینه پاسخ دهید.\n      زمینه: [سود سه‌ماهه اول 5 میلیون دلار بود، 10٪ افزایش (صفحه 3)؛ درآمد به 20 میلیون دلار رسید (صفحه 4)].\n      سؤال: سود سه‌ماهه اول چیست؟\n      پاسخ:\n      ```\n    - اختیاری: کوتاه کردن یا خلاصه‌سازی قطعات برای جای‌گیری در محدودیت‌های زمینه.\n- **مثال**: برای «ریسک‌های سرمایه‌گذاری؟»، قطعاتی درباره نوسانات بازار گنجانده می‌شود.\n- **چالش‌ها**: اضافه‌بار با قطعات نامرتبط؛ **راه‌حل**: بازمرتب‌سازی یا آستانه‌های اهمیت.\n\n### 6. **تولید**\n- **تعریف**: استفاده از LLM برای تولید پاسخی منسجم و آگاه از زمینه.\n- **فرآیند**:\n    - تغذیه پرس‌وجوی تقویت‌شده به LLM (مانند llama3.2:1b، GPT-4، BART).\n    - LLM داده‌ها را به پاسخ زبان طبیعی با ارجاعات ترکیب می‌کند.\n    - روش‌ها:\n        - **RAG-Sequence**: استفاده از یک سند برای کل خروجی.\n        - **RAG-Token**: استفاده از اسناد مختلف برای هر توکن خروجی با جستجوی پرتو.\n- **مثال**: خروجی: «سود سه‌ماهه اول 5 میلیون دلار بود، 10٪ افزایش نسبت به سال گذشته [صفحه 3].»\n- **ابزارها**: OpenAI API، Ollama، Hugging Face.\n- **چالش‌ها**: اطمینان از وفاداری (تطابق با زمینه) و انسجام.\n\n![img.png](img.png)\n*شکل 1: خط لوله RAG شامل دریافت، جاسازی، ذخیره‌سازی، بازیابی و تولید [2].*\n\n## مزایای RAG\n- **دقت**: پاسخ‌ها را در داده‌های واقعی پایه‌گذاری می‌کند، توهم را کاهش می‌دهد.\n- **دانش پویا**: اسناد جدید را بدون بازآموزش در بر می‌گیرد.\n- **مقیاس‌پذیری**: داده‌های بزرگ را با پایگاه‌های داده برداری مدیریت می‌کند.\n- **انطباق‌پذیری حوزه**: با داده‌های تخصصی (مانند مالی، پزشکی) کار می‌کند.\n- **شفافیت**: ارجاعات زمینه‌ای امکان ردیابی منابع را فراهم می‌کند، برخلاف مدل‌های بسته که «جعبه سیاه» هستند.\n\n## چالش‌ها و راه‌حل‌ها\n- **بازیابی نامرتبط**: جاسازی‌های ضعیف یا داده‌های پرنویز. **راه‌حل**: تنظیم دقیق جاسازی‌ها، جستجوی ترکیبی (BM25 + بردار).\n- **اضافه‌بار زمینه**: تعداد زیاد قطعات، محدودیت‌های LLM را نقض می‌کند. **راه‌حل**: خلاصه‌سازی قطعات، پنجره‌های لغزنده.\n- **ارزیابی**: معیارهای وفاداری (تطابق با زمینه)، اهمیت (Precision@K)، انسجام (BLEU/ROUGE). **ابزارها**: RAGAS، ارزیابی انسانی.\n- **تأخیر**: بازیابی + تولید کند است. **راه‌حل**: بهینه‌سازی نمایه‌سازی (HNSW)، کش پرس‌وجوها.\n- **اندازه قطعات**: کوچک‌تر دقیق‌تر اما زمینه را از دست می‌دهد؛ بزرگ‌تر نویز ایجاد می‌کند. **راه‌حل**: همپوشانی یا تنظیم اندازه.\n\n## انواع RAG\n1. **RAG ساده (Naive RAG)**:\n    - خط لوله پایه: بازیابی → تقویت → تولید.\n    - مثال: بازیابی 5 قطعه برتر، تغذیه به LLM (مانند پروژه شما).\n    - مزایا: ساده، مؤثر برای مجموعه داده‌های کوچک.\n    - معایب: محدود به بازیابی تک‌مرحله‌ای، ممکن است زمینه‌های ظریف را از دست بدهد.\n\n2. **RAG مدولار**:\n    - چندین بازیاب (بردار، کلمه کلیدی، گراف دانش).\n    - مثال: پرس‌وجوی «ریسک‌های شرکت X» از پایگاه داده برداری (معناشناسی)، BM25 (عبارات دقیق) و گراف دانش (روابط مانند «X → رقیب Y») بازیابی می‌کند.\n    - مزایا: بهبود یادآوری با ترکیب نقاط قوت.\n    - معایب: پیچیدگی پیاده‌سازی.\n\n3. **RAG تطبیقی (Adaptive RAG)**:\n    - انتخاب پویا استراتژی بازیابی بر اساس نوع پرس‌وجو.\n    - مثال: پرس‌وجوهای ساده («سود چیست؟») از LLM مستقیم، پرس‌وجوهای پیچیده («ریسک‌های سه‌ماهه اول؟») از بازیابی.\n    - مزایا: کارآمد برای بارهای کاری متنوع.\n    - معایب: نیاز به طبقه‌بند پرس‌وجو.\n\n4. **RAG عاملی (Agentic RAG)**:\n    - ادغام ابزارها (مانند جستجوی وب، ماشین‌حساب) با بازیابی.\n    - مثال: پرس‌وجوی «مقایسه درآمد اپل در سه‌ماهه اول و دوم» داده‌ها را بازیابی می‌کند، از ماشین‌حساب برای تفاوت‌ها استفاده می‌کند، سپس تولید می‌کند.\n    - مزایا: مدیریت وظایف پیچیده.\n    - معایب: تأخیر بیشتر، ادغام ابزار.\n\n5. **RAG تنظیم‌شده (Fine-Tuned RAG)**:\n    - تنظیم جاسازی‌ها یا LLM برای حوزه خاص (مانند مالی).\n    - مثال: آموزش nomic-embed-text روی گزارش‌های مالی برای جاسازی‌های دقیق‌تر.\n    - مزایا: دقت بالا در حوزه‌های خاص.\n    - معایب: نیاز به داده‌های برچسب‌دار و محاسبات.\n\n6. **FLARE (Forward-Looking Active Retrieval)**:\n    - بازیابی پویا در حین تولید اگر اعتماد به خروجی کم باشد.\n    - مثال: در پاسخ به «روندهای بازار 2023»، اگر اعتماد به بخشی از پاسخ کم باشد، وب یا پایگاه دانش را جستجو می‌کند.\n    - مزایا: بهبود مستمر پاسخ‌ها.\n    - معایب: پیچیدگی و تأخیر.\n\n7. **HyDE (Hypothetical Document Embeddings)**:\n    - تولید سند فرضی برای پرس‌وجو، جاسازی آن، و بازیابی اسناد مشابه.\n    - مثال: برای «ریسک‌های تسلا»، سند فرضی درباره ریسک‌ها تولید شده، سپس اسناد واقعی بازیابی می‌شوند.\n    - مزایا: بهبود بازیابی برای پرس‌وجوهای مبهم.\n    - معایب: محاسبات اضافی برای سند فرضی.\n\n![img_1.png](img_1.png)\n*شکل 2: انواع RAG، از ساده تا عاملی*\n\n## سناریوهای مثال\n1. **مشاور مالی**:\n    - ورودی: گزارش سه‌ماهه اول تسلا. پرس‌وجو: «ریسک‌های سه‌ماهه اول تسلا چیست؟»\n    - RAG: قطعاتی درباره «مشکلات زنجیره تأمین، صفحه 5» بازیابی می‌کند، پرس‌وجو را تقویت می‌کند، تولید می‌کند: «تسلا در سه‌ماهه اول با اختلالات زنجیره تأمین مواجه شد [صفحه 5].»\n2. **دستیار پزشکی**:\n    - ورودی: PDFهای مجلات پزشکی. پرس‌وجو: «درمان فشار خون بالا؟»\n    - RAG: پروتکل‌های دارویی را بازیابی می‌کند، تولید می‌کند: «لیزینوپریل توصیه می‌شود [مجله X، ص12].»\n3. **تحقیق حقوقی**:\n    - ورودی: پایگاه داده قوانین قضایی. پرس‌وجو: «سوابق برای اختلافات قرارداد؟»\n    - RAG: موارد مرتبط را بازیابی می‌کند، خلاصه‌ای با ارجاع تولید می‌کند.\n4. **پشتیبانی مشتری**:\n    - ورودی: PDF سیاست‌های شرکت. پرس‌وجو: «سیاست بازپرداخت چیست؟»\n    - RAG: بخش‌های سیاست را بازیابی می‌کند، تولید می‌کند: «بازپرداخت در 30 روز [بخش 4.2].»\n\n## بینش‌های فنی\n- **مدل‌های جاسازی**: مدل‌های کوچک (nomic-embed-text، ~100M پارامتر) سریع اما کمتر دقیق از مدل‌های بزرگ (text-embedding-ada-002، ~500M پارامتر).\n- **پایگاه‌های داده برداری**: pgvector منبع‌باز و مقرون‌به‌صرفه است؛ Pinecone مقیاس‌پذیری مدیریت‌شده ارائه می‌دهد.\n- **الگوریتم‌های جستجو**: HNSW (O(log n)) سرعت را بهینه می‌کند؛ IVFFlat (O(n/k)) برای مجموعه‌های بزرگ‌تر مناسب است.\n- **مهندسی پرس‌وجو**: پرس‌وجوهای سیستمی (مانند «به‌عنوان مشاور مالی عمل کنید») تمرکز حوزه را اعمال می‌کنند؛ مثال‌های چندشاتی انسجام را بهبود می‌دهند.\n- **آموزش RAG**: فقط رمزگذار پرس‌وجو و تولیدکننده متن آموزش می‌بینند (مانند DPR و BART)، نمایه اسناد ثابت می‌ماند برای کاهش هزینه [1].\n\n## معیارهای ارزیابی\n- **وفاداری**: تطابق پاسخ با زمینه (امتیاز RAGAS یا دستی).\n- **اهمیت**: قطعات مرتبط (Precision@K).\n- **انسجام**: خوانایی خروجی (BLEU، ROUGE، ارزیابی انسانی).\n- **تأخیر**: زمان کل (مانند 500 میلی‌ثانیه برای بازیابی + 1 ثانیه برای تولید).\n- **مقایسه عملکرد**: RAG در پرس‌وجوهای باز بهتر از روش‌های استخراجی (انتخاب متن) یا بسته (بدون بازیابی) عمل می‌کند، پاسخ‌های متنوع‌تر و دقیق‌تر تولید می‌کند [1].\n\n## بهبود سیستم‌های RAG\n1. **بازمرتب‌سازی (Re-ranking)**:\n    - استفاده از مدل‌هایی مانند MonoT5 یا MonoBERT برای اولویت‌بندی قطعات مرتبط‌تر پس از بازیابی اولیه.\n    - مثال: قطعات با امتیاز مشابهت پایین‌تر اما محتوای دقیق‌تر ارتقا می‌یابند.\n2. **FLARE**: بازیابی پویا در حین تولید اگر اعتماد به بخشی از پاسخ کم باشد.\n3. **HyDE**: تولید سند فرضی برای پرس‌وجو، جاسازی آن، و بازیابی اسناد مشابه برای پرس‌وجوهای مبهم.\n4. **جستجوی ترکیبی**: ترکیب بردار و BM25 برای دقت و یادآوری بهتر.\n5. **بهینه‌سازی زمینه**: خلاصه‌سازی قطعات یا استفاده از مدل‌های فشرده‌سازی برای جای‌گیری در محدودیت‌های LLM.\n\n## ارجاعات\n1. Lewis, P., et al. (2020). \"تولید مبتنی بر بازیابی برای وظایف NLP دانش‌محور.\" *NeurIPS*. [arXiv:2005.11401](https://arxiv.org/abs/2005.11401).\n2. Saurabh, S. (2024). \"خط لوله RAG: چگونه پردازش زبان طبیعی را متحول می‌کند.\" *Medium*. [Link](https://medium.com/@ashleygreen9910/rag-pipeline-how-it-transforms-natural-language-processing-6ee7c076cc25).\n3. Gao, Y., et al. (2023). \"تولید مبتنی بر بازیابی برای مدل‌های زبانی بزرگ: یک بررسی.\" [arXiv:2312.10997](https://arxiv.org/abs/2312.10997).\n4. LangChain. \"مستندات LangChain: تقسیم‌کننده‌های متن.\" [Link]().\n   - Hugging Face. \"مستندات Transformers: جاسازی‌های متنی.\" [huggingface/tasks/sentence-similarity](https://huggingface.co/tasks/sentence-similarity).\n   - [langchain.com/docs/integrations/document_transformers](https://python.langchain.com/docs/integrations/document_transformers/)\n6. pgvector. \"pgvector: جستجوی مشابهت برداری منبع‌باز برای Postgres.\" [https://github.com/pgvector/pgvector](https://github.com/pgvector/pgvector).\n7. https://www.google.com/url?sa=i\u0026url=https%3A%2F%2Fwww.linkedin.com%2Fposts%2Ftheravitshow_data-rag-vectordatabases-activity-7237744549823995904-OEJ7\u0026psig=AOvVaw3WjOk8tf-zp8HBQAGD07yz\u0026ust=1757767439302000\u0026source=images\u0026cd=vfe\u0026opi=89978449\u0026ved=0CBUQjhxqFwoTCMiNlJqg048DFQAAAAAdAAAAABAL\n\n## پروژه من: FIN.AI و پیاده‌سازی RAG\n\n**توضیح ساده**: FIN.AI یک برنامه Spring Boot است که به کاربران امکان می‌دهد PDFهای مالی را بارگذاری کنند، آن‌ها را به‌صورت بردار در PostgreSQL (pgvector) ذخیره کنند و از طریق رابط چت WebSocket در زمان واقعی پرس‌وجو کنند. از RAG برای پاسخ به سؤالاتی مانند «درآمد سه‌ماهه اول چیست؟» با پاسخ‌های مبتنی بر اسناد بارگذاری‌شده استفاده می‌کند، با پشتیبانی از Ollama (محلی) یا OpenAI (ابری).\n\n**چگونه RAG را به‌طور کامل پیاده‌سازی می‌کند**:\n- **دریافت**: `FinancialRagService.uploadPDF` از `PagePdfDocumentReader` برای استخراج متن PDF و `TokenTextSplitter` برای تکه‌تکه‌سازی (مانند قطعات 200 توکنی) استفاده می‌کند، با پشتیبانی از روش‌های ثابت و آگاه از محتوا.\n- **جاسازی/ذخیره‌سازی**: قطعات با nomic-embed-text (Ollama) یا text-embedding-ada-002 (OpenAI) جاسازی شده و در pgvector با نمایه‌سازی HNSW ذخیره می‌شوند، امکان جستجوی سریع ANN را فراهم می‌کند.\n- **بازیابی/تقویت**: `QuestionAnswerAdvisor` در `ChatClientConfigurations` از `VectorStore` برای بازیابی K قطعه برتر (SearchRequest) استفاده می‌کند، پرس‌وجوها را با دستورالعمل‌های سیستمی (مانند «به‌عنوان مشاور مالی عمل کنید») تقویت می‌کند.\n- **تولید**: `FinancialRagService.query` از `ChatClient` برای فراخوانی llama3.2:1b یا GPT-4o استفاده می‌کند، پاسخ‌های ارجاع‌دار تولید می‌کند (مانند «درآمد 10 میلیون دلار بود [گزارش سه‌ماهه اول، ص4]»).\n- **تمرکز حوزه**: پرس‌وجوهای سیستمی در `ChatClientConfigurations` (مانند «پاسخ‌های صرفاً مالی ارائه دهید») و اعتبارسنجی در `query` پرس‌وجوهای غیرمالی را فیلتر می‌کنند.\n- **زمان واقعی**: WebSocket (`WebSocketConfiguration`) پرس‌وجوی فوری را با ارسال پیام به `/socket-chat` تضمین می‌کند، ایده‌آل برای تحلیل مالی تعاملی.\n- **انواع RAG**: پروژه از RAG ساده استفاده می‌کند اما با افزودن بازمرتب‌سازی (مانند MonoBERT) یا FLARE قابل ارتقا به RAG مدولار یا عاملی است.\n\n**چرا کامل است؟**:\n- **خط لوله کامل**: از دریافت (PDF) تا تولید (پاسخ‌های ارجاع‌دار) را پوشش می‌دهد.\n- **انعطاف‌پذیر**: با پروفایل‌های `ollama` و `openai` بین محلی و ابری جابه‌جا می‌شود.\n- **مقیاس‌پذیر**: pgvector مجموعه داده‌های بزرگ را مدیریت می‌کند؛ WebSocket برای کاربران مقیاس می‌شود.\n- **آموزشی**: ساختار کد واضح (سرویس‌ها، کنترل‌کننده‌ها، پیکربندی‌ها) RAG را در عمل نشان می‌دهد، با پشتیبانی از جاسازی‌های متراکم و جستجوی ترکیبی بالقوه.\n- **متمرکز بر حوزه**: با پرس‌وجوهای سیستمی و اعتبارسنجی، پاسخ‌ها را به امور مالی محدود می‌کند، با قابلیت گسترش به حوزه‌های دیگر (مانند پزشکی).\n\nFIN.AI یک سیستم RAG عملی و آماده تولید است که برای پرس‌وجوی مالی طراحی شده و مفاهیم اصلی و قابلیت گسترش را نشان می‌دهد، با ادغام فناوری‌های مدرن مانند Spring AI، WebSocket و pgvector.","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flionerav2002%2Frag","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Flionerav2002%2Frag","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flionerav2002%2Frag/lists"}