Hệ thống khuyến nghị đã trở thành một phần không thể thiếu trong cuộc sống của chúng ta. Những thuật toán thông minh này đóng vai trò then chốt trong việc định hình trải nghiệm trực tuyến của chúng ta, ảnh hưởng đến nội dung chúng ta xem, sản phẩm chúng ta mua và dịch vụ chúng ta khám phá. Cho dù chúng ta đang phát trực tuyến nội dung trên các nền tảng như Netflix , khám phá âm nhạc mới trên Spotify hay mua sắm trực tuyến, các hệ thống đề xuất vẫn âm thầm hoạt động ở hậu trường để cá nhân hóa và nâng cao khả năng tương tác của chúng ta.
Yếu tố độc đáo của các hệ thống đề xuất này là khả năng hiểu và dự đoán sở thích của chúng tôi dựa trên hành vi lịch sử và mẫu người dùng. Bằng cách phân tích các lựa chọn trước đây của chúng tôi, các hệ thống này sẽ đưa ra các đề xuất phù hợp, giúp chúng tôi tiết kiệm thời gian và công sức đồng thời giới thiệu cho chúng tôi nội dung/sản phẩm phù hợp với sở thích của chúng tôi. Điều này nâng cao sự hài lòng của người dùng và thúc đẩy khả năng khám phá, giới thiệu cho chúng tôi những dịch vụ mới và phù hợp mà chúng tôi có thể chưa gặp phải.
Ở cấp độ cao, các nhà phát triển hiểu rằng các thuật toán này được hỗ trợ bởi hệ thống học máy và học sâu (có thể gọi là mạng thần kinh), nhưng điều gì sẽ xảy ra nếu tôi nói với bạn rằng có một cách để xây dựng công cụ đề xuất mà không gặp khó khăn khi triển khai mạng thần kinh của bạn? mô hình net hay máy học?
Câu hỏi này đặc biệt phù hợp trong bối cảnh các công ty khởi nghiệp ở giai đoạn đầu và giữa vì họ không có nhiều dữ liệu có cấu trúc để đào tạo mô hình của mình. Và như chúng ta đã biết, hầu hết các mô hình học máy sẽ không đưa ra dự đoán chính xác nếu không có dữ liệu đào tạo phù hợp.
Gần đây tôi đã xây dựng và triển khai một công cụ đề xuất cơ bản cho một
Tôi đã có một cuộc họp rộng rãi
Ở cấp độ cao, chúng tôi có các yêu cầu sau từ góc độ kỹ thuật -
Hệ thống sẽ có thể nắm bắt được sở thích của người dùng dưới dạng từ khóa. Hệ thống cũng có thể phân loại mức độ quan tâm của người dùng đối với các từ khóa cụ thể.
Hệ thống phải có khả năng nắm bắt được sự quan tâm của người dùng đối với những người dùng khác. Nó có thể phân loại mức độ quan tâm của người dùng đối với nội dung do người dùng khác tạo.
Hệ thống sẽ có thể tạo ra các đề xuất chất lượng cao dựa trên sở thích của người dùng.
Hệ thống phải có thể đảm bảo rằng các đề xuất đã được người dùng xem/từ chối sẽ không xuất hiện lại trong X số ngày.
Hệ thống phải có logic để đảm bảo rằng các bài đăng của cùng một người sáng tạo không được nhóm trên cùng một trang. Hệ thống nên cố gắng hết sức để đảm bảo rằng nếu người dùng xem mười bài đăng (kích thước trang của chúng tôi), thì tất cả những bài đăng đó phải đến từ những người sáng tạo khác nhau.
Hệ thống phải nhanh. Độ trễ P99 dưới 150 mili giây.
Tất cả các yêu cầu phi chức năng khác, chẳng hạn như tính sẵn sàng cao, khả năng mở rộng, bảo mật, độ tin cậy, khả năng bảo trì, v.v., phải được đáp ứng.
Một lần nữa, đây là một danh sách các báo cáo vấn đề được đơn giản hóa quá mức. Trên thực tế, các tài liệu dài hơn 3000 từ vì chúng cũng bao gồm rất nhiều trường hợp phức tạp và các trường hợp góc có thể phát sinh khi tích hợp công cụ đề xuất này vào các hệ thống hiện có của chúng tôi. Hãy chuyển sang giải pháp.
Tôi sẽ thảo luận từng giải pháp cho vấn đề và sau đó sẽ mô tả hoạt động tổng thể của toàn bộ hệ thống.
Để làm được điều này, chúng tôi đã tạo ra một thứ gọi là
Như bạn có thể thấy từ hình ảnh trên, chúng tôi đang lưu trữ rất nhiều thông tin, chẳng hạn như số lượng tương tác (thích, nhận xét, chia sẻ) và mức độ gần đây của những tương tác này (khi chúng xảy ra lần cuối) cũng như dữ liệu về mối quan hệ giữa hai người dùng giữa một người dùng và một mối quan tâm. Chúng tôi thậm chí còn lưu trữ mối quan hệ giữa hai từ khóa sở thích khác nhau. tôi đã sử dụng
Những từ khóa quan tâm này chủ yếu là danh từ. Có một hệ thống chia nhỏ nội dung của bài đăng thành các từ khóa (danh từ) này. Nó được hỗ trợ bởi AWS; dịch vụ xử lý ngôn ngữ tự nhiên (NLP) sử dụng máy học để chia văn bản thành các thực thể, cụm từ khóa, v.v. Một lần nữa, bạn có thể sử dụng bất kỳ dịch vụ NLP được quản lý nào (một số dịch vụ có sẵn) để thực hiện điều tương tự. Bạn không cần phải tìm hiểu hoặc triển khai các mô hình học máy của mình! Nếu bạn đã hiểu về học máy thì bạn có thể kiểm tra
Sơ đồ sau đây là sự trình bày ở cấp độ cao được đơn giản hóa về cách hệ thống hoạt động.
Mặc dù những điều trên có vẻ dễ dàng nhưng còn có rất nhiều điều khác diễn ra ở mỗi bước và những điều đó phải được suy nghĩ kỹ lưỡng rồi lập trình để đảm bảo hệ thống hoạt động tối ưu.
Hãy để tôi giải thích từng bước:
Để tạo ra những đề xuất này, trước tiên, chúng tôi phải chuyển đổi nội dung của bài đăng thành thứ gọi là -
Để tạo các phần nhúng vectơ, bạn có thể sử dụng bất kỳ mô hình nhúng nổi bật nào, chẳng hạn như mô hình nhúng OpenAI , Amazon titan hoặc bất kỳ mô hình nhúng văn bản nguồn mở nào, tùy thuộc vào trường hợp sử dụng của bạn. Chúng tôi chọn Amazon Titan vì giá cả thân thiện, hiệu suất và khả năng vận hành dễ dàng.
Bây giờ, đây là nơi mọi thứ trở nên thú vị. Bạn sẽ muốn thiết kế các truy vấn dựa trên nhu cầu kinh doanh cụ thể của mình. Ví dụ: chúng tôi đánh giá cao mức độ tương tác gần đây trong khi truy vấn sở thích hơn số lượng tương tác với một từ khóa hoặc người dùng cụ thể. Chúng tôi cũng chạy nhiều truy vấn song song để tìm các loại sở thích khác nhau của người dùng - từ khóa hoặc người dùng khác. Vì chúng tôi tạo nhiều nguồn cấp dữ liệu cho một người dùng nên chúng tôi cũng chạy một số truy vấn quảng cáo một chủ đề cụ thể theo xu hướng (ví dụ: bạn sẽ thấy nhiều bài đăng liên quan đến Giáng sinh gần Giáng sinh hoặc các bài đăng liên quan đến động đất nếu trận động đất nào đó đã xảy ra). Không cần phải nói, chủ đề này sẽ chỉ xuất hiện trong kết quả truy vấn nếu người dùng bày tỏ sự quan tâm đến họ trong hành trình của họ.
Vì vậy, hãy chọn logic phù hợp với trường hợp sử dụng kinh doanh của bạn cũng như hành vi mà bạn muốn thúc đẩy và chạy nhiều truy vấn để có được danh sách đủ lớn về tất cả sở thích của người dùng.
Cơ sở dữ liệu vectơ chủ yếu được sử dụng để thực hiện một loại tìm kiếm cụ thể được gọi là
Cache cơ sở dữ liệu vì một trong những vấn đề mà chúng ta cần giải quyết là tốc độ. Chúng tôi đã sử dụng các bộ được sắp xếp lại để lưu trữ ID duy nhất của bài đăng cho một người dùng cụ thể. Chúng tôi đã sử dụng các bộ được sắp xếp lại vì thứ tự các bài đăng trong nguồn cấp dữ liệu của người dùng là rất quan trọng. Ngoài ra, một vấn đề khác mà bạn phải giải quyết là “ hệ thống phải có logic để đảm bảo rằng các bài đăng của cùng một người sáng tạo không được nhóm trên cùng một trang”. Để tránh lặp lại nội dung của cùng một người sáng tạo, chúng tôi đã viết một thuật toán đơn giản để đảm bảo rằng nếu bài đăng của một người sáng tạo cụ thể được chèn vào bất kỳ vị trí nào trong nguồn cấp dữ liệu của một người dùng cụ thể (bộ đã sắp xếp), chúng tôi sẽ không chèn một bài đăng khác từ cùng một người sáng tạo cho mười vị trí liên tiếp (chúng tôi có kích thước trang là 10 trong khi phân phát nguồn cấp dữ liệu cho người dùng cuối, vì vậy chúng tôi giữ nó ở trạng thái tĩnh để tránh phức tạp).
Để quyết định thứ tự của một đề xuất cụ thể của người dùng, chúng tôi đã tính đến những điều sau -
Sức mạnh của mối quan hệ với sở thích cụ thể (hoặc người dùng khác) đối với người dùng này : Nó được xác định bằng công thức số học lấy nhiều điểm dữ liệu khác nhau từ biểu đồ xã hội. Tất cả những điều này đều là dữ liệu tương tác như dấu thời gian của lượt thích cuối cùng được tạo, số lượt thích được tạo, nhận xét cuối cùng, v.v. Hành vi tương tác của người dùng là dấu hiệu cho thấy họ quan tâm đến điều gì đó.
Mức độ phổ biến của bài đăng trên nền tảng: Để xác định điều này, chúng tôi đã tạo một thuật toán lấy nhiều yếu tố khác nhau như mức độ tương tác, tỷ lệ tương tác trên hiển thị, số lượng người dùng duy nhất đã tương tác, v.v. để tạo ra điểm tương tác đó đăng ở cấp độ nền tảng.
Trong một số nguồn cấp dữ liệu, chúng tôi ưu tiên mức độ phổ biến; ở những nơi khác, chúng tôi ưu tiên biểu đồ xã hội. Nhưng chủ yếu, tất cả chúng đều là sự kết hợp lành mạnh của cả hai.
Như bạn có thể thấy từ sơ đồ trên, hệ thống đã được cố tình giữ rất đơn giản. Sau đây là cách hệ thống hoạt động -
Khi người dùng A tạo một bài đăng, dịch vụ bưu chính, sau khi lưu bài đăng đó, sẽ kích hoạt một sự kiện pub/sub vào hàng đợi, sự kiện này sẽ được nhận bởi một dịch vụ nền dành cho việc tạo ứng viên. Chúng tôi sử dụng
Dịch vụ nền này nhận thông tin này một cách không đồng bộ và thực hiện các chức năng được thảo luận trước đó - Kiểm tra quyền riêng tư, kiểm tra kiểm duyệt và tạo từ khóa, sau đó tạo các phần nhúng vectơ và lưu trữ chúng trong cơ sở dữ liệu vectơ. Chúng tôi đang sử dụng
Bất cứ khi nào người dùng tương tác (thích/bình luận/chia sẻ, v.v.) sau khi cập nhật cơ sở dữ liệu NoSQL chính của chúng tôi, dịch vụ hậu kỳ sẽ kích hoạt một sự kiện pub/sub cho dịch vụ công cụ đề xuất.
Dịch vụ công cụ đề xuất này cập nhật cơ sở dữ liệu biểu đồ và sau đó cập nhật nguồn cấp dữ liệu được đề xuất của người dùng trong thời gian gần thực bằng cách thực hiện tìm kiếm ANN và cập nhật cơ sở dữ liệu Redis. Vì vậy, càng nhiều người dùng tương tác thì nguồn cấp dữ liệu càng trở nên tốt hơn. Có các bước kiểm tra để đảm bảo rằng các đề xuất không thiên về một danh sách từ khóa cụ thể . Những kiểm tra đó được thực hiện trong khi chúng tôi truy vấn cơ sở dữ liệu Đồ thị. Dịch vụ này cũng cập nhật điểm tương tác không đồng bộ. Điểm tương tác cũng được tính lại đối với người dùng xem bài đăng.
Vì tất cả các bước trên được thực hiện không đồng bộ ở hậu trường nên những tính toán này không ảnh hưởng đến trải nghiệm của người dùng cuối.
Nguồn cấp dữ liệu cuối cùng được cung cấp cho người dùng cuối thông qua dịch vụ nguồn cấp dữ liệu. Vì dịch vụ này chỉ thực hiện tra cứu trên redis và cơ sở dữ liệu NoSQL chính của chúng tôi (
Một số dịch vụ đã được viết bằng
Chúng tôi đang sử dụng
Chúng tôi sử dụng
Như bạn có thể tưởng tượng, thiết lập tương tự này có thể được điều chỉnh để xây dựng công cụ đề xuất cơ bản cho mọi trường hợp sử dụng. Tuy nhiên, vì mạng của chúng tôi là mạng xã hội nên chúng tôi sẽ yêu cầu một số điều chỉnh về sau để hệ thống này hoạt động hiệu quả hơn.
Sẽ cần đến các thuật toán học máy/học sâu ở cấp độ biểu đồ xã hội để dự đoán các từ khóa và người dùng phù hợp nhất với người dùng. Hiện tại, tập dữ liệu quá nhỏ để có thể dự đoán chính xác bất cứ điều gì vì đây là một sản phẩm rất mới. Tuy nhiên, khi dữ liệu tăng lên, chúng ta sẽ cần thay thế các truy vấn và công thức đơn giản hiện tại bằng đầu ra của thuật toán học máy.
Mối quan hệ giữa các từ khóa khác nhau và người dùng phải được tinh chỉnh và chi tiết hơn. Hiện tại họ đang ở một đẳng cấp rất cao. Nhưng họ sẽ cần phải sâu sắc hơn. Trước tiên, chúng tôi sẽ cần khám phá các mối quan hệ cấp độ thứ hai và cấp độ thứ ba trong biểu đồ của mình để tinh chỉnh các đề xuất.
Hiện tại, chúng tôi không thực hiện bất kỳ tinh chỉnh nào trong các mô hình nhúng của mình. Chúng ta sẽ cần phải làm điều đó trong thời gian tới.
Tôi hy vọng bạn thấy blog này hữu ích. Nếu bạn có bất kỳ câu hỏi, nghi ngờ hoặc đề xuất nào, xin vui lòng liên hệ với tôi trên
Cũng được xuất bản ở đây .