Khám phá các đề xuất về bài đánh giá sản phẩm bằng AI phía máy khách

Maud Nalpas
Maud Nalpas

Ngày xuất bản: 21 tháng 10 năm 2024

Cửa hàng trực tuyến có thể thấy số lượt chuyển đổi tăng 270% bằng cách đăng bài đánh giá sản phẩm. Bài đánh giá tiêu cực cũng rất quan trọng vì giúp tạo dựng uy tín. 82% người mua sắm trực tuyến tìm kiếm thông tin này trước khi mua hàng.

Việc khuyến khích khách hàng để lại bài đánh giá sản phẩm hữu ích, đặc biệt là khi bài đánh giá đó mang tính tiêu cực, có thể khá khó khăn. Trong bài viết này, chúng ta sẽ khám phá cách sử dụng AI tạo sinh để giúp người dùng viết bài đánh giá đầy đủ thông tin, hỗ trợ quyết định mua hàng của người khác.

Bản minh hoạ và mã

Thử nghiệm với bản minh hoạ đánh giá sản phẩm và tìm hiểu mã trên GitHub.

Cách chúng tôi xây dựng ứng dụng này

AI phía máy khách

Đối với bản minh hoạ này, chúng tôi đã triển khai tính năng phía máy khách vì những lý do sau:

  • Độ trễ. Chúng tôi muốn cung cấp nội dung đề xuất nhanh chóng, ngay khi người dùng ngừng nhập. Chúng tôi có thể cung cấp tính năng này bằng cách tránh các lượt truy cập qua lại máy chủ.
  • Chi phí. Mặc dù đây là bản minh hoạ, nhưng nếu bạn đang cân nhắc việc ra mắt một tính năng tương tự trong phiên bản chính thức, thì bạn nên thử nghiệm mà không mất chi phí phía máy chủ cho đến khi bạn có thể xác thực xem tính năng đó có phù hợp với người dùng hay không.

AI tạo sinh MediaPipe

Chúng tôi đã chọn sử dụng mô hình Gemma 2B thông qua API suy luận LLM MediaPipe (gói MediaPipe GenAI) vì những lý do sau:

  • Độ chính xác của mô hình: Gemma 2B mang đến sự cân bằng tuyệt vời giữa kích thước và độ chính xác. Khi được nhắc đúng cách, công cụ này đã cho ra kết quả mà chúng tôi thấy hài lòng cho bản minh hoạ này.
  • Hỗ trợ trên nhiều trình duyệt: MediaPipe được hỗ trợ trong tất cả trình duyệt hỗ trợ WebGPU.

Trải nghiệm người dùng

Áp dụng các phương pháp hay nhất về hiệu suất

Mặc dù Gemma 2B là một LLM nhỏ, nhưng vẫn có dung lượng tải xuống lớn. Áp dụng các phương pháp hay nhất về hiệu suất, bao gồm cả việc sử dụng worker web.

Đặt tính năng này ở chế độ không bắt buộc

Chúng tôi muốn các đề xuất đánh giá dựa trên AI giúp nâng cao quy trình đăng bài đánh giá sản phẩm của người dùng. Trong quá trình triển khai, người dùng có thể đăng bài đánh giá ngay cả khi mô hình chưa tải và do đó chưa đưa ra các mẹo cải thiện.

Hình 1. Người dùng vẫn có thể đăng bài đánh giá, ngay cả khi tính năng AI chưa sẵn sàng.

Trạng thái giao diện người dùng và ảnh động

Quá trình suy luận thường mất nhiều thời gian hơn so với cảm giác ngay lập tức, vì vậy, chúng tôi sẽ báo hiệu cho người dùng rằng mô hình đang chạy quy trình suy luận hoặc "suy nghĩ". Chúng tôi sử dụng ảnh động để giúp người dùng dễ dàng chờ đợi, đồng thời đảm bảo rằng ứng dụng đang hoạt động như dự kiến. Khám phá các trạng thái giao diện người dùng mà chúng tôi đã triển khai trong bản minh hoạ, do Adam Argyle thiết kế.

Hình 2. Ảnh động minh hoạ rằng mô hình đang tải, sau đó "suy nghĩ" và cuối cùng là hoàn tất.

Lưu ý khác

