Bagaimana kami mengajar Yandex untuk menjawab pertanyaan dan menghemat pengguna 20 ribu jam sehari



Saat kami memasukkan kueri di bilah pencarian, kami mencari informasi, bukan tautan. Lagipula, sering kali kita membutuhkan kalimat pendek atau fakta yang terkenal. Misalnya, [ rumus untuk volume piramida terpotong ] adalah sama di semua situs - tautan tidak diperlukan, cukup berikan jawaban.

Tidak ada yang dapat mengejutkan siapa pun dengan jawaban faktual (informasional), tetapi hanya sedikit orang yang tahu bagaimana mereka dibentuk, bagaimana mereka berbeda, dan apa yang terjadi di daerah ini baru-baru ini. Nama saya Anton Ivanov. Hari ini, bersama dengan rekan saya Mikhail Ageevdminerkami akan menceritakan kisah tentang jawaban dalam pencarian dan membagikan beberapa detail yang belum pernah dibahas sebelumnya. Semoga bermanfaat.

Sejarah Internet adalah sejarah penyederhanaan pencarian informasi. Sekali waktu, orang mengunjungi katalog online untuk menemukan jawaban di mana tautan ke situs dikelompokkan berdasarkan topik. Seiring waktu, mesin pencari muncul, mereka belajar bagaimana mencari situs dengan kata kunci. Permintaan akan pencarian cepat untuk informasi merangsang perkembangan teknologi: pencarian kata berangsur-angsur berkembang menjadi pencarian dengan makna, ketika jawabannya dapat ditemukan pada halaman dengan nol persimpangan dengan kata kunci. Tetapi bahkan dalam kasus ini, saya harus mengklik tautannya. Orang selalu memimpikan lebih banyak.

Fakta pertama


Sekarang sulit untuk mengingat bagaimana jawaban faktual Yandex dimulai. Kita dapat mengatakan bahwa solusinya adalah format khusus dari tukang sihir, yang mengasumsikan respons teks pendek tanpa interaktivitas (sebagai lawan menanggapi permintaan [ alamat ip saya ] atau [ warna aqua ]). Seperti yang Anda ketahui, menerapkan format seperti itu tidaklah sulit. Pertanyaan utamanya berbeda: dari mana mendapatkan jawaban?



Kami mulai dengan cara teknis termudah. Orang khusus (penilai) menganalisis pertanyaan yang paling populer, memilih pertanyaan yang dapat Anda temukan jawabannya. Contoh klasik dari permintaan seperti itu adalah [ berapa banyak cakar yang dimiliki lalat ].



Dengan cara ini, dimungkinkan untuk hanya mencakup permintaan yang paling populer, dan ekor panjang dari pertanyaan lainnya diabaikan. Sebagian, kami memecahkan masalah ini dengan bantuan crowdsourcing.

Beberapa tahun yang lalu, tolokers mulai membantu kami mengisi basis data jawaban faktual. Permintaan yang sering diunggah ke platform, tolokers melihat tugas: “Apakah benar Anda dapat memberikan jawaban lengkap untuk permintaan ini? Dan jika benar, maka berikan. " Tentu saja, toloker lain memeriksa kecukupan jawaban, dan kami menangkap kesalahan dengan bantuan penjaga pencarian . Ngomong-ngomong, tolokers juga membantu kami mengetahui bahwa jawaban sebenarnya dengan gambar biasanya disukai oleh pengguna lebih dari sekadar teks.

Bantuan tolokers sangat penting, tetapi bahkan mereka tidak akan membantu untuk menutupi ekor panjang dari pertanyaan frekuensi rendah. Ada terlalu banyak permintaan seperti itu untuk setiap markup manual: tidak ada puluhan ribu, tetapi jutaan! Untuk mengatasi masalah ini, pengalaman peringkat pencarian berguna bagi kami.

Cuplikan fakta


Ketika Anda mencari sesuatu dalam pencarian Yandex, Anda tidak hanya melihat 10 tautan, tetapi juga judul, deskripsi, ikon, dan data lainnya.

Kami fokus pada deskripsi. Pencarian kami membuatnya secara otomatis. Untuk menyoroti fragmen teks terbaik, model CatBoost ringan digunakan, yang memperkirakan kedekatan fragmen teks dan permintaan. Ternyata uraian tautan terkadang sudah berisi jawaban faktual. Akan aneh untuk tidak mengambil keuntungan dari ini - tetapi tidak begitu sederhana.

