CINXE.COM
Yahoo Developer Network
<!DOCTYPE html> <html lang=> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="google-site-verification" content="MOnPMZKo_gmKqZgcnzortlWhXu0qUWvmbNAeWx84v9I" /> <link rel="apple-touch-icon-precomposed" href="../static/images/apple-touch-icon-precomposed.png"> <title>Yahoo Developer Network</title> <meta name="description" content="Measure, monetize, advertise and improve your apps with Yahoo tools. Join the 200,000 developers using Yahoo tools to build their app businesses."> <meta property="og:title" content="Yahoo Developer Network" /> <meta property="og:type" content='website' /> <meta property="og:url" content="https://developer.yahoo.com/" /> <meta property="og:description" content="Measure, monetize, advertise and improve your apps with Yahoo tools. Join the 200,000 developers using Yahoo tools to build their app businesses."/> <meta property="og:image" content="https://s.yimg.com/oo/cms/products/site/assets/ydn200.png"/> <meta property="og:site_name" content="Yahoo Developer Network" /> <link rel="shortcut icon" href="https://s.yimg.com/rz/l/favicon.ico"/> <link rel="stylesheet" href="/static/css/font-awesome.min.css"> <link rel="stylesheet" href="/static/css/denali-icons-v0.4.1.css"> <link rel="stylesheet" href="/static/css/hoverbox.css"> <link rel="stylesheet" href="/static/css/rebranding_footer.css"> <!--[if lte IE 8]> <link rel="stylesheet" href="/static/css/codemirror.css"> <link rel="stylesheet" href="/static/css/pure.css"> <link rel="stylesheet" href="/static/css/main.css"> <link rel="stylesheet" href="/static/css/side-menu.css"> <link rel="stylesheet" href="/static/css/featherlight.min.css"> <link rel="stylesheet" href="/static/css/denali-style.css"> <link rel="stylesheet" href="/static/css/less-styles.css"> <![endif]--> <!--[if gt IE 8]><!--> <link rel="stylesheet" href="https://s.yimg.com/zz/combo?oo/fe/css/codemirror-min_681d3e3e0.css&oo/fe/css/pure-min_5ef171c51.css&oo/fe/css/main-min_248761b64.css&oo/fe/css/side-menu-min_d1ff8ca9b.css&oo/fe/css/featherlight.min_2802ef65c.css&oo/fe/css/denali-style-min_e0ef5615c.css&oo/fe/css/less-styles-min_1527735e8.css"> <!--<![endif]--> <script nonce="dwKkGiI6lnys9hUgPh30RA==" src="https://s.yimg.com/zz/combo?oo/fe/js/vendor/jquery331_min-min_fb71483ea.js&oo/fe/js/vendor/jquery-easytabs_min-min_5ed1e3e24.js&oo/fe/js/vendor/jquery-hashchange-min_acc519bb2.js&oo/fe/js/vendor/js-cookie-min_bff73c132.js"></script> <script nonce="dwKkGiI6lnys9hUgPh30RA==" src="/static/js/vendor/jquery.cookie.js"></script> <script nonce="dwKkGiI6lnys9hUgPh30RA==" src="https://s.yimg.com/zz/combo?oo/fe/js/vendor/featherlight_min-min_8697a441b.js&oo/fe/js/vendor/slick_min-min_0d13b88ac.js&oo/fe/js/vendor/scrollReveal_min-min_118b7ecf1.js&oo/fe/js/vendor/codemirror-compressed-min_3217a68df.js"></script> <script nonce="dwKkGiI6lnys9hUgPh30RA==" src="/static/js/vendor/bootstrap.bundle.min.js"></script> <!-- Google tag (gtag.js) --> <script nonce="dwKkGiI6lnys9hUgPh30RA==" async src="https://www.googletagmanager.com/gtag/js?id=G-BFY40XXE01"></script> <script nonce="dwKkGiI6lnys9hUgPh30RA=="> window.dataLayer = window.dataLayer || []; function gtag(){dataLayer.push(arguments);} gtag('js', new Date()); gtag('config', 'G-BFY40XXE01'); </script> </head> <body class=" "> <!-- Check if there is custom header data --> <div class="header-container"> <div class="page-head-search container"> <a href="/" aria-label="YDN Logo"><div class="logo-container"></div><div class="devtxt">developer</div></a> <div class="header-links"> <ul> <li> <a id="nav-opensource" href="/opensource/"><span>Open Source</span></a> </li> <li> <a id="nav-api" href="/api/"><span>APIs</span></a> </li> <li> <a id="nav-advertising" href="/advertising/" target="_blank" rel="noopener"><span>Advertising</span> <span><i class="d-icon d-external is-small" aria-hidden="true"></i></span></a> </li> <li> <a id="nav-blogs" href="/blogs/"><span>Blogs</span></a> </li> <li> <a id="nav-events" href="/events/"><span>Events</span></a> </li> <li> <a id="nav-podcasts" href="/podcasts/"><span>Podcasts</span></a> </li> <li> <a id="nav-apps" href="/apps/"><span>Apps</span></a> </li> </ul> </div> <div class="head-controls hidden"> <form id="search-form" action="/find/" method="GET" autocomplete="off"> <label for="search-input" class="sr-only">Input to search</label> <input title="" id="search-input" name="q" placeholder=""> <button type="submit" class="pure-button search-ydn" aria-label="search button"><i class="d-icon d-search is-smal" aria-hidden="true"></i></button> </form> </div> <div class="head-right-controls"> <div class="header-search-container" id="search-nav-bar"> <form action="/find/" method="GET" autocomplete="off" class="search-form"> <input title="search" aria-label="search scope" id="scope-search" name="q" placeholder="Search" > <button type="submit" class="search-ydn" aria-label="search button"><i class="d-icon d-search is-small" aria-hidden="true"></i></button> </form> </div> <!-- <a id="myapps-dropdown" class="hidden"> <img src="/assets/images/app-icon.png" alt="App Icons" class="header-icon"> </a> --> <a id="language-dropdown" aria-label="Language Dropdown"><span class="flag-icon flag-icon-us" aria-hidden="true"></span> <span class="caret" aria-hidden="true"></span></a> <div class="user-account"> <!-- <img class="pic-id my-id hidden" src="https://s.yimg.com/dh/ap/social/profile/profile_b64.png"> --> <a href="https://login.yahoo.com?done=https://developer.yahoo.com/blogs/20231026/&src=devnet&specId=usernameReg">Sign In</a> <!-- <a href="https://login.yahoo.com/config/login?.done=https://developer.yahoo.com/blogs/20231026/" class="login"><i class="d-icon d-user-profile-circle is-medium pic-id my-id hover"></i></a> --> </div> </div> <div id="language-overlay" class="overlay" sign-in "> <div class="pointer"></div> <ul> <li><a class='rapidnofollow' data-lang="en-US" href="#" aria-label="Translate to English"><span class="flag-icon flag-icon-us" aria-hidden="true"></span> English (U.S.)</a></li> <li><a class='rapidnofollow' data-lang="zh-Hant-HK" href="#" aria-label="Translate to Chinese (Hong Kong)"><span class="flag-icon flag-icon-hk" aria-hidden="true"></span> 中文(香港)</a></li> <li><a class='rapidnofollow' data-lang="zh-Hant-TW" href="#" aria-label="Translate to Chinese (Taiwan)"><span class="flag-icon flag-icon-tw" aria-hidden="true"></span> 中文(台灣)</a></li> </ul> </div> <div id="apps-overlay" class="overlay"> <div class="pointer"></div> <div> </div> <ul> <li><a href="/apps">YDN Apps</a></li> <li><a href="https://dev.flurry.com">Flurry Apps</a></li> <li><a href="/search-sdk/apps">Search SDK Apps</a></li> </ul> </div> </div> <div class="mobile-header"> <a href="#menu" id="menuLink" class="menu-link" aria-label="Menu Link"> <!-- Hamburger icon --> <span aria-hidden="true"></span> </a> <a href="/" class="yahoo-phone" role="presentation" aria-label="Logo"><div class="logo-container" style="position:static"></div><div class="devtxt">developer</div></a> <a href="/find/" class="mobile-search-icon" role="presentation" aria-label="Search Logo"></a> </div> </div> <script nonce="dwKkGiI6lnys9hUgPh30RA=="> var BACKSPACE_KEY = 8; var DELETE_KEY = 46; var searchForm = document.querySelector('#search-form'); var searchScopeName = document.querySelector('#search-scope-name'); var searchScopeUrl = document.querySelector('#search-scope-url'); var searchInput = document.querySelector('#search-input'); var searchScope = document.querySelector('.search-scope'); if (searchScope) { var paddingOffset = searchScope.offsetWidth + 40; searchInput.style.paddingLeft = paddingOffset + 'px'; } searchInput.addEventListener('keydown', handleSearchKeyDown); searchInput.addEventListener('blur', handleSearchLoseFocus); searchInput.addEventListener('focus', handleSearchFocus); searchInput.addEventListener('blur', handleLoseFocus); var pageName = window.location.pathname.split("/")[1]; var navElement = document.getElementById("nav-"+pageName); if(navElement){ navElement.classList.add("selected"); } function handleSearchFocus(event) { searchForm.style.width = "375px"; } function handleLoseFocus(event) { searchForm.style.width = "250px"; } window.addEventListener('resize', function(event){ searchForm.style.width = "250px"; }); function handleSearchKeyDown(event) { var searchText = document.querySelector('#search-input').value; searchScope = document.querySelector('.search-scope'); // When search bar is empty and Backspace or Delete keys are pressed, then // remove contextual scope from the search bar. // Note: Brightroll DSP is locked into contextual search. // Note: A.I. Studio is locked into contextual search. if (!searchText.length && searchScopeName.value !== 'DSP' && searchScopeName.value !== 'A.I. Studio' && (event.keyCode === BACKSPACE_KEY || event.keyCode === DELETE_KEY)) { searchScope.style.display = 'none'; searchInput.style.paddingLeft = 10 + 'px'; searchScopeName.disabled = true; searchScopeUrl.disabled = true; } } // Reset contextual search when the search bar loses focus and it's empty. function handleSearchLoseFocus(event) { var searchText = document.querySelector('#search-input').value; // Restore contextual label if it has been removed via the backspace key // but the text field is still empty. if (searchScope && !searchText.length) { searchScope.style.display = 'block'; searchInput.style.paddingLeft = paddingOffset + 'px'; searchScopeName.disabled = false; searchScopeUrl.disabled = false; } } // Update locale setting from language dropdown $('a[data-lang]').click(function(e) { e.preventDefault(); // Load PH cookie and convert it to object. // If PH cookie is not available, create an empty object. var locale = $(this).data('lang'); var phCookie = $.cookie('PH'); var phCookieObject = phCookie ? queryStringToObject(phCookie) : {}; // Update locale. phCookieObject.l = locale; // Set new PH cookie. $.cookie.raw = true; $.cookie('PH', $.param(phCookieObject), { path: '/', domain: 'yahoo.com' }); location.reload(); }); function queryStringToObject(query) { var qs = {}; var vars = query.split('&'); for (var i = 0; i < vars.length; i++) { var pair = vars[i].split('='); pair[0] = decodeURIComponent(pair[0]); pair[1] = decodeURIComponent(pair[1]); if (typeof qs[pair[0]] === 'undefined') { qs[pair[0]] = pair[1]; } else if (typeof qs[pair[0]] === 'string') { qs[pair[0]] = [qs[pair[0]], pair[1]]; } else { qs[pair[0]].push(pair[1]); } } return qs; } </script> <div> <div id="layout" class=" " > <div id="menu"> </div> <div id="main"> <link rel="stylesheet" href="/static/css/common-module.css"> <style nonce="dwKkGiI6lnys9hUgPh30RA=="> .blogBody a, .blogBody a:visited { color: #000000; text-decoration: underline; -webkit-transition: all 0.25s; -moz-transition: all 0.25s; -ms-transition: all 0.25s; -o-transition: all 0.25s; transition: all 0.25s; } .blogBody a:hover { color: #6E329D; text-decoration: underline; } figure { text-align: center; } article blockquote { border-left: 4px solid #f6f6f6; padding-left: 1em; margin-left: 1em; } code { background-color: #e5e5e5; font-style: italic; padding: 0.25em 0.5em; line-height: 1.25em; } pre code { background-color: transparent; line-height: 2.5em; font-style: normal; padding: 1em; } .homepage { height: 120px; background: #4F62FE; padding: 0 16px; margin-top: 50px; } .homepage .row { padding: 0 2em !important; } .homepage .is-visible-touch a { width: 100%; } .homepage .is-hidden-touch a h3 { margin-top: 2.5em; } .homepage .is-visible-touch a h2 { font-weight: 700; position: relative; left: 45%; transform: translateX(-50%); margin-top: 1.25em; } .homepage i { margin-top: -0.25em; } .homepage .container a * { display: inline-block; color: #fff; } .blog-info i { color: #9B9B9B; margin-right: 0.5em; } .blog-info > div { display: inline-block; position: relative; width: 15em; } .blog-info span { vertical-align: middle; } .blog-social .social-tooltip { visibility: hidden; width: 4em; background: #FFFFFF; border: 2px solid rgba(48,48,48,0.10); box-shadow: 0 4px 8px 0 rgba(0,0,0,0.35); border-radius: 2px; text-align: center; position: absolute; z-index: 1; top: 100%; left: -15%; opacity: 0; -webkit-transition: opacity 0.5s; -moz-transition: opacity 0.5s; -ms-transition: opacity 0.5s; -o-transition: opacity 0.5s; transition: opacity 0.5s; } .blog-social .social-share { list-style: none; padding: 0.25em 0.5em !important; } .blog-social .social-share li { display: inline; } .blog-social .social-share li i { margin: 0 0.25em; font-size: 1.2em; } .categories{ line-height: 3em; margin-top: 2em; } .category{ background: #EAEFFA; border-radius: 15px; height: 2em; padding: 0.5em 1em; margin-right: 1em; font-size: 0.9em; -webkit-transition: background 0.5s; -moz-transition: background 0.5s; -ms-transition: background 0.5s; -o-transition: background 0.5s; transition: background 0.5s; } .category a { text-decoration: none; color: #000000 !important; } .category:hover{ text-decoration: none; background: #B7BCC7; } @media (max-width: 1160px) { .row { padding: 2em; } .blog-social:hover .social-tooltip { visibility: visible; opacity: 1; } .blog-info > div { width: 10em; font-size: 0.9em; } .blog-social .social-share li { display: list-item; margin: 0.5em 0; } } @media (max-width: 767px) { .homepage i { margin-top: 0.5em; } .homepage .is-visible-touch h2 { display: none; } } </style> <div class="homepage"> <div class="row"> <div class="container is-hidden-touch"> <a href="/blogs/"> <i class="d-icon d-arrowhead-left"></i><h3>Latest Blogs</h3> </a> </div> <div class="container is-visible-touch"> <a href="/blogs/"> <i class="d-icon d-arrowhead-left is-large"></i><h2>Latest Blogs</h2> </a> </div> </div> </div> <section class="blog-body last-section"> <div class="row"> <div class="container"> <div class="pure-g-r"> <div class="pure-u-1-1 blog-info"> <div class="blog-date"><i class="d-icon d-calendar is-small"></i><span>October 26, 2023</span></div> <div class="blog-social"><i class="d-icon d-share is-small"></i>Share <ul class="social-share is-hidden-inline-touch"> <li><a class="d" title="Share on Facebook" href="https://www.facebook.com/sharer/sharer.php?u=https://developer.yahoo.com/blogs/20231026" target="_blank" aria-label=”Share on Facebook”><i class="d-icon d-facebook" aria-hidden="true"></i></a></li> <li><a class="d" title="Share on Twitter" href="https://twitter.com/share?text=Deep Dive into Yahoo's Semantic Search Suggestions: From Challenges to Effective Implementation&url=https://developer.yahoo.com/blogs/20231026" target="_blank" aria-label=”Share on Twitter"><i class="d-icon d-twitter" aria-hidden="true"></i></a></li> <li><a class="d" title="Share on Tumblr" href="https://www.tumblr.com/widgets/share/tool?url=https://developer.yahoo.com/blogs/20231026" target="_blank" aria-label=”Share on Tumblr"><i class="d-icon d-tumblr" aria-hidden="true"></i></a></li> <li><a class="d" title="Share on Mail" href="mailto:?subject=Deep Dive into Yahoo's Semantic Search Suggestions: From Challenges to Effective Implementation&body=<h2 dir="ltr" style="line-height:1.38;margin-top:18pt;margin-bottom:6pt;"><span style="font-size: 16pt; font-family: Arial, sans-serif; font-weight: 400; font-variant-numeric: normal; font-variant-east-asian: normal; font-variant-alternates: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">The Pervasive Problem of Semantic Search</span></h2><p dir="ltr" style="line-height:1.38;margin-top:0pt;margin-bottom:0pt;"><span style="font-size: 11pt; font-family: Arial, sans-serif; font-variant-numeric: normal; font-variant-east-asian: normal; font-variant-alternates: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">In the expansive digital age where information is not only vast but grows at an exponential rate, the quest for accurate and relevant search results has never been more critical. Within this context, Yahoo Mail, serving millions of users, understood the transformative potential of semantic search. By leveraging the prowess of OpenAI embeddings, we embarked on a journey to provide search results that would understand and match user intent, going beyond the conventional keyword-based approach. And while the results were commendable, they weren't devoid of hurdles:</span></p><ol style="margin-top:0;margin-bottom:0;padding-inline-start:48px;"> <li dir="ltr" style="list-style-type: decimal; font-size: 11pt; font-family: Arial, sans-serif; font-variant-numeric: normal; font-variant-east-asian: normal; font-variant-alternates: normal; font-variant-position: normal; vertical-align: baseline; white-space: pre;" aria-level="1"><p dir="ltr" style="line-height:1.38;margin-top:0pt;margin-bottom:0pt;" role="presentation"><span style="font-size: 11pt; font-variant-numeric: normal; font-variant-east-asian: normal; font-variant-alternates: normal; font-variant-position: normal; vertical-align: baseline; text-wrap: wrap;">Performance Bottlenecks: The integration of OpenAI embeddings, though powerful, significantly slowed down our search process.</span> </p></li> <li dir="ltr" style="list-style-type: decimal; font-size: 11pt; font-family: Arial, sans-serif; font-variant-numeric: normal; font-variant-east-asian: normal; font-variant-alternates: normal; font-variant-position: normal; vertical-align: baseline; white-space: pre;" aria-level="1"><p dir="ltr" style="line-height:1.38;margin-top:0pt;margin-bottom:0pt;" role="presentation"><span style="font-size: 11pt; font-variant-numeric: normal; font-variant-east-asian: normal; font-variant-alternates: normal; font-variant-position: normal; vertical-align: baseline; text-wrap: wrap;">User Experience: The new system demanded users to type extensively, often more than they were used to, leading to potential user dissatisfaction.</span> </p></li> <li dir="ltr" style="list-style-type: decimal; font-size: 11pt; font-family: Arial, sans-serif; font-variant-numeric: normal; font-variant-east-asian: normal; font-variant-alternates: normal; font-variant-position: normal; vertical-align: baseline; white-space: pre;" aria-level="1"><p dir="ltr" style="line-height:1.38;margin-top:0pt;margin-bottom:0pt;" role="presentation"><span style="font-size: 11pt; font-variant-numeric: normal; font-variant-east-asian: normal; font-variant-alternates: normal; font-variant-position: normal; vertical-align: baseline; text-wrap: wrap;">Habit Change: Introducing a paradigm shift in search behaviors meant we were not just altering algorithms but challenging years of user habits.</span> </p></li></ol><br><p dir="ltr" style="line-height:1.38;margin-top:0pt;margin-bottom:0pt;"><span style="font-size: 11pt; font-family: Arial, sans-serif; font-variant-numeric: normal; font-variant-east-asian: normal; font-variant-alternates: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Our objective was crystal clear yet daunting: We wanted to augment the semantic search with suggestions that were rapid, economically viable, and seamlessly integrated into the user's natural search behavior.</span></p><br><br><h2 dir="ltr" style="line-height:1.38;margin-top:18pt;margin-bottom:6pt;"><span style="font-size: 16pt; font-family: Arial, sans-serif; font-weight: 400; font-variant-numeric: normal; font-variant-east-asian: normal; font-variant-alternates: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Approach: Exploration Phase</span></h2><br><p dir="ltr" style="line-height:1.38;margin-top:0pt;margin-bottom:0pt;"><span style="font-size: 11pt; font-family: Arial, sans-serif; font-variant-numeric: normal; font-variant-east-asian: normal; font-variant-alternates: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Enticed by the idea of real-time suggestions via large language models (LLMs), we soon realized the impracticality of such an approach, primarily due to the speed constraints. The challenge demanded a solution that operated offline but mirrored the capabilities of real-time systems.</span></p><br><p dir="ltr" style="line-height:1.38;margin-top:0pt;margin-bottom:0pt;"><span style="font-size: 11pt; font-family: Arial, sans-serif; font-variant-numeric: normal; font-variant-east-asian: normal; font-variant-alternates: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Our exploration led us to task the LLM to frame and answer all conceivable questions for every email a user received. While theoretically sound, the financial implications were prohibitive. Moreover, the risk of the LLM generating "hallucinations" or inaccurate results couldn't be ignored.</span></p><br><p dir="ltr" style="line-height:1.38;margin-top:0pt;margin-bottom:0pt;"><span style="font-size: 11pt; font-family: Arial, sans-serif; font-variant-numeric: normal; font-variant-east-asian: normal; font-variant-alternates: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">It was amidst this exploration that a revelatory idea emerged. We were already equipped with a sophisticated extraction pipeline capable of gleaning crucial information from emails. This was achieved using a blend of human curated regex parsing and meticulously fine-tuned AI models. This became the key to powering our search suggestions.</span></p><br><br><br><h2 dir="ltr" style="line-height:1.38;margin-top:18pt;margin-bottom:6pt;"><span style="font-size: 16pt; font-family: Arial, sans-serif; font-weight: 400; font-variant-numeric: normal; font-variant-east-asian: normal; font-variant-alternates: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Implementation Challenges: Transitioning from Conceptualization to Real-World Application</span></h2><br><p dir="ltr" style="line-height:1.38;margin-top:0pt;margin-bottom:0pt;"><span style="font-size: 11pt; font-family: Arial, sans-serif; font-variant-numeric: normal; font-variant-east-asian: normal; font-variant-alternates: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">1. The Intricacies of Indexing: One of the more pronounced challenges we encountered revolved around the intricacies of over-indexing. Let's delve into a hypothetical yet common scenario to elucidate this. Imagine a user intending to search for the term "staples." As they begin their search with the initial letters "sta", an all-encompassing approach to indexing, which takes into account every conceivable keyword, might mistakenly steer the user towards unrelated terms like "statement." Such deviations, although seemingly minor, can significantly hamper the user experience. Recognizing the paramount importance of ensuring that our search suggestions remained razor-sharp in their precision and highly relevant, we embarked on a methodical approach. Our resolution was to meticulously handpick and index only a curated set of keywords, ensuring that every suggestion offered was in perfect alignment with the user's intent.</span></p><br><p dir="ltr" style="line-height:1.38;margin-top:0pt;margin-bottom:0pt;"><span style="font-size: 11pt; font-family: Arial, sans-serif; font-variant-numeric: normal; font-variant-east-asian: normal; font-variant-alternates: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">2. The Quest for Relevance in Suggestions: Another challenge that frequently emerged was ensuring the highest degree of relevance in our search suggestions. This challenge becomes particularly pronounced when one considers a situation where a user's inbox is populated with multiple items that bear a resemblance to each other, say multiple flight confirmations. The conundrum we faced was discerning which of these similar items was of immediate interest to the user. Our breakthrough came in the form of an innovative approach centered on the extraction card date. Rather than basing our suggestions on the date the email was received, we shifted our focus to the date of the event described within the email, like a flight's departure date. This nuanced change enabled us to consistently zero in on and prioritize the most timely and pertinent result for the user.</span></p><br><p dir="ltr" style="line-height:1.38;margin-top:0pt;margin-bottom:0pt;"><span style="font-size: 11pt; font-family: Arial, sans-serif; font-variant-numeric: normal; font-variant-east-asian: normal; font-variant-alternates: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">3. Embracing Dynamism and Adaptability: When we first conceptualized our approach, our methodology was anchored in generating questions and answers during the email delivery phase, which were then indexed. However, as we delved deeper, it became evident that this approach, while robust, was somewhat inflexible and lacked the dynamism that modern search paradigms demand. Determined to infuse our system with greater adaptability, we pioneered the Just-in-Time question generation mechanism. With this refined approach, while the foundational search indexes are crafted at the point of delivery, the actual questions are dynamically constructed in real-time, tailored to the user's specific queries and the prevailing temporal context. This rejuvenated approach not only elevated the flexibility quotient of our system but also enhanced operational efficiency, ensuring that users always received the most pertinent suggestions.</span></p><h2 dir="ltr" style="line-height:1.38;text-align: justify;margin-top:18pt;margin-bottom:6pt;"><span style="font-size: 16pt; font-family: Arial, sans-serif; font-weight: 400; font-variant-numeric: normal; font-variant-east-asian: normal; font-variant-alternates: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Implementation</span></h2><h3 dir="ltr" style="line-height:1.38;margin-top:16pt;margin-bottom:4pt;"><span style="font-size: 14pt; font-family: Arial, sans-serif; color: rgb(67, 67, 67); font-weight: 400; font-variant-numeric: normal; font-variant-east-asian: normal; font-variant-alternates: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">At delivery time</span></h3><ul style="margin-top:0;margin-bottom:0;padding-inline-start:48px;"> <li dir="ltr" style="list-style-type: disc; font-size: 11pt; font-family: Arial, sans-serif; font-variant-numeric: normal; font-variant-east-asian: normal; font-variant-alternates: normal; font-variant-position: normal; vertical-align: baseline; white-space: pre;" aria-level="1"><p dir="ltr" style="line-height:1.38;margin-top:0pt;margin-bottom:0pt;" role="presentation"><span style="font-size: 11pt; font-variant-numeric: normal; font-variant-east-asian: normal; font-variant-alternates: normal; font-variant-position: normal; vertical-align: baseline; text-wrap: wrap;">Here we extract important information, create cards from the emails and save it in our BE store.</span> </p></li></ul><br><p dir="ltr" style="line-height:1.38;margin-top:0pt;margin-bottom:0pt;"><span style="font-size: 11pt; font-family: Arial, sans-serif; font-variant-numeric: normal; font-variant-east-asian: normal; font-variant-alternates: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"><span style="border:none;display:inline-block;overflow:hidden;width:624px;height:203px;"><img src="https://lh7-us.googleusercontent.com/XlIgexwxvY16iECtJhtFb9BRo_K0Qpp8c96HDscEeTC4sXeAoFuzlLoFBuRbbBn7oTaMrRiWlpMa9arKZRgo1nc6M-CdYNsCrhX5CVTGMSHElz_0egTEQ61xNaEROaMVLWepGQM67mHIQpAmdpjOuOk" width="624" height="203" style="margin-left:0px;margin-top:0px;"></span></span></p><h3 dir="ltr" style="line-height:1.38;margin-top:16pt;margin-bottom:4pt;"> <span style="font-size: 14pt; font-family: Arial, sans-serif; color: rgb(67, 67, 67); font-weight: 400; font-variant-numeric: normal; font-variant-east-asian: normal; font-variant-alternates: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Semantic Search Indexing</span></h3><ul style="margin-top:0;margin-bottom:0;padding-inline-start:48px;"> <li dir="ltr" style="list-style-type: disc; font-size: 11pt; font-family: Arial, sans-serif; font-variant-numeric: normal; font-variant-east-asian: normal; font-variant-alternates: normal; font-variant-position: normal; vertical-align: baseline; white-space: pre;" aria-level="1"><p dir="ltr" style="line-height:1.38;margin-top:0pt;margin-bottom:0pt;" role="presentation"><span style="font-size: 11pt; font-variant-numeric: normal; font-variant-east-asian: normal; font-variant-alternates: normal; font-variant-position: normal; vertical-align: baseline; text-wrap: wrap;">Fetch/Update the extracted cards from BE DB. Index by extracting the keywords and storing in Semantic Search Index - DB</span> </p></li></ul><p dir="ltr" style="line-height:1.38;margin-top:0pt;margin-bottom:0pt;"><span style="font-size: 11pt; font-family: Arial, sans-serif; font-variant-numeric: normal; font-variant-east-asian: normal; font-variant-alternates: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"><span style="border:none;display:inline-block;overflow:hidden;width:624px;height:215px;"><img src="https://lh7-us.googleusercontent.com/jqk3LhXr48R60DZccCiV8NUl0M8le9JfYkdjukvGiArSMv6PpskJMhW3wvFdW6bL0800osfB2GsIlPflonGJl_nwhEZsz_8p1xidFhYGI1Xkpy20nDbIG7_fnfyvIYYmfFCUx1Q0sgfUn2ASh1Q-AUU" width="624" height="215" style="margin-left:0px;margin-top:0px;"></span></span></p><h3 dir="ltr" style="line-height:1.38;margin-top:16pt;margin-bottom:4pt;"> <span style="font-size: 14pt; font-family: Arial, sans-serif; color: rgb(67, 67, 67); font-weight: 400; font-variant-numeric: normal; font-variant-east-asian: normal; font-variant-alternates: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Retrieval</span></h3><ul style="margin-top:0;margin-bottom:0;padding-inline-start:48px;"> <li dir="ltr" style="list-style-type: disc; font-size: 11pt; font-family: Arial, sans-serif; font-variant-numeric: normal; font-variant-east-asian: normal; font-variant-alternates: normal; font-variant-position: normal; vertical-align: baseline; white-space: pre;" aria-level="1"><p dir="ltr" style="line-height:1.38;margin-top:0pt;margin-bottom:0pt;" role="presentation"><span style="font-size: 11pt; font-variant-numeric: normal; font-variant-east-asian: normal; font-variant-alternates: normal; font-variant-position: normal; vertical-align: baseline; text-wrap: wrap;">When the user makes the search, we make a server call which inturn will find the best matching extraction card for the query.</span> </p></li> <li dir="ltr" style="list-style-type: disc; font-size: 11pt; font-family: Arial, sans-serif; font-variant-numeric: normal; font-variant-east-asian: normal; font-variant-alternates: normal; font-variant-position: normal; vertical-align: baseline; white-space: pre;" aria-level="1"><p dir="ltr" style="line-height:1.38;margin-top:0pt;margin-bottom:0pt;" role="presentation"><span style="font-size: 11pt; font-variant-numeric: normal; font-variant-east-asian: normal; font-variant-alternates: normal; font-variant-position: normal; vertical-align: baseline; text-wrap: wrap;">This will then be used for generating the suggestions for the semantic search.</span> </p></li></ul><h2 dir="ltr" style="line-height:1.38;text-align: justify;margin-top:18pt;margin-bottom:6pt;"><span style="font-size: 16pt; font-family: Arial, sans-serif; font-weight: 400; font-variant-numeric: normal; font-variant-east-asian: normal; font-variant-alternates: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"><span style="border:none;display:inline-block;overflow:hidden;width:624px;height:235px;"><img src="https://lh7-us.googleusercontent.com/uQLJEFuqU6Q48uDdqxOpD-sZPWvhf_nC0gYWHq7T12OF7XfaORsWEfnWnUDBYAzMOlSGCQnkAVzd9jvfI1SU0Uz2U8jfPocsw3H0TdnOHmIFhLGqAiSUTXb_AfcnVDwKjkAiyUq-4LVv1FjnB6VSALg" width="624" height="235" style="margin-left:0px;margin-top:0px;"></span></span></h2><br><br><h2 dir="ltr" style="line-height:1.38;margin-top:18pt;margin-bottom:6pt;"> <span style="font-size: 16pt; font-family: Arial, sans-serif; font-weight: 400; font-variant-numeric: normal; font-variant-east-asian: normal; font-variant-alternates: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Conclusion</span></h2><p dir="ltr" style="line-height:1.38;margin-top:0pt;margin-bottom:0pt;"><span style="font-size: 11pt; font-family: Arial, sans-serif; font-variant-numeric: normal; font-variant-east-asian: normal; font-variant-alternates: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Our innovative foray into enhancing search suggestions bore fruit in a remarkably short span of 30 days, even as we navigated the intricacies of a completely new tech stack. The benefits were manifold, an enriched user experience and 10% of semantic search traffic handled by search suggestions.</span></p><br><p dir="ltr" style="line-height:1.38;margin-top:0pt;margin-bottom:0pt;"><span style="font-size: 11pt; font-family: Arial, sans-serif; font-variant-numeric: normal; font-variant-east-asian: normal; font-variant-alternates: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">In the rapidly evolving realm of AI, challenges are omnipresent. However, our journey at Yahoo underscores the potential of lateral thinking and a commitment to User Experience. Through our experiences, we hope to galvanize the broader tech community, encouraging them to ideate and implement solutions that are not just effective, but also economically prudent.</span></p><div><span style="font-size: 11pt; font-family: Arial, sans-serif; font-variant-numeric: normal; font-variant-east-asian: normal; font-variant-alternates: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"><br></span></div><div><b>Contributors</b> <div>Kevin Patel(<a href="mailto:patelkev@yahooinc.com">patelkev@yahooinc.com</a>) + Renganathan Dhanogopal(<a href="mailto:renga@yahooinc.com">renga@yahooinc.com</a>) - Architecture + Tech Implementation </div> <div>Josh Jacobson + Sam Bouguerra(<a href="mailto:sbouguerra@yahooinc.com">sbouguerra@yahooinc.com</a>) - Product </div></div><br/><div><b>Author</b> <div>Kevin Patel(<a href="mailto:patelkev@yahooinc.com">patelkev@yahooinc.com</a>) - Director of Engineering Yahoo </div></div>,https://developer.yahoo.com/blogs/20231026" target="_blank" aria-label=”Share on Mail"><i class="d-icon d-mail" aria-hidden="true"></i></a></li> </ul> <div class="social-tooltip"> <ul class="social-share"> <li><a class="d" title="Share on Facebook" href="https://www.facebook.com/sharer/sharer.php?u=https://developer.yahoo.com/blogs/20231026" target="_blank" aria-label=”Share on Facebook”><i class="d-icon d-facebook" aria-hidden="true"></i></a></li> <li><a class="d" title="Share on Twitter" href="https://twitter.com/share?text=Deep Dive into Yahoo's Semantic Search Suggestions: From Challenges to Effective Implementation&url=https://developer.yahoo.com/blogs/20231026" target="_blank" aria-label=”Share on Twitter"><i class="d-icon d-twitter" aria-hidden="true"></i></a></li> <li><a class="d" title="Share on Tumblr" href="https://www.tumblr.com/widgets/share/tool?url=https://developer.yahoo.com/blogs/20231026" target="_blank" aria-label=”Share on Tumblr"><i class="d-icon d-tumblr" aria-hidden="true"></i></a></li> <li><a class="d" title="Share on Mail" href="mailto:?subject=Deep Dive into Yahoo's Semantic Search Suggestions: From Challenges to Effective Implementation&body=<h2 dir="ltr" style="line-height:1.38;margin-top:18pt;margin-bottom:6pt;"><span style="font-size: 16pt; font-family: Arial, sans-serif; font-weight: 400; font-variant-numeric: normal; font-variant-east-asian: normal; font-variant-alternates: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">The Pervasive Problem of Semantic Search</span></h2><p dir="ltr" style="line-height:1.38;margin-top:0pt;margin-bottom:0pt;"><span style="font-size: 11pt; font-family: Arial, sans-serif; font-variant-numeric: normal; font-variant-east-asian: normal; font-variant-alternates: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">In the expansive digital age where information is not only vast but grows at an exponential rate, the quest for accurate and relevant search results has never been more critical. Within this context, Yahoo Mail, serving millions of users, understood the transformative potential of semantic search. By leveraging the prowess of OpenAI embeddings, we embarked on a journey to provide search results that would understand and match user intent, going beyond the conventional keyword-based approach. And while the results were commendable, they weren't devoid of hurdles:</span></p><ol style="margin-top:0;margin-bottom:0;padding-inline-start:48px;"> <li dir="ltr" style="list-style-type: decimal; font-size: 11pt; font-family: Arial, sans-serif; font-variant-numeric: normal; font-variant-east-asian: normal; font-variant-alternates: normal; font-variant-position: normal; vertical-align: baseline; white-space: pre;" aria-level="1"><p dir="ltr" style="line-height:1.38;margin-top:0pt;margin-bottom:0pt;" role="presentation"><span style="font-size: 11pt; font-variant-numeric: normal; font-variant-east-asian: normal; font-variant-alternates: normal; font-variant-position: normal; vertical-align: baseline; text-wrap: wrap;">Performance Bottlenecks: The integration of OpenAI embeddings, though powerful, significantly slowed down our search process.</span> </p></li> <li dir="ltr" style="list-style-type: decimal; font-size: 11pt; font-family: Arial, sans-serif; font-variant-numeric: normal; font-variant-east-asian: normal; font-variant-alternates: normal; font-variant-position: normal; vertical-align: baseline; white-space: pre;" aria-level="1"><p dir="ltr" style="line-height:1.38;margin-top:0pt;margin-bottom:0pt;" role="presentation"><span style="font-size: 11pt; font-variant-numeric: normal; font-variant-east-asian: normal; font-variant-alternates: normal; font-variant-position: normal; vertical-align: baseline; text-wrap: wrap;">User Experience: The new system demanded users to type extensively, often more than they were used to, leading to potential user dissatisfaction.</span> </p></li> <li dir="ltr" style="list-style-type: decimal; font-size: 11pt; font-family: Arial, sans-serif; font-variant-numeric: normal; font-variant-east-asian: normal; font-variant-alternates: normal; font-variant-position: normal; vertical-align: baseline; white-space: pre;" aria-level="1"><p dir="ltr" style="line-height:1.38;margin-top:0pt;margin-bottom:0pt;" role="presentation"><span style="font-size: 11pt; font-variant-numeric: normal; font-variant-east-asian: normal; font-variant-alternates: normal; font-variant-position: normal; vertical-align: baseline; text-wrap: wrap;">Habit Change: Introducing a paradigm shift in search behaviors meant we were not just altering algorithms but challenging years of user habits.</span> </p></li></ol><br><p dir="ltr" style="line-height:1.38;margin-top:0pt;margin-bottom:0pt;"><span style="font-size: 11pt; font-family: Arial, sans-serif; font-variant-numeric: normal; font-variant-east-asian: normal; font-variant-alternates: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Our objective was crystal clear yet daunting: We wanted to augment the semantic search with suggestions that were rapid, economically viable, and seamlessly integrated into the user's natural search behavior.</span></p><br><br><h2 dir="ltr" style="line-height:1.38;margin-top:18pt;margin-bottom:6pt;"><span style="font-size: 16pt; font-family: Arial, sans-serif; font-weight: 400; font-variant-numeric: normal; font-variant-east-asian: normal; font-variant-alternates: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Approach: Exploration Phase</span></h2><br><p dir="ltr" style="line-height:1.38;margin-top:0pt;margin-bottom:0pt;"><span style="font-size: 11pt; font-family: Arial, sans-serif; font-variant-numeric: normal; font-variant-east-asian: normal; font-variant-alternates: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Enticed by the idea of real-time suggestions via large language models (LLMs), we soon realized the impracticality of such an approach, primarily due to the speed constraints. The challenge demanded a solution that operated offline but mirrored the capabilities of real-time systems.</span></p><br><p dir="ltr" style="line-height:1.38;margin-top:0pt;margin-bottom:0pt;"><span style="font-size: 11pt; font-family: Arial, sans-serif; font-variant-numeric: normal; font-variant-east-asian: normal; font-variant-alternates: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Our exploration led us to task the LLM to frame and answer all conceivable questions for every email a user received. While theoretically sound, the financial implications were prohibitive. Moreover, the risk of the LLM generating "hallucinations" or inaccurate results couldn't be ignored.</span></p><br><p dir="ltr" style="line-height:1.38;margin-top:0pt;margin-bottom:0pt;"><span style="font-size: 11pt; font-family: Arial, sans-serif; font-variant-numeric: normal; font-variant-east-asian: normal; font-variant-alternates: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">It was amidst this exploration that a revelatory idea emerged. We were already equipped with a sophisticated extraction pipeline capable of gleaning crucial information from emails. This was achieved using a blend of human curated regex parsing and meticulously fine-tuned AI models. This became the key to powering our search suggestions.</span></p><br><br><br><h2 dir="ltr" style="line-height:1.38;margin-top:18pt;margin-bottom:6pt;"><span style="font-size: 16pt; font-family: Arial, sans-serif; font-weight: 400; font-variant-numeric: normal; font-variant-east-asian: normal; font-variant-alternates: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Implementation Challenges: Transitioning from Conceptualization to Real-World Application</span></h2><br><p dir="ltr" style="line-height:1.38;margin-top:0pt;margin-bottom:0pt;"><span style="font-size: 11pt; font-family: Arial, sans-serif; font-variant-numeric: normal; font-variant-east-asian: normal; font-variant-alternates: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">1. The Intricacies of Indexing: One of the more pronounced challenges we encountered revolved around the intricacies of over-indexing. Let's delve into a hypothetical yet common scenario to elucidate this. Imagine a user intending to search for the term "staples." As they begin their search with the initial letters "sta", an all-encompassing approach to indexing, which takes into account every conceivable keyword, might mistakenly steer the user towards unrelated terms like "statement." Such deviations, although seemingly minor, can significantly hamper the user experience. Recognizing the paramount importance of ensuring that our search suggestions remained razor-sharp in their precision and highly relevant, we embarked on a methodical approach. Our resolution was to meticulously handpick and index only a curated set of keywords, ensuring that every suggestion offered was in perfect alignment with the user's intent.</span></p><br><p dir="ltr" style="line-height:1.38;margin-top:0pt;margin-bottom:0pt;"><span style="font-size: 11pt; font-family: Arial, sans-serif; font-variant-numeric: normal; font-variant-east-asian: normal; font-variant-alternates: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">2. The Quest for Relevance in Suggestions: Another challenge that frequently emerged was ensuring the highest degree of relevance in our search suggestions. This challenge becomes particularly pronounced when one considers a situation where a user's inbox is populated with multiple items that bear a resemblance to each other, say multiple flight confirmations. The conundrum we faced was discerning which of these similar items was of immediate interest to the user. Our breakthrough came in the form of an innovative approach centered on the extraction card date. Rather than basing our suggestions on the date the email was received, we shifted our focus to the date of the event described within the email, like a flight's departure date. This nuanced change enabled us to consistently zero in on and prioritize the most timely and pertinent result for the user.</span></p><br><p dir="ltr" style="line-height:1.38;margin-top:0pt;margin-bottom:0pt;"><span style="font-size: 11pt; font-family: Arial, sans-serif; font-variant-numeric: normal; font-variant-east-asian: normal; font-variant-alternates: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">3. Embracing Dynamism and Adaptability: When we first conceptualized our approach, our methodology was anchored in generating questions and answers during the email delivery phase, which were then indexed. However, as we delved deeper, it became evident that this approach, while robust, was somewhat inflexible and lacked the dynamism that modern search paradigms demand. Determined to infuse our system with greater adaptability, we pioneered the Just-in-Time question generation mechanism. With this refined approach, while the foundational search indexes are crafted at the point of delivery, the actual questions are dynamically constructed in real-time, tailored to the user's specific queries and the prevailing temporal context. This rejuvenated approach not only elevated the flexibility quotient of our system but also enhanced operational efficiency, ensuring that users always received the most pertinent suggestions.</span></p><h2 dir="ltr" style="line-height:1.38;text-align: justify;margin-top:18pt;margin-bottom:6pt;"><span style="font-size: 16pt; font-family: Arial, sans-serif; font-weight: 400; font-variant-numeric: normal; font-variant-east-asian: normal; font-variant-alternates: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Implementation</span></h2><h3 dir="ltr" style="line-height:1.38;margin-top:16pt;margin-bottom:4pt;"><span style="font-size: 14pt; font-family: Arial, sans-serif; color: rgb(67, 67, 67); font-weight: 400; font-variant-numeric: normal; font-variant-east-asian: normal; font-variant-alternates: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">At delivery time</span></h3><ul style="margin-top:0;margin-bottom:0;padding-inline-start:48px;"> <li dir="ltr" style="list-style-type: disc; font-size: 11pt; font-family: Arial, sans-serif; font-variant-numeric: normal; font-variant-east-asian: normal; font-variant-alternates: normal; font-variant-position: normal; vertical-align: baseline; white-space: pre;" aria-level="1"><p dir="ltr" style="line-height:1.38;margin-top:0pt;margin-bottom:0pt;" role="presentation"><span style="font-size: 11pt; font-variant-numeric: normal; font-variant-east-asian: normal; font-variant-alternates: normal; font-variant-position: normal; vertical-align: baseline; text-wrap: wrap;">Here we extract important information, create cards from the emails and save it in our BE store.</span> </p></li></ul><br><p dir="ltr" style="line-height:1.38;margin-top:0pt;margin-bottom:0pt;"><span style="font-size: 11pt; font-family: Arial, sans-serif; font-variant-numeric: normal; font-variant-east-asian: normal; font-variant-alternates: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"><span style="border:none;display:inline-block;overflow:hidden;width:624px;height:203px;"><img src="https://lh7-us.googleusercontent.com/XlIgexwxvY16iECtJhtFb9BRo_K0Qpp8c96HDscEeTC4sXeAoFuzlLoFBuRbbBn7oTaMrRiWlpMa9arKZRgo1nc6M-CdYNsCrhX5CVTGMSHElz_0egTEQ61xNaEROaMVLWepGQM67mHIQpAmdpjOuOk" width="624" height="203" style="margin-left:0px;margin-top:0px;"></span></span></p><h3 dir="ltr" style="line-height:1.38;margin-top:16pt;margin-bottom:4pt;"> <span style="font-size: 14pt; font-family: Arial, sans-serif; color: rgb(67, 67, 67); font-weight: 400; font-variant-numeric: normal; font-variant-east-asian: normal; font-variant-alternates: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Semantic Search Indexing</span></h3><ul style="margin-top:0;margin-bottom:0;padding-inline-start:48px;"> <li dir="ltr" style="list-style-type: disc; font-size: 11pt; font-family: Arial, sans-serif; font-variant-numeric: normal; font-variant-east-asian: normal; font-variant-alternates: normal; font-variant-position: normal; vertical-align: baseline; white-space: pre;" aria-level="1"><p dir="ltr" style="line-height:1.38;margin-top:0pt;margin-bottom:0pt;" role="presentation"><span style="font-size: 11pt; font-variant-numeric: normal; font-variant-east-asian: normal; font-variant-alternates: normal; font-variant-position: normal; vertical-align: baseline; text-wrap: wrap;">Fetch/Update the extracted cards from BE DB. Index by extracting the keywords and storing in Semantic Search Index - DB</span> </p></li></ul><p dir="ltr" style="line-height:1.38;margin-top:0pt;margin-bottom:0pt;"><span style="font-size: 11pt; font-family: Arial, sans-serif; font-variant-numeric: normal; font-variant-east-asian: normal; font-variant-alternates: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"><span style="border:none;display:inline-block;overflow:hidden;width:624px;height:215px;"><img src="https://lh7-us.googleusercontent.com/jqk3LhXr48R60DZccCiV8NUl0M8le9JfYkdjukvGiArSMv6PpskJMhW3wvFdW6bL0800osfB2GsIlPflonGJl_nwhEZsz_8p1xidFhYGI1Xkpy20nDbIG7_fnfyvIYYmfFCUx1Q0sgfUn2ASh1Q-AUU" width="624" height="215" style="margin-left:0px;margin-top:0px;"></span></span></p><h3 dir="ltr" style="line-height:1.38;margin-top:16pt;margin-bottom:4pt;"> <span style="font-size: 14pt; font-family: Arial, sans-serif; color: rgb(67, 67, 67); font-weight: 400; font-variant-numeric: normal; font-variant-east-asian: normal; font-variant-alternates: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Retrieval</span></h3><ul style="margin-top:0;margin-bottom:0;padding-inline-start:48px;"> <li dir="ltr" style="list-style-type: disc; font-size: 11pt; font-family: Arial, sans-serif; font-variant-numeric: normal; font-variant-east-asian: normal; font-variant-alternates: normal; font-variant-position: normal; vertical-align: baseline; white-space: pre;" aria-level="1"><p dir="ltr" style="line-height:1.38;margin-top:0pt;margin-bottom:0pt;" role="presentation"><span style="font-size: 11pt; font-variant-numeric: normal; font-variant-east-asian: normal; font-variant-alternates: normal; font-variant-position: normal; vertical-align: baseline; text-wrap: wrap;">When the user makes the search, we make a server call which inturn will find the best matching extraction card for the query.</span> </p></li> <li dir="ltr" style="list-style-type: disc; font-size: 11pt; font-family: Arial, sans-serif; font-variant-numeric: normal; font-variant-east-asian: normal; font-variant-alternates: normal; font-variant-position: normal; vertical-align: baseline; white-space: pre;" aria-level="1"><p dir="ltr" style="line-height:1.38;margin-top:0pt;margin-bottom:0pt;" role="presentation"><span style="font-size: 11pt; font-variant-numeric: normal; font-variant-east-asian: normal; font-variant-alternates: normal; font-variant-position: normal; vertical-align: baseline; text-wrap: wrap;">This will then be used for generating the suggestions for the semantic search.</span> </p></li></ul><h2 dir="ltr" style="line-height:1.38;text-align: justify;margin-top:18pt;margin-bottom:6pt;"><span style="font-size: 16pt; font-family: Arial, sans-serif; font-weight: 400; font-variant-numeric: normal; font-variant-east-asian: normal; font-variant-alternates: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"><span style="border:none;display:inline-block;overflow:hidden;width:624px;height:235px;"><img src="https://lh7-us.googleusercontent.com/uQLJEFuqU6Q48uDdqxOpD-sZPWvhf_nC0gYWHq7T12OF7XfaORsWEfnWnUDBYAzMOlSGCQnkAVzd9jvfI1SU0Uz2U8jfPocsw3H0TdnOHmIFhLGqAiSUTXb_AfcnVDwKjkAiyUq-4LVv1FjnB6VSALg" width="624" height="235" style="margin-left:0px;margin-top:0px;"></span></span></h2><br><br><h2 dir="ltr" style="line-height:1.38;margin-top:18pt;margin-bottom:6pt;"> <span style="font-size: 16pt; font-family: Arial, sans-serif; font-weight: 400; font-variant-numeric: normal; font-variant-east-asian: normal; font-variant-alternates: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Conclusion</span></h2><p dir="ltr" style="line-height:1.38;margin-top:0pt;margin-bottom:0pt;"><span style="font-size: 11pt; font-family: Arial, sans-serif; font-variant-numeric: normal; font-variant-east-asian: normal; font-variant-alternates: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Our innovative foray into enhancing search suggestions bore fruit in a remarkably short span of 30 days, even as we navigated the intricacies of a completely new tech stack. The benefits were manifold, an enriched user experience and 10% of semantic search traffic handled by search suggestions.</span></p><br><p dir="ltr" style="line-height:1.38;margin-top:0pt;margin-bottom:0pt;"><span style="font-size: 11pt; font-family: Arial, sans-serif; font-variant-numeric: normal; font-variant-east-asian: normal; font-variant-alternates: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">In the rapidly evolving realm of AI, challenges are omnipresent. However, our journey at Yahoo underscores the potential of lateral thinking and a commitment to User Experience. Through our experiences, we hope to galvanize the broader tech community, encouraging them to ideate and implement solutions that are not just effective, but also economically prudent.</span></p><div><span style="font-size: 11pt; font-family: Arial, sans-serif; font-variant-numeric: normal; font-variant-east-asian: normal; font-variant-alternates: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"><br></span></div><div><b>Contributors</b> <div>Kevin Patel(<a href="mailto:patelkev@yahooinc.com">patelkev@yahooinc.com</a>) + Renganathan Dhanogopal(<a href="mailto:renga@yahooinc.com">renga@yahooinc.com</a>) - Architecture + Tech Implementation </div> <div>Josh Jacobson + Sam Bouguerra(<a href="mailto:sbouguerra@yahooinc.com">sbouguerra@yahooinc.com</a>) - Product </div></div><br/><div><b>Author</b> <div>Kevin Patel(<a href="mailto:patelkev@yahooinc.com">patelkev@yahooinc.com</a>) - Director of Engineering Yahoo </div></div>,https://developer.yahoo.com/blogs/20231026" target="_blank" aria-label=”Share on Mail"><i class="d-icon d-mail" aria-hidden="true"></i></a></li> </ul> </div> </div> </div> <div class="pure-u-1-1"> <h2 class="blog-title">Deep Dive into Yahoo's Semantic Search Suggestions: From Challenges to Effective Implementation</h2> </div> <div class="pure-u-1-1"> <article class="blogBody" style="display: none;"> <h2 dir="ltr" style="line-height:1.38;margin-top:18pt;margin-bottom:6pt;"><span style="font-size: 16pt; font-family: Arial, sans-serif; font-weight: 400; font-variant-numeric: normal; font-variant-east-asian: normal; font-variant-alternates: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">The Pervasive Problem of Semantic Search</span></h2><p dir="ltr" style="line-height:1.38;margin-top:0pt;margin-bottom:0pt;"><span style="font-size: 11pt; font-family: Arial, sans-serif; font-variant-numeric: normal; font-variant-east-asian: normal; font-variant-alternates: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">In the expansive digital age where information is not only vast but grows at an exponential rate, the quest for accurate and relevant search results has never been more critical. Within this context, Yahoo Mail, serving millions of users, understood the transformative potential of semantic search. By leveraging the prowess of OpenAI embeddings, we embarked on a journey to provide search results that would understand and match user intent, going beyond the conventional keyword-based approach. And while the results were commendable, they weren't devoid of hurdles:</span></p><ol style="margin-top:0;margin-bottom:0;padding-inline-start:48px;"> <li dir="ltr" style="list-style-type: decimal; font-size: 11pt; font-family: Arial, sans-serif; font-variant-numeric: normal; font-variant-east-asian: normal; font-variant-alternates: normal; font-variant-position: normal; vertical-align: baseline; white-space: pre;" aria-level="1"><p dir="ltr" style="line-height:1.38;margin-top:0pt;margin-bottom:0pt;" role="presentation"><span style="font-size: 11pt; font-variant-numeric: normal; font-variant-east-asian: normal; font-variant-alternates: normal; font-variant-position: normal; vertical-align: baseline; text-wrap: wrap;">Performance Bottlenecks: The integration of OpenAI embeddings, though powerful, significantly slowed down our search process.</span> </p></li> <li dir="ltr" style="list-style-type: decimal; font-size: 11pt; font-family: Arial, sans-serif; font-variant-numeric: normal; font-variant-east-asian: normal; font-variant-alternates: normal; font-variant-position: normal; vertical-align: baseline; white-space: pre;" aria-level="1"><p dir="ltr" style="line-height:1.38;margin-top:0pt;margin-bottom:0pt;" role="presentation"><span style="font-size: 11pt; font-variant-numeric: normal; font-variant-east-asian: normal; font-variant-alternates: normal; font-variant-position: normal; vertical-align: baseline; text-wrap: wrap;">User Experience: The new system demanded users to type extensively, often more than they were used to, leading to potential user dissatisfaction.</span> </p></li> <li dir="ltr" style="list-style-type: decimal; font-size: 11pt; font-family: Arial, sans-serif; font-variant-numeric: normal; font-variant-east-asian: normal; font-variant-alternates: normal; font-variant-position: normal; vertical-align: baseline; white-space: pre;" aria-level="1"><p dir="ltr" style="line-height:1.38;margin-top:0pt;margin-bottom:0pt;" role="presentation"><span style="font-size: 11pt; font-variant-numeric: normal; font-variant-east-asian: normal; font-variant-alternates: normal; font-variant-position: normal; vertical-align: baseline; text-wrap: wrap;">Habit Change: Introducing a paradigm shift in search behaviors meant we were not just altering algorithms but challenging years of user habits.</span> </p></li></ol><br><p dir="ltr" style="line-height:1.38;margin-top:0pt;margin-bottom:0pt;"><span style="font-size: 11pt; font-family: Arial, sans-serif; font-variant-numeric: normal; font-variant-east-asian: normal; font-variant-alternates: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Our objective was crystal clear yet daunting: We wanted to augment the semantic search with suggestions that were rapid, economically viable, and seamlessly integrated into the user's natural search behavior.</span></p><br><br><h2 dir="ltr" style="line-height:1.38;margin-top:18pt;margin-bottom:6pt;"><span style="font-size: 16pt; font-family: Arial, sans-serif; font-weight: 400; font-variant-numeric: normal; font-variant-east-asian: normal; font-variant-alternates: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Approach: Exploration Phase</span></h2><br><p dir="ltr" style="line-height:1.38;margin-top:0pt;margin-bottom:0pt;"><span style="font-size: 11pt; font-family: Arial, sans-serif; font-variant-numeric: normal; font-variant-east-asian: normal; font-variant-alternates: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Enticed by the idea of real-time suggestions via large language models (LLMs), we soon realized the impracticality of such an approach, primarily due to the speed constraints. The challenge demanded a solution that operated offline but mirrored the capabilities of real-time systems.</span></p><br><p dir="ltr" style="line-height:1.38;margin-top:0pt;margin-bottom:0pt;"><span style="font-size: 11pt; font-family: Arial, sans-serif; font-variant-numeric: normal; font-variant-east-asian: normal; font-variant-alternates: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Our exploration led us to task the LLM to frame and answer all conceivable questions for every email a user received. While theoretically sound, the financial implications were prohibitive. Moreover, the risk of the LLM generating "hallucinations" or inaccurate results couldn't be ignored.</span></p><br><p dir="ltr" style="line-height:1.38;margin-top:0pt;margin-bottom:0pt;"><span style="font-size: 11pt; font-family: Arial, sans-serif; font-variant-numeric: normal; font-variant-east-asian: normal; font-variant-alternates: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">It was amidst this exploration that a revelatory idea emerged. We were already equipped with a sophisticated extraction pipeline capable of gleaning crucial information from emails. This was achieved using a blend of human curated regex parsing and meticulously fine-tuned AI models. This became the key to powering our search suggestions.</span></p><br><br><br><h2 dir="ltr" style="line-height:1.38;margin-top:18pt;margin-bottom:6pt;"><span style="font-size: 16pt; font-family: Arial, sans-serif; font-weight: 400; font-variant-numeric: normal; font-variant-east-asian: normal; font-variant-alternates: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Implementation Challenges: Transitioning from Conceptualization to Real-World Application</span></h2><br><p dir="ltr" style="line-height:1.38;margin-top:0pt;margin-bottom:0pt;"><span style="font-size: 11pt; font-family: Arial, sans-serif; font-variant-numeric: normal; font-variant-east-asian: normal; font-variant-alternates: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">1. The Intricacies of Indexing: One of the more pronounced challenges we encountered revolved around the intricacies of over-indexing. Let's delve into a hypothetical yet common scenario to elucidate this. Imagine a user intending to search for the term "staples." As they begin their search with the initial letters "sta", an all-encompassing approach to indexing, which takes into account every conceivable keyword, might mistakenly steer the user towards unrelated terms like "statement." Such deviations, although seemingly minor, can significantly hamper the user experience. Recognizing the paramount importance of ensuring that our search suggestions remained razor-sharp in their precision and highly relevant, we embarked on a methodical approach. Our resolution was to meticulously handpick and index only a curated set of keywords, ensuring that every suggestion offered was in perfect alignment with the user's intent.</span></p><br><p dir="ltr" style="line-height:1.38;margin-top:0pt;margin-bottom:0pt;"><span style="font-size: 11pt; font-family: Arial, sans-serif; font-variant-numeric: normal; font-variant-east-asian: normal; font-variant-alternates: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">2. The Quest for Relevance in Suggestions: Another challenge that frequently emerged was ensuring the highest degree of relevance in our search suggestions. This challenge becomes particularly pronounced when one considers a situation where a user's inbox is populated with multiple items that bear a resemblance to each other, say multiple flight confirmations. The conundrum we faced was discerning which of these similar items was of immediate interest to the user. Our breakthrough came in the form of an innovative approach centered on the extraction card date. Rather than basing our suggestions on the date the email was received, we shifted our focus to the date of the event described within the email, like a flight's departure date. This nuanced change enabled us to consistently zero in on and prioritize the most timely and pertinent result for the user.</span></p><br><p dir="ltr" style="line-height:1.38;margin-top:0pt;margin-bottom:0pt;"><span style="font-size: 11pt; font-family: Arial, sans-serif; font-variant-numeric: normal; font-variant-east-asian: normal; font-variant-alternates: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">3. Embracing Dynamism and Adaptability: When we first conceptualized our approach, our methodology was anchored in generating questions and answers during the email delivery phase, which were then indexed. However, as we delved deeper, it became evident that this approach, while robust, was somewhat inflexible and lacked the dynamism that modern search paradigms demand. Determined to infuse our system with greater adaptability, we pioneered the Just-in-Time question generation mechanism. With this refined approach, while the foundational search indexes are crafted at the point of delivery, the actual questions are dynamically constructed in real-time, tailored to the user's specific queries and the prevailing temporal context. This rejuvenated approach not only elevated the flexibility quotient of our system but also enhanced operational efficiency, ensuring that users always received the most pertinent suggestions.</span></p><h2 dir="ltr" style="line-height:1.38;text-align: justify;margin-top:18pt;margin-bottom:6pt;"><span style="font-size: 16pt; font-family: Arial, sans-serif; font-weight: 400; font-variant-numeric: normal; font-variant-east-asian: normal; font-variant-alternates: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Implementation</span></h2><h3 dir="ltr" style="line-height:1.38;margin-top:16pt;margin-bottom:4pt;"><span style="font-size: 14pt; font-family: Arial, sans-serif; color: rgb(67, 67, 67); font-weight: 400; font-variant-numeric: normal; font-variant-east-asian: normal; font-variant-alternates: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">At delivery time</span></h3><ul style="margin-top:0;margin-bottom:0;padding-inline-start:48px;"> <li dir="ltr" style="list-style-type: disc; font-size: 11pt; font-family: Arial, sans-serif; font-variant-numeric: normal; font-variant-east-asian: normal; font-variant-alternates: normal; font-variant-position: normal; vertical-align: baseline; white-space: pre;" aria-level="1"><p dir="ltr" style="line-height:1.38;margin-top:0pt;margin-bottom:0pt;" role="presentation"><span style="font-size: 11pt; font-variant-numeric: normal; font-variant-east-asian: normal; font-variant-alternates: normal; font-variant-position: normal; vertical-align: baseline; text-wrap: wrap;">Here we extract important information, create cards from the emails and save it in our BE store.</span> </p></li></ul><br><p dir="ltr" style="line-height:1.38;margin-top:0pt;margin-bottom:0pt;"><span style="font-size: 11pt; font-family: Arial, sans-serif; font-variant-numeric: normal; font-variant-east-asian: normal; font-variant-alternates: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"><span style="border:none;display:inline-block;overflow:hidden;width:624px;height:203px;"><img src="https://lh7-us.googleusercontent.com/XlIgexwxvY16iECtJhtFb9BRo_K0Qpp8c96HDscEeTC4sXeAoFuzlLoFBuRbbBn7oTaMrRiWlpMa9arKZRgo1nc6M-CdYNsCrhX5CVTGMSHElz_0egTEQ61xNaEROaMVLWepGQM67mHIQpAmdpjOuOk" width="624" height="203" style="margin-left:0px;margin-top:0px;"></span></span></p><h3 dir="ltr" style="line-height:1.38;margin-top:16pt;margin-bottom:4pt;"> <span style="font-size: 14pt; font-family: Arial, sans-serif; color: rgb(67, 67, 67); font-weight: 400; font-variant-numeric: normal; font-variant-east-asian: normal; font-variant-alternates: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Semantic Search Indexing</span></h3><ul style="margin-top:0;margin-bottom:0;padding-inline-start:48px;"> <li dir="ltr" style="list-style-type: disc; font-size: 11pt; font-family: Arial, sans-serif; font-variant-numeric: normal; font-variant-east-asian: normal; font-variant-alternates: normal; font-variant-position: normal; vertical-align: baseline; white-space: pre;" aria-level="1"><p dir="ltr" style="line-height:1.38;margin-top:0pt;margin-bottom:0pt;" role="presentation"><span style="font-size: 11pt; font-variant-numeric: normal; font-variant-east-asian: normal; font-variant-alternates: normal; font-variant-position: normal; vertical-align: baseline; text-wrap: wrap;">Fetch/Update the extracted cards from BE DB. Index by extracting the keywords and storing in Semantic Search Index - DB</span> </p></li></ul><p dir="ltr" style="line-height:1.38;margin-top:0pt;margin-bottom:0pt;"><span style="font-size: 11pt; font-family: Arial, sans-serif; font-variant-numeric: normal; font-variant-east-asian: normal; font-variant-alternates: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"><span style="border:none;display:inline-block;overflow:hidden;width:624px;height:215px;"><img src="https://lh7-us.googleusercontent.com/jqk3LhXr48R60DZccCiV8NUl0M8le9JfYkdjukvGiArSMv6PpskJMhW3wvFdW6bL0800osfB2GsIlPflonGJl_nwhEZsz_8p1xidFhYGI1Xkpy20nDbIG7_fnfyvIYYmfFCUx1Q0sgfUn2ASh1Q-AUU" width="624" height="215" style="margin-left:0px;margin-top:0px;"></span></span></p><h3 dir="ltr" style="line-height:1.38;margin-top:16pt;margin-bottom:4pt;"> <span style="font-size: 14pt; font-family: Arial, sans-serif; color: rgb(67, 67, 67); font-weight: 400; font-variant-numeric: normal; font-variant-east-asian: normal; font-variant-alternates: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Retrieval</span></h3><ul style="margin-top:0;margin-bottom:0;padding-inline-start:48px;"> <li dir="ltr" style="list-style-type: disc; font-size: 11pt; font-family: Arial, sans-serif; font-variant-numeric: normal; font-variant-east-asian: normal; font-variant-alternates: normal; font-variant-position: normal; vertical-align: baseline; white-space: pre;" aria-level="1"><p dir="ltr" style="line-height:1.38;margin-top:0pt;margin-bottom:0pt;" role="presentation"><span style="font-size: 11pt; font-variant-numeric: normal; font-variant-east-asian: normal; font-variant-alternates: normal; font-variant-position: normal; vertical-align: baseline; text-wrap: wrap;">When the user makes the search, we make a server call which inturn will find the best matching extraction card for the query.</span> </p></li> <li dir="ltr" style="list-style-type: disc; font-size: 11pt; font-family: Arial, sans-serif; font-variant-numeric: normal; font-variant-east-asian: normal; font-variant-alternates: normal; font-variant-position: normal; vertical-align: baseline; white-space: pre;" aria-level="1"><p dir="ltr" style="line-height:1.38;margin-top:0pt;margin-bottom:0pt;" role="presentation"><span style="font-size: 11pt; font-variant-numeric: normal; font-variant-east-asian: normal; font-variant-alternates: normal; font-variant-position: normal; vertical-align: baseline; text-wrap: wrap;">This will then be used for generating the suggestions for the semantic search.</span> </p></li></ul><h2 dir="ltr" style="line-height:1.38;text-align: justify;margin-top:18pt;margin-bottom:6pt;"><span style="font-size: 16pt; font-family: Arial, sans-serif; font-weight: 400; font-variant-numeric: normal; font-variant-east-asian: normal; font-variant-alternates: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"><span style="border:none;display:inline-block;overflow:hidden;width:624px;height:235px;"><img src="https://lh7-us.googleusercontent.com/uQLJEFuqU6Q48uDdqxOpD-sZPWvhf_nC0gYWHq7T12OF7XfaORsWEfnWnUDBYAzMOlSGCQnkAVzd9jvfI1SU0Uz2U8jfPocsw3H0TdnOHmIFhLGqAiSUTXb_AfcnVDwKjkAiyUq-4LVv1FjnB6VSALg" width="624" height="235" style="margin-left:0px;margin-top:0px;"></span></span></h2><br><br><h2 dir="ltr" style="line-height:1.38;margin-top:18pt;margin-bottom:6pt;"> <span style="font-size: 16pt; font-family: Arial, sans-serif; font-weight: 400; font-variant-numeric: normal; font-variant-east-asian: normal; font-variant-alternates: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Conclusion</span></h2><p dir="ltr" style="line-height:1.38;margin-top:0pt;margin-bottom:0pt;"><span style="font-size: 11pt; font-family: Arial, sans-serif; font-variant-numeric: normal; font-variant-east-asian: normal; font-variant-alternates: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Our innovative foray into enhancing search suggestions bore fruit in a remarkably short span of 30 days, even as we navigated the intricacies of a completely new tech stack. The benefits were manifold, an enriched user experience and 10% of semantic search traffic handled by search suggestions.</span></p><br><p dir="ltr" style="line-height:1.38;margin-top:0pt;margin-bottom:0pt;"><span style="font-size: 11pt; font-family: Arial, sans-serif; font-variant-numeric: normal; font-variant-east-asian: normal; font-variant-alternates: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">In the rapidly evolving realm of AI, challenges are omnipresent. However, our journey at Yahoo underscores the potential of lateral thinking and a commitment to User Experience. Through our experiences, we hope to galvanize the broader tech community, encouraging them to ideate and implement solutions that are not just effective, but also economically prudent.</span></p><div><span style="font-size: 11pt; font-family: Arial, sans-serif; font-variant-numeric: normal; font-variant-east-asian: normal; font-variant-alternates: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"><br></span></div><div><b>Contributors</b> <div>Kevin Patel(<a href="mailto:patelkev@yahooinc.com">patelkev@yahooinc.com</a>) + Renganathan Dhanogopal(<a href="mailto:renga@yahooinc.com">renga@yahooinc.com</a>) - Architecture + Tech Implementation </div> <div>Josh Jacobson + Sam Bouguerra(<a href="mailto:sbouguerra@yahooinc.com">sbouguerra@yahooinc.com</a>) - Product </div></div><br/><div><b>Author</b> <div>Kevin Patel(<a href="mailto:patelkev@yahooinc.com">patelkev@yahooinc.com</a>) - Director of Engineering Yahoo </div></div> </article> </div> <div class="pure-u-1-1"> <div class="categories is-hidden-touch"> <span class="category"> <a href='mail' target="_blank">mail</a></span> <span class="category"> <a href='search' target="_blank">search</a></span> <span class="category"> <a href='AI' target="_blank">AI</a></span> <span class="category"> <a href='artificial%20intelligence' target="_blank">artificial intelligence</a></span> <span class="category"> <a href='LLM' target="_blank">LLM</a></span> </div> </div> </div> </div> </div> </section> <script nonce="dwKkGiI6lnys9hUgPh30RA=="> var body = $(".blogBody"); var innerHTML = body.html() .replace(/&/g, "&") .replace(/</g, "<") .replace(/>/g, ">") .replace(/"/g, "\"") .replace(/'/g, "\'"); body.html(innerHTML); body.show(); </script> </div> </div> </div> <!-- FOOTER --> <footer class="footer yahoo" style="background-color: #f0f3f5;background-image: none;"> <section class="section"> <div class="container"> <div class="columns is-variable is-multiline is-5"> <div class="column foot-link-block"> <span class="featured-header is-block is-bold"> Support <i class="toggle-icon fa fa-angle-down" aria-hidden="true"></i> </span> <div class="clickDisplay hideClick"> <a href="https://guce.yahoo.com/terms?locale=en-US" target="_blank" rel="noopener">Terms</a> <a style="cursor: default; pointer-events: none"> and </a> <a href="https://guce.yahoo.com/privacy-policy?locale=en-US" target="_blank" rel="noopener">Privacy Policy</a> </div> <a class="is-block clickDisplay hideClick" href="https://guce.yahoo.com/privacy-dashboard?locale=en-US" target="_blank" rel="noopener">Privacy Dashboard</a> <a class="is-block clickDisplay hideClick" href="https://developer.yahoo.com/opensource/" target="_blank" rel="noopener">About Us</a> <a class="is-block clickDisplay hideClick" href="https://www.linkedin.com/company/yahoo/jobs/" target="_blank" rel="noopener">Jobs</a> <a class="is-block clickDisplay hideClick" href="https://legal.yahoo.com/us/en/yahoo/privacy/products/developer/index.html" target="_blank" rel="noopener">Developer Privacy</a> <a class="is-block clickDisplay hideClick" href="https://policies.yahoo.com/us/en/yahoo/terms/product-atos/apiforydn/index.htm" target="_blank" rel="noopener">Developer Terms</a> <a class="is-block clickDisplay hideClick" href="https://developer.yahoo.com/policies/" target="_blank" rel="noopener">Developer Policies</a> <a class="is-block clickDisplay hideClick" href="https://yahoo.uservoice.com/forums/182455-yahoo-developer-network" target="_blank" rel="noopener">Site Feedback</a> </div> <div class="column foot-link-block"> <span class="featured-header is-block is-bold">Brands <i class="toggle-icon fa fa-angle-down" aria-hidden="true"></i> </span> <a class="is-block clickDisplay hideClick" href="https://developer.yahoo.com" target="_blank" rel="noopener">Yahoo Developer</a> <a class="is-block clickDisplay hideClick" href="https://developer.edgecast.com/" target="_blank" rel="noopener">Yahoo Edgecast Developer</a> <a class="is-block clickDisplay hideClick" href="https://help.yahoo.com/kb/account" target="_blank" rel="noopener">Ad Platform Help Center</a> </div> <div class="column logo foot-link-block"> <div> <a class="nav-brand is-block" href="https://www.yahoo.com/" target="_blank" rel="noopener"> <img class="nav-brand is-block" src="/static/images/yahoo-logo-purple.svg" alt="Yahoo Logo"/> </a> <span id="copyright" class="is-block is-size-7 copy-right"></span> </div> </div> </div> </div> </section> </footer> <script nonce="dwKkGiI6lnys9hUgPh30RA=="> $('.featured-header').click(function(){ $(this).find("i").toggleClass('fa-angle-down fa-angle-up') $(this).nextAll('.clickDisplay').toggleClass('hideClick showClick') }); $('#copyright').html("© " + new Date().getFullYear() + " Yahoo. All rights reserved."); </script> <script nonce="dwKkGiI6lnys9hUgPh30RA==" src="https://s.yimg.com/zz/combo?oo/fe/js/polyfills/assign-min_6f975308e.js&oo/fe/js/navigation-min_3c753d938.js&oo/fe/js/utils-min_65ef3b583.js&oo/fe/js/admin-min_4f54d799e.js"></script> <script nonce="dwKkGiI6lnys9hUgPh30RA=="> var head = $('.nb_page-head-search'), url = document.URL, fragment = url.substring(url.indexOf('#')), pathAndFragment = '/' + url.split('/').splice(3).join('/'), // i.e., /gemini/guide/gsg.html#integrating-oauth path = (pathAndFragment.indexOf('#') > -1) ? pathAndFragment.substring(0, pathAndFragment.indexOf('#')) : pathAndFragment, // i.e., /gemini/guide/gsg.html // the menu li container that matches the scope of menu items on the current page menuPageRoot, languageLeaveWait, userLeaveWait, // a timeout for mouseleave from header's user id and pic elements menuIsExpanded = false, overMenu = false, // is cursor over the user id or pic userOverlay, // menu overlay that pops up from user id or pic appsOverlay, // menu overlay that pops up from My Apps link languageOverlay, // menu overlay that pops up from language dropdown link dialpadOverlay, searchOverlay, headToMenuArr = [], $headings, menuList = $('.pure-menu a'), menuLiList = $('.pure-menu li'), pageMenuList, // only the menu items that have heads on this page (used for scrolling highlight) isThrottled = false, throttleDuration = 100; // ms if ($('.feedback_close')) { $('.feedback_close').click(function (e) { $('.feedback').remove(); }); } // allows the menu to slide in/out on mobile size screens function slideMobileMenu() { $('#layout').toggleClass('active'); // the menu and page contents $('.pure-menu').toggleClass('active'); // the menu $('#menuLink').toggleClass('active'); // hamburger icon $('.nb_footer').toggleClass('active'); // footer needs to slide too $('.nb_mobile-header').toggleClass('active'); // top bar needs to slide too $('.mobile-header').toggleClass('active'); // top bar needs to slide too $('.footer').toggleClass('active'); // footer needs to slide too } $('#menuLink').click(function (e) { e.preventDefault(); // without this, the first menu item can get triggered on a mobile device when the hamburger icon is clicked setTimeout(function () { slideMobileMenu(); }, 200); }); // set/remove box-shadow on head if scrolled $(document).scroll(function () { if (window.scrollY > 5) { head.addClass('head-shadow'); } else { head.removeClass('head-shadow'); } }); // My Apps Overlay Dropdown appsOverlay = $('#apps-overlay'); appsOverlay.css('z-index', 10); // show the apps menu if mouse enters My Apps link $('.head-right-controls').delegate('#myapps-dropdown', 'mouseover', function (e) { languageOverlay.css('display','none'); var filterCheck = document.getElementById("filter-dropdown"); if(filterCheck){ searchOverlay.css('display','none'); } const left = $(".head-right-controls").position().left + $(".head-right-controls").width() - 280; appsOverlay.css({left: left + "px"}); appsOverlay.css('display','table'); }); // when over My Apps menu, clear the timer // that's waiting to remove the menu $('#apps-overlay').mouseover(function () { clearTimeout(languageLeaveWait); overMenu = true; }); // when cursor leaves My Apps, // if it doesn't move over the menu within 1sec, // hide the menu $('#myapps-dropdown').mouseleave(function (e) { languageLeaveWait = setTimeout(function () { if (overMenu === false) { removeAppsOverlay(e); } }, 1000); }); function removeAppsOverlay(e) { appsOverlay.css('display','none'); overMenu = false; } $('#apps-overlay').click(removeAppsOverlay); $('#apps-overlay').mouseleave(removeAppsOverlay); // Begin language overlay languageOverlay = $('#language-overlay'); languageOverlay.css('z-index', 10); $('.head-right-controls').delegate('#language-dropdown', 'mouseover', function (e) { appsOverlay.css('display','none'); dialpadOverlay.css('display','none'); var filterCheck = document.getElementById("filter-dropdown"); if(filterCheck){ searchOverlay.css('display','none'); const left = $(".head-right-controls").position().left + $(".head-right-controls").width() - 155; languageOverlay.css({left: left + "px"}); } else { const top = $(".head-right-controls").position().top + $(".head-right-controls").height() + 5; const left = $(".head-right-controls").position().left + $(".head-right-controls").width() - 275; languageOverlay.css({ top: top+"px", left: left + "px" }); } languageOverlay.css('display','table'); }); $('#language-overlay').mouseover(function () { clearTimeout(languageLeaveWait); overMenu = true; }); // when cursor leaves My Apps, // if it doesn't move over the menu within 1sec, // hide the menu $('#language-dropdown').mouseleave(function (e) { languageLeaveWait = setTimeout(function () { if (overMenu === false) { removeLanguageOverlay(e); } }, 1000); }); function removeLanguageOverlay() { languageOverlay.css('display','none'); overMenu = false; } $('#language-overlay').click(removeLanguageOverlay); $('#language-overlay').mouseleave(removeLanguageOverlay); // Begin dialpad overlay dialpadOverlay = $('#dialpad-overlay'); dialpadOverlay.css('z-index', 10); $('.head-right-controls').delegate('#dialpad-dropdown', 'mouseover', function (e) { let top; let left; left = $(".head-right-controls").position().left + $(".head-right-controls").width()-545; top = $(".head-right-controls").position().top + $(".head-right-controls").height() - 5; languageOverlay.css('display','none'); dialpadOverlay.css({ top: top+"px", left: left + "px" }); dialpadOverlay.css({ 'display':'block', 'background-color': '#fff', 'border-radius': '4px', 'box-shadow': '0 2px 8px 2px rgba(0, 0, 0, 0.36)', 'width': '410px', 'height': '265px', 'padding':'25px 25px 0px', 'min-width': '20rem'}); }); var overDialMenu = false; $('#dialpad-overlay').mouseover(function () { clearTimeout(dialpadLeaveWait); overDialMenu = true; }); // when cursor leaves My Apps, // if it doesn't move over the menu within 1sec, // hide the menu $('#dialpad-dropdown').mouseleave(function (e) { dialpadLeaveWait = setTimeout(function () { if (overDialMenu === false) { removeDialpadOverlay(e); } }, 1000); }); function removeDialpadOverlay() { dialpadOverlay.css('display','none'); overDialMenu = false; } $('#dialpad-overlay').click(removeDialpadOverlay); $('#dialpad-overlay').mouseleave(removeDialpadOverlay); $('#dialpad-dropdown').click(function(){ $('#dialpad-overlay').css('display','block'); }); function supportsSVG() { return !!document.createElementNS && !!document.createElementNS('http://www.w3.org/2000/svg', 'svg').createSVGRect; } if (!supportsSVG()) { var imgs = document.getElementsByTagName('img'); var dotSVG = /\.svg$/; for (var i = 0; i !== imgs.length; ++i) { if (imgs[i].src.match(dotSVG) && imgs[i].dataAlternate) { imgs[i].src = imgs[i].dataAlternate; } } } const tabholders = document.getElementsByClassName('tabview'); for (var x = 0, len = tabholders.length; x < len; x++) { $("#" + $(tabholders[x]).attr("id")).easytabs({animationSpeed:'fast'}); } $(".tabview-tab a").click(function () { for (var x = 0, len = tabholders.length; x < len; x++) { $("#" + $(tabholders[x]).attr("id")).easytabs({'select':$(this).attr('href')}); } }); </script> <script nonce="dwKkGiI6lnys9hUgPh30RA==" src="/static/js/right-nav.js"></script> <script nonce="dwKkGiI6lnys9hUgPh30RA==" src="https://s.yimg.com/ss/rapid-3.41.3.js"></script> <script nonce="dwKkGiI6lnys9hUgPh30RA=="> var rapid = new YAHOO.i13n.Rapid({webworker_file: 'http://l.yimg.com/oo/fe/js/vendor/rapidworker-1-min_b8fccc270.js' ,spaceid:1197800063, tracked_mods:['layout']}); </script> <script nonce="dwKkGiI6lnys9hUgPh30RA=="> $(document).ready(function() { $('.dropdown-trigger button').click(function(){ var element = $('.dropdown'); $('.dropdown').toggleClass('is-active'); $('.dropdown button').attr( 'aria-expanded', $(element).hasClass('is-active') ); event.stopPropagation(); }); $('body').click(function(){ var element = $('.dropdown'); var menuOpen = $(element).hasClass('is-active'); if (menuOpen) { $(element).removeClass('is-active'); $('.dropdown button').attr('aria-expanded', !menuOpen); } }); }); (function(){ var test = document.createElement('div'); test.innerHTML = ' '; test.className = 'adsbox'; document.body.appendChild(test); window.setTimeout(function() { if (test.offsetHeight === 0) { if ($(':header').length > 0 && $(':header').is(':visible') === false) { var callout = $('div.g-content'); callout.first().prepend("<div class='admonition important' style='margin-top: 20px'><p class='first admonition-title'>Ad Blocker Detected</p><p class='last'>We've detected the use of an ad blocker. For the best viewing experience, we recommend that you disable your ad blocker.</p>"); } } test.remove(); }, 100); })(); </script> <script nonce="dwKkGiI6lnys9hUgPh30RA=="> (function() { // Check if we're in gemini domain if (window.location.href.indexOf('gemini-publishers-synd/docs/') > -1) { console.log(window.location.href); var callout = $('div.g-content'); callout.first().prepend("<div class='admonition important' style='margin-top: 20px'><p class='first admonition-title'>Deprication Warning</p><p class='last'>These docs have been deprecated. Please use <a href='https://developer.yahoo.com/flurry/docs/publisher/web/'>the documentation here</a>.</p>"); } })(); $("div.section table").parent().css("overflow-x", "auto"); </script> <!-- renders each hoverbox--> <script nonce="dwKkGiI6lnys9hUgPh30RA=="> function enableTooltip(){ $('.reference.internal').each(function() { var reference = $(this).find('.std-term'); var definition = $(this.hash + ' + dd'); if (reference.length !== 0 && definition.length !== 0) { $(this).removeAttr("href"); // remove link to glossary page $(this).on("click", function(e) { // make it not clickable e.preventDefault(); return false; }); $(reference) // set tooltip .tooltip({ html: true, trigger: 'manual', placement: 'top', title: definition.html() }).on("mouseenter", function() { var _this = this; $('.reference.internal .std-term').tooltip('hide'); $(this).tooltip('show'); $('.tooltip').on('mouseleave', function() { $(_this).tooltip('hide'); }); }).on("mouseleave", function() { var _this = this; setTimeout(function() { if ($('.tooltip:hover').length === 0) { $(_this).tooltip('hide'); } }, 200); }); } }); } enableTooltip(); </script> <script nonce="dwKkGiI6lnys9hUgPh30RA==" type="text/javascript" src="/static/js/vmdn.js"></script> <script nonce="dwKkGiI6lnys9hUgPh30RA==" type="text/javascript" src="/static/js/rebranding_documentation.js"></script> </body> </html>