<aside> 🗺️

포켓몬고 처럼 AI 챗봇을 수집하자!

</aside>

본 프로젝트는 회사 동료와 함께 진행한 프로젝트로, “포켓몬고 처럼 AI 챗봇을 만들어볼까?” 에서 시작하였습니다. 사실 우리가 포켓몬고 하면 떠오르는 것은 내 위치 중심으로 다양한 포켓몬 들이 있고, 이를 잡기도 하고 레이드도 하는 등 다양한 이벤트를 **“위치 기반”**의 게이밍입니다.

image.png

사람들의 추억과 향수 그리고 “수집욕” 과 모바일 기기에서 할 수 있는 “간소화된 경쟁” 시스템, “수집형 RPG” 시스템 등으로 누구나 1번 쯤은 해봤을 겁니다. AI 챗봇을 GPS 기반으로 포켓몬 고 처럼 떠다니게 해서 사람들이 다양하게 이용해보면 어떨까? 에서 확장한 단계가 바로,

image.png

<aside> 🗺️

뭔가 거창해보이지만, 사실 AI + TMAP 조합 입니다.

</aside>

단순하게 생각하면 현재 내 위치 정보(GPS)에 AI 챗봇을 보여주면 됩니다. 하지만 임의의 챗봇을 만들기에는 너무 재미가 없었습니다. 따라서 현재 내 위치 기반으로 주변 상권(음식점, 숙박시설, 카페, 놀거리, 박물관, 공원 등) 정보 기반으로 한 AI 챗봇을 만들고 이와 대화를 할 수 있게 하는 것 입니다.

백엔드 구조 살펴보기

graph TB
    subgraph "AMAP Project Structure"
        subgraph "Root Level"
            MAIN[main.py<br/>FastAPI 애플리케이션 진입점]
            CONFIG[config.py<br/>설정 관리]
            DEPS[dependencies.py<br/>의존성 주입]
            LOGS[loggings.py<br/>로깅 설정]
            REQ[requirements.txt<br/>Python 의존성]
            DOCKER[Dockerfile<br/>컨테이너 설정]
            BUILD[build.sh<br/>빌드 스크립트]
        end

        subgraph "App Layer"
            subgraph "app/agents/"
                subgraph "API Layer"
                    API_AGENT[agent_router.py<br/>에이전트 API]
                    API_USER[user_router.py<br/>사용자 API]
                    API_ACHIEVE[achievement_router.py<br/>업적 API]
                    API_PUSH[subsrbe_router.py<br/>푸시 알림 API]
                end

                subgraph "Core Layer"
                    CORE_AGENT[agent_manager.py<br/>에이전트 관리]
                    CORE_USER[user_manager.py<br/>사용자 관리]
                    CORE_ACHIEVE[achivement_manager.py<br/>업적 관리]
                    CORE_DB[d1_database.py<br/>데이터베이스]
                    CORE_TOOLS[tool_list.py<br/>도구 목록]
                end

                subgraph "Schema Layer"
                    SCHEMA_AGENT[agent_schemas.py<br/>에이전트 스키마]
                    SCHEMA_USER[user_schemas.py<br/>사용자 스키마]
                    SCHEMA_CHAT[chat_schemas.py<br/>채팅 스키마]
                    SCHEMA_MAP[map_schemas.py<br/>지도 스키마]
                    SCHEMA_ACHIEVE[achivement_schemas.py<br/>업적 스키마]
                end
            end
        end

        subgraph "External Services"
            AWS[AWS Services<br/>DynamoDB, Lambda]
            GOOGLE[Google Places API<br/>장소 검색]
            OPENAI[OpenAI API<br/>AI 에이전트]
        end

        subgraph "Testing"
            TEST_ACHIEVE[test_achievements.py<br/>업적 테스트]
            TEST_CONF[conftest.py<br/>테스트 설정]
        end
    end

    %% 연결 관계
    MAIN --> API_AGENT
    MAIN --> API_USER
    MAIN --> API_ACHIEVE
    MAIN --> API_PUSH

    API_AGENT --> CORE_AGENT
    API_USER --> CORE_USER
    API_ACHIEVE --> CORE_ACHIEVE

    CORE_AGENT --> SCHEMA_AGENT
    CORE_USER --> SCHEMA_USER
    CORE_ACHIEVE --> SCHEMA_ACHIEVE

    CORE_AGENT --> AWS
    CORE_AGENT --> GOOGLE
    CORE_AGENT --> OPENAI

    CORE_DB --> AWS

    TEST_ACHIEVE --> CORE_ACHIEVE
    TEST_CONF --> TEST_ACHIEVE

    %% 스타일링
    classDef apiLayer fill:#e1f5fe
    classDef coreLayer fill:#f3e5f5
    classDef schemaLayer fill:#e8f5e8
    classDef external fill:#fff3e0
    classDef test fill:#fce4ec

    class API_AGENT,API_USER,API_ACHIEVE,API_PUSH apiLayer
    class CORE_AGENT,CORE_USER,CORE_ACHIEVE,CORE_DB,CORE_TOOLS coreLayer
    class SCHEMA_AGENT,SCHEMA_USER,SCHEMA_CHAT,SCHEMA_MAP,SCHEMA_ACHIEVE schemaLayer
    class AWS,GOOGLE,OPENAI external
    class TEST_ACHIEVE,TEST_CONF test

AWS Lambda 에 FastAPI를 배포하자

image.png

FastAPI로 가볍게 백엔드 API 를 잡고, ECR 에 도커 빌드해서 올립니다. 그 다음 AWS Lambda 에 도커 빌드 이미지를 가져와 배포하였습니다. 별칭 기반 버전 관리를 하였습니다. 이렇게 하면 딸깍! 만으로도 API 버전을 관리할 수 있기 때문입니다. 별칭 자체를 API 스냅샷처럼 운영해서 배포한 뒤 API Gateway를 통해 세부 작업을 할 수 있습니다. 물론 사이드 프로젝트로 그만큼 할 필요는 없었기에, 단순 AWS Lambda 함수 URL 만 사용했습니다.

<aside> 🗺️

ASGI 비동기 에플리케이션 배포를 위한 “Mangum” 패키지

</aside>