Prompt 4: Context engineering, tool'lar, RAG, eval va xavfsizlik
🤖 Prompt & AI Engineering
Prompt 4: Context engineering, tool'lar, RAG, eval va xavfsizlik
Holat: 2026-yil sentabr. 1-darsda 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
- Context engineering nima?
- Tool dizayni — agent sifatining asosiy omili
- Ko'p tool bo'lganda: tool search va strict
- Uzoq vazifalar: compaction, eslatmalar, sub-agentlar
- RAG: modelga o'z ma'lumotingizni berish
- Eval — "yaxshilandi"ni raqam bilan isbotlash
- Prompt injection — hal qilinmagan xavf
- Narx va tezlik: caching, batch, effort
- Xulosa
- 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/headbilan 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.
Yaxshi tool qoidalari (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):
{
"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: trueargumentlar 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:
- Compaction — kontekst chegaraga yaqinlashganda, oldingi suhbat muhim qarorlarni saqlagan holda qisqa xulosaga aylantiriladi. Claude API'da bu server tomonida beta funksiya sifatida mavjud.
- Strukturali eslatmalar — agent muhim narsalarni kontekstdan tashqarida faylga yozib boradi (masalan,
NOTES.mdyoki API'dagi memory tool) va keyin qayta o'qiydi. - 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:
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.
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).
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.
- Muvaffaqiyat mezonini aniq yozing. "Yaxshi tasniflasin" emas, "200 ta haqiqiy TestFlight feedback'ida severity aniqligi ≥ 90%, critical'larning birortasi ham low deb belgilanmasin".
- Golden dataset — real ma'lumotdan olingan, to'g'ri javobi ma'lum misollar.
- Baholash usuli — eng soddasidan: aniq moslik (klassifikatsiya) → o'xshashlik → LLM-judge (ohang va sifat kabi subyektiv narsalar uchun).
- Har o'zgarishda qayta ishga tushiring — regression.
Minimal eval skripti (classify funksiyasini model chaqiruvi bilan almashtirasiz):
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).
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).
Yagona "filtr" bilan himoyalanib bo'lmaydi — faqat qatlamli himoya ishlaydi:
- Eng kam huquq. Agentga faqat kerakli tool'larni bering. Chaqira olmaydigan tool'ni hech qanday injection chaqira olmaydi.
- 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.
- Xavfli harakatlar uchun inson tasdig'i. To'lov, o'chirish, tashqariga yuborish kabi harakatlar tasdiqsiz bajarilmasin.
- Chiqishni tekshiring. Model javobidagi URL, buyruq yoki JSON'ni ishlatishdan oldin validatsiya qiling.
- 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:
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:
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
effortyoki 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}
- Anthropic — Effective context engineering for AI agents (2025-09-29)
- Anthropic — Writing effective tools for AI agents
- Anthropic — SWE-bench Verified with Claude 3.5 Sonnet
- Anthropic — Define tools (strict, tool_choice)
- Anthropic — Contextual Retrieval
- RAG chunking 2026 benchmark
- OWASP GenAI — LLM Top 10
- EchoLeak — arXiv:2509.10540
- Anthropic — Prompt caching
- Anthropic — Develop tests / success criteria