Build \'For you\' recommendations using AI on Fastly!

王林
Release: 2024-08-07 21:54:53
Original
879 people have browsed it

Forget the hype; where is AI delivering real value? Let's use edge computing to harness the power of AI and make smarter user experiences that are also fast, safe and reliable.

Recommendations are everywhere, and everyone knows that making web experiences more personalized makes them more engaging and successful. My Amazon homepage knows that I like home furnishings, kitchenware and right now, summer clothing:

Build

Today, most platforms make you choose between either being fast or being personalized. At Fastly, we think you — and your users — deserve to have both. If every time your web server generates a page, it is only suitable for one end user, you can't benefit from caching it, which is what edge networks like Fastly do well.

So how can you benefit from edge caching, and yet make content personalized? We've written a lot before about how to break up complex client requests into multiple smaller, cacheable backend requests, and you'll find tutorials, code examples and demos in the personalization topic on our developer hub.

But what if you want to go further and generate the personalisation dataat the edge? The "edge" - the Fastly servers handling your website's traffic, are the closest point to the end user that's still within your control. A great place to produce content that's specific to one user.

The "For you" use case

Product recommendations are inherently transient, specific to an individual user and likely to change frequently. But they also don't need to persist - we don't typically need to know what we've recommended to each person, only whether a particular algorithm achieves better conversion than another. Some recommendation algorithms need access to a large amount of state data, like what users are most similar to you and their purchase or rating history, but often that data is easy to pregenerate in bulk.

Basically, generating recommendations usually doesn't create a transaction, doesn't need any locks in your data store, and makes use of input data that's either immediately available from the current user's session, or created in an offline build process.

Sounds like we can generate recommendations at the edge!

A real world example

Let's take a look at the website of the New York Metropolitan Museum of Art:

Build

Each of the 500,000 or so objects in the Met's collection has a page with a picture and information about it. It also has this list of related objects:

Build

This seems to use a fairly straightforward system of faceting to generate these relationships, showing me other artworks by the same artist, or other objects in the same wing of the museum, or which are also made of paper or originate in the same time period.

The nice thing about this system (from a developer perspective!) is that since it's only based on the one input object, it can be pre-generated into the page.

What if we want to augment this with a selection of recommendations that are based on the end user's personal browsing history as they navigate around the Met's website, not just based on this one object?

Adding personalized recommendations

There's lots of ways we can do this, but I wanted to try using a language model, since AI ishappeningright now, and it's really different from the way the Met's existing related artworks mechanism seems to work. Here's the plan:

  1. Download the Met's open access collection dataset.
  2. Run it through a language model to create vector embeddings – lists of numbers suitable for machine learning tasks.
  3. Build a performant similarity search engine for the resulting half a million vectors (representing the Met’s artworks) and load it into KV store so we can use it from Fastly Compute.

Once we've done all that, we should be able to, as you browse the Met's website:

  1. Track the artworks you visit in a cookie.
  2. Look up the vectors corresponding to those artworks.
  3. Calculate an average vector representing your browsing interests.
  4. Plug that into our similarity search engine to find the most similar artworks.
  5. Load details about those artworks from the Met's Object API and augment the page with personalized recommendations.

Et voilà, personalized recommendations:

Build

OK, jadi mari kita pecahkan perkara itu.

Mencipta set data

Data data mentah Met ialah CSV dengan banyak lajur dan kelihatan seperti ini:

Object Number,Is Highlight,Is Timeline Work,Is Public Domain,Object ID,Gallery Number,Department,AccessionYear,Object Name,Title,Culture,Period,Dynasty,Reign,Portfolio,Constituent ID,Artist Role,Artist Prefix,Artist Display Name,Artist Display Bio,Artist Suffix,Artist Alpha Sort,Artist Nationality,Artist Begin Date,Artist End Date,Artist Gender,Artist ULAN URL,Artist Wikidata URL,Object Date,Object Begin Date,Object End Date,Medium,Dimensions,Credit Line,Geography Type,City,State,County,Country,Region,Subregion,Locale,Locus,Excavation,River,Classification,Rights and Reproduction,Link Resource,Object Wikidata URL,Metadata Date,Repository,Tags,Tags AAT URL,Tags Wikidata URL 1979.486.1,False,False,False,1,,The American Wing,1979,Coin,One-dollar Liberty Head Coin,,,,,,16429,Maker," ",James Barton Longacre,"American, Delaware County, Pennsylvania 1794–1869 Philadelphia, Pennsylvania"," ","Longacre, James Barton",American,1794 ,1869 ,,http://vocab.getty.edu/page/ulan/500011409,https://www.wikidata.org/wiki/Q3806459,1853,1853,1853,Gold,Dimensions unavailable,"Gift of Heinz L. Stoppelmann, 1979",,,,,,,,,,,,,,http://www.metmuseum.org/art/collection/search/1,,,"Metropolitan Museum of Art, New York, NY",,, 1980.264.5,False,False,False,2,,The American Wing,1980,Coin,Ten-dollar Liberty Head Coin,,,,,,107,Maker," ",Christian Gobrecht,1785–1844," ","Gobrecht, Christian",American,1785 ,1844 ,,http://vocab.getty.edu/page/ulan/500077295,https://www.wikidata.org/wiki/Q5109648,1901,1901,1901,Gold,Dimensions unavailable,"Gift of Heinz L. Stoppelmann, 1980",,,,,,,,,,,,,,http://www.metmuseum.org/art/collection/search/2,,,"Metropolitan Museum of Art, New York, NY",,,
Copy after login

