ContentFilterService,會用來審查使用者輸入的內容,確保其系統安全性且與回應內容與飲料主題相關。主要功能分為四個部分:
禁用詞彙檢查
服務初始化時,會建立 forbiddenWords 集合,包含中英文常見的髒話或是不適當的詞彙。當 filterContent 方法收到輸入後,會將內容皆轉為小寫,逐一比對 forbiddenWords 中的值,若有命中則直接回傳「輸入包含不當內容」訊息,並標示檢查未通過。
// 檢查禁用詞彙
String lowerInput = cleanedInput.toLowerCase();
for (String forbiddenWord : forbiddenWords) {
if (lowerInput.contains(forbiddenWord.toLowerCase())) {
return new ContentFilterResult(false, "輸入包含禁用詞彙", cleanedInput);
}
}
敏感詞彙檢查
同理,sensitiveWords 集合包含一些較為敏感的詞彙。若輸入內容包含這些詞彙,則回傳「輸入包含敏感內容,請重新輸入」,避免不適當或爭議話題。
// 檢查敏感詞彙
for (String sensitiveWord : sensitiveWords) {
if (lowerInput.contains(sensitiveWord.toLowerCase())) {
return new ContentFilterResult(false, "輸入包含敏感內容,請重新輸入", cleanedInput);
}
}
URL 與 Email 過濾
另外,也利用正則表達式 urlPattern 和 emailPattern,將輸入中的網址和電子郵件替換為「[已移除連結]」和「[已移除郵箱]」,防止外部連結或個資洩漏。
// 移除 URL 和 Email
cleanedInput = urlPattern.matcher(cleanedInput).replaceAll("[已移除超連結]");
cleanedInput = emailPattern.matcher(cleanedInput).replaceAll("[已移除電子信箱]");
飲料相關性判斷
而 isDrinkRelated 方法會檢查內容是否包含飲料品項、口味、心情、時間、場合、季節等關鍵字(中英文皆有),若無相關詞且內容長度超過 10 字,則回傳「請輸入與飲品、心情或口味相關的內容」。若內容很短(10 字以內),也會讓它直接通過。
// 檢查是否與飲品相關
if (!isDrinkRelated(cleanedInput)) {
return new ContentFilterResult(false,
"請輸入與飲品、心情或口味相關的內容", cleanedInput);
}
private boolean isDrinkRelated(String input) {
Set<String> drinkKeywords = new HashSet<>(Arrays.asList(
// 飲品類型
"咖啡", "茶", "奶茶", "果汁", "汽水", "酒", "水", "飲料", "飲品",
"coffee", "tea", "juice", "soda", "drink", "beverage",
// 口味和特徵
"甜", "酸", "苦", "辣", "鹹", "香", "濃", "淡", "熱", "冰", "溫",
"sweet", "sour", "bitter", "hot", "cold", "warm", "strong", "light",
// 心情相關
"開心", "難過", "累", "疲憊", "放鬆", "興奮", "冷靜", "煩躁", "壓力",
"happy", "sad", "tired", "relaxed", "excited", "calm", "stressed",
// 時間和場合
"早上", "下午", "晚上", "夜晚", "工作", "休息", "聚會", "約會",
"morning", "afternoon", "evening", "night", "work", "rest", "party",
// 季節和天氣
"春天", "夏天", "秋天", "冬天", "熱", "冷", "雨天", "晴天",
"spring", "summer", "autumn", "winter", "hot", "cold", "rainy", "sunny"
));
String lowerInput = input.toLowerCase();
for (String keyword : drinkKeywords) {
if (lowerInput.contains(keyword.toLowerCase())) {
return true;
}
}
// 如果輸入很短,也考慮通過
return input.length() <= 10;
}
最後,如果所有檢查都順利通過,就會回傳「內容通過檢查」,並將過濾後的內容傳送給 AI Agent。這樣就能過濾一些不適當、敏感或含有個資的輸入字元,提升安全性與主題一致性。
參考資料: