Places Aggregate API를 사용하여 맞춤 위치 점수 만들기

목표

이미지

다가오는 휴가를 위한 호텔이든 가족 친화적인 아파트든 이상적인 위치를 찾는 과정에는 수많은 옵션을 비교하는 번거롭고 시간이 많이 소요되는 과정이 따르는 경우가 많습니다. 관광객에게 적합한 호텔을 보여주는 맞춤 측정항목을 제공하거나 가족 친화도에 따라 아파트 목록을 순위 지정하여 사용자가 지루한 작업을 손쉽게 결정할 수 있도록 도와준다면 어떨까요?

이 문서에서는 Places Aggregate API를 사용하여 정의된 지리적 영역 내 장소의 밀도를 기반으로 동적 맞춤 위치 점수를 생성하는 방법을 설명합니다. 점수는 지정된 기준에 대한 숫자 순위로, 위치가 필요에 얼마나 적합한지 즉시 알 수 있습니다.

예를 들어 도시의 호텔을 홍보하고 있으며 관광객에게 적합한 점수를 만들어 가장 매력적인 관광 지역의 호텔을 강조하고 싶다고 가정해 보겠습니다. Places Aggregate API를 사용하여 각 호텔 근처에 있는 관련 장소 유형의 수를 계산합니다. 예를 들어 고객이 다음 항목이 여러 개 있는 위치의 호텔을 선호한다는 것을 알고 있다고 가정해 보겠습니다.

  • 레스토랑 및 커피숍
  • 공원 및 박물관
  • 의류 매장

선택한 이러한 장소 유형의 개수에 중요도 가중치를 적용하면 각 호텔 위치의 전체 점수를 계산할 수 있습니다. 점수는 주변 장소를 기반으로 한 위치의 전반적인 적합성을 반영합니다. 각 장소 유형에 할당된 가중치는 특정 사용 사례 및 타겟 잠재고객에게 중요한 요소와 일치해야 합니다. 이 문서에서는 관광객에게 적합 점수를 기본 예로 사용하지만, 사용자 인구통계 및 요구사항을 반영하도록 점수를 구성할 수 있습니다.

기본 요건

이 문서를 읽기 전에 다음 문서를 숙지하는 것이 좋습니다.

  • Places Aggregate API 개발자 문서를 참고하여 기술 세부정보와 사용 가능한 매개변수를 파악하세요.
  • [선택사항] Gemini 개발자 API 개발자 문서로, API를 사용하여 Gemini를 호출하는 방법을 이해하는 데 사용되며 이 문서에서 맞춤 위치 점수를 생성하는 옵션으로 사용됩니다.

데모

이 데모에서는 맞춤 위치 점수가 실제로 사용되는 예를 보여줍니다. 드롭다운에서 도시를 선택하고 맞춤 점수 계산 버튼을 클릭하여 미리 입력된 5개 위치의 맞춤 위치 점수를 표시합니다.

관련 장소 유형 선택

맞춤 위치 점수를 만드는 첫 번째 단계는 표 A에서 고객과 관련된 장소 유형을 결정하는 것입니다. 관광객에게 적합 점수를 생성하므로 관광객이 숙박하는 동안 가까이 있기를 원하는 다음 장소 유형을 선택했습니다.

  • 요리를 서빙하는 단계에 이르는
  • 공원
  • 의류점
  • 박물관
  • coffee_shop

그런 다음 각 장소 유형에 가중치를 할당하여 최종 점수에서 상대적 중요도를 반영합니다. 가중치는 사용 사례와 사용자의 선호도에서 가장 중요한 요소에 따라 결정해야 합니다. 이 예에서 가중치 부여 기준은 다음과 같이 0과 1 사이입니다.

장소 유형

가중치 부여

요리를 서빙하는 단계에 이르는

0.8

공원

0.6

의류점

0.3

박물관

0.2

coffee_shop

0.5

Places Aggregate API 호출

관심 있는 장소 유형 목록이 있으므로 다음 단계는 Places Aggregate API를 호출하는 것입니다.

Places Aggregate API에는 위치 필터가 필요합니다. 이 예에서는 중심 latLng이 호텔 위치이고 radius이 500m인 circle을 사용합니다. 또한 ratingFilter를 설정하여 평점이 3.8~5인 장소를 반환하고 평점이 낮은 장소는 개수에서 제외합니다.

특정 사용 사례에 맞게 위치 필터 설정을 다양하게 실험해 보세요. 예를 들어 반경 값을 늘려 중심 위도와 경도에서 더 넓은 반경 내의 장소를 포착할 수 있습니다. 또는 지역이나 맞춤 영역과 같은 다른 방법을 사용하여 검색 영역을 설정할 수도 있습니다.

