OSM을 위한 로컬 AI 에이전트 구축하기

21일 동안 로컬 AI 에이전트를 구축했습니다. 이 에이전트는 자연어를 OSM 필터 JSON으로 변환합니다.

저는 이것이 완전히 로컬 GPU에서 실행되기를 원했습니다. API 호출도, 개인정보 보호 위험도, 속도 제한(rate limits)도 없습니다.

제가 어떻게 구축했는지, 그리고 무엇을 배웠는지 소개합니다.

아키텍처

모델에 컨텍스트를 제공하기 위해 RAG 파이프라인을 사용했습니다.

임베딩(Embeddings): OSM 태그 설명을 벡터로 변환하기 위해 bge-small-en-v1.5를 사용했습니다. • 데이터베이스: 이 임베딩들을 SQLite에 저장했습니다. • 검색(Retrieval): 질문을 하면 시스템이 가장 관련성 높은 OSM 태그와 필터 예시를 찾아냅니다. • 생성(Generation): LLM이 사용자의 쿼리와 검색된 예시를 받아 JSON을 생성합니다.

실패 사례

구축 과정이 순탄치만은 않았습니다. 몇 가지 난관에 부딪혔습니다.

중지 토큰(Stop Token) 버그: 처음 실행했을 때는 결과가 빈 값으로 나왔습니다. 모델이 JSON 앞에 빈 줄을 추가했는데, 이것이 중지 토큰을 트리거하여 출력을 중간에 끊어버린 것이었습니다. 이를 해결하기 위해 중지 토큰을 제거해야 했습니다. • 맹목적인 복사: LLM이 예시를 변형하지 않고 그대로 복사하는 경우가 많았습니다. 모델이 새로운 필터를 합성하도록 프롬프트를 다시 작성했습니다. • 도메인 혼동: 모델이 해양(maritime) 태그와 육상(land) 태그를 혼동했습니다. 관련성에 따라 후보 태그를 필터링하는 검증 단계를 추가했습니다.

배운 점

중지 토큰 사용을 피하세요: 확실하지 않다면 사용하지 마세요. 출력을 망가뜨리는 경우가 많습니다. • 데이터 품질이 핵심입니다: 가공되지 않은 JSON 문자열을 임베딩하는 것보다 자연어 문장을 임베딩하는 것이 더 효과적입니다. • 루프(Loop)가 마법을 부립니다: 간단한 루프를 추가했습니다. 필터 결과가 0개라면, 에이전트가 요청 범위를 넓혀 다시 시도합니다. 이를 통해 정적인 도구가 적응형 시스템으로 변모합니다.

결과

이 시스템은 8GB 미만의 VRAM을 가진 단일 GPU에서 실행됩니다. 대부분의 간단한 쿼리를 처리하며, 실패할 경우 스스로 적응합니다. 복잡한 부정(negation)이나 태그 합성 부분은 아직 개선이 필요하지만, 핵심 기능은 작동합니다.

여러분의 지리공간(geospatial) 워크플로우에서는 태그의 모호성을 어떻게 처리하시나요?

출처: https://dev.to/gisfromscratch/building-a-local-ai-agent-for-osm-21-days-of-iteration-2fc4

선택 사항 학습 커뮤니티: https://t.me/GyaanSetuAi