1. Tuproq tahlilini AI bilan bajarish
Maqsad – laboratoriya yo‘qligida ham foydali ma’lumot berish.
Quyidagichasiga tasavvur qilamiz:
- User: mobil ilova (fermer)
- Server: NestJS / Node backend
- AI: Gemini (text + image)
1️⃣ Umumiy arxitektura: kim nima qiladi?
Mobile App (User)
- Formalarni to‘ldiradi (dala ma’lumoti, kuzatuvlar, fotosuratlar)
- “Tahlil qilish” tugmasini bosadi
- AI natijasini oson tilda ko‘radi
Backend Server (NestJS)
- Requestni qabul qiladi, validatsiya qiladi
- Dala / hudud / oldingi ekinlar tarixini DB’dan oladi
- Hammasini bitta strukturali JSONga yig‘adi
- Gemini’ga so‘rov qiladi
- Olingan natijani tozalaydi, DBga yozadi
- Foydalanuvchiga soddalashtirilgan javob qaytaradi
Gemini (AI)
- So‘rovdagi barcha ma’lumotlarni (raqam, matn, rasm) agronom kabi tahlil qiladi
- Tuproq holati, muammolar, tavsiya etilgan ekinlar va o‘g‘itlarni strukturali JSON ko‘rinishida qaytaradi
2️⃣ Userdan keladigan ma’lumotlar (inputlar)
A) Majburiy maydonlar (minimal MVP)
field_id– qaysi dalaga tegishlilocation– koordinata yoki region: “Farg‘ona, Beshariq”area– maydon (gektar)last_crops[]– oxirgi 2–3 yillik ekinlar va taxminiy hosilirrigation_type– ariqqa, tomchilatib, yomg‘irlatibfarmer_observations– oddiy matn:- “Tuproq tez quriydi”, “Loy bo‘lib qoladi”
- “Oxirgi yilda hosil kamaydi” va hokazo
B) Ixtiyoriy maydonlar (aniqlik oshiradi)
lab_results(agar bo‘lsa):- pH, N, P, K, organik modda %
soil_physical_properties:- rangi, tuzilishi, qo‘l bilan bosganda hissiyot (bu keyin cho‘zamiz)
soil_photos[]– tuproq rasmlari (quruq / nam)
3️⃣ Server tomonda sodir bo‘ladigan step-lar
Fermer “Tahlil qilish” tugmasini bosdi → mobil backendga POST /soil/analyze yuboradi.
3.1. Requestni qabul qilish va tekshirish
POST /soil/analyze
body: {
fieldId: "123",
location: { lat: 40.3, lng: 71.7 },
area: 1.2,
lastCrops: [
{ year: 2023, crop: "g'alla", yield: "o'rtacha" },
{ year: 2022, crop: "paxta", yield: "yaxshi" }
],
irrigationType: "tomchilatib",
farmerObservations: "Tuproq tez quriydi, oxirgi yil hosil pasaygan",
labResults: null,
photos: [file1, file2]
}
Backend’da:
DTO / class-validator bilan validatsiya
fieldIdbo‘yicha DB’dan:Field(asosiy info)FieldSeasonvaFieldPlottarixini oladi
locationbo‘yicha:- hudud iqlim zonasi
- statistik o‘rtacha tuproq xaritasi (bo‘lsa)
👉 Natijada bizda AIga berishga tayyor bo‘lgan boy JSON kontekst bo‘ladi.
3.2. AI-ga yuboriladigan kontekstni yig‘ish
Server ichida alohida SoilAnalysisService bo‘ladi va u Gemini uchun toza input tayyorlaydi:
{
"field": {
"id": "123",
"region": "Farg'ona, Beshariq",
"area_ha": 1.2,
"lat": 40.3,
"lng": 71.7
},
"history": {
"last_3_seasons": [
{ "year": 2023, "crop": "g'alla", "yield": "o'rtacha" },
{ "year": 2022, "crop": "paxta", "yield": "yaxshi" }
]
},
"farmer_observations": "Tuproq tez quriydi, oxirgi yil hosil pasaygan",
"irrigation_type": "tomchilatib",
"lab_results": null,
"region_stats": {
"avg_ph": 6.8,
"soil_type": "o'rta qumloq",
"climate_zone": "kontinental"
}
}
Agar rasm yuklangan bo‘lsa – uni ham Gemini ga “image input” sifatida qo‘shamiz.
4️⃣ Gemini bilan integratsiya: prompt dizayni
Bu joy eng muhim: Gemini faqat “nima qilishini” juda aniq bilsa, foydali natija beradi.
Biz 2 qismdan foydalanamiz:
system– model roli, cheklovlar, formatuser– fermerga tegishli real data
4.1. System prompt (agrar kontekst)
Masalan:
Siz tajribali agronom va tuproq bo‘yicha mutaxassissiz. Sizga dala haqidagi strukturali ma’lumotlar beriladi (region, maydon, oldingi ekinlar, fermer kuzatuvlari, iqlim zonasi, lab natijalari bo‘lsa). Sizning vazifangiz:
- Tuproq holati bo‘yicha baho berish (pH, namlik rejimi, azot/fosfor/kaliy taxmini)
- Ehtimoliy muammolarni aniqlash (monokultura, o‘g‘it yetishmasligi, sho‘rlanish risklari)
- Fermerga oddiy tilda tushunarli izoh berish
- Faqat O‘zbekiston sharoitiga mos ekinlar va amaliy tavsiyalar berish
- Juda aniq laboratoriya qiymati yo‘q bo‘lsa, taxmin ekanini albatta ko‘rsating
Javobingizni faqat quyidagi JSON formatida qaytaring, boshqa matn yozmang.
So‘ng JSON schema beramiz:
{
"soil_profile": {
"estimated_type": "o'rta qumloq",
"ph_estimate": 6.8,
"ph_confidence": 0.6,
"nitrogen_status": "past / o'rtacha / yetarli",
"phosphorus_status": "unknown | past | o'rtacha | yetarli",
"potassium_status": "unknown | past | o'rtacha | yetarli",
"organic_matter_level": "past/o'rtacha/yuqori"
},
"issues": [
{
"code": "possible_nitrogen_depletion",
"severity": "low/medium/high",
"description_uz": "So'nggi yillarda g'alla ko'p ekilgani sababli azot kamaygan bo'lishi mumkin."
}
],
"recommended_actions": [
{
"type": "fertilizer",
"description_uz": "Kuzda 1 ga uchun X kg azotli o'g'it berish tavsiya etiladi.",
"priority": "high"
}
],
"recommended_crops": [
{
"name": "loviya",
"reason_uz": "Azot to'plashi va keyingi yil hosildorlikni oshirish uchun foydali.",
"suitability_score": 0.82
}
],
"summary_for_farmer_uz": "Yer tuprog'i taxminan o'rta qumloq bo'lib, ehtimol azot yetishmasligi kuzatilmoqda...",
"disclaimer_uz": "Bu tahlil taxminiy bo'lib, laboratoriya tahlilini o'rnini bosa olmaydi."
}
4.2. User content (haqiqiy data)
User prompt / contentga yuqorida tayyorlagan field JSONni beramiz:
Mana dala bo‘yicha ma’lumotlar (JSON):
{ ... }
Agar rasm bo‘lsa – u ham “image” input sifatida beriladi.
5️⃣ Backend → Gemini → Backend oqimi
Pseudo-pipeline:
const payloadForGemini = { ... yuqorida tayyorlangan JSON ... };
const response = await geminiClient.generate({
systemInstruction: systemPromptUz,
contents: [
{ role: "user", parts: [
{ text: "Mana dala haqida ma'lumotlar JSON ko'rinishida:" },
{ text: JSON.stringify(payloadForGemini) },
...(photos?.map(p => ({ inlineData: { mimeType: p.mime, data: p.base64 } })) ?? [])
]}
]
});
const rawText = response.outputText; // modeldan kelgan text
// bu text faqat JSON bo'lishi kerak
const soilResult = JSON.parse(rawText);
5.1. JSONni tekshirish va sanitizatsiya
- Maydonlar bormi? (
soil_profile,recommended_crops…) - Noto‘g‘ri qiymatlarni to‘g‘rilash (
ph_estimate< 3 bo‘lsa, limit 3) confidence0–1 oralig‘ida ekanini tekshirish
Agar xato bo‘lsa:
- fallback: “tahlil bajarib bo‘lmadi, keyinroq urinib ko‘ring”
6️⃣ Natijani DBga yozish va userga chiqarish
6.1. DB’da soil_reports jadvali
Masalan:
soil_reports
- id
- field_id
- created_at
- source: 'gemini_v1'
- soil_profile_json
- recommended_actions_json
- recommended_crops_json
- summary_for_farmer_uz
- confidence_overall
Bu keyinchalik:
- AI modelni qayta o‘qitish
- Farmer tarixini tahlil qilish
- “Oldingi tahlil bilan solishtirish” uchun kerak bo‘ladi.
6.2. Userga qaytadigan response (soddalashtirilgan)
Server frontendga tied UI-friendly response beradi:
{
"summary": "Yer tuprog'i taxminan o'rta qumloq, azot biroz past...",
"soilProfile": {
"type": "o'rta qumloq",
"ph": 6.8,
"nitrogen": "past",
"confidence": 0.65
},
"chips": ["Azot yetishmovchiligi ehtimoli bor", "Monokultura xavfi: o'rta"],
"actions": [
"Kuzda 1 ga uchun X kg azotli o'g'it berish",
"Keyingi mavsum loviya/loviya bilan rotatsiya"
],
"recommendedCrops": [
{ "name": "Loviya", "score": 0.82 },
{ "name": "No'xat", "score": 0.76 }
]
}
Frontend esa buni chiroyli kartalar, progress bar va badge’larda ko‘rsatadi.
7️⃣ Qo‘shimcha logika: AI ni “chegaralash”
Gemini ba’zida:
- Juda aniq raqam topishtirib yuborishi
- O‘zbekiston sharoitiga mos bo‘lmagan o‘g‘it/brend aytishi mumkin
Shu uchun:
System promptda cheklash:
- “Brend nomi aytmang”
- “Faqat umumiy tavsiyalar bering”
Post-processing:
- “Eritma 45 ml/l” kabi g‘alati raqamlarni range ichida clamp qilish
Disclaimer:
- Har doim “taxminiy tahlil” ekanini yozdirish
Rule-based validator:
- Agar “Juda agressiv” tavsiya bo‘lsa, yashirib qo‘yish yoki flaglash
8️⃣ Yakuniy “big picture” oqim
Fermer dalani tanlaydi yoki yarataDI
So‘rov formasida:
- qisqa savollarga javob beradi
- istasa tuproq fotosini yuklaydi
Backend:
- dalaning tarixini, region statsini, user kuzatuvini yig‘adi
- hammasini normalizatsiya qiladi
Gemini:
- data + rasm asosida tuproq holatini tahlil qiladi
- JSON formatda profil + tavsiya + ekin ro‘yxatini qaytaradi
Backend:
- JSONni tekshiradi, DBga yozadi
- Fermerga soddalashtirilgan, tushunarli ko‘rinishda javob beradi
Bu – tuproq tahlilini AI bilan ishlatishning to‘liq vertikal kesimi.
9️⃣ TEST haqiqiy TEST qilib ko‘rish
Quyida 2 qism bor:
- System Prompt – AI qanday rol o‘ynashi kerak
- User Payload (JSON) – fermer + serverdan kelgan real ma’lumot
✅ SYSTEM PROMPT (to‘liq — O‘zgartirma)
Siz tajribali agronom va tuproqshunos mutaxassissiz.
Sizga bir fermer dalasi haqida strukturali ma’lumotlar beriladi.
Sizning vazifangiz:
1) Tuproq holatini taxminiy aniqlash
2) Tuproq turini, pH darajasini va asosiy ozuqa elementlarini baholash
3) Ehtimoliy muammolarni aniqlash (azot kamayishi, monokultura, suv muammosi)
4) Fermer uchun amaliy tavsiyalar berish
5) O‘zbekiston iqlimi va qishloq xo‘jaligi sharoitiga mos ekinlarni tavsiya qilish
Muhim qoidalar:
- Agar laboratoriya ma’lumoti yo‘q bo‘lsa, buni ALOHIDA ko‘rsating
- Aniq raqamlar uydirmang, taxmin ekanini confidence bilan belgilang
- Dori yoki brend nomlari aytmang
- Javobni faqat JSON formatida qaytaring
- Javob o‘zbek tilida bo‘lsin
Hech qanday qo‘shimcha matn yozmang, faqat JSON qaytaring.
JSON struktura quyidagicha bo‘lishi SHART:
{
"soil_profile": { ... },
"issues": [ ... ],
"recommended_actions": [ ... ],
"recommended_crops": [ ... ],
"summary_for_farmer_uz": "...",
"disclaimer_uz": "..."
}
✅ USER PAYLOAD (REAL TEST DATA)
👉 buni aynan shunday yuborish kerak
{
"field": {
"id": "FIELD-101",
"region": "Farg'ona viloyati, Beshariq tumani",
"coordinates": {
"lat": 40.308,
"lng": 71.832
},
"area_ha": 1.5
},
"field_history": {
"last_3_years": [
{
"year": 2024,
"plots": [
{ "crop": "g'alla", "area_percent": 100, "yield": "o'rtacha" }
]
},
{
"year": 2023,
"plots": [
{ "crop": "g'alla", "area_percent": 60, "yield": "past" },
{ "crop": "piyoz", "area_percent": 40, "yield": "yaxshi" }
]
},
{
"year": 2022,
"plots": [{ "crop": "paxta", "area_percent": 100, "yield": "yaxshi" }]
}
]
},
"irrigation": {
"type": "tomchilatib",
"water_availability": "o'rtacha"
},
"farmer_observations": [
"Tuproq tez quriydi",
"Ba'zi joylarda o'simliklar sust o'smoqda",
"Oxirgi yilda g'alladan hosil kamaydi"
],
"regional_statistics": {
"avg_soil_type": "o'rta qumloq",
"avg_ph": 6.8,
"climate_zone": "kontinental, issiq yoz"
},
"lab_results": null
}
✅ KUTILAYOTGAN TO‘G‘RI OUTPUT (NAMUNA)
Agar Gemini to‘g‘ri ishlayotgan bo‘lsa, shunga YAQIN natija beradi:
{
"soil_profile": {
"estimated_type": "o'rta qumloq",
"ph_estimate": 6.7,
"ph_confidence": 0.6,
"nitrogen_status": "past",
"phosphorus_status": "o'rtacha",
"potassium_status": "o'rtacha",
"organic_matter_level": "o'rtacha"
},
"issues": [
{
"code": "possible_nitrogen_depletion",
"severity": "high",
"description_uz": "So'nggi yillarda ketma-ket g'alla ekilgani sabab tuproqdagi azot kamaygan bo'lishi mumkin."
},
{
"code": "uneven_growth",
"severity": "medium",
"description_uz": "Ba'zi hududlarda o'simlik sust o'sayotgani kuzatilmoqda, bu namlik yoki tuproq tuzilishi bilan bog'liq bo'lishi mumkin."
}
],
"recommended_actions": [
{
"type": "soil_improvement",
"description_uz": "Kuzgi mavsumda 1 gektarga azotli o'g'it berish yoki loviya/sobiq ekinlar bilan rotatsiya qilish tavsiya etiladi.",
"priority": "high"
},
{
"type": "irrigation",
"description_uz": "Tomchilatib sug'orish jadvalini qayta ko'rib chiqish va tuproq namligini saqlash tavsiya etiladi.",
"priority": "medium"
}
],
"recommended_crops": [
{
"name": "loviya",
"reason_uz": "Azot yig'uvchi ekin bo'lib, tuproq unumdorligini tiklashga yordam beradi.",
"suitability_score": 0.84
},
{
"name": "no'xat",
"reason_uz": "Qisqa vegetatsiya davriga ega va tuproqni tiklash uchun foydalidir.",
"suitability_score": 0.78
}
],
"summary_for_farmer_uz": "Sizning dalangiz tuprog'i taxminan o'rta qumloq bo'lib, azot yetishmasligi ehtimoli yuqori. Oxirgi yillardagi g'alla ekinlari tuproqni charchatgan bo'lishi mumkin.",
"disclaimer_uz": "Ushbu tahlil taxminiy bo‘lib, laboratoriya tuproq tahlilini to‘liq almashtirmaydi."
}
🔥 TEST NATIJA - (Islom - menga gemini shunaqa res qaytardi Demak shu yo'sinda tuproq tahlilini aniqlash mumkin )
{
"tahlil_natijasi": {
"laboratoriya_ma'lumoti": "Laboratoriya ma'lumotlari mavjud emas. Quyidagi baholashlar **faqat taxminiy** va berilgan tarixiy ma'lumotlar hamda kuzatuvlarga asoslangan.",
"tuproq_holati_taxmini": {
"tur_taxmini": "O'rta qumloq (regional statistikaga asoslangan)",
"ph_taxmini": "6.5 - 7.5 (regional statistikaga asoslangan holda, neytralga yaqin yoki biroz ishqoriy. Ammo tez qurish kuzatuvi biroz ishqoriylikni oshirishi mumkin).",
"asosiy_ozuqa_elementlari_bahosi": {
"azot_n": "Kamaygan bo'lishi ehtimoli yuqori. Sababi: g'allaning ketma-ket ekilishi (2023-2024 yillarda monokultura elementlari) azotni ko'p iste'mol qiladi va hosilning kamayishi shu bilan bog'liq bo'lishi mumkin.",
"fosfor_p": "O'rtacha darajada. O'zbekiston tuproqlari odatda fosfor bilan yaxshi ta'minlangan, ammo aniq tahlil kerak.",
"qaliy_k": "O'rtacha yoki yaxshi darajada. O'rta qumloq tuproqlar uchun odatiy hol."
},
"umumiy_baholash": "Tuproq organik moddalar (gumus)ga bo'lgan ehtiyoj yuqori bo'lishi mumkin, bu esa uning tez qurishiga va ozuqa elementlarini ushlab turish qobiliyatining pastligiga olib keladi."
},
"ehtimoliy_muammolar": [
{
"muammo": "Azot (N) tanqisligi",
"izoh": "G'alla monokulturasi (2024) va 2023 yilda katta qismga ekilishi azotni jiddiy ravishda kamaytirgan bo'lishi mumkin. Hosilning kamayishi bevosita dalil."
},
{
"muammo": "Monokultura (Ekin rotatsiyasi buzilishi)",
"izoh": "2022 yilda paxta, so'ngra 2023-2024 yillarda deyarli faqat g'alla (don) ekilishi. Bu tuproqni bir xil ozuqa elementlaridan ayirib, zararkunanda va kasalliklarning to'planishiga sabab bo'ladi."
},
{
"muammo": "Tuproqning suv ushlash qobiliyatining pastligi / Organik moddalar yetishmasligi",
"izoh": "Fermerning 'Tuproq tez quriydi' kuzatuvi qumloq tuproqlar va organik moddalarning yetishmasligi bilan bog'liq. Tomchilatib sug'orish usuli sharoitida ham tez qurish kuzatilishi organik tarkib pastligini anglatadi."
}
]
},
"amaliy_tavsiyalar": {
"tuproq_namunasi_shart": "**Zaruriy birinchi qadam:** Zudlik bilan tuproqning to'liq agrokimyoviy tahlilini (pH, gumus, NPK, mikroelementlar, tuz miqdori) o'tkazish.",
"ekin_rotatsiyasi": [
"Keyingi mavsumda g'alla ekishdan to'xtatish.",
"O'rniga dukkakli ekin (no'xat, mosh, yeryong'oq, lyutserna) ekishni boshlash (tuproqni azot bilan boyitish uchun).",
"Kuzgi g'alla (agar ekilgan bo'lsa) o'rniga yashil go'ng (siderat) ekinlarini, masalan, xantal yoki vika-suli aralashmasini ekib, ularni gullash davrida tuproqqa haydash orqali organik modda qo'shish."
],
"ozuqa_boshqaruvi": [
"Organik o'g'itlar (go'ng, kompost) yoki yashil go'ng (sideratlar)ni muntazam ravishda tuproqqa qo'shish.",
"Azot tanqisligi yuqori ehtimol bo'lganligi sababli, navbatdagi ekinda ekin talabiga muvofiq muvozanatli mineral o'g'it (ayniqsa, azot) berish.",
"Agar tahlil tuzlanishni ko'rsatsa, sho'r yuvish va sho'rga chidamli ekinlarni tanlash."
],
"suv_va_tuproq_tuzilishi": [
"Tuproqni chuqur yumshatish (chizel) orqali uning havo o'tkazuvchanligini yaxshilash va ildizlarning rivojlanishiga sharoit yaratish.",
"Yuzani mulchalash (somon, ekin qoldiqlari) orqali tuproqning namligini saqlab qolish va tez qurishning oldini olish."
]
},
"ozbekiston_sharoitiga_mos_ekinlar": [
{
"ekin": "Lyutserna (beda)",
"asoslash": "Azotni tuproqqa to'playdi, tuproq tuzilishini yaxshilaydi, chorva uchun yuqori daromadli ozuqa. **Ekin rotatsiyasi uchun a'lo tanlov.**"
},
{
"ekin": "Mosh / No'xat",
"asoslash": "Qisqa muddatli dukkakli ekinlar, tuproqni azot bilan boyitadi va yaxshi daromad keltiradi. G'alladan keyin yaxshi o'tmishdosh bo'ladi."
},
{
"ekin": "Sabzavotlar (Pomidor, Bodring, Qalampir)",
"asoslash": "Tomchilatib sug'orish mavjudligi sababli, yuqori daromadli eksportbop sabzavotlar. Lekin ular yuqori NPK talab qiladi.",
"izoh": "Bu ekinlar uchun organik moddalar va azot yetarli darajada berilishi shart."
},
{
"ekin": "Kuzgi kartoshka (yoki erta bahorda)",
"asoslash": "Yaxshi foyda manbai, lekin tuproqni juda 'charchatadi', shuning uchun keyingi yili yana dukkaklilar ekilishi tavsiya etiladi."
}
]
}