Cukup mudah untuk mengubahnya menjadi dua lajur, ID dan rentetan:

id,description 1,"One-dollar Liberty Head Coin; Type: Coin; Artist: James Barton Longacre; Medium: Gold; Date: 1853; Credit: Gift of Heinz L. Stoppelmann, 1979" 2,"Ten-dollar Liberty Head Coin; Type: Coin; Artist: Christian Gobrecht; Medium: Gold; Date: 1901; Credit: Gift of Heinz L. Stoppelmann, 1980" 3,"Two-and-a-Half Dollar Coin; Type: Coin; Medium: Gold; Date: 1927; Credit: Gift of C. Ruxton Love Jr., 1967"
Copy after login

Kini kita boleh menggunakan pakej transformer daripada set alat Hugging Face AI, dan menjana pembenaman setiap huraian ini. Kami menggunakan model pengubah ayat/semua-MiniLM-L12-v2 dan menggunakan analisis komponen utama (PCA) untuk mengurangkan vektor yang terhasil kepada 5 dimensi. Itu memberi anda sesuatu seperti:

[ { "id": 1, "vector": [ -0.005544120445847511, -0.030924081802368164, 0.008597176522016525, 0.20186401903629303, 0.0578165128827095 ] }, { "id": 2, "vector": [ -0.005544120445847511, -0.030924081802368164, 0.008597176522016525, 0.20186401903629303, 0.0578165128827095 ] }, … ]
Copy after login

Kami mempunyai setengah juta daripada ini, jadi tidak mungkin untuk menyimpan keseluruhan set data ini dalam memori apl tepi. Dan kami ingin melakukan jenis carian persamaan tersuai ke atas data ini, yang merupakan sesuatu yang tidak ditawarkan oleh kedai nilai kunci tradisional. Memandangkan kami sedang membina pengalaman masa nyata, kami juga benar-benar ingin mengelak daripada mencari setengah juta vektor pada satu masa.

Jadi, mari kita bahagikan data. Kita boleh menggunakan pengelompokan KMeans untuk mengumpulkan vektor yang serupa antara satu sama lain. Kami menghiris data kepada 500 kelompok dengan saiz yang berbeza-beza dan mengira titik tengah yang dipanggil "vektor centroid" untuk setiap kelompok tersebut. Jika anda memplot ruang vektor ini dalam dua dimensi dan mengezum masuk, ia mungkin kelihatan seperti ini:

Build

Palang merah ialah titik pusat matematik bagi setiap kelompok vektor, dipanggil centroid. Mereka boleh berfungsi seperti pencari jalan untuk ruang setengah juta vektor kami. Sebagai contoh, jika kita ingin mencari 10 vektor yang paling serupa dengan vektor A tertentu, kita boleh mencari centroid terdekat (daripada 500) dahulu, kemudian lakukan carian kita hanya dalam kelompok yang sepadan–kawasan yang lebih mudah diurus!

Kini kami mempunyai 500 set data kecil dan indeks yang memetakan titik centroid kepada set data yang berkaitan. Seterusnya, untuk mendayakan prestasi masa nyata, kami ingin menyusun semula graf carian supaya kami tidak perlu memulakan dan membinanya pada masa jalan dan boleh menggunakan masa CPU sesedikit mungkin. Algoritma jiran terdekat yang sangat pantas ialah Hierarchical Navigable Small Worlds (HNSW), dan ia mempunyai pelaksanaan Rust tulen, yang kami gunakan untuk menulis apl kelebihan kami. Oleh itu, kami menulis apl Rust kendiri yang kecil untuk membina struktur graf HNSW bagi setiap set data, dan kemudian menggunakan kod bin untuk mengeksport memori struct yang di instantiated ke dalam gumpalan binari.