Tampaknya tugas untuk memilih deskripsi “paling faktual” di antara semua deskripsi halaman yang ditemukan berdasarkan permintaan, tetapi pendekatan ini tidak akan berfungsi dengan baik. Alasannya adalah bahwa deskripsi informatif dari halaman tidak selalu bertepatan dengan jawaban yang baik untuk pertanyaan langsung seseorang. Oleh karena itu, teknologi Fact Snippet kami membangun fakta secara paralel dengan deskripsi halaman, tetapi berdasarkan parameter lain sehingga hasilnya mirip dengan jawabannya. Dan sekarang di antara mereka Anda harus memilih jawaban yang paling berkualitas tinggi.

Kami sudah memberi tahupada Habré tentang algoritma pencarian "Palekh", "Korolev" dan tentang pendekatan DSSM. Tugas kemudian turun untuk menemukan teks yang dekat artinya ketika memeringkat halaman. Bahkan, kami membandingkan dua vektor: vektor kueri dan vektor teks dokumen. Semakin dekat vektor-vektor ini dalam ruang multidimensi, semakin dekat pula makna teks. Untuk memilih fakta kualitas terbaik, kami melakukan hal yang sama. Model jaringan saraf kami, terlatih dengan jawaban yang sudah kami ketahui, membangun vektor respons untuk halaman yang ditemukan dalam pencarian dan membandingkannya dengan vektor kueri. Jadi kami mendapat jawaban terbaik.

Jelas bahwa menjawab semua permintaan dengan cara ini tidak sepadan: sebagian besar permintaan tidak memerlukan jawaban faktual. Oleh karena itu, kami menggunakan model lain untuk membatalkan permintaan “non-faktual”.

Cuplikan Fakta 2.0


Semua yang kita bicarakan di atas berkaitan dengan jawaban faktual "klasik": pendek, komprehensif, seperti dalam ensiklopedia. Arah ini telah lama menjadi satu-satunya. Tetapi semakin jauh, semakin kita melihat bahwa pembagian atas dasar adanya jawaban yang lengkap, di satu sisi, sangat goyah, dan di sisi lain - buram bagi pengguna: ia hanya perlu menyelesaikan masalahnya lebih cepat. Butuh saya untuk melampaui fakta yang biasa. Maka proyek tersebut muncul Fact Snippet 2.0.



Untuk menyederhanakan banyak hal, Fact Snippet 2.0 adalah Snippet Fakta yang sama, tetapi tanpa persyaratan untuk menemukan "jawaban komprehensif". Bahkan, semuanya agak lebih rumit.

Biarkan saya mengingatkan Anda bahwa Fact Snippet bekerja dalam dua tahap. Pada tahap pertama, menggunakan model yang mudah, kami mengevaluasi "sifat faktual" dari permintaan: apakah itu berarti jawaban faktual atau tidak. Jika ya, pada tahap kedua kami sedang mencari jawaban, itu muncul di hasil pencarian. Untuk Fact Snippet 2.0, kami mengadaptasi kedua langkah untuk menemukan jawaban untuk berbagai pertanyaan. Jawaban seperti itu tidak mengklaim sebagai ensiklopedis secara keseluruhan, tetapi masih bermanfaat.

Dimungkinkan, tetapi tidak selalu perlu, untuk memilih paragraf teks untuk setiap permintaan. Terkadang teks yang ditemukan tidak cukup relevan dengan kueri. Terkadang kami sudah memiliki jawaban yang bagus dari sumber lain - dan kami harus memutuskan mana yang akan dipilih. Misalnya, mengapa menawarkan alamat organisasi dalam teks jika Anda dapat menampilkan peta interaktif, nomor telepon, dan ulasan. Kami memecahkan masalah ini dengan bantuan sebuah classifier blender, dengan yang Andrei Styskin sudah berkenalan pembaca Habr . Dan jawabannya tidak harus kasar, menghina. Hampir setiap pembatasan yang masuk akal memiliki penggolongnya sendiri, dan membuatnya bekerja dalam runtime dalam sepersekian detik adalah pencarian lain.

Formulasi ulang kueri


