긍정적인 리뷰와 부정적인 리뷰는 구매자의 구매 결정에 영향을 미칠 수 있습니다.
외부 연구에 따르면 온라인 쇼핑객의 82% 는 구매하기 전에 부정적인 리뷰를 적극적으로 찾습니다. 이러한 부정적인 리뷰는 고객과 비즈니스에 유용합니다. 부정적인 리뷰를 사용할 수 있으면 반품 비율을 낮추고 제조업체가 제품을 개선하는 데 도움이 될 수 있기 때문입니다.
다음은 리뷰 품질을 개선할 수 있는 몇 가지 방법입니다.
- 제출하기 전에 각 리뷰에 악의성이 있는지 확인합니다. 다른 사용자가 더 나은 구매 결정을 내리는 데 도움이 되도록 불쾌감을 주는 표현 및 기타 유용하지 않은 발언을 삭제하는 것이 좋습니다.
- 부정적인: 이 가방은 짜증나고, 싫어요.
- 부정적이고 유용한 피드백 제공: 지퍼가 매우 딱딱하고 소재가 저렴합니다. 이 가방을 반품했습니다.
- 리뷰에 사용된 언어를 기반으로 평점을 자동 생성합니다.
- 리뷰가 부정적인지 또는 긍정적인지 판단합니다.
![감정과 별표 평점이 있는 리뷰 예시 스크린샷](https://developer.chrome.google.cn/static/docs/ai/images/leave-a-review.png?authuser=5&hl=ko)
결국 제품 평가에 대한 최종 결정권이 사용자에게 있어야 합니다.
다음 Codelab은 브라우저에서 기기 내 솔루션을 제공합니다. AI 개발 지식, 서버 또는 API 키가 필요하지 않습니다.
기본 요건
서버 측 AI 솔루션과 함께 (예: Gemini API 또는 OpenAI API)는 많은 애플리케이션에 강력한 솔루션을 제공하지만 이 가이드에서는 온디바이스 웹 AI에 중점을 둡니다. 온디바이스 웹 AI는 AI 모델이 브라우저에서 실행되는 경우에 서버 왕복이 없는 웹 사용자의 경험을 개선합니다.
이 Codelab에서는 다양한 기법을 사용하여 온디바이스 웹 AI의 도구 상자에 있는 항목을 보여줍니다.
Google에서는 다음과 같은 라이브러리와 모델을 사용합니다.
- 유해성 분석을 위한 TensforFlow.js TensorFlow.js는 웹에서 추론 및 학습을 위한 오픈소스 머신러닝 라이브러리입니다.
- transformers.js: 감정 분석 Transformers.js는 Hugging Face의 웹 AI 라이브러리입니다.
- Gemma 2B: 별표 평점 Gemma는 Google에서 Gemini 모델을 만드는 데 사용한 연구 및 기술을 바탕으로 구축된 경량 개방형 모델 제품군입니다. 브라우저에서 Gemma를 실행하기 위해 MediaPipe의 실험용 LLM Inference API와 함께 사용됩니다.
UX 및 안전 고려사항
최적의 사용자 환경과 안전을 보장하기 위해 고려할 사항이 있습니다.
- 사용자가 평점을 수정할 수 있도록 허용합니다. 결국에는 사용자가 제품 평가에 대한 최종 의견을 제시해야 합니다.
- 사용자에게 평점과 리뷰는 자동화되어 있음을 명확히 알립니다.
- 사용자가 악의적인 것으로 분류된 리뷰를 게시할 수 있도록 허용하지만 서버에서 두 번째 확인을 실행합니다. 이렇게 하면 악의적이지 않은 리뷰가 악의적인 것으로 잘못 분류 (거짓양성)되는 불편을 방지할 수 있습니다. 악의적인 사용자가 클라이언트 측 확인을 우회하는 경우도 포함됩니다.
- 클라이언트 측 악성코드 검사는 유용하지만 우회될 수 있습니다. 서버 측에서도 검사를 실행해야 합니다.
TensorFlow.js로 유해성 분석
TensorFlow.js를 사용하면 사용자 리뷰의 유해성 분석을 빠르게 시작할 수 있습니다.
- TensorFlow.js 라이브러리와 유해성 모델을 설치하고 import.
- 최소 예측 신뢰도를 설정합니다. 기본값은 0.85이고 이 예에서는 0.9로 설정했습니다.
- 모델을 비동기식으로 로드합니다.
- 리뷰를 비동기식으로 분류합니다. 이 코드는 모든 카테고리에서 0.9라는 임계값을 초과하는 예측을 식별합니다.
이 모델은 신원 공격, 모욕, 외설 등으로 악의성을 분류할 수 있습니다.
예를 들면 다음과 같습니다.
import * as toxicity from '@tensorflow-models/toxicity';
// Minimum prediction confidence allowed
const TOXICITY_COMMENT_THRESHOLD = 0.9;
const toxicityModel = await toxicity.load(TOXICITY_COMMENT_THRESHOLD);
const toxicityPredictions = await toxicityModel.classify([review]);
// `predictions` is an array with the raw toxicity probabilities
const isToxic = toxicityPredictions.some(
(prediction) => prediction.results[0].match
);
Transformers.js로 감정 확인
Transformers.js 라이브러리를 설치하고 가져옵니다.
전용 파이프라인을 사용하여 감정 분석 태스크를 설정합니다. 파이프라인을 처음 사용하는 경우 모델이 다운로드되고 캐시됩니다. 그때부터 감정 분석이 훨씬 빨라집니다.
리뷰를 비동기식으로 분류합니다. 커스텀 임곗값을 사용하여 애플리케이션에 사용할 수 있는 신뢰도 수준을 설정합니다.
예를 들면 다음과 같습니다.
import { pipeline } from '@xenova/transformers';
const SENTIMENT_THRESHOLD = 0.9;
// Create a pipeline (don't block rendering on this function)
const transformersjsClassifierSentiment = await pipeline(
'sentiment-analysis'
);
// When the user finishes typing
const sentimentResult = await transformersjsClassifierSentiment(review);
const { label, score } = sentimentResult[0];
if (score > SENTIMENT_THRESHOLD) {
// The sentiment is `label`
} else {
// Classification is not conclusive
}
Gemma 및 MediaPipe로 별표 평점 제안하기
LLM Inference API를 사용하면 브라우저에서 대규모 언어 모델 (LLM)을 완전히 실행할 수 있습니다.
이 새로운 기능은 기존의 온디바이스 모델보다 100배 이상 큰 LLM의 메모리 및 컴퓨팅 수요를 고려할 때 특히 혁신적인 기능입니다. 기기 내 스택 전반의 최적화를 통해 새 작업, 양자화, 캐싱, 가중치 공유를 포함하여 이러한 작업이 가능합니다. 출처: 'Large Language Models On-Device with MediaPipe and TensorFlow Lite'(MediaPipe 및 TensorFlow Lite를 사용한 기기 내 대규모 언어 모델)
- MediaPipe LLM 추론 API를 설치하고 가져옵니다.
- 모델을 다운로드합니다. 여기에서는 Kaggle에서 다운로드한 Gemma 2B를 사용합니다. Gemma 2B는 Google의 개방형 모델 중 가장 작은 모델입니다.
FilesetResolver
를 사용하여 코드가 올바른 모델 파일을 가리키도록 합니다. 생성형 AI 모델은 애셋에 대한 특정 디렉터리 구조를 가질 수 있으므로 이는 중요합니다.- MediaPipe의 LLM 인터페이스로 모델을 로드하고 구성합니다. 모델을 사용할 준비를 합니다. 모델 위치, 선호하는 응답 길이, 온도에 따라 선호하는 창의성 수준을 지정합니다.
- 모델에 프롬프트를 입력합니다 (예시 보기).
- 모델의 응답을 기다립니다.
- 평점 파싱: 모델의 응답에서 별표 평점을 추출합니다.
import { FilesetResolver, LlmInference } from '@mediapipe/tasks-genai';
const mediaPipeGenAi = await FilesetResolver.forGenAiTasks();
const llmInference = await LlmInference.createFromOptions(mediaPipeGenAi, {
baseOptions: {
modelAssetPath: '/gemma-2b-it-gpu-int4.bin',
},
maxTokens: 1000,
topK: 40,
temperature: 0.5,
randomSeed: 101,
});
const prompt = …
const output = await llmInference.generateResponse(prompt);
const int = /\d/;
const ratingAsString = output.match(int)[0];
rating = parseInt(ratingAsString);
프롬프트 예
const prompt = `Analyze a product review, and then based on your analysis give me the
corresponding rating (integer). The rating should be an integer between 1 and 5.
1 is the worst rating, and 5 is the best rating. A strongly dissatisfied review
that only mentions issues should have a rating of 1 (worst). A strongly
satisfied review that only mentions positives and upsides should have a rating
of 5 (best). Be opinionated. Use the full range of possible ratings (1 to 5). \n\n
\n\n
Here are some examples of reviews and their corresponding analyses and ratings:
\n\n
Review: 'Stylish and functional. Not sure how it'll handle rugged outdoor use, but it's perfect for urban exploring.'
Analysis: The reviewer appreciates the product's style and basic functionality. They express some uncertainty about its ruggedness but overall find it suitable for their intended use, resulting in a positive, but not top-tier rating.
Rating (integer): 4
\n\n
Review: 'It's a solid backpack at a decent price. Does the job, but nothing particularly amazing about it.'
Analysis: This reflects an average opinion. The backpack is functional and fulfills its essential purpose. However, the reviewer finds it unremarkable and lacking any standout features deserving of higher praise.
Rating (integer): 3
\n\n
Review: 'The waist belt broke on my first trip! Customer service was unresponsive too. Would not recommend.'
Analysis: A serious product defect and poor customer service experience naturally warrants the lowest possible rating. The reviewer is extremely unsatisfied with both the product and the company.
Rating (integer): 1
\n\n
Review: 'Love how many pockets and compartments it has. Keeps everything organized on long trips. Durable too!'
Analysis: The enthusiastic review highlights specific features the user loves (organization and durability), indicating great satisfaction with the product. This justifies the highest rating.
Rating (integer): 5
\n\n
Review: 'The straps are a bit flimsy, and they started digging into my shoulders under heavy loads.'
Analysis: While not a totally negative review, a significant comfort issue leads the reviewer to rate the product poorly. The straps are a key component of a backpack, and their failure to perform well under load is a major flaw.
Rating (integer): 1
\n\n
Now, here is the review you need to assess:
\n
Review: "${review}" \n`;
테이크어웨이
AI/ML 전문 지식은 필요하지 않습니다. 프롬프트를 설계하려면 반복이 필요하지만 나머지 코드는 표준 웹 개발 과정입니다.
기기 내 모델은 상당히 정확합니다. 이 문서의 스니펫을 실행하면 악성 및 감정 분석이 모두 정확한 결과를 얻을 수 있습니다. 대부분의 경우 Gemma 평점은 테스트된 일부 참조 리뷰에서 Gemini 모델 평점과 일치합니다. 정확성을 검증하려면 더 많은 테스트가 필요합니다.
하지만 Gemma 2B의 프롬프트를 설계하려면 많은 노력이 필요합니다. Gemma 2B는 소규모 LLM이기 때문에 만족스러운 결과를 얻기 위해서는 상세한 프롬프트가 필요합니다. 특히 Gemini API에 필요한 것보다 더 상세한 프롬프트가 필요합니다.
추론은 매우 빠를 수 있습니다. 이 문서의 스니펫을 실행하면 다양한 기기에서 추론 속도가 빨라질 수 있으며 서버 왕복보다 빠를 수 있습니다. 하지만 추론 속도는 크게 달라질 수 있습니다. 대상 기기에 대한 철저한 벤치마킹이 필요합니다. 웹 GPU, WebAssembly, 라이브러리 업데이트를 통해 기기 내 추론이 계속 빨라질 것으로 예상됩니다. 예를 들어 Transformers.js는 v3의 웹 GPU 지원을 추가하여 기기 내 추론 속도를 크게 향상할 수 있습니다.
다운로드 크기는 매우 클 수 있습니다. 브라우저에서의 추론은 빠르지만 AI 모델을 로드하는 것은 어려울 수 있습니다 브라우저 내 AI를 수행하려면 일반적으로 라이브러리와 모델이 모두 필요하며, 이는 웹 앱의 다운로드 크기에 추가됩니다.
TensorFlow 악의성 모델 (기존 자연어 처리 모델)은 몇 킬로바이트에 불과하지만 Transformers.js의 기본 감정 분석 모델과 같은 생성형 AI 모델은 60MB에 달합니다. Gemma와 같은 대규모 언어 모델의 크기는 최대 1.3GB입니다 이는 중앙값 2.2MB 웹페이지 크기를 초과하며, 지금까지는 최고의 성능을 위해 권장되는 크기보다 훨씬 큽니다. 온디바이스 생성형 AI는 특정 시나리오에서 사용할 수 있습니다.
웹의 생성형 AI 분야는 빠르게 발전하고 있습니다. 웹에 최적화된 소규모 모델은 향후 출현할 것으로 예상됩니다.
다음 단계
Chrome은 브라우저에서 생성형 AI를 실행하는 또 다른 방법을 실험하고 있습니다. 사전 체험판 프로그램에 가입하여 테스트할 수 있습니다.