Places Aggregate 맞춤 위치 점수

목표

이미지

다가오는 휴가를 위한 호텔이든 가족 친화적인 아파트든 이상적인 위치를 찾는 과정은 수많은 옵션을 비교하는 번거롭고 시간이 많이 걸리는 작업입니다. 관광객에게 적합한 호텔을 보여주는 맞춤 측정항목을 제공하거나 가족 친화성을 기준으로 아파트 등록정보의 순위를 매겨 지루한 작업을 손쉬운 결정으로 바꾸어 사용자가 더 쉽게 결정할 수 있도록 도울 수 있다면 어떨까요?

이 문서에서는 Places Aggregate API를 사용하여 정의된 지리적 영역 내의 장소 밀도를 기반으로 동적 맞춤 위치 점수를 생성하는 방법을 설명합니다. 지정한 기준에 따른 수치 순위인 점수는 위치가 요구사항에 얼마나 적합한지 즉시 전달합니다.

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

  • 식당 및 카페
  • 공원 및 박물관
  • 의류 매장

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

기본 요건

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

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

관련 장소 유형 선택

맞춤 위치 점수를 만드는 첫 번째 단계는 표 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에는 위치 필터가 필요합니다. 이 예에서는 circle를 사용합니다. 중심 latLng은 호텔 위치이고 radius은 500m입니다. 또한 평점이 3.8에서 5 사이인 장소를 반환하도록 ratingFilter를 설정하여 평점이 낮은 장소를 개수에서 제외합니다.

특정 사용 사례에 맞게 위치 필터 설정을 다양하게 변경해 보세요. 예를 들어 반경 값을 늘려 중심 위도 및 경도에서 더 넓은 반경 내의 장소를 캡처할 수 있습니다. 또는 리전 또는 커스텀 영역과 같은 다른 방법을 사용하여 검색 영역을 설정할 수 있습니다.

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
    }
    

itemCounts에 typeWeights를 곱하고 결과를 전체 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 Developer API는 이러한 정성적 데이터를 이해하고 고려하여 순수한 수학적 접근 방식을 넘어 더 정교하고 관련성 높은 점수를 제공할 수 있습니다.

Gemini Developer 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 엔지니어