# Prompt 4: Context engineering, tool'lar, RAG, eval va xavfsizlik

> **Holat:** 2026-yil sentabr. [1-darsda](/ios-lessons/prompt-basics) bitta promptni yaxshi yozishni o'rgandik. Bu dars — tizim darajasi: modelga qaysi ma'lumotni qachon berish, unga qanday tool berish, natijani qanday o'lchash va hujumlardan qanday himoyalanish.

## Mundarija

1. [Context engineering nima?](#context-engineering)
2. [Tool dizayni — agent sifatining asosiy omili](#tools)
3. [Ko'p tool bo'lganda: tool search va strict](#tool-scaling)
4. [Uzoq vazifalar: compaction, eslatmalar, sub-agentlar](#uzoq-vazifalar)
5. [RAG: modelga o'z ma'lumotingizni berish](#rag)
6. [Eval — "yaxshilandi"ni raqam bilan isbotlash](#eval)
7. [Prompt injection — hal qilinmagan xavf](#injection)
8. [Narx va tezlik: caching, batch, effort](#narx)
9. [Xulosa](#xulosa)
10. [Manbalar](#manbalar)

---

## 1. Context engineering nima? {#context-engineering}

Anthropic 2025-yil 29-sentabrda _"Effective context engineering for AI agents"_ maqolasini chiqardi. Asosiy fikr:

> Model har bir qadamda ko'radigan **token'lar to'plamini** boshqarish — shu **context engineering**. Maqsad: kerakli natijani beradigan **eng kichik, eng yuqori signalli** token'lar to'plami.

Nega "ko'proq kontekst — yaxshiroq" emas? Context kattalashgani sari model undagi aniq ma'lumotni topib ishlatishda qiynala boshlaydi. Buni **context rot** deyishadi. Kontekst — cheklangan "diqqat byudjeti".

Amaliy qoidalar:

- **System prompt "to'g'ri balandlikda" bo'lsin.** Juda qattiq if-else mantiq mo'rt bo'ladi, juda umumiy gaplar esa hech narsa bermaydi. Bo'limlarga (`<background>`, `<instructions>`, `## Tool guidance`) ajratib, aniq va qisqa yozing.
- **Hammasini oldindan yuklamang.** Agent fayl yo'li yoki so'rov kabi yengil identifikatorlarni saqlaydi, tafsilotni esa kerak bo'lganda tool orqali o'qiydi (_just-in-time context_). Claude Code katta loyihada shunday ishlaydi: butun kodni kontekstga solmaydi, `grep`/`head` bilan kerakli joyni topadi.

---

## 2. Tool dizayni — agent sifatining asosiy omili {#tools}

Agent (masalan, kod yozadigan yordamchi) dunyoni **tool'lar** orqali ko'radi. Anthropic tajribasi: Claude 3.5 Sonnet **model o'zgarmagan holda**, faqat prompt va 2 ta umumiy tool (bash va fayl tahriri) tavsiflarini yaxshilash orqali SWE-bench Verified'da **49%** natija ko'rsatdi — o'sha paytdagi eng yaxshi natija 45% edi. Manba: [SWE-bench Sonnet](https://www.anthropic.com/research/swe-bench-sonnet).

**Yaxshi tool qoidalari** ([Writing tools for agents](https://www.anthropic.com/engineering/writing-tools-for-agents)):

| Qoida                                                              | Yomon                           | Yaxshi                                                                   |
| ------------------------------------------------------------------ | ------------------------------- | ------------------------------------------------------------------------ |
| Tavsif — nima qiladi, qachon ishlatiladi, qachon **ishlatilmaydi** | `"Builds the app."`             | `"Runs xcodebuild for a scheme... Does NOT run tests — use xcode_test."` |
| Nom fazosi (namespace)                                             | `search`                        | `lessons_search`, `github_search_prs`                                    |
| Birlashtirish                                                      | `list_slots` + `create_booking` | bitta `schedule_lesson`                                                  |
| Ma'noli javob                                                      | `{"id": "a3f9-…"}`              | `{"title": "Concurrency", "slug": "concurrency"}`                        |
| Harakatga undovchi xato                                            | `Error 400`                     | `"date noto'g'ri formatda, kutilgan: YYYY-MM-DD"`                        |

Claude API'da tool ta'rifi — oddiy JSON. `strict: true` bo'lsa, model yuboradigan argumentlar schema'ga **aniq mos kelishi kafolatlanadi** (buning uchun `additionalProperties: false` va `required` shart):

```json
{
  "name": "lessons_search",
  "description": "Searches the iOS lessons catalog by topic and returns up to 5 matching lessons with their slug and one-line summary. Use it when the user asks where a topic is explained. Does NOT return lesson content; call lessons_read with a slug for that.",
  "strict": true,
  "input_schema": {
    "type": "object",
    "properties": {
      "query": {
        "type": "string",
        "description": "Topic in English or Uzbek, e.g. 'retain cycle' or 'xotira'"
      },
      "level": {
        "type": "string",
        "enum": ["junior", "middle", "senior", "any"],
        "description": "Target level; use 'any' if the user did not say"
      }
    },
    "required": ["query", "level"],
    "additionalProperties": false
  }
}
```

> **2026 o'zgarishi:** eng yangi Claude modellarida (Claude Fable 5.1, Mythos 5.1, Opus 5.5) toolni **majburan** tanlash (`tool_choice: {"type": "any"}` yoki `{"type": "tool", ...}`) **400** xato qaytaradi. O'rniga `{"type": "auto"}` ishlating va promptda qaysi toolni kutayotganingizni yozing. `strict: true` argumentlar to'g'riligini baribir kafolatlaydi.

---

## 3. Ko'p tool bo'lganda: tool search {#tool-scaling}

iOS ishida bir nechta MCP server ulash oson: masalan, XcodeBuildMCP, Xcode'ning o'z MCP ko'prigi (`xcrun mcpbridge`), GitHub. Shunda tool'lar soni o'nlab, hatto yuzlab bo'lib ketadi. Har birining tavsifi har so'rovda kontekstni egallaydi va model tanlashda adashadi.

Yechim — **tool search**. Tool'larning ko'pini `defer_loading: true` bilan belgilaysiz, model esa kerak bo'lganda maxsus qidiruv tool'i orqali ularni topadi (`tool_search_tool_regex_20251119` yoki `tool_search_tool_bm25_20251119`). Qoida: hammasini _deferred_ qilib bo'lmaydi — kamida bitta tool doim yuklangan bo'lishi shart. Aks holda API 400 qaytaradi.

---

## 4. Uzoq vazifalar: compaction, eslatmalar, sub-agentlar {#uzoq-vazifalar}

Agent soatlab ishlasa, kontekst to'ladi. Anthropic uchta usulni tavsiya qiladi:

1. **Compaction** — kontekst chegaraga yaqinlashganda, oldingi suhbat muhim qarorlarni saqlagan holda qisqa xulosaga aylantiriladi. Claude API'da bu server tomonida beta funksiya sifatida mavjud.
2. **Strukturali eslatmalar** — agent muhim narsalarni kontekstdan tashqarida faylga yozib boradi (masalan, `NOTES.md` yoki API'dagi memory tool) va keyin qayta o'qiydi.
3. **Sub-agentlar** — har bir kichik vazifani alohida agent to'liq kontekst bilan bajaradi. Asosiy agentga esa faqat qisqa xulosa (bir necha ming token) qaytadi.

Bu kursning o'zi ham shunday tayyorlangan: izlanishni bir nechta agent parallel qildi, har biri faqat xulosa qaytardi, faktlarni esa alohida "skeptik" agentlar tekshirdi.

---

## 5. RAG: modelga o'z ma'lumotingizni berish {#rag}

**RAG** (Retrieval-Augmented Generation) — savolga javob berishdan oldin tegishli hujjat bo'laklarini (**chunk**) qidirib topib, modelga berish:

```text
Hujjatlar → bo'laklarga bo'lish → har birini embedding + indeks
Savol → eng mos bo'laklarni topish → [bo'laklar + savol] → model → javob (manba bilan)
```

**Contextual Retrieval** (Anthropic) — har bir bo'lakka embedding'dan oldin qisqa kontekst qo'shiladi ("bu bo'lak X hujjatining Y bo'limidan"). Qidiruv xatolari (top-20 bo'lakda kerakli ma'lumot yo'qligi) quyidagicha kamaygan:

| Usul                    | Xato darajasi | Kamayish |
| ----------------------- | ------------- | -------- |
| Oddiy embedding         | 5.7%          | —        |
| + contextual embeddings | 3.7%          | 35%      |
| + contextual BM25       | 2.9%          | 49%      |
| + reranking             | 1.9%          | 67%      |

Manba: [Anthropic — Contextual Retrieval](https://www.anthropic.com/engineering/contextual-retrieval).

**Bo'laklash (chunking) haqida kutilmagan natija:** 2026-yil fevralidagi benchmark'da (FloTorch) oddiy **recursive ~512 token** bo'laklash **69%** aniqlik bergan, "aqlliroq" semantic chunking esa **54%**. Sababi: semantic chunk'lar juda kichik bo'lib qoladi va modelga yetarli kontekst bermaydi. NAACL 2025 tadqiqoti ham shunga o'xshash xulosaga kelgan. Amaliy xulosa: oddiy usuldan boshlang va **o'z ma'lumotlaringizda** o'lchang ([benchmark sharhi](https://www.premai.io/blog/rag-chunking-strategies-the-2026-benchmark-guide/)).

**Grounding:** modeldan javobni faqat berilgan bo'laklarga tayanib yozishni va manbani ko'rsatishni so'rang. Claude'da hujjat bloklariga `citations: {"enabled": true}` qo'shsangiz, javob qaysi joydan olinganini API o'zi qaytaradi.

---

## 6. Eval — "yaxshilandi"ni raqam bilan isbotlash {#eval}

Promptni o'zgartirdingiz va "yaxshiroq ishlayapti" deb his qildingiz. His — isbot emas. **Eval** — oldindan tayyorlangan savol-javoblar to'plamida natijani o'lchash.

1. **Muvaffaqiyat mezonini aniq yozing.** "Yaxshi tasniflasin" emas, "200 ta haqiqiy TestFlight feedback'ida severity aniqligi ≥ 90%, critical'larning birortasi ham low deb belgilanmasin".
2. **Golden dataset** — real ma'lumotdan olingan, to'g'ri javobi ma'lum misollar.
3. **Baholash usuli** — eng soddasidan: aniq moslik (klassifikatsiya) → o'xshashlik → LLM-judge (ohang va sifat kabi subyektiv narsalar uchun).
4. **Har o'zgarishda qayta ishga tushiring** — regression.

Minimal eval skripti (`classify` funksiyasini model chaqiruvi bilan almashtirasiz):

```python
from collections import Counter

# Golden dataset: (feedback, to'g'ri severity)
golden = [
    ("App crashes every time I open a lesson", "critical"),
    ("Dark mode text is slightly low contrast", "low"),
    ("Payment screen freezes for 5 seconds", "high"),
    ("Typo on the settings screen", "low"),
    ("Cannot log in after the update", "critical"),
    ("App closes immediately on launch", "critical"),
]

def classify(text: str) -> str:
    """Vaqtincha qoidaga asoslangan 'model'. Haqiqiy loyihada bu yerda LLM chaqiriladi."""
    lowered = text.lower()
    if "crash" in lowered or "cannot log in" in lowered:
        return "critical"
    if "freeze" in lowered:
        return "high"
    return "low"

results = [(expected, classify(text)) for text, expected in golden]
correct = sum(expected == got for expected, got in results)
print(f"Aniqlik: {correct}/{len(golden)} = {correct / len(golden):.0%}")

# Eng qimmat xato: critical'ni past baholash
missed_critical = [r for r in results if r[0] == "critical" and r[1] != "critical"]
print(f"O'tkazib yuborilgan critical: {len(missed_critical)}")
print("Xatolar:", Counter(f"{e}->{g}" for e, g in results if e != g))
```

Natija: aniqlik **5/6 = 83%**, lekin eng muhimi — **1 ta critical o'tkazib yuborilgan**. "App closes immediately on launch" aslida crash, ammo matnda "crash" so'zi yo'q, shuning uchun qoida uni `low` deb belgiladi. Umumiy aniqlik yaxshi ko'rinsa ham, eval aynan shu "eng qimmat" xatoni ko'rsatib beradi. Shuning uchun faqat umumiy foizga emas, xato turlariga ham qarang.

**LLM-judge ehtiyotkorligi:** model-baholovchi javob tartibiga (position bias), uzunligiga (verbosity bias) va o'z oilasidagi modellarning javoblariga moyil bo'lishi hujjatlashtirilgan. Javoblarni ikki xil tartibda baholating va judge natijasini bir qism misollarda inson bahosi bilan solishtiring.

---

## 7. Prompt injection — hal qilinmagan xavf {#injection}

**Prompt injection** — model o'qiydigan matn ichiga yashiringan "buyruq". To'g'ridan-to'g'ri (foydalanuvchi o'zi yozadi) va bilvosita (email, veb-sahifa, PDF, tool javobi ichida) turlari bor. OWASP bu xavfni **LLM01:2025** — LLM ilovalar uchun birinchi raqamli xavf — deb belgilagan ([OWASP LLM Top 10](https://genai.owasp.org/llm-top-10/)).

Real misol: **EchoLeak** (CVE-2025-32711, CVSS **9.3**, 2025-yil iyun). Microsoft 365 Copilot'da foydalanuvchi hech narsa bosmasa ham (_zero-click_) ishlaydigan injection orqali ma'lumot sizdirish mumkin edi ([arXiv:2509.10540](https://arxiv.org/abs/2509.10540)).

Yagona "filtr" bilan himoyalanib bo'lmaydi — faqat **qatlamli himoya** ishlaydi:

1. **Eng kam huquq.** Agentga faqat kerakli tool'larni bering. Chaqira olmaydigan tool'ni hech qanday injection chaqira olmaydi.
2. **Ishonchsiz matnni ajrating.** Foydalanuvchi fayli, veb-sahifa, App Store sharhi — bular _ma'lumot_, ko'rsatma emas. Ularni alohida teglar ichida bering va system prompt'da shunday deb yozing.
3. **Xavfli harakatlar uchun inson tasdig'i.** To'lov, o'chirish, tashqariga yuborish kabi harakatlar tasdiqsiz bajarilmasin.
4. **Chiqishni tekshiring.** Model javobidagi URL, buyruq yoki JSON'ni ishlatishdan oldin validatsiya qiling.
5. **Secret'lar promptga kirmasin.** API kalit, token, parol — hech qachon.

---

## 8. Narx va tezlik: caching, batch, effort {#narx}

### Prompt caching (Claude)

Har so'rovda o'zgarmaydigan katta qism (system prompt, tool'lar, hujjat) bo'lsa, uni **cache** qiling. `cache_control` barqaror qismning oxirgi blokiga qo'yiladi:

```bash
curl https://api.anthropic.com/v1/messages \
  -H "Content-Type: application/json" \
  -H "x-api-key: $ANTHROPIC_API_KEY" \
  -H "anthropic-version: 2023-06-01" \
  --data-binary @- <<'JSON'
{
  "model": "claude-opus-5",
  "max_tokens": 2048,
  "system": [
    {
      "type": "text",
      "text": "<kurs katalogi va qoidalar — bir necha ming token, har so'rovda bir xil>",
      "cache_control": {"type": "ephemeral"}
    }
  ],
  "messages": [
    {"role": "user", "content": "Retain cycle qaysi darsda tushuntirilgan?"}
  ]
}
JSON
```

Narx koeffitsientlari (oddiy input narxiga nisbatan):

| Amal                                           | Koeffitsient                                   |
| ---------------------------------------------- | ---------------------------------------------- |
| Cache'ga yozish, 5 daqiqalik TTL (standart)    | 1.25×                                          |
| Cache'ga yozish, 1 soatlik TTL (`"ttl": "1h"`) | 2×                                             |
| Cache'dan o'qish                               | ~0.1× (ba'zi yangi modellarda undan ham arzon) |

Cache ishlaganini javobdagi `usage.cache_read_input_tokens` orqali tekshiring. Doim `0` bo'lsa, prefiks har safar o'zgaryapti. Tipik sabab — system prompt ichidagi vaqt belgisi. Minimal cache qilinadigan uzunlik modelga bog'liq: taxminan 512 dan 4096 token'gacha. Qisqa prefiks xato bermaydi, shunchaki cache bo'lmaydi.

Qachon foydali? Hisoblaymiz:

```python
write_5m, write_1h, read = 1.25, 2.0, 0.1

for n in range(1, 5):
    no_cache = n * 1.0
    cache_5m = write_5m + (n - 1) * read
    cache_1h = write_1h + (n - 1) * read
    print(f"{n} so'rov: cache'siz {no_cache:.2f}x | 5 daq {cache_5m:.2f}x | 1 soat {cache_1h:.2f}x")
```

Natija: 5 daqiqalik cache **2-so'rovdanoq** foyda beradi (1.35× va 2.00×). 1 soatlik cache esa **3-so'rovdan** (2.20× va 3.00×).

### Boshqa vositalar

- **Batch API** — 24 soat ichida bajariladigan asinxron so'rovlar ~**50%** arzonroq. Tungi tahlil, katta hajmdagi tasniflash uchun qulay.
- **Effort va model tanlash** — oddiy vazifalar uchun past `effort` yoki kichikroq model. Narxni **bajarilgan vazifa** bo'yicha hisoblang, bitta so'rov bo'yicha emas: arzon so'rov qayta urinish talab qilsa, aslida qimmatga tushadi.

---

## 9. Xulosa {#xulosa}

- Context engineering: eng kichik, eng yuqori signalli kontekst. Hammasini oldindan yuklamang.
- Tool tavsifi — agent sifatining asosiy omili: nima, qachon, qachon emas, aniq xato matnlari.
- RAG'da oddiy chunking'dan boshlang, Contextual Retrieval va reranking bilan yaxshilang, manbani ko'rsating.
- Eval'siz "yaxshilandi" degan gap — taxmin. Golden dataset + regression.
- Prompt injection hal qilinmagan: eng kam huquq, ishonchsiz matnni ajratish, inson tasdig'i.
- Caching, batch va to'g'ri effort/model — narxni bir necha barobar kamaytiradi.

---

## Manbalar {#manbalar}

1. [Anthropic — Effective context engineering for AI agents (2025-09-29)](https://www.anthropic.com/engineering/effective-context-engineering-for-ai-agents)
2. [Anthropic — Writing effective tools for AI agents](https://www.anthropic.com/engineering/writing-tools-for-agents)
3. [Anthropic — SWE-bench Verified with Claude 3.5 Sonnet](https://www.anthropic.com/research/swe-bench-sonnet)
4. [Anthropic — Define tools (strict, tool_choice)](https://platform.claude.com/docs/en/agents-and-tools/tool-use/define-tools)
5. [Anthropic — Contextual Retrieval](https://www.anthropic.com/engineering/contextual-retrieval)
6. [RAG chunking 2026 benchmark](https://www.premai.io/blog/rag-chunking-strategies-the-2026-benchmark-guide/)
7. [OWASP GenAI — LLM Top 10](https://genai.owasp.org/llm-top-10/)
8. [EchoLeak — arXiv:2509.10540](https://arxiv.org/abs/2509.10540)
9. [Anthropic — Prompt caching](https://platform.claude.com/docs/en/build-with-claude/prompt-caching)
10. [Anthropic — Develop tests / success criteria](https://platform.claude.com/docs/en/test-and-evaluate/develop-tests)
