Shamba-MedCare 프롬프트 엔지니어링
Source: Dev.to
소개
저는 농업 배경과 지능형 기술 도구의 발전에 영감을 받아 AI를 이용한 간단한 식물 질병 진단 솔루션을 만들고 있습니다.
**Shamba‑MedCare 앱 여기서**를 확인해 보세요. 테스트용이므로 공개 출시가 될 때까지는 직접 API 키를 사용해야 합니다. 키는 브라우저의 로컬 스토리지에 저장되므로 비공개입니다.

맥락을 위해, 제가 LLM(대형 언어 모델)을 언급할 때는 주로 Claude를 사용합니다. LLM은 범용적이라 이 솔루션을 어떤 LLM에도 적용할 수 있기 때문에 사용합니다.
최적의 결과를 얻기 위해 여러 프롬프트를 실험했습니다. 이것이 Shamba‑MedCare와 함께한 프롬프트 엔지니어링 여정입니다:

LLM Vision에 처음 시도한 프롬프트는 너무 순진했습니다:
“이 식물은 어떤 병에 걸렸나요?”
응답은 식물 병리학 전반에 대한 2,000단어짜리 에세이였으며—교과서에는 도움이 되지만 죽어가는 토마토 식물을 가진 농부에게는 전혀 쓸모가 없었습니다. AI가 구조화되고 실행 가능한, 예산을 고려한 진단을 반환하도록 만들려면 여러 차례 반복이 필요했습니다. 여기서 배운 점을 정리합니다.
아키텍처

두 가지 프롬프트가 중요합니다:
- 시스템 프롬프트 – LLM이 가장할 인물을 정의합니다.
- 분석 프롬프트 – 특정 이미지에 대해 LLM이 무엇을 해야 하는지 알려줍니다.
시스템 프롬프트: “Shamba” 만들기
프롬프트는 페르소나와 함께할 때 더 잘 작동합니다. 저는 Shamba 페르소나를 만들었는데, 이는 농업 병리학 전문가입니다:
You are Shamba, an expert agricultural pathologist. You analyze
plant images to identify diseases, pests, and nutrient deficiencies.
Your expertise includes:
- 50+ crop types worldwide
- Fungal, bacterial, viral, and physiological disorders
- Traditional and modern treatment methods
- Practical advice for resource‑limited farmers
Guidelines:
1. Always include at least one FREE/traditional treatment
2. Describe WHERE symptoms appear (for visual mapping)
3. Be honest about uncertainty—use confidence scores
4. Recommend professional help for severe cases
핵심 문구: “Always include at least one FREE/traditional treatment.”
이 명시적 지시가 없으면 LLM은 상업용 제품을 기본으로 제시했는데—교외 정원사에게는 도움이 될지 몰라도 $15 정도의 살균제를 살 여유가 없는 농부에게는 전혀 쓸모가 없습니다.
실패 #1 – JSON 악몽
첫 번째 구조화 시도에서는 LLM에게 JSON을 반환하도록 요청했지만, 마크다운 코드 펜스와 주석이 포함된 형태로 반환했습니다:
Here's my analysis:
```json
{ "disease": "Early Blight" }
```
This is a common fungal disease...
파서는 이를 처리하지 못했습니다. 요청을 명확히 하여 해결했습니다:
Return ONLY a valid JSON object. No markdown, no commentary,
no text before or after. Start with { and end with }
그럼에도 불구하고 약 10 % 정도는 여전히 실패했으므로, 백엔드 로직에 다음을 추가했습니다:
- 마크다운 펜스가 있으면 제거
- 주변 텍스트에서 JSON 추출
- 예상 스키마에 맞게 검증
실패 #2 – 위치 설명
시각적 히트맵 기능을 위해 LLM이 어디 손상이 발생했는지를 설명하도록 해야 했습니다. 초기 프롬프트에서는 “affected regions”라고만 요청했더니 “The affected area is significant.”와 같은 모호한 답변이 나왔습니다.
개선된 프롬프트:
Describe affected regions with:
- Location (helpful for heatmaps): top‑left, center, lower‑right, edges, margins
- Coverage: percentage of area affected (e.g., "35%")
- Spread direction: "Moving from lower leaves upward."
그 결과:
{
"affected_regions": [
{
"location": "lower-left",
"severity": "severe",
"description": "Dark brown lesions with concentric rings",
"coverage": 15
},
{
"location": "center",
"severity": "moderate",
"coverage": 20
}
]
}
이 정도면 히트맵 오버레이를 생성하기에 충분합니다.

실패 #3 – 치료 비용 무시
초기에는 치료법이 무작위 순서로 제시돼, 때때로 $50짜리 전신 살균제보다 무료 목재 재(ash) 치료법이 뒤에 나왔습니다. LLM은 예산 제약을 스스로 인식하지 못하므로, 순서를 강제하는 스키마를 도입했습니다:
Provide treatments in EXACTLY this order:
1. FREE TIER: Traditional/home remedies ($0)
2. LOW COST: Basic solutions ($1‑5)
3. MEDIUM COST: Commercial organic ($5‑20)
4. HIGH COST: Synthetic/professional ($20+)
Each tier must have at least one option if applicable.
강제된 응답 스키마:
{
"treatments": [
{
"method": "Wood ash paste",
"cost_tier": "free",
"estimated_cost": "$0",
"ingredients": ["Wood ash", "Water"],
"application": "Apply directly to affected areas",
"availability": "Common from cooking fires"
},
{
"method": "Neem oil spray",
"cost_tier": "low",
"estimated_cost": "$1-3"
}
]
}
식물 부위별 프롬프트 전략
식물의 각 부위는 서로 다른 문제를 드러내므로, 부위별로 프롬프트를 맞춤화했습니다.
잎
Examine: color patterns, spot shapes, curling, holes, coating
Common issues: fungal spots, viral mosaic, nutrient chlorosis, pest damage
뿌리
Examine: color (white=healthy, brown/black=rot), texture, galls, structure
Common issues: root rot, nematode damage, waterlogging
관련 기관에 LLM의 초점을 맞추면 진단 정확도가 크게 향상됩니다.