24 KiB
راهنمای کامل PCSE در این پروژه
این سند توضیح میدهد PCSE در این پروژه دقیقا چه نقشی دارد، چگونه دادهها را مصرف میکند، خروجی آن چگونه ساخته میشود، و این خروجی چه اثری روی توصیههای آبیاری و کودهی دارد. تمرکز اصلی این راهنما روی اتصال بین این فایلها است:
crop_simulation/services.pycrop_simulation/recommendation_optimizer.pycrop_simulation/apps.pyirrigation/apps.pyfertilization/apps.pyrag/services/irrigation.pyrag/services/fertilization.py
1) PCSE چیست؟
PCSE مخفف Python Crop Simulation Environment است. این کتابخانه یک چارچوب شبیهسازی زراعی است که میتواند با مدلهایی مثل WOFOST رشد گیاه، توسعه فنولوژیک، تولید زیستتوده، عملکرد، و پاسخ به آب و نیتروژن را شبیهسازی کند.
در این پروژه، PCSE نقش اینها را بر عهده دارد:
- تبدیل دادههای مزرعه، هوا، خاک و برنامه مدیریت به یک اجرای شبیهسازی
- برآورد خروجیهای کلیدی مثل:
yield_estimatebiomassmax_lai
- مقایسه سناریوهای مختلف آبیاری و کودهی
- تولید یک مبنای عددی برای recommendation engine
به زبان ساده:
RAGمتن توصیه را خوشبیان و کاربرپسند میکندPCSEمنطق عددی و شبیهسازی سناریویی را تامین میکند
2) معماری کلی PCSE در این پروژه
جریان اصلی به این صورت است:
- داده مزرعه از دیتابیس خوانده میشود
- داده هوا از forecastها به فرمت قابل فهم برای PCSE تبدیل میشود
- داده خاک و وضعیت سایت ساخته میشود
- پروفایل گیاه و
agromanagementآماده میشود - اگر recommendation آبیاری یا کودهی وجود داشته باشد، به
TimedEventsتزریق میشود - مدل PCSE اجرا میشود
- خروجیهای روزانه، خلاصه و نهایی جمع میشوند
- از روی آنها شاخص عملکرد و recommendation سناریویی ساخته میشود
- RAG از این خروجی بهعنوان
context_textاستفاده میکند تا متن نهایی توصیه را بسازد
3) نقطه ورود اصلی PCSE
crop_simulation/apps.py
در crop_simulation/apps.py یک optimizer سراسری lazy-loaded تعریف شده:
recommendation_optimizerget_recommendation_optimizer()
این optimizer از کلاس SimulationRecommendationOptimizer در crop_simulation/recommendation_optimizer.py ساخته میشود.
بنابراین:
rag/services/irrigation.pyازapps.get_app_config("crop_simulation").get_recommendation_optimizer()استفاده میکندrag/services/fertilization.pyهم همین کار را انجام میدهد
یعنی هر دو سرویس recommendation در نهایت به موتور شبیهسازی crop_simulation وصل هستند.
4) نقش irrigation/apps.py
فایل irrigation/apps.py فقط یک AppConfig ساده نیست؛ در عمل تنظیمات پایه optimizer آبیاری را نگه میدارد.
پارامترهای مهم
simulation_model
مدل پیشفرض:
"Wofost81_NWLP_CWB_CNB"
این یعنی recommendationهای آبیاری قرار است روی مدلی ساخته شوند که هم water-limited و هم nutrient-aware است.
validity_days
3
توصیه آبیاری کوتاهمدت است و بیشتر به forecastهای نزدیک متکی است.
minimum_event_mm
4.0
هر نوبت آبیاری نباید از این کمتر شود، چون در عمل آبیاریهای خیلی کوچک یا بیاثرند یا اجرای میدانی ضعیفی دارند.
significant_rain_threshold_mm
4.0
اگر بارش موثر به این آستانه برسد، recommendation میتواند محافظهکارتر شود یا پنجره اعتبار کوتاهتر شود.
stage_targets
برای هر مرحله رشد یک هدف رطوبت خاک تعریف شده:
initial: 65%vegetative: 70%flowering: 75%fruiting: 68%
اینها مستقیما بر moisture_target_percent در توصیه نهایی اثر میگذارند.
strategy_profiles
سه استراتژی اصلی برای آبیاری تعریف شده:
conservativebalancedprotective
هر استراتژی این مولفهها را دارد:
multiplierfrequency_factorevent_count
اینها تعیین میکنند:
- جمع کل آب بیشتر یا کمتر شود
- تعداد نوبتها بیشتر یا کمتر شود
- توزیع آب در طول بازه forecast چگونه باشد
5) نقش fertilization/apps.py
این فایل هم مثل نسخه آبیاری، تنظیمات پایه recommendation optimizer کودهی را نگه میدارد.
پارامترهای مهم
simulation_model
باز هم مدل:
"Wofost81_NWLP_CWB_CNB"
یعنی recommendation کودهی بر مبنای مدلی ساخته میشود که نیتروژن را در سطح شبیهسازی لحاظ میکند.
validity_days
7
پنجره اعتبار کودهی بلندتر از آبیاری است، چون تصمیم تغذیهای معمولاً کندتر و با اثر تجمعیتر است.
rain_delay_threshold_mm
3.0
اگر بارش موثر نزدیک باشد، برخی روشهای مصرف یا زمان مصرف میتوانند نامناسب شوند.
stage_targets
برای هر مرحله رشد، هدف تغذیهای جداگانه تعریف شده است:
npkformulaapplication_methodtiming
مثلا در مرحله flowering:
- نیاز پتاس بالاتر میشود
- فرمول
15-10-30پیشنهاد میشود - روش مصرف و timing هم متناسب با حساسیت گیاه تعیین میشود
strategy_profiles
سه استراتژی اصلی:
maintenancebalancedcorrective
هر کدام ضریب مصرف و تمرکز متفاوت دارند. این استراتژیها پایه سناریوسازی برای شبیهسازی یا heuristic هستند.
6) PCSE در crop_simulation/services.py چگونه کار میکند؟
6.1 نرمالسازی ورودیها
قبل از اجرای مدل، ورودیها یکنواخت میشوند:
_normalize_weather_records()_normalize_agromanagement()_normalize_site_parameters_for_model()
6.2 ساخت payload مزرعه
تابع build_simulation_payload_from_farm() اطلاعات زیر را میسازد:
- weather
- soil
- site_parameters
- crop_parameters
- agromanagement
منابع آن:
SensorDataWeatherForecast- پروفایل گیاه
- داده لایه خاک
6.3 ساخت داده خاک و سایت
در این مرحله مقادیر مهمی مثل اینها ساخته میشوند:
SMFCFSMWRDMSOLWAVNAVAILIP_STATUSK_STATUSSOIL_PHEC
تعبیر عملی این مقادیر:
WAV: آب در دسترس اولیهNAVAILI: نیتروژن اولیه در دسترسP_STATUSوK_STATUS: شاخصهای وضعیت فسفر و پتاسیمSOIL_PHوEC: شرایط شیمیایی که روی کارایی تغذیه و رشد اثر دارند
6.4 لود کردن bindingهای PCSE
تابع _load_pcse_bindings() این اجزا را از package pcse میگیرد:
ParameterProviderWeatherDataProviderWeatherDataContainerpcse.models
اگر package نصب نباشد، اجرای سناریوی واقعی PCSE ممکن نیست.
6.5 اجرای مدل
کلاس PcseSimulationManager قلب اجرای شبیهسازی است.
متد run_simulation() این کارها را انجام میدهد:
- ساخت
PreparedSimulationInput - normalize کردن weather / soil / crop / site / agromanagement
- اجرای
_run_with_pcse() - در مدلهای
Wofost81_NWLPاعمال adjustment برایPوK
6.6 خروجیهای اصلی مدل
بعد از اجرا، این سه نوع خروجی جمع میشوند:
daily_outputsummary_outputterminal_output
و در نهایت metrics اصلی ساخته میشود:
yield_estimatebiomassmax_lai
7) eventهای recommendation چگونه وارد شبیهسازی میشوند؟
این مهمترین بخش اتصال PCSE به recommendationها است.
_parse_recommendation_events()
این تابع recommendation خام را به event قابل الحاق تبدیل میکند.
برای آبیاری:
event_signal = "irrigate"- کلید مقدار میتواند
amountیاirrigation_amountباشد
برای کودهی:
event_signal = "apply_n"- کلید مقدار میتواند
N_amountیاamountباشد
_merge_management_recommendations()
این تابع recommendationها را داخل TimedEvents همان campaign اصلی قرار میدهد.
پس وقتی شما یک recommendation جدید میدهید، در عمل:
- یک برنامه مدیریت جدید ساخته نمیشود
- همان
agromanagementپایه مزرعه گرفته میشود - eventهای جدید به آن تزریق میشوند
این طراحی مهم است چون:
- تقویم اصلی کشت حفظ میشود
- فقط تصمیمهای مدیریتی جدید روی سناریو سوار میشوند
8) recommendation optimizer دقیقا چه میکند؟
فایل crop_simulation/recommendation_optimizer.py لایه تصمیمگیری سناریویی است.
کلاس اصلی:
SimulationRecommendationOptimizer
این کلاس دو مسیر دارد:
- مسیر مبتنی بر PCSE
- مسیر heuristic fallback
اگر داده کافی و پروفایل simulation گیاه موجود باشد، اول تلاش میکند از PCSE استفاده کند. اگر نشد، به heuristic برمیگردد.
9) تاثیر PCSE روی توصیه آبیاری
9.1 ورودیهای optimizer آبیاری
متد:
optimize_irrigation()
ورودیها:
sensorplantforecastsdaily_water_needsgrowth_stageirrigation_method
9.2 وقتی مسیر PCSE فعال میشود
اگر برای گیاه simulation profile معتبر وجود داشته باشد، متد _optimize_irrigation_with_pcse() اجرا میشود.
در این مسیر:
- تنظیمات از
irrigation/apps.pyخوانده میشود - soil/site از سنسور و عمق خاک ساخته میشود
- forecastها به weather record تبدیل میشوند
- از روی
strategy_profilesچند سناریوی آبیاری ساخته میشود - برای هر سناریو، eventهای
irrigateبهagromanagementتزریق میشود - هر سناریو با
run_single_simulation()اجرا میشود - از روی
yield_estimateهر سناریو،scoreساخته میشود - بهترین سناریو انتخاب میشود
9.3 PCSE دقیقا چه چیزی را تغییر میدهد؟
PCSE باعث میشود recommendation آبیاری فقط بر پایه ET یا بارش نباشد. بلکه تاثیر برنامه آبیاری روی شاخص عملکرد گیاه هم دیده شود.
یعنی سیستم فقط نمیگوید:
- امروز 8 میلیمتر آب بده
بلکه عملاً سناریوها را مقایسه میکند:
- اگر آب کمتر بدهیم، عملکرد چقدر افت میکند؟
- اگر آب را در نوبتهای بیشتری پخش کنیم، نتیجه بهتر میشود؟
- اگر آبیاری حمایتی بدهیم، نسبت آب به عملکرد چطور تغییر میکند؟
9.4 خروجی نهایی آبیاری
خروجی recommendation آبیاری شامل این فیلدهاست:
total_irrigation_mmamount_per_event_mmeventsevent_datestimingmoisture_target_percentvalidity_periodreasoning
9.5 اثر مستقیم irrigation/apps.py
مقادیر این فایل مستقیم روی recommendation اثر دارند:
stage_targetsهدف رطوبت خاک را تعیین میکندstrategy_profilescandidate scenarioها را تعریف میکندvalidity_daysمتن و پنجره اعتبار را تعیین میکندminimum_event_mmجلوی recommendationهای غیرعملی را میگیردsignificant_rain_threshold_mmروی logic بارش موثر اثر دارد
9.6 اگر PCSE در دسترس نباشد
مسیر _optimize_irrigation_with_heuristic() استفاده میشود.
در این مسیر امتیازدهی بر اساس اینهاست:
- نیاز آبی forecast
- بارش موثر
- رطوبت فعلی خاک
- دمای بالا
- باد
- بازده روش آبیاری
اما در این حالت شبیهسازی واقعی عملکرد انجام نمیشود. پس recommendation سبکتر و تخمینیتر است.
10) تاثیر PCSE روی توصیه کودهی
10.1 ورودیهای optimizer کودهی
متد:
optimize_fertilization()
ورودیها:
sensorplantforecastsgrowth_stage
10.2 مسیر PCSE برای کودهی
اگر simulation profile و forecast موجود باشد، _optimize_fertilization_with_pcse() اجرا میشود.
در این مسیر:
- تنظیمات از
fertilization/apps.pyخوانده میشود - stage target مرحله رشد تعیین میشود
- برای هر strategy profile یک دوز نیتروژن متفاوت ساخته میشود
- event
apply_nرویTimedEventsقرار میگیرد - هر سناریوی کودهی با PCSE اجرا میشود
yield_estimateسناریوها مقایسه میشود- بهترین استراتژی انتخاب میشود
10.3 PCSE دقیقا چه کمکی میکند؟
PCSE باعث میشود recommendation کودهی فقط بر اساس کمبود لحظهای عناصر نباشد، بلکه اثر احتمالی سناریوی مصرف روی خروجی گیاه هم دیده شود.
یعنی سیستم فقط نمیگوید:
- چون نیتروژن پایین است، فلان مقدار کود بده
بلکه مقایسه میکند:
- اگر سناریوی نگهدارنده اجرا شود، عملکرد چقدر میشود؟
- اگر سناریوی اصلاحی اجرا شود، gain عملکردی چقدر است؟
- آیا افزایش دوز واقعاً ارزش دارد یا خیر؟
10.4 اثر fertilization/apps.py
مقادیر این فایل مستقیما بر recommendation اثر دارند:
stage_targetsدوز هدف N/P/K را تعیین میکندformulaنوع کود پیشنهادی را تعیین میکندapplication_methodروش مصرف را تعیین میکندtimingزمان مناسب مصرف را تعیین میکندstrategy_profilesسناریوهای رقابتی را میسازدrain_delay_threshold_mmروی ریسک زمانبندی مصرف اثر داردvalidity_daysپنجره اعتبار را تعیین میکند
10.5 heuristic fallback در کودهی
اگر PCSE اجرا نشود، _optimize_fertilization_with_heuristic() استفاده میشود.
این مسیر بر این مبنا تصمیم میگیرد:
- نیتروژن فعلی
- فسفر فعلی
- پتاسیم فعلی
- pH خاک
- مرحله رشد
- بارش پیشرو
خروجی آن هنوز ساختاریافته و مفید است، اما مثل مسیر PCSE مقایسه عملکرد شبیهسازیشده ندارد.
11) نقش P و K در حالی که event کودهی فقط apply_n است
در نسخه فعلی شبیهسازی، event مستقیم کودهی که وارد TimedEvents میشود بیشتر روی N_amount تمرکز دارد.
اما پروژه برای P و K هم یک adjustment تکمیلی دارد:
_estimate_pk_stress_factor()_apply_pk_adjustment()
این بخش بعد از اجرای PCSE روی خروجی اعمال میشود.
منطق آن:
- اگر فسفر پایین باشد،
p_factorکاهش مییابد - اگر پتاسیم پایین باشد،
k_factorکاهش مییابد - اگر
pHیاECنامناسب باشد، penalty اعمال میشود - سپس این factor روی:
yield_estimatebiomassmax_laiاعمال میشود
پس حتی اگر event سناریویی مستقیم بیشتر نیتروژنی باشد، وضعیت P, K, pH, EC باز هم روی recommendation نهایی اثر میگذارد.
12) RAG چطور از خروجی PCSE استفاده میکند؟
در rag/services/irrigation.py
این سرویس:
- forecastها و داده مزرعه را میگیرد
- نیاز آبی روزانه را از FAO-56 محاسبه میکند
- optimizer شبیهسازی را صدا میزند
- اگر
optimized_resultموجود باشد،context_textآن را به prompt اضافه میکند - LLM پاسخ را تولید میکند
- پاسخ با fallback ساختاریافته merge میشود
نکته مهم:
- LLM مرجع عددی اصلی نیست
optimized_resultمرجع اصلی اعداد است
این موضوع حتی در prompt پیشفرض هم صریح آمده است.
در rag/services/fertilization.py
منطق مشابه است:
- sensor و forecast خوانده میشود
- optimizer کودهی اجرا میشود
context_textبه system prompt اضافه میشود- LLM متن recommendation را میسازد
- خروجی با fallback عددی merge میشود
در نتیجه:
- PCSE و optimizer عددها را میسازند
- RAG متن را کاربرپسند و اجرایی میکند
13) تفاوت بین simulation engine و recommendation layer
لایه simulation
در crop_simulation/services.py:
- سناریو اجرا میشود
- eventها merge میشوند
- خروجیهای عملکردی تولید میشوند
لایه recommendation
در crop_simulation/recommendation_optimizer.py:
- چند سناریو candidate ساخته میشود
- همه با simulation یا heuristic ارزیابی میشوند
- بهترین گزینه انتخاب میشود
context_textبرای RAG تولید میشود
لایه presentation
در rag/services/irrigation.py و rag/services/fertilization.py:
- متن نهایی
- هشدارها
- list itemها
- توضیح توسعهپذیر
ساخته میشود.
14) سناریوی واقعی آبیاری در این پروژه
یک نمونه ساده:
- forecast هفت روز آینده دریافت میشود
- نیاز آبی روزانه محاسبه میشود
- optimizer سه سناریوی آبیاری میسازد:
- محافظهکارانه
- متعادل
- حمایتی
- هر سناریو به
TimedEventsتزریق میشود - PCSE برای هر سناریو اجرا میشود
- عملکرد نسبی هر سناریو اندازهگیری میشود
- بهترین سناریو انتخاب میشود
- RAG همان سناریو را به زبان قابل فهم برای کاربر توضیح میدهد
15) سناریوی واقعی کودهی در این پروژه
یک نمونه ساده:
- مرحله رشد تشخیص داده میشود
- target غذایی همان مرحله از
fertilization/apps.pyخوانده میشود - چند سناریوی دوز و شدت مصرف ساخته میشود
- برای هر سناریو event
apply_nساخته میشود - PCSE سناریوها را اجرا میکند
- خروجی عملکرد مقایسه میشود
- بهترین برنامه انتخاب میشود
- RAG آن را به صورت JSON ساختاریافته به کاربر برمیگرداند
16) مزیتهای استفاده از PCSE در توصیه آبیاری و کودهی
- recommendationها فقط rule-based نیستند
- تصمیمها بر پایه مقایسه سناریو هستند
- امکان اتصال داده واقعی مزرعه به مدل رشد وجود دارد
- مرحله رشد، هوا، خاک و مدیریت همزمان دیده میشوند
- recommendation خروجی قابل توضیحتری برای LLM تولید میکند
17) محدودیتهای فعلی پیادهسازی
این پروژه عملی و مفید است، اما چند محدودیت مهم دارد:
- کیفیت recommendation وابسته به کیفیت
simulation profileگیاه است - اگر پروفایل simulation وجود نداشته باشد، سیستم به heuristic fallback میرود
- event کودهی در شبیهسازی فعلی بیشتر نیتروژنمحور است
PوKبه شکل adjustment پس از اجرا اعمال میشوند، نه لزوما event-driven کامل- forecastهای هوا کوتاهمدتاند؛ پس recommendationها مخصوص تصمیمگیری عملیاتی نزدیک هستند
- score برخی سناریوها از
yield_estimate / 100ساخته میشود و هنوز میتواند با calibration دقیقتر بهبود یابد
18) جمعبندی عملی
اگر بخواهیم نقش PCSE را در یک جمله خلاصه کنیم:
PCSE در این پروژه موتور سنجش اثر تصمیمهای آبیاری و کودهی روی عملکرد احتمالی گیاه است.
و اگر بخواهیم نقش irrigation/apps.py و fertilization/apps.py را هم در یک جمله بگوییم:
این دو فایل policy و defaultهای تصمیمگیری را تعریف میکنند، و optimizer با استفاده از همان policyها سناریو میسازد و با PCSE ارزیابی میکند.
بنابراین خروجی نهایی recommendation حاصل ترکیب سه لایه است:
- داده واقعی مزرعه و forecast
- شبیهسازی سناریویی با PCSE
- تولید پاسخ ساختاریافته و قابل فهم با RAG
19) فایلهایی که اگر بخواهید این سیستم را توسعه دهید باید اول ببینید
crop_simulation/services.pycrop_simulation/recommendation_optimizer.pycrop_simulation/apps.pyirrigation/apps.pyfertilization/apps.pyrag/services/irrigation.pyrag/services/fertilization.py
اگر بخواهید behavior سیستم را تغییر دهید:
- برای تغییر policy آبیاری:
irrigation/apps.py - برای تغییر policy کودهی:
fertilization/apps.py - برای تغییر منطق ارزیابی سناریو:
crop_simulation/recommendation_optimizer.py - برای تغییر اجرای واقعی مدل:
crop_simulation/services.py - برای تغییر متن و ساختار پاسخ:
rag/services/irrigation.pyوrag/services/fertilization.py