بردارهای تعبیه و شباهت برداری
توسعه عاملهای هوشمند (Agentic Ai) با Langchain و Langgraph
- Explain embeddings as vector representations for semantic comparison.
- Compare cosine similarity, lexical matching, and semantic retrieval.
- Select an embedding model based on language, dimension, cost, and retrieval needs.
از قطعه تا معنا
**هدف:** تبدیل هر `chunk` به نمایش عددی برای مقایسهٔ معنا
- Builds on ← **Text Chunking Strategies:** هر `chunk` واحدی است که جداگانه index میشود.
- واژههای متفاوت، معنای نزدیک: `car repair` ↔ `automobile maintenance`
- **Embedding:** تابعی که متن را به بردار عددی تبدیل میکند:
\[
E: \text{text} \rightarrow \mathbb{R}^{d},\qquad E(x)=(x_1,x_2,\ldots,x_d)
\]
- بردار، خلاصهای عددی از الگوهای معنایی است؛ **کپی کامل متن نیست**.
- Where this leads → **Vector Stores and Retrieval:** ذخیرهٔ بردار `chunk`ها و جستوجوی `top-k`
```mermaid
flowchart LR
A["Text chunk"] --> B["Embedding model"]
B --> C["Vector in R^d"]
C --> D["Similarity search"]
D --> E["Relevant chunks"]
```
بردار یعنی چه؟
- برای متن `x`، embedding برابر است با:
\[
\mathbf{v}=E(x)=(v_1,v_2,\ldots,v_d)\in\mathbb{R}^{d}
\]
- `d` = dimension؛ هر مؤلفه یک مختصهٔ عددیِ آموختهشده است.
- مثال مفهومی با `d=3`:
\[
E(\text{car repair})=(0.80,0.10,0.60)
\]
\[
E(\text{automobile maintenance})=(0.75,0.15,0.65)
\]
- اختلاف مؤلفهها:
\[
(0.80-0.75,\,0.10-0.15,\,0.60-0.65)=(0.05,-0.05,-0.05)
\]
پس این دو نمایش، در این مثال، نزدیکاند.
```tikz
\begin{tikzpicture}[scale=1.05]
\draw[->] (0,0) -- (4.3,0) node[right] {$v_1$};
\draw[->] (0,0) -- (0,4.0) node[above] {$v_2$};
\draw[->] (0,0) -- (2.7,2.2) node[above right] {$v_3$};
\draw[->,thick,blue] (0,0) -- (2.4,1.0) node[below right] {$E(\mathrm{car\ repair})$};
\draw[->,thick,red] (0,0) -- (2.2,1.2) node[above left] {$E(\mathrm{auto\ maintenance})$};
\end{tikzpicture}
```
- Builds on ← **Text Chunking Strategies:** ورودی embedding همان `chunk`های ساختهشدهٔ قبلی است.
شباهت کسینوسی
- **Cosine similarity** زاویهٔ دو بردار را مقایسه میکند:
\[
\operatorname{cos\_sim}(\mathbf{a},\mathbf{b})=
\frac{\mathbf{a}\cdot\mathbf{b}}{\|\mathbf{a}\|\|\mathbf{b}\|}
\]
- ضرب داخلی:
\[
\mathbf{a}\cdot\mathbf{b}=\sum_{i=1}^{d}a_i b_i
\]
- طول بردار:
\[
\|\mathbf{a}\|=\sqrt{\sum_{i=1}^{d}a_i^2}
\]
**مثال کامل:** \(\mathbf{a}=(1,2)\)، \(\mathbf{b}=(2,1)\)
\[
\mathbf{a}\cdot\mathbf{b}=(1)(2)+(2)(1)=2+2=4
\]
\[
\|\mathbf{a}\|=\sqrt{1^2+2^2}=\sqrt{1+4}=\sqrt{5}
\]
\[
\|\mathbf{b}\|=\sqrt{2^2+1^2}=\sqrt{4+1}=\sqrt{5}
\]
\[
\operatorname{cos\_sim}(\mathbf{a},\mathbf{b})=\frac{4}{\sqrt{5}\sqrt{5}}=\frac{4}{5}=0.8
\]
```tikz
\begin{tikzpicture}[scale=1.3]
\draw[->] (-0.2,0) -- (3.4,0) node[right] {$x$};
\draw[->] (0,-0.2) -- (0,3.2) node[above] {$y$};
\draw[->,thick,blue] (0,0) -- (1,2) node[above] {$\mathbf{a}$};
\draw[->,thick,red] (0,0) -- (2,1) node[right] {$\mathbf{b}$};
\end{tikzpicture}
```
واژه یا معنا؟
**Lexical matching**
- تطبیق شکل واژهها؛ نمونه: `car repair` با `car service`
- شکست محتمل: `automobile maintenance` واژهٔ `car` را ندارد.
**Semantic retrieval**
- سؤال و `chunk` → embedding
- رتبهبندی بر اساس similarity
**مثال:** سؤال: `How do I service a car?`
| متن chunk | تطبیق واژهای | شباهت معنایی |
|---|---:|---:|
| `روش نگهداری خودرو` | کم | زیاد |
| `تاریخچهٔ قطار` | کم | کم |
| `سرویس خودرو در پنج مرحله` | زیاد | زیاد |
```mermaid
flowchart TD
Q["User query"] --> L["Lexical matching"]
Q --> E["Embedding query"]
C["Chunk texts"] --> E2["Embedding chunks"]
E --> S["Cosine similarity"]
E2 --> S
L --> R1["Exact-word results"]
S --> R2["Meaning-based ranking"]
```
- Builds on ← **Text Chunking Strategies:** similarity روی `chunk`ها محاسبه میشود، نه الزاماً کل سند.
- Where this leads → **Vector Stores and Retrieval:** `chunk`های برتر برای بازیابی انتخاب میشوند.
شباهت پاسخ نیست
- **Similarity ≠ relevance کامل ≠ پاسخ درست**
- شباهت زیاد فقط میگوید متن از نظر embedding نزدیک است.
**مثال کامل:**
- سؤال: `مهلت بازگشت کالا چقدر است؟`
- `Chunk A`: `بازگشت کالا تا ۳۰ روز ممکن است.`
- موضوع مرتبط → عدد مهلت موجود است → پاسخگو
- `Chunk B`: `فروشگاه دربارهٔ بازگشت کالا مقالهای منتشر کرد.`
- موضوع مرتبط → عدد یا شرط موجود نیست → پاسخگو نیست
```mermaid
flowchart LR
A["Retrieve by similarity"] --> B["Inspect content"]
B --> C{"Answers the question?"}
C -->|Yes| D["Use as context"]
C -->|No| E["Retrieve more or revise"]
```
- **نکته:** embedding کپی کامل سند نیست؛ جزئیات ممکن است کمرنگ شوند.
- برای Cosine similarity باید داشته باشیم:
\[
\|\mathbf{a}\|\neq 0,\qquad \|\mathbf{b}\|\neq 0
\]
- مثال مرزی:
\[
\mathbf{a}=(0,0)\Rightarrow \|\mathbf{a}\|=\sqrt{0^2+0^2}=0
\]
بنابراین مخرج صفر است و Cosine similarity تعریفنشده میشود.
انتخاب مدل embedding
**چهار قید اصلی**
| قید | پرسش تصمیمگیری |
|---|---|
| Language | مدل زبان query و سند را پشتیبانی میکند؟ |
| Dimension | storage و latency برای dimension مناسب است؟ |
| Cost | هزینهٔ embedding و حجم داده قابل قبول است؟ |
| Retrieval need | دقت، چندزبانی، طول متن و domain چه میخواهند؟ |
**سناریوی تصمیم:**
- داده: `chunk`های فارسی و انگلیسی، جستوجوی چندزبانی، storage محدود
- گزینهٔ A: تکزبانه، `dimension` زیاد، ارزان
- گزینهٔ B: چندزبانه، `dimension` متوسط، هزینهٔ بیشتر
**انتخاب:** گزینهٔ B؛ چون `Language` و نیاز چندزبانه شرط پایهاند. سپس با `test set`، دقت و هزینه را اندازه میگیریم.
```mermaid
flowchart TD
A["Language and domain"] --> B{"پشتیبانی کافی؟"}
B -->|No| X["رد مدل"]
B -->|Yes| C["بررسی dimension و storage"]
C --> D["بررسی cost و latency"]
D --> E["آزمون retrieval روی test set"]
E --> F["انتخاب بهترین trade-off"]
```
- در پیکربندی Semantic search، `embedding model`، `dimension` و `fields to index` باید سازگار باشند.
- Where this leads → **Long-Term Memory Stores:** embeddingها برای بازیابی facts پایدار در namespaceهای مختلف به کار میروند.
بازگشت به دوره