بهبود کیفیت بازیابی
توسعه عاملهای هوشمند (Agentic Ai) با Langchain و Langgraph
- Diagnose retrieval failure caused by chunking, embeddings, query wording, and top-k selection.
- Use query rewriting, metadata filtering, and reranking when appropriate.
- Compare retrieval configurations using representative queries.
چرا بازیابی شکست میخورد؟
**اصل تشخیص**
پاسخ ضعیف را بهصورت خودکار مشکل generation فرض نکن؛ مسیر retrieval را بررسی کن.
```mermaid
flowchart LR
Q["Query"] --> E["Embedding"]
E --> R["Initial retrieval"]
R --> K["Top-k context"]
K --> G["Generation"]
G --> A["Answer"]
R -. "failure" .-> D["تشخیص: chunks، wording، k"]
```
تشخیص با یک مسیر قابل مشاهده
**نمونه تشخیص**
مدرک لازم: سند A با سقف ۲۰۰ واحد.
نتایج فعلی: سند B و سند C.
چون سند A در top-k نیست، شکست در retrieval رخ داده است؛ نه در generation.
```mermaid
flowchart TD
Q["Query"] --> C{"مدرک لازم در chunks هست؟"}
C -->|"نه"| X["Chunking یا ingestion"]
C -->|"بله"| S{"قطعه در top-k هست؟"}
S -->|"نه"| K["Query wording یا k"]
S -->|"بله"| O{"قطعه واقعاً مرتبط است؟"}
O -->|"نه"| E["Embedding یا metadata filter"]
O -->|"بله"| P["Reranking یا ترتیب context"]
```
بازنویسی و فیلتر query
**از سؤال مبهم تا query دقیق**
سؤال خام: «چطور سقفش رو عوض کنم؟»
هدف: تغییر سقف هزینه ماهانه API.
query جدید: `API monthly spending limit change procedure`.
فیلتر: `product = API`, `language = fa`, `version = 2`.
نتیجه: جستوجو محدودتر و query دارای واژههای قابل بازیابی میشود.
**فیلتر بیشازحد**
فیلتر نادرست میتواند مدرک درست را پیش از vector search حذف کند.
```mermaid
flowchart LR
U["سؤال خام"] --> W["Query rewrite"]
W --> F["Metadata filter"]
F --> V["Vector search"]
V --> R["نتایج دقیقتر"]
```
Top-k و reranking در عمل
**اثر top-k**
امتیازهای اولیه: `A = 0.82`, `B = 0.80`, `C = 0.79`.
با `top_k = 2`: نامزدها فقط A و B هستند.
امتیاز reranker: `A = 0.61`, `B = 0.18`.
ترتیب نهایی: A سپس B.
C حذف شده است؛ پس reranker نمیتواند آن را برگرداند. برای حفظ C، `top_k` را بزرگتر کن.
```mermaid
flowchart LR
Q["Query"] --> I["Initial retrieval: top-k بزرگ"]
I --> R["Reranker: امتیازدهی با query و chunk"]
R --> C["Final context: top-m"]
```
**نکته کلیدی**
`top_k` دامنه نامزدها را تعیین میکند؛ `final_m` تعداد قطعات واردشده به context نهایی را کنترل میکند.
مقایسه تنظیمها و تصمیم نهایی
**مقایسه پیکربندیها**
A: یک مدرک از سه مدرک.
B: دو مدرک از سه مدرک.
C: سه مدرک از سه مدرک.
نتیجه: C بهترین پوشش مشاهدهشده را دارد، اما باید هزینه و نویز آن هم سنجیده شود.
**زنجیره اصلاح**
۱. در A، chunk بزرگ و نبود rewrite باعث از دست رفتن مدرک میشود.
۲. در B، chunk کوچکتر و rewrite دو مدرک را بازیابی میکنند.
۳. در C، reranker ترتیب مدرکها را اصلاح میکند و مدرک سوم نیز در جای مناسب قرار میگیرد.
۴. انتخاب نهایی فقط پس از اجرای هر سه تنظیم روی queryهای نماینده انجام میشود.
```mermaid
flowchart TD
T["Queryهای نماینده"] --> M["اندازهگیری نتایج retrieval"]
M --> D{"الگوی شکست"}
D --> C["تغییر یک تنظیم با دلیل"]
C --> R["اجرای دوباره همان queryها"]
R --> M
```
بازگشت به دوره