목표
예정된 휴가를 위한 호텔이든 가족 친화적인 아파트든 이상적인 장소를 찾는 데는 여러 옵션을 비교하는 번거롭고 시간이 많이 소요되는 과정이 수반되는 경우가 많습니다. 호텔이 관광객에게 적합한지 보여주는 맞춤 측정항목을 제공하거나 가족 친화성을 기준으로 아파트 등록정보를 순위 지정하여 사용자의 까다로운 숙제를 간편한 결정으로 바꾸는 데 도움을 줄 수 있다면 어떨까요?
이 문서에서는 Places Aggregate API를 사용하여 지정된 지리적 영역 내 장소의 밀도를 기반으로 동적 맞춤 위치 점수를 생성하는 방법을 간략히 설명합니다. 지정된 기준에 따른 숫자 순위인 점수는 위치가 사용자의 요구사항에 얼마나 적합한지 즉시 알 수 있도록 합니다.
도시의 호텔을 홍보하는 중이며 관광객에게 좋은 점수를 만들어 가장 매력적인 관광 지역에 있는 호텔을 강조하려고 한다고 가정해 보겠습니다. Places Aggregate API를 사용하여 각 호텔 근처에 있는 관련 장소 유형의 수를 계산합니다. 예를 들어 고객이 다음과 같은 시설이 근처에 있는 호텔을 선호한다는 것을 알고 있습니다.
- 레스토랑 및 카페
- 공원 및 박물관
- 의류 매장
선택한 장소 유형의 개수에 중요도 가중치를 적용하면 각 호텔 위치의 전반적인 점수를 계산할 수 있습니다. 이 점수는 주변 장소를 기반으로 위치의 전반적인 적합성을 반영합니다. 각 장소 유형에 할당된 가중치는 특정 사용 사례 및 타겟층에게 중요한 사항에 따라 달라야 합니다. 이 문서에서는 관광객에게 적합 점수를 주요 예로 들지만 사용자 인구통계와 요구사항을 반영하도록 점수를 구성할 수 있습니다.
기본 요건
이 문서를 읽기 전에 다음 문서를 숙지하는 것이 좋습니다.
- Places Aggregate API 개발자 문서에서 기술 세부정보와 사용 가능한 매개변수를 알아보세요.
- [선택사항] API를 사용하여 Gemini를 호출하는 방법을 이해할 수 있는 Gemini 개발자 API 개발자 문서. 이 문서에서는 맞춤 위치 점수를 생성하는 옵션으로 사용됩니다.
데모
이 데모에서는 맞춤 위치 점수가 작동하는 예를 보여줍니다. 드롭다운에서 도시를 선택하고 맞춤 점수 계산 버튼을 클릭하여 사전 입력된 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에는 위치 필터가 필요합니다. 이 예에서는 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 개발자 API를 사용하는 두 가지 옵션을 설명합니다.
옵션 1: 알고리즘 사용
첫 번째 옵션은 로컬 알고리즘을 사용하여 각 장소 유형의 가중치와 개수를 사용하여 점수를 생성하는 것입니다. 이 점수를 0~5의 척도로 표준화합니다. 여기서 값이 클수록 기준에 따라 더 매력적인 지역을 나타냅니다. 이 예에서는 위의 데이터에서 JavaScript 객체 2개를 생성합니다.
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자리로 반올림)입니다.
옵션 2: Gemini Developer API 사용
로컬 알고리즘을 사용하는 대신 Gemini Developer API를 사용하면 모든 위치의 맞춤 위치 점수를 계산하는 강력한 방법을 사용할 수 있습니다. 모든 호텔 위치에 대한 시스템 안내와 함께 개수 및 가중치 데이터를 제공하기만 하면 됩니다.
이 방법은 다음과 같이 계산에 포함할 미묘한 정보가 있는 경우에 특히 유용합니다.
- 각 호텔 위치에 대한 텍스트 설명입니다(예: '이 위치는 가족 단위 투숙객에게 적합하며 밤에는 조용합니다').
- 사용자에 관한 정보(예: '이 사용자는 가족을 위해 예약하고 있으며 번화가에 있는 조용한 지역을 선호함')
Gemini Developer API는 이러한 정성적 데이터를 이해하고 고려하여 순전히 수학적 접근 방식을 넘어 더 정교하고 관련성 높은 점수를 산출할 수 있습니다.
Gemini Developer API를 사용하면 위의 장소 유형 및 가중치 표 외에도 다음과 같은 각 위치에 대한 설명 데이터를 가질 수 있습니다.
위치 |
설명 |
박물관과 가까운 도심에 위치하며, 밤에는 조용하고 가족이 머물기에 적합합니다. |
|
바 및 레스토랑이 가까운 중심부에 위치합니다. 밤에 시끄럽고 북적거리며 그룹에 적합합니다. |
|
도심에서 멀리 떨어진 주거 지역 |
|
강 근처의 중앙 위치. 밤에는 조용하고 가족에게 적합합니다. |
|
도심에서 멀리 떨어진 주거 지역 |
이러한 정성적 설명은 사용자 정보 또는 환경설정과 함께 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 엔지니어