MandiLens: 농부에게 어느 시장(mandi)이 실제로 더 많은 돈을 지불하는지 알려주는 오픈 소스 AI
요약
MandiLens는 인도 농부들이 작물을 어느 시장에 팔아야 할지 결정하는 데 도움을 주는 오픈 소스 AI 도구입니다. 단순한 공개 가격 지표가 아닌, 운송비와 수수료를 공제한 '예상 순수익'을 기준으로 여러 시장의 수익성을 비교합니다. 이를 통해 농부들이 실제 돈이 되는 정보를 얻고 최적의 판매처를 결정할 수 있도록 돕습니다.
핵심 포인트
- 단순 가격 지표가 아닌, 비용 공제 후 예상 순수익을 계산합니다.
- 운송비, 하역비 등 다양한 비용 요소를 반영하여 정확한 수익성을 제시합니다.
- 결정론적 엔진과 출처(Provenance) 추적 기능을 통해 신뢰도를 높였습니다.
This is a submission for the Hacktoberfest Open-Source AI Challenge Week 2: Side Hustle
제가 만든 것 (What I Built)
매일 인도에 있는 작은 농부는 하나의 질문에 답해야 합니다: 오늘 내 작물을 어느 시장(mandi)으로 가져가야 할까요?
공개 가격 데이터는 존재합니다. 정부가 이를 발표합니다. 하지만 공개된 가격은 지표(headline)일 뿐, 실제 지급액이 아닙니다. 40킬로미터 떨어진 곳의 더 높은 가격도 운송비, 하역비, 수수료 및 시장 비용으로 인해 사라질 수 있습니다. 농부는 결코 실제 숫자가 아니었던 숫자로 정신적인 산술 계산을 하게 됩니다.
MandiLens는 그 지표 가격을 실제로 중요한 숫자, 즉 **비용 공제 후 예상 순수익(estimated net proceeds after your costs)**으로 바꿉니다. 작물과 수량, 그리고 비용을 입력하면 MandiLens가 농부가 실제로 가져갈 금액을 기준으로 후보 시장들을 순위화하고, 정확히 어떻게 그 결과에 도달했는지 보여줍니다.
이것은 돈을 지불할 사람을 위해 만들어졌습니다: 즉, 소규모 및 영세 농부들, 그리고 그들에게 조언하는 상인들과 수수료 대리인들입니다. 가치는 단 한 번의 비교에서 명확합니다—마즈(maize) 1톤에 대한 두 시장 간 ₹8/kg의 차이는 ₹8,000이며, 운송비가 이 금액 전체를 차지하는 경우는 드뭅니다.
MandiLens를 다른 가격 대시보드와 다르게 만드는 세 가지 요소는 다음과 같습니다:
- 결정론적 의사 결정 엔진(deterministic decision engine). 순수익은 단순 산술입니다. 총액에서 비용을 제외하고, 정확한 단위 변환(kg, quintal, tonne)과 비율 커미션을 적용합니다. 동일한 입력값은 항상 동일한 출력을 내며, 이는 단위 테스트로 검증됩니다. AI는 이 수치들을 절대 덮어쓰도록 허용되지 않습니다.
- 모든 숫자에 대한 출처(Provenance). 모든 가격은 자신이 어디서 왔는지, 그리고 우리가 가져온 시점이 아닌 출처가 보고한 날짜를 저장합니다. 신선도는 우리가 캐싱한 시점이 아니라 시장이 실제로 보고한 시점을 기준으로 계산됩니다. 데모 데이터는 사방에
DEMO DATA로 표시되며 실제 가격과 절대 혼용되지 않습니다. - 모르는 것을 인정하는 근거 기반 코파일럿(grounded copilot).
- [Compare]에 접속하여 작물과 수량을 입력하고 운송비 및 수수료 비용을 추가하세요. MandiLens는 표면 가격이 아닌 순수익(net proceeds) 기준으로 시장의 순위를 매깁니다.
- [Copilot]에 접속하여 일반 언어 질문을 하세요. 도구가 실제로 어떤 가격을 읽었는지 추적 과정을 확인해 보세요.
- [commodities]와 [markets] 디렉토리를 둘러보고, [Listings]에서 매수 또는 매도 제안을 게시하세요.
모든 Copilot 답변에는 출처 배너(provenance banner), 도구 추적 과정(tool trace), 그리고 근거/누락 데이터 플래그(grounded / missingData flags)가 표시됩니다.
매수 또는 매도 제안을 게시하고 이유와 함께 점수가 매겨진 일치 항목(scored matches)을 확인하세요.
데모 계정 (비밀번호는 모두 DemoPass123):
데모 데이터셋은 결정론적이며 명확하게 라벨링되어 있습니다: 8개의 Bihar APMC 시장 × 8개 상품 × 45일간의 가격으로, 누구나 동일한 과정을 재현할 수 있도록 생성되었습니다.
코드
저장소(Repository): https://github.com/madhavgupta07/mandilens (MIT 라이선스)
MandiLens는 스케치가 아닌 실제 애플리케이션입니다: 적절한 인덱스가 적용된 15개의 MongoDB 모델, 2단계 CSV/JSON 가져오기 파이프라인, 데이터 수집 및 감사 기능이 있는 관리자 콘솔, 퍼스트파티 인증(first-party authentication), 알림, 관심 목록(watchlists), 저장된 비교 항목, 그리고 매칭 및 문의 기능을 갖춘 리스팅 마켓플레이스가 있습니다. 단위 변환, 기회 엔진, NLU(Natural Language Understanding), 가져오기 기능, 데이터 수집의 반복 불변성(ingestion idempotency)을 다루고, — 무엇보다 중요한 — 어시스턴트의 신뢰성(데이터를 조작하지 않는지 여부)까지 포함하는 73개의 테스트가 통과했습니다.
개발 과정 (How I Built It)
클라이언트 → API → 결정론적 엔진(deterministic engine) + 접지된 코파일럿(grounded copilot) → MongoDB, AGMARKNET 수집을 사용.
- Next.js 16 (App Router) + React 19 + TypeScript, Tailwind CSS v4로 스타일링하고 Radix primitives와 lucide-react를 사용했습니다.
- 저장소에는 MongoDB (Atlas)를 사용했으며, 재실행 시 데이터가 중복되는 대신 반복 불변성(idempotent)을 갖도록 복합
dedupeKey를 구현했습니다. - 모든 금액 및 수량 계산에 Decimal.js를 사용하여 부동 소수점 산술(floating-point arithmetic)이 누군가의 수입 근처에서 사용될 여지가 없기 때문입니다.
- 모든 API 경계에서의 유효성 검사에는 Zod를, CSV 가져오기 경로에는 Papaparse를 사용했습니다.
- 전체 테스트 스위트가 라이브 데이터베이스 없이 실행되도록 vitest + mongodb-memory-server를 사용했습니다.
- 배포는 Render를 통해 진행했으며, 애플리케이션과 그 환경은
render.yaml청사진(blueprint)에 선언되어 있습니다.
AI 레이어는 의도적으로 특정 제공업체에 종속되지 않습니다(provider-agnostic). AI_PROVIDER는 ollama(완전 로컬, 오픈 웨이트), openai_compatible(OpenAI와 호환되는 모든 엔드포인트 포함, Gemma 같은 오픈 웨이트 모델을 통해 서비스될 수 있음) 또는 deterministic일 수 있습니다. 후자는 어떤 모델 키도 필요하지 않으며 완벽한 근거 기반 도구 호출 파이프라인(grounded tool-calling pipeline)을 실행합니다. 데이터 수집 어댑터는 인도 정부 오픈 데이터 라이선스(Government Open Data License – India)에 따라 AGMARKNET(data.gov.in 경유)과 통신합니다.
코드 리뷰에서 제가 옹호할 두 가지 설계 결정이 있습니다:
- 산술 계산은 AI의 역할이 아닙니다. 비교 엔진은 순수하고 테스트 가능한 함수입니다. 코파일럿(copilot)이 이 기능을 호출하며, 모델은 절대 재계산하지 않습니다. 이것이 의사결정 도구와 자신감 있는 추측 사이의 차이점입니다.
- 누락된 데이터는 일급 결과값(first-class outcome)입니다. 빈 결과 세트는 _“현재 가격 정보가 없습니다”_로 보고되며, 절대 _“시장이 폐쇄되었습니다”_로 보고되지 않습니다. 같은 단어들이 농부가 아침에 무엇을 할지 바꿉니다.
오픈 혁신이 중요한 이유?
농산물 가격 인텔리전스(Agricultural price intelligence)는 개방성(openness)이 철학이 아니라 필수 요건인 도구의 전형적인 예입니다.
가장 필요한 사람들에게 무료로 제공될 만큼 저렴해야 합니다. 두 개의 시장(mandi)을 비교하는 농부는 쿼리당 AI 비용을 감당할 수 있는 고객이 아닙니다. MandiLens는 deterministic 모드에서 모델 키 없이 완전히 실행되며, 모델이 필요할 때 Ollama를 통해 완전한 로컬 오픈 웨이트 모델을 실행할 수 있습니다. 소규모 자영업자가 이 기능을 사용할지 여부를 결정하는 가격 책정을 하는 공급업체는 없습니다.
검사 가능해야 합니다. 왜냐하면 이해관계가 누군가의 수확물에 걸려 있기 때문입니다. 평가는 오픈 라이선스 하의 정부 데이터를 기준으로 이루어지며, 앱의 모든 숫자는 그 출처와 해당 출처 보고 날짜까지 추적됩니다. 숫자가 틀릴 때, 누구든 그것을 집으로 따라갈 수 있습니다. 이러한 감사 추적(audit trail)은 가격 엔진, 데이터 수집 어댑터, 코파일럿 도구 전체 스택이 개방적이고 읽기 가능하기 때문에만 가능합니다.
일반 API가 제대로 처리하기 어려운 틈새 시장에 적응할 수 있어야 합니다. '운송 후 내 옥수수에 어느 시장(mandi)이 더 많은 돈을 지불하는가?'라는 질문은 일반 목적의 비서가 잘 답변할 수 없는 문제입니다. 그 답은 특정하고 복잡하며 지역적인 데이터셋 안에 존재하기 때문입니다. 오픈 모델을 그러한 데이터셋에 기반(Grounding)시키고 — 그리고 그 논리를 누구나 포크(fork), 현지화(localize), 번역할 수 있게 하는 것 — 이 모든 것이 작동하게 만듭니다.
그리고 이는 정직한 길, 쉬운 길을 유지합니다. 결정론적 모드(deterministic mode)로 실행된다는 것은 MandiLens가 가격을 지어내기보다는 '이 가격은 없습니다'라고 말하는 것을 선호한다는 의미입니다. 열려 있고 검사 가능한 코드(inspectable code) 덕분에 판사, 기여자, 또는 농부들이 그 주장을 맹신하지 않고 직접 확인할 수 있습니다.
오픈 소스 AI는 폐쇄적인 제품이 결코 가치 있다고 여기지 않을 커뮤니티를 위해 이러한 도구를 가능하게 합니다.
나의 에이전트 세션 (My Agent Session)
MandiLens는 인간 참여형 워크플로우(human-in-the-loop workflow)와 AI 코딩 에이전트를 사용하여 구축되었습니다. 아키텍처 결정, 기반 규칙(grounding rules), 데이터 모델, 그리고 검토 과정은 사람이 담당했고, 에이전트가 대부분의 구현과 테스트 스캐폴딩을 수행했습니다. 이를 형성한 설계 제약 조건 — AI는 절대 산술 연산을 무시하지 않으며, 누락된 데이터는 결코 확실성으로 포장되지 않는다 — 은 의도뿐만 아니라 테스트를 통해 강제되었습니다. 이 과정을 설명하기 위해 에이전트 세션 기록을 공유할 수 있습니다.
수상 부문 (Prize Categories)
저의 프로젝트는 Hacktoberfest Open-Source AI Challenge — Week 2: Side Hustle에 제출됩니다.
또한 파트너 기술을 실제로 사용하므로, 다음에도 출품합니다:
MongoDB Atlas의 최적 활용 — MongoDB는 시스템 기록(system of record) 역할을 합니다: 복합 및 고유 인덱스가 적용된 15개 컬렉션, 복합 dedupeKey를 키로 하는멱등성(idempotent) 수집 파이프라인, 그리고 가격 기록별 출처 정보가 저장됩니다.
Render의 최적 활용 — 라이브 데모는 웹 서비스 형태로 Render에 배포되었으며, 환경은 커밋된 render.yaml 파일에 정의되어 있습니다.
Gemma의 최적 활용 — 이 코파일럿은 OpenAI와 호환되는 엔드포인트 위에서 제공되는 오픈 웨이트 Gemma를 지원하며, Ollama를 통해 완전히 로컬에서 실행됩니다. 결정론 모드(deterministic mode)는 모델 키가 전혀 없어도 작동을 유지합니다.
MandiLens는 MIT 라이선스 하에 오픈 소스로 공개되었습니다. Mandi 가격 데이터는 data.gov.in의 Government Open Data License – India를 통해 AGMARKNET, Directorate of Marketing & Inspection으로부터 출처를 밝힙니다. 이는 독립적인 프로젝트이며 AGMARKNET이나 인도 정부와 제휴하거나 보증하지 않습니다.
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기