Places Aggregate API 문서의 위치 필터 섹션을 숙지하여 사용할 수 있는 옵션을 알아보세요.

맞춤 점수를 생성하려는 각 장소 유형 및 위치에 대해 Places Aggregate API를 호출합니다. 예를 들어 호텔 중 한 곳의 음식점 장소 유형을 호출합니다.

curl --location 'https://areainsights.googleapis.com/v1:computeInsights' \
--header 'X-Goog-Api-Key: API_KEY \
--header 'Content-Type: application/json' \
--data '{
    "insights": [
        "INSIGHT_COUNT"
    ],
    "filter": {
        "locationFilter": {
            "circle": {
                "latLng": {
                    "latitude": 51.51611,
                    "longitude": -0.12726
                },
                "radius": 500
            }
        },
        "typeFilter": {
            "includedTypes": [
                "restaurant"
            ]
        },
        "ratingFilter": {
            "minRating": 3.8,
            "maxRating": 5
        }
    }
}'

API에 대한 모든 호출이 완료되면 각 위치에 대해 다음과 같은 데이터가 표시됩니다.

장소 유형

가중치 부여

개수

요리를 서빙하는 단계에 이르는

0.8

56

공원

0.6

3

의류점

0.3

32

박물관

0.2

8

coffee_shop

0.5

41

맞춤 위치 점수 생성

이제 각 위치의 장소 수와 각 장소 유형의 가중치가 있으므로 맞춤 위치 점수를 생성할 수 있습니다. 이 섹션에서는 로컬 알고리즘을 사용하거나 Gemini Developer API를 사용하는 두 가지 옵션을 설명합니다.

옵션 1: 알고리즘 사용

첫 번째 옵션은 각 장소 유형의 가중치와 개수를 사용하여 점수를 생성하는 로컬 알고리즘을 사용하는 것입니다. 이 점수를 0~5 범위로 정규화합니다. 값이 클수록 내 기준에 따라 더 매력적인 지역임을 나타냅니다. 이 예에서는 위의 데이터에서 JavaScript 객체 두 개를 생성합니다.

itemCounts

typeWeights

    {
      "restaurant": 56,
      "park": 3,
      "clothing_store": 32,
      "museum": 8,
      "coffee_shop": 41
    }
    
    {
      "restaurant": 0.8,
      "park": 0.6,
      "clothing_store": 0.3,
      "museum": 0.2,
      "coffee_shop": 0.5
    }
    

itemCountstypeWeights을 곱하고 결과를 전체 weightedCount에 더하여 개수와 가중치에서 점수를 생성합니다.

let weightedCount = 0;
for (const itemType in itemCounts) {
  weightedCount += itemCounts[itemType] * typeWeights[itemType];
}
weightedCount = weightedCount.toFixed(2);

이 예에서 이 단계의 출력은 78.3입니다.

이제 로그 정규화를 사용하여 0~5 사이의 척도로 이 위치의 최종 점수를 생성할 수 있습니다.

if (weightedCount === 0) {
   normalizedScore = 0;
} else {
   normalizedScore = Math.log(weightedCount + 1);
}

// Clamp between 0 and 5
normalizedScore = Math.max(0, Math.min(5, normalizedScore));

이 예시에서 최종 점수 출력은 4.36 (소수점 둘째 자리로 반올림)입니다.

옵션 2: Gemini Developer API 사용

로컬 알고리즘을 사용하는 대신 Gemini Developer API를 사용하면 모든 위치의 맞춤 위치 점수를 강력하게 계산할 수 있습니다. 모든 호텔 위치에 대한 시스템 안내와 함께 개수 및 가중치 데이터를 제공하기만 하면 됩니다.

이 방법은 다음과 같이 계산에 포함할 미묘한 정보가 있는 경우에 특히 유용합니다.

  • 각 호텔 위치의 텍스트 설명입니다(예: '이 위치는 가족에게 적합하며 밤에는 조용합니다').
  • '이 사용자는 가족을 위해 예약하며 중심부에 있는 조용한 지역을 선호합니다'와 같은 사용자 정보입니다.

Gemini 개발자 API는 이러한 정성적 데이터를 이해하고 고려하여 순전히 수학적 접근 방식을 넘어 더 정교하고 관련성 높은 점수를 도출할 수 있습니다.

위의 장소 유형 및 가중치 테이블 외에도 Gemini 개발자 API를 사용하면 각 위치에 대해 다음과 같은 설명 데이터를 사용할 수 있습니다.