Trong môi trường phát hành, bạn nên:

  • Cung cấp cơ chế phản hồi. Nếu các đề xuất không phù hợp hoặc không có ý nghĩa thì sao? Triển khai cơ chế phản hồi nhanh (chẳng hạn như biểu tượng thích và không thích) và dựa vào thông tin phỏng đoán để xác định những nội dung mà người dùng thấy hữu ích. Ví dụ: hãy đánh giá xem có bao nhiêu người dùng đang tương tác với tính năng này và liệu họ có tắt tính năng này hay không.
  • Cho phép người dùng chọn không tham gia. Điều gì sẽ xảy ra nếu người dùng muốn sử dụng từ ngữ của riêng họ mà không cần sự hỗ trợ của AI hoặc thấy tính năng này gây phiền toái? Cho phép người dùng chọn không sử dụng và chọn sử dụng lại nếu muốn.
  • Giải thích lý do tồn tại của tính năng này. Một lời giải thích ngắn gọn có thể khuyến khích người dùng sử dụng công cụ phản hồi. Ví dụ: "Ý kiến phản hồi chất lượng hơn giúp người mua sắm khác quyết định mua gì và giúp chúng tôi tạo ra những sản phẩm mà bạn muốn". Bạn có thể thêm nội dung giải thích chi tiết về cách hoạt động của tính năng và lý do bạn cung cấp tính năng đó, có thể là một đường liên kết để tìm hiểu thêm.
  • Công bố về cách thức sử dụng AI khi thích hợp. Với AI phía máy khách, nội dung của người dùng sẽ không được gửi đến máy chủ để xử lý, do đó có thể được giữ ở chế độ riêng tư. Tuy nhiên, nếu bạn xây dựng một phương án dự phòng phía máy chủ hoặc thu thập thông tin bằng AI, hãy cân nhắc thêm thông tin đó vào chính sách quyền riêng tư, điều khoản dịch vụ hoặc các nơi khác.

Triển khai

Cách triển khai của chúng tôi cho trình đề xuất bài đánh giá sản phẩm có thể phù hợp với nhiều trường hợp sử dụng. Hãy xem thông tin sau đây là cơ sở cho các tính năng AI phía máy khách trong tương lai.

MediaPipe trong một worker web

Với tính năng Suy luận LLM MediaPipe, mã AI chỉ là một vài dòng: tạo trình phân giải tệp và đối tượng suy luận LLM bằng cách truyền URL mô hình vào đó, sau đó sử dụng thực thể suy luận LLM đó để tạo phản hồi.

Tuy nhiên, mã mẫu của chúng ta có phần mở rộng hơn một chút. Đó là do tính năng này được triển khai trong một worker web, vì vậy, tính năng này sẽ truyền thông báo bằng tập lệnh chính thông qua mã thông báo tuỳ chỉnh. Tìm hiểu thêm về mẫu này.

// Trigger model preparation *before* the first message arrives
self.postMessage({ code: MESSAGE_CODE.PREPARING_MODEL });
try {
  // Create a FilesetResolver instance for GenAI tasks
  const genai = await FilesetResolver.forGenAiTasks(MEDIAPIPE_WASM);
  // Create an LLM Inference instance from the specified model path
  llmInference = await LlmInference.createFromModelPath(genai, MODEL_URL);
  self.postMessage({ code: MESSAGE_CODE.MODEL_READY });
} catch (error) {
  self.postMessage({ code: MESSAGE_CODE.MODEL_ERROR });
}

// Trigger inference upon receiving a message from the main script
self.onmessage = async function (message) {
  // Run inference = Generate an LLM response
  let response = null;
  try {
    response = await llmInference.generateResponse(
      // Create a prompt based on message.data, which is the actual review
      // draft the user has written. generatePrompt is a local utility function.
      generatePrompt(message.data),
    );
  } catch (error) {
    self.postMessage({ code: MESSAGE_CODE.INFERENCE_ERROR });
    return;
  }
  // Parse and process the output using a local utility function
  const reviewHelperOutput = generateReviewHelperOutput(response);
  // Post a message to the main thread
  self.postMessage({
    code: MESSAGE_CODE.RESPONSE_READY,
    payload: reviewHelperOutput,
  });
};
export const MESSAGE_CODE ={
  PREPARING_MODEL: 'preparing-model',
  MODEL_READY: 'model-ready',
  GENERATING_RESPONSE: 'generating-response',
  RESPONSE_READY: 'response-ready',
  MODEL_ERROR: 'model-error',
  INFERENCE_ERROR: 'inference-error',
};

Đầu vào và đầu ra

Hình 3. Sơ đồ minh hoạ quá trình xử lý câu lệnh thông qua suy luận đến đầu ra LLM thô, sau đó được phân tích cú pháp thành đề xuất đọc để hiển thị.

Câu lệnh đầy đủ của chúng tôi được tạo bằng câu lệnh đặt câu lệnh dựa trên một vài ví dụ. Dữ liệu này bao gồm nội dung do người dùng nhập, hay nói cách khác là bản nháp bài đánh giá mà người dùng đã viết.

Để tạo lời nhắc dựa trên dữ liệu đầu vào của người dùng, chúng ta gọi hàm tiện ích generatePrompt trong thời gian chạy.

Các mô hình và thư viện AI phía máy khách thường có ít tiện ích hơn so với AI phía máy chủ. Ví dụ: chế độ JSON thường không dùng được. Điều này có nghĩa là chúng ta cần cung cấp cấu trúc đầu ra mong muốn bên trong câu lệnh. Cách này kém rõ ràng, khó bảo trì và kém tin cậy hơn so với việc cung cấp giản đồ thông qua cấu hình mô hình. Ngoài ra, các mô hình phía máy khách thường nhỏ hơn, tức là chúng dễ gặp lỗi cấu trúc hơn trong đầu ra.

