Building Krishi-Mitra: A Beginner’s Guide to Multi-Agent AI for Agriculture
Quick Summary
Krishi Mitra는 농업 보조금, 날씨, 저장시설 같은 지역별 정보를 농민이 자연어로 물으면 다중 에이전트 구조와 실시간 웹 검색을 통해 답하도록 만든 농업용 AI 챗봇이다.
🖼️ 인포그래픽
🖼️ 4컷 인포그래픽
💡 한 줄 요약
Krishi-Mitra는 농업 보조금, 날씨, 저장시설 같은 지역별 정보를 농민이 자연어로 물으면 다중 에이전트 구조와 실시간 웹 검색을 통해 답하도록 만든 농업용 AI 챗봇이다.
📌 핵심 요약
- 글은 농민들이 보조금, 작물별 냉장 저장시설, 지역 날씨 같은 정보를 찾기 위해 느리고 흩어진 정부 웹사이트를 직접 뒤져야 하는 문제에서 출발한다.
- 저자는 이 문제를 해결하기 위해 ‘Krishi-Mitra’라는 농업 개인 비서형 AI 챗봇을 만들었고, 단순한 ChatGPT 프롬프트가 아니라 역할을 나눈 다중 에이전트 시스템으로 구현했다고 설명한다.
- 시스템은 Streamlit 인터페이스에서 질문을 받고, LangGraph 기반 Supervisor가 의도를 파악한 뒤 날씨 담당인 Mausam 같은 적절한 Worker에게 요청을 라우팅한다.
- 개발 과정에서는 AI가 도구 호출 형식을 잘못 만들어 앱을 망가뜨리는 문제와, 위치 같은 필수 정보가 빠졌을 때 웹 검색 도구가 오류를 내는 문제가 발생했다.
- 해결책으로는 json_mode와 Pydantic을 이용한 엄격한 JSON 검증, 그리고 필요한 입력값이 없을 때 사용자에게 되묻는 ask_user_for_missing_data 흐름을 도입해 안정성을 높였다.
🧩 주요 포인트
- 글은 농민들이 보조금, 작물별 냉장 저장시설, 지역 날씨 같은 정보를 찾기 위해 느리고 흩어진 정부 웹사이트를 직접 뒤져야 하는 문제에서 출발한다.
- 저자는 이 문제를 해결하기 위해 ‘Krishi-Mitra’라는 농업 개인 비서형 AI 챗봇을 만들었고, 단순한 ChatGPT 프롬프트가 아니라 역할을 나눈 다중 에이전트 시스템으로 구현했다고 설명한다.
- 시스템은 Streamlit 인터페이스에서 질문을 받고, LangGraph 기반 Supervisor가 의도를 파악한 뒤 날씨 담당인 Mausam 같은 적절한 Worker에게 요청을 라우팅한다.
- 개발 과정에서는 AI가 도구 호출 형식을 잘못 만들어 앱을 망가뜨리는 문제와, 위치 같은 필수 정보가 빠졌을 때 웹 검색 도구가 오류를 내는 문제가 발생했다.
- 해결책으로는 json_mode와 Pydantic을 이용한 엄격한 JSON 검증, 그리고 필요한 입력값이 없을 때 사용자에게 되묻는 ask_user_for_missing_data 흐름을 도입해 안정성을 높였다.
🧠 상세 정리
1. 농민이 겪는 정보 접근 문제에서 출발한 프로젝트
글은 농민이 자기 지역의 종자 보조금이나 특정 작물, 예를 들어 마카나에 맞는 가까운 냉장 저장시설을 찾으려 할 때 겪는 현실적 불편을 먼저 제시한다. 보통 이런 정보는 여러 정부 웹사이트에 흩어져 있고, 사이트는 느리거나 복잡해 필요한 답을 얻기까지 시간이 많이 걸린다. 저자는 농민에게 그런 시간과 여유가 부족하다고 보고, 이 문제를 해결하기 위한 도구로 Krishi-Mitra를 만들었다. Krishi-Mitra는 ‘농부의 친구’라는 뜻의 개인 농업 보조 챗봇으로 소개된다. 핵심 목표는 사용자가 평범한 영어로 복잡한 질문을 던지면, 시스템이 실시간 인터넷을 검색해 정확하고 지역화된 답을 돌려주는 것이다.
2. 단순 챗봇이 아니라 다중 에이전트 시스템을 택한 이유
저자는 Krishi-Mitra를 단순히 웹사이트에 ChatGPT 프롬프트 하나를 붙인 형태로 만들지 않았다고 강조한다. 표준 AI 챗봇은 모든 질문을 혼자 처리하려는 ‘만능이지만 전문성은 부족한’ 방식이라, 잘못된 답이나 존재하지 않는 사실을 만들어낼 위험이 크다고 설명한다. 반면 다중 에이전트 시스템은 한 명의 AI가 모든 일을 처리하지 않고, 잘 조직된 회사처럼 Supervisor와 Worker 역할을 나눈다. 사용자가 질문하면 Supervisor가 의도를 판단하고 적절한 Worker에게 일을 넘긴다. Worker는 웹 검색 같은 도구를 사용해 필요한 정보를 찾고, 그 결과를 다시 사용자에게 전달하는 구조다.
3. Krishi-Mitra의 기본 작동 흐름
시스템의 흐름은 사용자가 Streamlit 기반의 깔끔한 웹 인터페이스에 질문을 입력하는 것에서 시작된다. 예를 들어 “오늘 Darbhanga의 날씨는 어떤가?”라고 묻는 식이다. 그러면 LangGraph 시스템이 질문의 의도를 읽고, 해당 요청이 날씨에 관한 것이라고 판단하면 Mausam이라는 날씨 담당 Worker로 라우팅한다. 이 Worker는 DuckDuckGo나 Tavily 같은 도구를 사용해 Darbhanga의 실제 날씨 정보를 실시간 웹에서 검색한다. 마지막으로 Worker는 찾은 데이터를 사용자가 이해하기 쉬운 정확한 응답으로 정리해 돌려준다. 저자는 이 흐름을 통해 AI가 단순 문장 생성이 아니라 외부 도구를 사용해 실제 작업을 수행하게 된다고 설명한다.
4. 첫 번째 문제: AI가 도구 호출 코드를 환각한 사례
개발 과정에서 처음 부딪힌 큰 문제는 AI가 도구 호출 형식을 잘못 만들어낸 것이었다. 초기에 저자는 표준적인 tool-calling 방식을 사용해 AI가 Python 함수를 호출하도록 했지만, AI가 라우팅 요청을 Route 도구로 보내는 대신 functions.Route라는 이상한 출력을 만들어냈다. 시스템은 이 불필요한 접두어가 붙은 형식을 인식하지 못했고, 그 결과 전체 앱이 충돌했다. 이 사례는 생성형 AI가 코드나 호출 형식에서도 그럴듯하지만 틀린 출력을 만들 수 있음을 보여준다. 저자는 이를 단순 오류가 아니라 안정적인 애플리케이션을 만들 때 반드시 통제해야 할 문제로 다룬다.
5. 엄격한 JSON 검증과 Pydantic으로 안정성 확보
도구 호출 환각 문제를 해결하기 위해 저자는 AI가 마음대로 형식을 추측하지 못하도록 제한했다. 구체적으로 json_mode를 사용하고, Python 라이브러리인 Pydantic으로 출력 구조를 엄격하게 검증했다. 글에서는 Pydantic을 클럽 입구의 엄격한 문지기에 비유하며, AI가 정해진 형태와 정확히 맞는 데이터만 내보내야 하고 여분의 단어나 잘못된 형식은 거부되도록 만들었다고 설명한다. 이 방식은 AI의 출력이 시스템이 기대한 스키마에서 벗어나는 순간 차단하는 역할을 한다. 결과적으로 이전처럼 functions.Route 같은 형식 오류로 앱이 충돌하는 문제가 사라졌고, 시스템 전체가 훨씬 안정적으로 동작하게 되었다.
6. 빠진 정보에 되묻는 안전장치와 복제 방법
두 번째 문제는 사용자가 “냉장 저장시설을 찾아줘”처럼 필요한 위치 정보를 빠뜨렸을 때 발생했다. 웹 검색 도구는 어느 지역을 검색해야 하는지 알 수 없어 BadRequestError를 냈고, 이것이 치명적인 오류로 이어졌다. 저자는 이를 막기 위해 ask_user_for_missing_data라는 프로그램적 루프 차단 장치를 만들었다. 시스템은 웹 검색을 시작하기 전에 필요한 정보가 모두 있는지 확인하고, 위치가 없으면 작업을 멈춘 뒤 사용자에게 어느 지역을 찾는지 되묻는다. 마지막으로 저자는 GitHub 저장소를 클론하고 Python 3.10 이상 환경에서 의존성을 설치한 뒤 API 키를 준비하고 streamlit run src/app.py로 실행하면 프로젝트를 복제해 볼 수 있다고 안내한다. 또한 graph.py에서는 LangGraph 노드 연결을, state.py에서는 Pydantic으로 AI 출력을 통제한 방식을 확인하라고 덧붙인다.
🧾 핵심 주장 / 시사점
- 이 글의 핵심은 ‘AI가 답을 잘 쓰게 하는 것’보다 ‘AI가 어떤 역할과 도구를 언제 안전하게 쓰게 할 것인가’가 실용 애플리케이션의 성패를 가른다는 점이다.
- Krishi-Mitra 사례는 다중 에이전트 구조가 거창한 개념이 아니라, 사용자 의도 분류·담당 Worker 라우팅·실시간 검색·응답 정리처럼 작은 책임 분리를 통해 구현될 수 있음을 보여준다.
- 실제 서비스에서는 모델의 지능보다 출력 형식 검증, 필수 입력 확인, 사용자에게 되묻는 흐름 같은 방어적 설계가 충돌을 줄이고 신뢰도를 높이는 핵심 장치가 된다.
✅ 액션 아이템
- 보조금·날씨·저장시설처럼 농민 질문이 자주 몰리는 정보 영역을 나누고, 각 영역별 Worker 역할과 필요한 입력값을 먼저 정의한다.
- 도구 호출이 앱을 망가뜨리지 않도록 응답 형식을 json_mode와 Pydantic 검증으로 제한하는 최소 프로토타입을 만든다.
- 지역·작물 등 필수 정보가 빠진 질문에서는 바로 검색하지 않고 되묻는 흐름을 챗봇 대화 설계에 포함한다.
❓ 열린 질문
- Supervisor가 농민의 질문 의도를 보조금, 날씨, 저장시설 중 어디로 라우팅할지 판단하는 기준은 얼마나 명확하게 설계돼야 할까?
- 실시간 웹 검색 결과가 느리거나 흩어진 정부 웹사이트에 의존할 때, 농민에게 유용한 답변 속도와 안정성을 어떻게 확보할 수 있을까?
- 필수 정보가 빠진 상황에서 되묻는 질문은 농민이 부담 없이 답할 수 있을 만큼 간단하게 구성돼 있는가?