위치

설명

51.49884, -0.17978

박물관과 가까운 중심부에 위치하며 밤에는 조용하고 가족에게 적합합니다.

51.51750, -0.13065

바와 레스토랑이 가까운 중심부에 위치 밤에는 시끄럽고 북적이며 단체에 적합합니다.

51.45712, 0.01146

도심에서 멀리 떨어진 주거 지역

51.51271, -0.09933

강과 가까운 중심부에 위치해 있습니다. 밤에는 조용하며 가족에게 적합합니다.

51.58502, -0.06445

도심에서 멀리 떨어진 주거 지역

이러한 정성적 설명은 사용자 정보 또는 환경설정과 함께 Gemini 프롬프트에 포함될 수 있습니다.

시스템 안내

Gemini는 제공된 데이터 포인트를 기반으로 각 위치에 대한 점수를 생성해야 한다는 것을 알기 위해 원시 데이터와 함께 지침이 필요합니다. 이를 달성하기 위한 시스템 명령의 예는 다음과 같습니다.

You will be given a json file containing details about a number of locations grouped by their latitude and longitudes.

Within the location details is information about the count of places nearby the location that match a specific category, and the weighting of importance of that category, between 0 - 1.

You will also be given information about the user's preference, and a description of each location. Take this into consideration when generating scores.

Generate a location suitability score taking these into account for each location. The score should be between 1 - 5 inclusive, to two decimal places. The minimum score a location can receive is 1.

Output in JSON

위의 시스템 지침은 Gemini에게 예상되는 데이터와 AI 모델의 예상 출력을 알려줍니다. 또한 JSON으로 출력을 요청합니다.

구조화된 출력

Gemini에 결과를 JSON으로 출력하도록 요청했지만, 코드에서 쿼리할 때 무엇을 예상해야 하는지 알 수 있도록 출력의 구조를 더 구체적으로 지정해야 합니다. 이를 위해 Gemini API의 responseSchema 필드를 사용하여 요청에 추가 구조화된 출력 명령어를 추가할 수 있습니다. OpenAPI 스키마 객체를 사용하여 모델 출력을 제한합니다.

예를 들면 다음과 같습니다.

{
  "type": "array",
  "description": "Array of location data with score",
  "items": {
    "type": "object",
    "properties": {
      "location": {
        "type": "object",
        "description": "Geographical coordinates of the location",
        "properties": {
          "latitude": {
            "type": "number",
            "format": "float",
            "description": "Latitude of the location"
          },
          "longitude": {
            "type": "number",
            "format": "float",
            "description": "Longitude of the location"
          }
        },
        "required": [
          "latitude",
          "longitude"
        ]
      },
      "score": {
        "type": "string",
        "description": "A score associated with the location"
      }
    },
    "required": [
      "location",
      "score"
    ]
  }
}

이 예시에서는 Gemini가 다음을 포함하는 JavaScript 배열을 출력하도록 요청합니다.

  • 위치 위도 및 경도
  • 맞춤 위치 점수

위의 시스템 안내와 구조화된 출력을 사용하면 한 위치에 대한 Gemini의 대답은 다음과 같습니다. 여기서 score는 맞춤 위치 점수입니다.

[
  {
    "location": {
      "latitude": 51.51611,
      "longitude": -0.12726
    },
    "score": "4.13"
  }
]

점수 표시

설명된 방법 중 하나를 사용하여 각 위치의 맞춤 위치 점수를 생성하면 호텔 세부정보와 함께 표시하거나 검색 필터링 옵션으로 사용할 수 있습니다. 예를 들어 '관광객에게 적합 점수가 높은 곳을 보여 줘'라고 말합니다. 이를 통해 고객은 예약 시 데이터를 기반으로 결정을 내릴 수 있습니다.

결론

맞춤 위치 점수를 사용하면 사용자에게 지역의 적합성을 한눈에 보여줄 수 있습니다. 이 문서에서는 5개의 개별 장소 유형을 사용하여 다양한 위치의 맞춤 위치 점수를 생성하는 방법을 보여주었습니다. 이 구현은 필요에 따라 수정할 수 있으며 유사한 장소 유형을 하나의 요청으로 결합하여 이러한 유형의 집계된 수를 반환하여 맞춤 위치 점수 지정 솔루션에 제공할 수 있습니다.

지금 Places Aggregate API를 사용해 고객이 충분한 정보를 바탕으로 위치 관련 결정을 내릴 수 있도록 유용한 위치 점수를 생성해 보세요.

참여자

헨리크 밸브 | DevX 엔지니어