Mereka menutupi bagian lain dari ekor panjang, tetapi banyak permintaan "unik" tetap ada. Sebagian besar dari mereka adalah rumusan pertanyaan lain yang sudah kami ketahui. Misalnya, [ ketika tombak berganti gigi ] dan [pada saat apa tombak berganti gigi ] adalah hal yang hampir sama.



Untuk mengatasi masalah ini, kami menemukan mekanisme yang dengan cepat memahami bahwa permintaan yang masuk adalah alias (berarti sama) dari permintaan lain, jawaban yang sudah kami miliki. Ini lebih mudah dan lebih cepat daripada secara independen menghasilkan dua jawaban faktual.

Kami menerima semua permintaan yang jawabannya ada, mengubahnya menjadi vektor dan memasukkannya ke dalam indeks k-NN (lebih tepatnya, dalam versi HNSW yang dioptimalkanyang memungkinkan Anda untuk mencari lebih cepat). Selanjutnya, kami membuat vektor kueri yang tidak ada jawaban dengan kebetulan langsung, dan mencari N teratas atas permintaan paling mirip di k-NN kami.

Selanjutnya, kita pergi melalui bagian atas ini dan menjalankan melalui pengklasifikasi katbust dari triple:

- permintaan pengguna;
- permintaan dari k-NN;
- Menanggapi permintaan dari k-NN.

Jika verifier verifier positif, permintaan dianggap sebagai alias dari permintaan dari k-NN, kami dapat mengembalikan jawaban yang sudah diketahui.

Bagian kreatif utama dari desain ini adalah faktor tertulis untuk pengklasifikasi. Di sini kami mencoba banyak ide berbeda. Di antara faktor-faktor terkuat:

- vektor permintaan;
- Jarak Levenshtein;
- kata demi kata embeddings;
- faktor-faktor berdasarkan berbagai penyihir untuk setiap permintaan;
- jarak antara kata-kata permintaan.

Secara terpisah, saya akan berbicara tentang trik menggunakan jaringan saraf BERT. Kami memiliki batasan yang agak kuat pada waktu untuk mencari alias: maksimum beberapa milidetik. Tidak mungkin melakukan BERT dalam waktu seperti itu dengan beban beberapa ribu RPS pada sumber daya saat ini. Oleh karena itu, dengan model BERT kami, kami mengumpulkan banyak (ratusan juta) perkiraan buatan dan melatih mereka DSSM jaringan saraf yang lebih sederhana, yang bekerja sangat cepat dalam runtime. Akibatnya, dengan hilangnya keakuratan, diperoleh faktor yang kuat.

Bahkan, seseorang dapat menentukan kedekatan permintaan semantik dengan cara lain. Misalnya, jika dua kueri berbeda satu sama lain dalam satu kata - periksa bagaimana hasil pencarian untuk kueri ini berbeda (lihat jumlah tautan yang cocok di atas). Jika Anda mengulangi ini jutaan kali dan rata-rata hasilnya, Anda mendapatkan perkiraan yang cukup bagus tentang seberapa banyak makna permintaan berubah jika Anda mengubah satu kata untuk yang lain di dalamnya. Setelah itu, Anda dapat menambahkan semua data ke dalam satu struktur (misalnya, trie) dan menghitung ukuran kedekatan kueri melalui jarak Levenshtein yang digeneralisasi. Anda dapat memperluas pendekatan ini dan mempertimbangkan tidak hanya kata-kata, tetapi juga pasangan kata-kata (tetapi trie diperoleh lebih banyak karena pertumbuhan data yang eksponensial).

Apa berikutnya


Menurut perkiraan kami, berkat jawaban faktual / informasi, kami menghemat pengguna 20 ribu jam setiap hari, karena mereka tidak harus melihat melalui tautan dalam hasil pencarian (dan ini tidak termasuk waktu yang akan mereka habiskan untuk menemukan jawaban di situs). Ini bagus, tetapi selalu ada ruang untuk tumbuh. Misalnya, sekarang kami menggunakan teks yang kami temukan di Internet untuk mendapatkan jawaban, tetapi potongan teks yang sudah selesai tidak selalu dapat ditemukan di satu tempat atau dalam bentuk yang benar. Dengan bantuan jaringan saraf masalah ini dapat diselesaikan: menghasilkan respons sehingga sesuai dengan permintaan dan tidak mengandung yang tidak perlu. Ini adalah proyek pencarian neurosumarisasi kami, yang, saya harap, akan kami bicarakan di lain waktu.

All Articles