GigLift: 힌글리시(Hinglish) 작업 요청을 받아 명확한 브리프로 변환 (Gemma + Django)
요약
GigLift는 WhatsApp 스타일의 비정형화된 작업 요청(예: 'logo bana do dukaan ke liye...')을 받아, 필요한 예산, 기술 스택, 마감일 등 명확한 브리프로 변환해주는 시스템입니다. 이 플랫폼은 프리랜서와 소규모 사업주 간의 커뮤니케이션 문제를 해결하여 프로젝트 시작 단계부터 투명성을 확보하는 것을 목표로 합니다.
핵심 포인트
- 비정형화된 요청을 구조화된 브리프로 자동 변환합니다.
- 예산, 마감일 등 누락된 정보를 사용자에게 요청합니다.
- 프리랜서와 소상공인 간의 초기 커뮤니케이션 문제를 해결합니다.
_이 글은 Hacktoberfest Open-Source AI Challenge Week 2: Side Hustle 제출물입니다.
제가 만든 것
인도의 한 가게 주인은 작업 공고를 작성하지 않습니다. 그들은 WhatsApp 메시지를 보냅니다: "logo bana do dukaan ke liye, 1500 tak, Friday tak chahiye" (가게 로고를 만들어 주세요, 최대 1500루피까지, 금요일까지 필요합니다).
GigLift는 바로 그러한 메시지에서 시작하는 학생들을 위한 작은 작업 게시판입니다. 이 시스템은 해당 메시지를 적절한 브리프로 변환합니다: 무엇을 전달해야 하는지, 어떤 기술이 필요한지, 예산, 마감일, 그리고 주인이 빠뜨린 질문들까지 포함합니다. 주인은 잘못된 부분을 수정하고 게시합니다. 그 전까지는 아무것도 공개되지 않습니다. 학생들은 자신의 프로필에 얼마나 잘 맞는지 순위가 매겨진 작업들을 보고 제안서를 보내고, 주인은 한 명을 고용합니다. 전화번호는 고용 후에만 표시되며, 결제는 두 사람 사이에서 이루어집니다.
실제로 비용을 지불할 사람들은 로고, 메뉴판, 편집된 릴스 8개 또는 타이핑된 40페이지 등 작은 사업주들입니다. 보통 ₹500에서 ₹3,000 정도입니다. 부업은 학생의 것입니다.
저는 이러한 메시지가 프리랜서가 알아야 할 내용의 절반을 빠뜨리기 때문에 브리프를 개선하고 싶었습니다. 학생들은 추측하고, 무작정 견적을 내고, 나중에 두 사람 사이에 논쟁이 벌어집니다. 시작 단계에서 명확한 브리프는 거의 비용이 들지 않으면서 이러한 문제의 대부분을 막아줍니다.
GigLift 자체는 수익을 창출하지 않습니다. 아직 아무도 이 시스템을 통해 결제한 적이 없고, 실제 고객이 사용한 적도 없습니다.
데모
실시간: https://giglift-aa4q.onrender.com
Render의 무료 티어에서 실행되기 때문에, 조용했던 시간 이후 첫 방문은 최대 1분까지 걸릴 수 있으며, 재배포할 때마다 데이터가 초기화됩니다. '(demo)'로 표시된 다섯 개의 작업이 시드(seeded)되어 있습니다. 모델이 답변했을 때는 푸터에 AI: gemma라고 적혀 있고, 폴백(fallback)을 사용했을 때는 AI: offline이라고 되어 있습니다.
시도해 볼 만한 두 가지가 있습니다:
- **'긱 올리기(Post a gig)'**를 클릭하고
logo bana do dukaan ke liye, 1500 tak, Friday tak chahiye를 붙여넣으세요. 브리프에 있는 예산과 마감일은 작성한 것과 정확히 일치해야 합니다. - 예산이 없는 다른 요청을 게시해 보세요. 예를 들어
4 posters chahiye shaadi ke liye와 같이요. 가격은 대략적인 추측으로 표시되고, 브리프는 사용자에게 예산과 마감일을 요청합니다.
코드
GitHub logo Divyansh0208 / GigLift
GigLift
학생들을 위한 소액 유료 작업, 평이한 언어로 게시됩니다. 가게 주인이 지저분한 WhatsApp 스타일의 요청(
- 시도해 보기
- 문제점
- 작동 방식
- AI가 사용되는 곳과 그렇지 않은 곳
- 평가(Eval)
- 과정 중 잘못된 점
- 실행하기
- 설정(Configuration)
- 프로젝트 레이아웃
- 테스트
- 배포(Deploy)
- 보안(Security)
- 로드맵 및 알려진 한계
- 라이선스
시도해 보기 (Try)
…
MIT 라이선스입니다. README에는 설정 단계, 평가(eval), 그리고 아직 부족한 항목 목록이 있습니다.
구축 과정 (How I Built It)
이 프로젝트는 Render의 무료 플랜을 사용하는 Django와 HTMX, SQLite로 만들어졌습니다. 모든 AI 로직은 core/llm.py라는 단일 파일에 있으며, 표준 라이브러리만을 사용하고 SDK는 사용하지 않았습니다. 모델은 Gemma (gemma-4-26b-a4b-it)이며, 동일한 무료 키를 사용하여 Google의 호스팅된 Gemini API를 통해 호출됩니다. 만약 키가 없거나 호출이 실패하면, 규칙 기반 폴백(rule-based fallbacks)이 작동하며 페이지에 그 내용이 표시됩니다.
디자인의 대부분은 제가 일찍 배운 한 가지 것에서 비롯됩니다. 모델에게 가격을 물어보면, 클라이언트가 제시하지 않았더라도 모델은 가격을 알려주기 때문입니다. 그래서 저는 모델이 숫자를 결정하도록 두는 것을 멈췄습니다. 만약 클라이언트가 예산이나 마감일을 명시했다면, core/extract.py의 작은 규칙 세트가 그 내용을 텍스트에서 그대로 읽어내고 모델은 이를 변경할 수 없습니다. 이 규칙들은 영어(English), 힌글리시(Hinglish), 데바나가리 숫자(Devanagari digits)를 처리합니다: '1500 tak', '₹१२००', 'parso', 'agle hafte', 'Friday tak'. 아무것도 명시되지 않았다면, 모델의 숫자는 "실제 가격에서 나온 것이 아닌 대략적인 추측"으로 표시되고 클라이언트에게 질문을 요청합니다. 만약 모델이 클라이언트 메시지에 없는 숫자를 포함하는 결과물(deliverable)을 작성하면, 저는 그 줄을 삭제합니다. Gemma가 맡게 되는 것은 규칙들이 할 수 없는 부분입니다: 힌글리시 요청을 이해하고 결과물과 열린 질문들을 작성하는 것입니다.
이를 확인하기 위해, 제가 손으로 30개의 브리프(영어, 힌글리시, 데바나가리)를 작성했고 그 위에 규칙을 만들었습니다. 그런 다음 extract.py를 고정(freeze)했으며, 이 파일의 해시 값은 eval/FROZEN.txt에 있습니다. 그리고 32개의 새로운 브리프를 작성하고 점수를 매겼습니다.
| 제외된 32개 브리프 | 이전 정규식 (Old regex) | 새 규칙 (New rules) |
|---|---|---|
| 명시된 예산이 올바르게 읽힘 (25) | 11 | 22 |
| ... |
그런 다음 실제 Gemma를 백엔드로 사용하여 전체 파이프라인을 실행했고, 모든 32개 브리프가 모델에 의해 처리되었습니다: 예산 25개 중 22개가 정확하고 마감일 27개 중 25개가 정확했으며, 틀린 것은 하나도 없고 지어낸 것도 없습니다. 이는 규칙만으로 달성한 것과 일치하며, 이것이 핵심입니다. Gemma는 클라이언트가 작성한 숫자를 변경할 수 없습니다.
오류가 발생한 다섯 가지 경우는 'paanch hazar'(단어로 된 금액), '1800 mein ho jaye', 'due 25 Oct', 그리고 'within 48 hours'였습니다. 오류가 발생했다는 것은 앱이 클라이언트에게 질문을 요청한다는 의미입니다. 잘못된 숫자를 절대 보여주지 않습니다.
이것이 보여주지 않는 것들: 제가 규칙과 테스트 브리프를 모두 작성했기 때문에, 보류 점수는 낙관적입니다. 또한 숫자만 측정합니다. 아직 Gemma 자신의 출력물에 대한 점수(즉, 개방형 질문, 기술 및 산출물)는 매기지 않았습니다. 이것이 다음 과제이며, 실제 고객의 메시지와 제출 확인을 포함할 것입니다. 여기서 학생은 자신이 무엇을 제출했는지 설명하고 모델은 각 산출물이 완료되었는지 누락되었는지 표시합니다.
잘못된 점들. 저의 첫 번째 오프라인 정규 표현식(regex)이 'posters, 4'에서 충돌했는데, 이는 'posters'의 'rs'를 루피(rupees)로 읽었기 때문입니다. Windows에서는 제 스코어러가 잘못된 인코딩으로 브리프를 읽으면서 ₹ 기호를 망가뜨렸고, 예산 점수가 22점에서 16점으로 떨어졌다가 제가 원인을 파악한 후에야 해결되었습니다. Gemma의 첫 번째 답변들은 JSON으로 전혀 구문 분석되지 않았기 때문에, 한동안 모든 브리프는 조용히 오프라인 규칙으로 되돌아갔고 저는 알아차리지 못했습니다. 저는 응답에서 가장 큰 유효한 JSON 객체를 가져오도록 파서를 다시 작성했고, 이제 평가는 어떤 백엔드가 실제로 실행을 제공했는지 출력합니다. 또한 API 키가 포함된 스크린샷을 한 번 게시한 적이 있습니다. 저는 그것을 폐기했습니다.
저는 지루한 보안 부분에도 시간을 보냈습니다: nonces를 사용한 CSP(Content Security Policy), 세션 및 IP당 속도 제한, 그리고 수정 및 고용에 대한 소유권 확인입니다. 규칙에 대한 7개 외에도 Django 테스트가 24개가 있습니다.
개방형 혁신이 중요한 이유?
저는 폐쇄 모델을 Gemma와 비교하여 실행하지 않았기 때문에, 더 잘했다고 주장할 수 없습니다. 여기서 개방성이 이 프로젝트에 어떤 변화를 주었는지 알려드리겠습니다.
설계는 최첨단(frontier) 모델이 필요하지 않습니다. 코드가 숫자를 결정하기 때문에, 모델은 단지 지저분한 요청을 읽고 짧은 브리프를 작성하는 것만 하면 되며, 중간 규모의 개방형 모델로 충분합니다. 이것은 모델을 교체 가능하게 만듭니다. GEMMA_MODEL을 변경하여 다른 모델로 전환할 수 있습니다.
돈이 빠듯합니다. 일당은 ₹600입니다. 현재 무료 API 키가 브리프 비용을 0원으로 만들어주며, 개방형 가중치(open weights)는 이 무료 등급이 변경되어도 제가 막히지 않게 해줍니다. 저는 동일한 프롬프트를 제 자체 하드웨어에서 실행할 수도 있습니다.
개인 정보 보호가 저에게 가장 중요하며, 이 부분이 아직은 완성되지 않았습니다. 이러한 메시지에는 종종 전화번호가 포함되어 있습니다. 오늘 텍스트는 Google의 API로 전송되므로 제 서버를 떠나게 됩니다. 오픈 웨이트(open weights) 모델을 사용하면 가게의 메시지가 폐쇄된 공급업체의 시스템 안에 머무를 필요가 없습니다. Gemma 호출은 하나의 함수 내에 있으므로, 이를 제 자신의 기기에 있는 모델을 가리키도록 하려면 프롬프트가 아니라 해당 함수 자체를 다시 작성해야 합니다. 저는 아직 그것을 구축하지 않았습니다.
수상 부문 (Prize Categories)
사이드 허슬(Side Hustle). Gemma는 모델이므로, Gemma 관련 파트너 카테고리에도 고려해 주시면 좋겠습니다.
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기