Kini, gumpalan binari tersebut boleh dimuatkan ke dalam stor KV, dikunci pada indeks kluster dan indeks kluster boleh dimasukkan dalam apl tepi kami.

Seni bina ini membolehkan kami memuatkan bahagian indeks carian ke dalam memori atas permintaan. Dan kerana kami tidak perlu mencari lebih daripada beberapa ribu vektor pada satu masa, carian kami akan sentiasa murah dan pantas.

Membina apl edge

Aplikasi yang kami jalankan di tepi perlu mengendalikan beberapa jenis permintaan:

  • Halaman HTML:Kami mengambilnya daripada metmuseum.org dan mengubah respons untuk menambah bahagian depan dan tag, supaya kami boleh menyuntik sedikit pemprosesan dan kandungan bahagian hadapan kami sendiri
  • Sumber skrip dan gaya Fastlydirujuk oleh teg tambahan tersebut, yang boleh kami sediakan terus daripada perduaan apl edge.
  • Titik akhir pengesyor, yang menjana dan mengembalikan pengesyoran **Semua permintaan (bukan HTML) lain:Imej, dan skrip serta lembaran gaya Met sendiri, yang kami proksi terus dari domain mereka tanpa perubahan.

Kami pada mulanya membina apl ini dalam JavaScript, tetapi akhirnya mengalihkan bahagian pengesyor kepada Rust kerana kami menyukai pelaksanaan HNSW dalam jarak segera.

JavaScript pihak pelanggan melakukan beberapa perkara menarik:

  1. Menggunakan IntersectionObserver, kami mencetuskan peristiwa apabila pengguna menatal ke bawah halaman ke bahagian objek yang berkaitan. Ini ialah API super cekap yang jauh lebih baik daripada menggunakan kaedah lama seperti onscroll.
  2. Buat pengambilan titik akhir API pengesyoran khas kami (yang kemudiannya boleh kami kendalikan di tepi dan kembalikan maklumat objek)
  3. Karang beberapa HTML menggunakan templat terbina dalam fungsi sisi pelanggan
  4. Tambahkan HTML itu pada halaman dan alihkan pemerhati persimpangan ke elemen baharu supaya sambil anda menatal melalui pengesyoran, kami terus memuatkan lebih banyak lagi.

Dengan cara ini, kami boleh menghantar muatan HTML utama tanpa menggunakan algoritma pengesyoran kami, tetapi pengesyoran dihantar cukup pantas sehingga kami boleh memuatkannya semasa anda menatal dan ia hampir pasti akan berada di sana apabila anda sampai kepadanya.

Saya suka melakukan perkara dengan cara ini kerana memberikan paparan pertama di bahagian atas kepada pengguna secepat mungkin adalah perkara yang penting. Apa-apa sahaja yang anda tidak dapat lihat melainkan anda menatal boleh dimuatkan kemudian, dan terutamanya jika ia adalah kandungan yang diperibadikan yang kompleks - tiada gunanya menjananya jika pengguna tidak merancang untuk menatal.

Menutup pemikiran

Jadi kini anda mempunyai yang terbaik dari kedua-dua dunia: keupayaan untuk menyampaikan kandungan yang sangat diperibadikan, hampir tidak memerlukan sebarang penyekatan diambil ke asal, dan muatan HTML yang dioptimumkan yang menghasilkan sangat pantas, membolehkan aplikasi anda menikmati skalabiliti tanpa had yang berkesan dan daya tahan yang hampir sempurna .

Ia bukan penyelesaian yang sempurna. Alangkah baiknya jika Fastly menawarkan lebih banyak ciri tahap lebih tinggi untuk mendedahkan data tepi melalui mekanisme pertanyaan selain daripada carian kunci mudah (beritahu kami jika itu akan membantu anda!) dan mekanisme khusus ini mempunyai kelemahan yang jelas - jika saya mempunyai minat yang berasingan dalam dua atau lebih perkara yang sangat berbeza (katakan lukisan minyak abad ke-19 dan amphora Rom purba) Saya akan mendapat pengesyoran yang akan menjadi "titik tengah" semantik teori di antaranya, bukan hasil yang sangat berguna.

Namun, mudah-mudahan ini menunjukkan prinsip bahawa memikirkan cara melakukan kerja di bahagian tepi selalunya menghasilkan faedah yang luar biasa dari segi skalabiliti, prestasi dan daya tahan.

Beritahu kami perkara yang anda bina di community.fastly.com!

The above is the detailed content of Build \'For you\' recommendations using AI on Fastly!. For more information, please follow other related articles on the PHP Chinese website!

source:dev.to
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
About us Disclaimer Sitemap
php.cn:Public welfare online PHP training,Help PHP learners grow quickly!