Bixby Developer Center

Guides
References

완화(Relaxation)

검색 action에서 결과가 반환되지 않을 경우 on-empty 블록을 사용하여 검색 제약 조건을 수정할 수 있습니다. 일반적으로, input value를 덜 제약적인 value로 대체(replacing)하거나 input value를 제거(dropping)하여 제약 조건을 해제합니다. 이것을 검색 제약 조건의 완화(relaxation)라고 합니다.

on-empty 효과에 의해 완화된 노드를 relaxed() Expression Language 함수로 테스트하면 true가 반환됩니다.

예: Input 대체

개수 제한규칙(cardinality)이 Many인 input을 제거하지 않고, 그 대신 해당 input의 크기를 1로 줄일 수도 있습니다. 예를 들어 Bixby가 많은 주제에 걸쳐 있는 이벤트를 제대로 찾지 못할 경우 한 가지 주제에 집중하는 것이 적절할 수 있습니다.

output (event.Event) {
on-empty {
if (exists(topic) && size(topic).length > 1) {
replace(topic) {
intent{
goal: Event
value: $expr(topic[0])
}
}
}
}
}

예: 복합 Input 대체

현지 식당을 검색할 때 사용자는 "식당"이라는 단어를 명시적으로 검색하지 않고 "코스 요리", "맛집" 등 다른 음식 관련 input을 언급할 수 있습니다. 이러한 input에 대해서도 "식당"을 명시적으로 찾도록 검색을 수정할 수 있습니다. 아래에 나와 있는 완화(relaxation) 전략의 첫 번째 블록에서 이 부분을 확인할 수 있습니다.

이 완화(relaxation) 전략의 두 번째 블록에서는 인근에서 결과를 찾을 수 없는 경우 검색 거리 반경을 넓히는 방법을 보여줍니다. 즉, 5마일 이내에서 결과가 없는 경우 20마일 이내에서 찾도록 설정되었습니다.

output (Business) {
on-empty {
if ("!relaxed(restaurantStyle) && ((exists(restaurantStyle) && (!contains(restaurantStyle, 'Restaurant') || size(restaurantStyle) > 1)) || exists(allergy) || exists(course) || exists(cuisineAttribute) || exists(cuisineStyle) || exists(diet) || exists(meal) || exists(menuItem) || exists(restaurantAmenities) || exists(restaurantQualities))") {
// If we have reason to believe this is a restaurant query, make that explicit and simple
replace (restaurantStyle) {
intent{
goal { Restaurant }
value { restaurant.RestaurantStyle(Restaurant) }
}
}
} else-if (!relaxed(searchRegion) && searchRegion.searchType == 'PointRadius' && searchRegion.pointRadius.radius.magnitude < 20) {
// Increase search radius
replace (searchRegion) {
intent {
goal { geo.SearchRegion }
value { $expr (searchRegion.pointRadius.centroid) }
value {
geo.SearchRadius {
unit: $expr (searchRegion.pointRadius.radius.unit)
magnitude { geo.DistanceMagnitude(20.0) }
}
}
}
}
}
}
}

예: Input 제거

FindRecipes action은 여러 사용자 input을 충족하는 레시피를 찾으려고 합니다. 그러나 경우에 따라 모든 input을 한 번에 충족하는 결과가 없을 수도 있습니다. 이때 NoResults 상태로 전환하는 대신에 drop 효과를 사용하면 제약 조건을 완화하여 검색을 반복할 수 있습니다.

이 예에서는 여러 가지 제약 조건이 있는지 확인하고 제약 조건 없이 검색을 반복합니다. ordered-effects 블록 내에 input을 래핑(wrapping)하면 input을 한 번에 제거할 수 있습니다. 이처럼 drop 효과를 함께 그룹화하면 완화 단계 수가 줄어 Bixby가 결과를 더 빠르게 얻을 수 있습니다.

output (Recipe) {
on-empty {
if (exists(servings)) {
drop (servings)
} else-if (exists(course) || exists(meal) || exists(cuisine)) {
ordered-effects {
drop (course)
drop (meal)
drop (cuisine)
}
}
}
}