Trong thực tế, chúng tôi nhận thấy rằng Gemma 2B hoạt động hiệu quả hơn trong việc cung cấp kết quả có cấu trúc dưới dạng văn bản so với JSON hoặc JavaScript. Vì vậy, đối với bản minh hoạ này, chúng tôi đã chọn định dạng đầu ra dựa trên văn bản. Mô hình này tạo văn bản, sau đó chúng ta phân tích cú pháp đầu ra thành một đối tượng JavaScript để xử lý thêm trong ứng dụng web.

Cải thiện câu lệnh

Câu lệnh của tôi và câu trả lời trong giao diện Gemini Chat.
Hình 4. Chúng tôi yêu cầu Gemini Chat cải thiện câu lệnh của mình. Gemini Chat sẽ trả lời cùng với nội dung giải thích về những điểm cải tiến và một cảnh báo về hiệu quả.

Chúng tôi đã sử dụng LLM để lặp lại câu lệnh.

  • Câu lệnh dựa trên một vài ví dụ. Để tạo ví dụ cho các câu lệnh ít lần lặp, chúng tôi dựa vào Gemini Chat. Gemini Chat sử dụng các mô hình Gemini mạnh mẽ nhất. Điều này đảm bảo chúng tôi tạo ra các ví dụ chất lượng cao.
  • Đánh bóng lời nhắc. Sau khi cấu trúc của câu lệnh đã sẵn sàng, chúng tôi cũng sử dụng Gemini Chat để tinh chỉnh câu lệnh. Điều này giúp cải thiện chất lượng đầu ra.

Sử dụng ngữ cảnh để tăng chất lượng

Việc đưa loại sản phẩm vào câu lệnh của chúng tôi đã giúp mô hình đưa ra các đề xuất phù hợp và chất lượng cao hơn. Trong bản minh hoạ này, loại sản phẩm là tĩnh. Trong một ứng dụng thực tế, bạn có thể đưa sản phẩm vào lời nhắc một cách linh động, dựa trên trang mà người dùng đang truy cập.

Review: "I love these."
Helpful: No  
Fix: Be more specific, explain why you like these **socks**.
Example: "I love the blend of wool in these socks. Warm and not too heavy."

Một trong những ví dụ trong phần vài lần chụp của câu lệnh: loại sản phẩm "vớ" có trong nội dung sửa lỗi được đề xuất và trong bài đánh giá mẫu.

Sự cố và cách khắc phục LLM

Gemma 2B thường yêu cầu nhiều kỹ thuật hơn so với mô hình phía máy chủ lớn hơn, mạnh mẽ hơn.

Chúng tôi gặp phải một số vấn đề với Gemma 2B. Sau đây là cách chúng tôi cải thiện kết quả:

  • Quá tuyệt. Gemma 2B gặp khó khăn khi đánh dấu bài đánh giá là "không hữu ích", có vẻ như ngập ngừng khi đưa ra nhận xét. Chúng tôi đã cố gắng làm cho ngôn ngữ nhãn trung lập hơn ("cụ thể" và "không cụ thể" thay vì "hữu ích" và "không hữu ích") và thêm các ví dụ, nhưng điều này không cải thiện kết quả. Điều giúp cải thiện kết quả là sự kiên trì và lặp lại trong câu lệnh. Cách tiếp cận chuỗi suy nghĩ cũng có thể mang lại những điểm cải thiện.
  • Hướng dẫn không rõ ràng. Đôi khi, mô hình diễn giải quá mức câu lệnh. Thay vì đánh giá bài đánh giá, công cụ này tiếp tục danh sách ví dụ. Để khắc phục vấn đề này, chúng tôi đã thêm một phần chuyển đổi rõ ràng vào lời nhắc:

    I'll give you example reviews and outputs, and then give you one review
    to analyze. Let's go:
    Examples:
    <... Examples>
    
    Review to analyze:
    <... User input>
    

    Việc sắp xếp rõ ràng câu lệnh sẽ giúp mô hình phân biệt giữa danh sách ví dụ (một vài cảnh quay) và dữ liệu đầu vào thực tế.

  • Mục tiêu không chính xác. Đôi khi, mô hình đề xuất thay đổi đối với sản phẩm thay vì văn bản bài đánh giá. Ví dụ: đối với một bài đánh giá có nội dung "Tôi ghét tất này", mô hình có thể đề xuất "Hãy cân nhắc thay thế tất bằng một thương hiệu hoặc kiểu khác". Đây không phải là hiệu ứng mong muốn. Việc tách câu lệnh giúp làm rõ nhiệm vụ và cải thiện tiêu điểm của mô hình về bài đánh giá.