Files

1482 lines
48 KiB
HTML

<!doctype html>
<html lang="en" class="no-js">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<meta name="author" content="Nirant Kasliwal">
<link rel="canonical" href="https://qdrant.github.io/fastembed/examples/ColBERT_with_FastEmbed/">
<link rel="prev" href="../../Getting%20Started/">
<link rel="next" href="../FastEmbed_GPU/">
<link rel="icon" href="../../assets/favicon.png">
<meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.7.7">
<title>ColBERT with FastEmbed - FastEmbed</title>
<link rel="stylesheet" href="../../assets/stylesheets/main.ec1eaa64.min.css">
<link rel="stylesheet" href="../../assets/stylesheets/palette.ab4e12ef.min.css">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:300,300i,400,400i,700,700i%7CRoboto+Mono:400,400i,700,700i&display=fallback">
<style>:root{--md-text-font:"Roboto";--md-code-font:"Roboto Mono"}</style>
<link rel="stylesheet" href="../../assets/_mkdocstrings.css">
<link rel="stylesheet" href="../../css/ansi-colours.css">
<link rel="stylesheet" href="../../css/jupyter-cells.css">
<link rel="stylesheet" href="../../css/pandas-dataframe.css">
<script>__md_scope=new URL("../..",location),__md_hash=e=>[...e].reduce(((e,_)=>(e<<5)-e+_.charCodeAt(0)),0),__md_get=(e,_=localStorage,t=__md_scope)=>JSON.parse(_.getItem(t.pathname+"."+e)),__md_set=(e,_,t=localStorage,a=__md_scope)=>{try{t.setItem(a.pathname+"."+e,JSON.stringify(_))}catch(e){}}</script>
</head>
<body dir="ltr" data-md-color-scheme="default" data-md-color-primary="indigo" data-md-color-accent="indigo">
<input class="md-toggle" data-md-toggle="drawer" type="checkbox" id="__drawer" autocomplete="off">
<input class="md-toggle" data-md-toggle="search" type="checkbox" id="__search" autocomplete="off">
<label class="md-overlay" for="__drawer"></label>
<div data-md-component="skip">
<a href="#late-interaction-text-embedding-models" class="md-skip">
Skip to content
</a>
</div>
<div data-md-component="announce">
<aside class="md-banner">
<div class="md-banner__inner md-grid md-typeset">
<button class="md-banner__button md-icon" aria-label="Don't show this again">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z"/></svg>
</button>
<div style="text-align: center">
If you're using FastEmbed from Qdrant, join the
<a rel="me" href="https://discord.gg/Qy6HCJK9Dc">
<span class="twemoji mastodon">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 576 512"><!--! Font Awesome Free 7.1.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2025 Fonticons, Inc.--><path d="M492.5 69.8c-.2-.3-.4-.6-.8-.7-38.1-17.5-78.4-30-119.7-37.1-.4-.1-.8 0-1.1.1s-.6.4-.8.8c-5.5 9.9-10.5 20.2-14.9 30.6-44.6-6.8-89.9-6.8-134.4 0-4.5-10.5-9.5-20.7-15.1-30.6-.2-.3-.5-.6-.8-.8s-.7-.2-1.1-.2C162.5 39 122.2 51.5 84.1 69c-.3.1-.6.4-.8.7C7.1 183.5-13.8 294.6-3.6 404.2c0 .3.1.5.2.8s.3.4.5.6c44.4 32.9 94 58 146.8 74.2.4.1.8.1 1.1 0s.7-.4.9-.7c11.3-15.4 21.4-31.8 30-48.8.1-.2.2-.5.2-.8s0-.5-.1-.8-.2-.5-.4-.6-.4-.3-.7-.4c-15.8-6.1-31.2-13.4-45.9-21.9-.3-.2-.5-.4-.7-.6s-.3-.6-.3-.9 0-.6.2-.9.3-.5.6-.7c3.1-2.3 6.2-4.7 9.1-7.1.3-.2.6-.4.9-.4s.7 0 1 .1c96.2 43.9 200.4 43.9 295.5 0 .3-.1.7-.2 1-.2s.7.2.9.4c2.9 2.4 6 4.9 9.1 7.2.2.2.4.4.6.7s.2.6.2.9-.1.6-.3.9-.4.5-.6.6c-14.7 8.6-30 15.9-45.9 21.8-.2.1-.5.2-.7.4s-.3.4-.4.7-.1.5-.1.8.1.5.2.8c8.8 17 18.8 33.3 30 48.8.2.3.6.6.9.7s.8.1 1.1 0c52.9-16.2 102.6-41.3 147.1-74.2.2-.2.4-.4.5-.6s.2-.5.2-.8c12.3-126.8-20.5-236.9-86.9-334.5zm-302 267.7c-29 0-52.8-26.6-52.8-59.2s23.4-59.2 52.8-59.2c29.7 0 53.3 26.8 52.8 59.2 0 32.7-23.4 59.2-52.8 59.2m195.4 0c-29 0-52.8-26.6-52.8-59.2s23.4-59.2 52.8-59.2c29.7 0 53.3 26.8 52.8 59.2 0 32.7-23.2 59.2-52.8 59.2"/></svg>
</span>
<strong>Qdrant Discord server</strong>
</a>
to get help and share your work! Or check out <a rel="me"
href="https://cloud.qdrant.io?utm_source=twitter&utm_medium=website&utm_campaign=fastembed">Qdrant Cloud</a> to
get started with vector search!
</div>
</div>
<script>var el=document.querySelector("[data-md-component=announce]");if(el){var content=el.querySelector(".md-typeset");__md_hash(content.innerHTML)===__md_get("__announce")&&(el.hidden=!0)}</script>
</aside>
</div>
<header class="md-header md-header--shadow" data-md-component="header">
<nav class="md-header__inner md-grid" aria-label="Header">
<a href="../.." title="FastEmbed" class="md-header__button md-logo" aria-label="FastEmbed" data-md-component="logo">
<img src="../../assets/favicon.png" alt="logo">
</a>
<label class="md-header__button md-icon" for="__drawer">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M3 6h18v2H3zm0 5h18v2H3zm0 5h18v2H3z"/></svg>
</label>
<div class="md-header__title" data-md-component="header-title">
<div class="md-header__ellipsis">
<div class="md-header__topic">
<span class="md-ellipsis">
FastEmbed
</span>
</div>
<div class="md-header__topic" data-md-component="header-topic">
<span class="md-ellipsis">
ColBERT with FastEmbed
</span>
</div>
</div>
</div>
<form class="md-header__option" data-md-component="palette">
<input class="md-option" data-md-color-media="" data-md-color-scheme="default" data-md-color-primary="indigo" data-md-color-accent="indigo" aria-label="Switch to dark mode" type="radio" name="__palette" id="__palette_0">
<label class="md-header__button md-icon" title="Switch to dark mode" for="__palette_1" hidden>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 8a4 4 0 0 0-4 4 4 4 0 0 0 4 4 4 4 0 0 0 4-4 4 4 0 0 0-4-4m0 10a6 6 0 0 1-6-6 6 6 0 0 1 6-6 6 6 0 0 1 6 6 6 6 0 0 1-6 6m8-9.31V4h-4.69L12 .69 8.69 4H4v4.69L.69 12 4 15.31V20h4.69L12 23.31 15.31 20H20v-4.69L23.31 12z"/></svg>
</label>
<input class="md-option" data-md-color-media="" data-md-color-scheme="slate" data-md-color-primary="indigo" data-md-color-accent="indigo" aria-label="Switch to light mode" type="radio" name="__palette" id="__palette_1">
<label class="md-header__button md-icon" title="Switch to light mode" for="__palette_0" hidden>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 18c-.89 0-1.74-.2-2.5-.55C11.56 16.5 13 14.42 13 12s-1.44-4.5-3.5-5.45C10.26 6.2 11.11 6 12 6a6 6 0 0 1 6 6 6 6 0 0 1-6 6m8-9.31V4h-4.69L12 .69 8.69 4H4v4.69L.69 12 4 15.31V20h4.69L12 23.31 15.31 20H20v-4.69L23.31 12z"/></svg>
</label>
</form>
<script>var palette=__md_get("__palette");if(palette&&palette.color){if("(prefers-color-scheme)"===palette.color.media){var media=matchMedia("(prefers-color-scheme: light)"),input=document.querySelector(media.matches?"[data-md-color-media='(prefers-color-scheme: light)']":"[data-md-color-media='(prefers-color-scheme: dark)']");palette.color.media=input.getAttribute("data-md-color-media"),palette.color.scheme=input.getAttribute("data-md-color-scheme"),palette.color.primary=input.getAttribute("data-md-color-primary"),palette.color.accent=input.getAttribute("data-md-color-accent")}for(var[key,value]of Object.entries(palette.color))document.body.setAttribute("data-md-color-"+key,value)}</script>
<label class="md-header__button md-icon" for="__search">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.52 6.52 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5"/></svg>
</label>
<div class="md-search" data-md-component="search" role="dialog">
<label class="md-search__overlay" for="__search"></label>
<div class="md-search__inner" role="search">
<form class="md-search__form" name="search">
<input type="text" class="md-search__input" name="query" aria-label="Search" placeholder="Search" autocapitalize="off" autocorrect="off" autocomplete="off" spellcheck="false" data-md-component="search-query" required>
<label class="md-search__icon md-icon" for="__search">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.52 6.52 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5"/></svg>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11z"/></svg>
</label>
<nav class="md-search__options" aria-label="Search">
<button type="reset" class="md-search__icon md-icon" title="Clear" aria-label="Clear" tabindex="-1">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z"/></svg>
</button>
</nav>
<div class="md-search__suggest" data-md-component="search-suggest"></div>
</form>
<div class="md-search__output">
<div class="md-search__scrollwrap" tabindex="0" data-md-scrollfix>
<div class="md-search-result" data-md-component="search-result">
<div class="md-search-result__meta">
Initializing search
</div>
<ol class="md-search-result__list" role="presentation"></ol>
</div>
</div>
</div>
</div>
</div>
<div class="md-header__source">
<a href="https://github.com/qdrant/fastembed/" title="Go to repository" class="md-source" data-md-component="source">
<div class="md-source__icon md-icon">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 7.1.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2025 Fonticons, Inc.--><path d="M173.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6m-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3m44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9M252.8 8C114.1 8 8 113.3 8 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C436.2 457.8 504 362.9 504 252 504 113.3 391.5 8 252.8 8M105.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1m-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7m32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1m-11.4-14.7c-1.6 1-1.6 3.6 0 5.9s4.3 3.3 5.6 2.3c1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2"/></svg>
</div>
<div class="md-source__repository">
qdrant/fastembed
</div>
</a>
</div>
</nav>
</header>
<div class="md-container" data-md-component="container">
<main class="md-main" data-md-component="main">
<div class="md-main__inner md-grid">
<div class="md-sidebar md-sidebar--primary" data-md-component="sidebar" data-md-type="navigation" >
<div class="md-sidebar__scrollwrap">
<div class="md-sidebar__inner">
<nav class="md-nav md-nav--primary" aria-label="Navigation" data-md-level="0">
<label class="md-nav__title" for="__drawer">
<a href="../.." title="FastEmbed" class="md-nav__button md-logo" aria-label="FastEmbed" data-md-component="logo">
<img src="../../assets/favicon.png" alt="logo">
</a>
FastEmbed
</label>
<div class="md-nav__source">
<a href="https://github.com/qdrant/fastembed/" title="Go to repository" class="md-source" data-md-component="source">
<div class="md-source__icon md-icon">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 7.1.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2025 Fonticons, Inc.--><path d="M173.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6m-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3m44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9M252.8 8C114.1 8 8 113.3 8 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C436.2 457.8 504 362.9 504 252 504 113.3 391.5 8 252.8 8M105.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1m-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7m32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1m-11.4-14.7c-1.6 1-1.6 3.6 0 5.9s4.3 3.3 5.6 2.3c1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2"/></svg>
</div>
<div class="md-source__repository">
qdrant/fastembed
</div>
</a>
</div>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../.." class="md-nav__link">
<span class="md-ellipsis">
⚡️ What is FastEmbed?
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../Getting%20Started/" class="md-nav__link">
<span class="md-ellipsis">
Getting Started
</span>
</a>
</li>
<li class="md-nav__item md-nav__item--active md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_3" checked>
<label class="md-nav__link" for="__nav_3" id="__nav_3_label" tabindex="">
<span class="md-ellipsis">
Examples
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_3_label" aria-expanded="true">
<label class="md-nav__title" for="__nav_3">
<span class="md-nav__icon md-icon"></span>
Examples
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item md-nav__item--active">
<input class="md-nav__toggle md-toggle" type="checkbox" id="__toc">
<label class="md-nav__link md-nav__link--active" for="__toc">
<span class="md-ellipsis">
ColBERT with FastEmbed
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<a href="./" class="md-nav__link md-nav__link--active">
<span class="md-ellipsis">
ColBERT with FastEmbed
</span>
</a>
<nav class="md-nav md-nav--secondary" aria-label="Table of contents">
<label class="md-nav__title" for="__toc">
<span class="md-nav__icon md-icon"></span>
Table of contents
</label>
<ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
<li class="md-nav__item">
<a href="#what-is-a-late-interaction-text-embedding-model" class="md-nav__link">
<span class="md-ellipsis">
What is a Late Interaction Text Embedding Model?
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#colbert-in-fastembed" class="md-nav__link">
<span class="md-ellipsis">
ColBERT in FastEmbed
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#maxsim-operator" class="md-nav__link">
<span class="md-ellipsis">
MaxSim operator
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#use-case-recommendation" class="md-nav__link">
<span class="md-ellipsis">
Use-case recommendation
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="../FastEmbed_GPU/" class="md-nav__link">
<span class="md-ellipsis">
FastEmbed GPU
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../FastEmbed_Multi_GPU/" class="md-nav__link">
<span class="md-ellipsis">
FastEmbed Multi GPU
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../FastEmbed_vs_HF_Comparison/" class="md-nav__link">
<span class="md-ellipsis">
FastEmbed vs HF Comparison
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../Hindi_Tamil_RAG_with_Navarasa7B/" class="md-nav__link">
<span class="md-ellipsis">
Hindi Tamil RAG with Navarasa7B
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../Hybrid_Search/" class="md-nav__link">
<span class="md-ellipsis">
Hybrid Search
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../Image_Embedding/" class="md-nav__link">
<span class="md-ellipsis">
Image Embedding
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../SPLADE_with_FastEmbed/" class="md-nav__link">
<span class="md-ellipsis">
SPLADE with FastEmbed
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../Supported_Models/" class="md-nav__link">
<span class="md-ellipsis">
Supported Models
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_4" >
<label class="md-nav__link" for="__nav_4" id="__nav_4_label" tabindex="">
<span class="md-ellipsis">
Experimental
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_4_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_4">
<span class="md-nav__icon md-icon"></span>
Experimental
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../experimental/Binary%20Quantization%20from%20Scratch/" class="md-nav__link">
<span class="md-ellipsis">
Binary Quantization from Scratch
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_5" >
<label class="md-nav__link" for="__nav_5" id="__nav_5_label" tabindex="">
<span class="md-ellipsis">
Qdrant
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_5_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_5">
<span class="md-nav__icon md-icon"></span>
Qdrant
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../qdrant/Binary_Quantization_with_Qdrant/" class="md-nav__link">
<span class="md-ellipsis">
Binary Quantization with Qdrant
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../qdrant/Retrieval_with_FastEmbed/" class="md-nav__link">
<span class="md-ellipsis">
Retrieval with FastEmbed
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../qdrant/Usage_With_Qdrant/" class="md-nav__link">
<span class="md-ellipsis">
Usage With Qdrant
</span>
</a>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</div>
</div>
</div>
<div class="md-sidebar md-sidebar--secondary" data-md-component="sidebar" data-md-type="toc" >
<div class="md-sidebar__scrollwrap">
<div class="md-sidebar__inner">
<nav class="md-nav md-nav--secondary" aria-label="Table of contents">
<label class="md-nav__title" for="__toc">
<span class="md-nav__icon md-icon"></span>
Table of contents
</label>
<ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
<li class="md-nav__item">
<a href="#what-is-a-late-interaction-text-embedding-model" class="md-nav__link">
<span class="md-ellipsis">
What is a Late Interaction Text Embedding Model?
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#colbert-in-fastembed" class="md-nav__link">
<span class="md-ellipsis">
ColBERT in FastEmbed
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#maxsim-operator" class="md-nav__link">
<span class="md-ellipsis">
MaxSim operator
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#use-case-recommendation" class="md-nav__link">
<span class="md-ellipsis">
Use-case recommendation
</span>
</a>
</li>
</ul>
</nav>
</div>
</div>
</div>
<div class="md-content" data-md-component="content">
<article class="md-content__inner md-typeset">
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/2.0.3/jquery.min.js"></script>
<script>
(function() {
function addWidgetsRenderer() {
var requireJsScript = document.createElement('script');
requireJsScript.src = 'https://cdnjs.cloudflare.com/ajax/libs/require.js/2.3.4/require.min.js';
var mimeElement = document.querySelector('script[type="application/vnd.jupyter.widget-view+json"]');
var jupyterWidgetsScript = document.createElement('script');
var widgetRendererSrc = 'https://unpkg.com/@jupyter-widgets/html-manager@*/dist/embed-amd.js';
var widgetState;
// Fallback for older version:
try {
widgetState = mimeElement && JSON.parse(mimeElement.innerHTML);
if (widgetState && (widgetState.version_major < 2 || !widgetState.version_major)) {
widgetRendererSrc = 'jupyter-js-widgets@*/dist/embed.js';
}
} catch(e) {}
jupyterWidgetsScript.src = widgetRendererSrc;
document.body.appendChild(requireJsScript);
document.body.appendChild(jupyterWidgetsScript);
}
document.addEventListener('DOMContentLoaded', addWidgetsRenderer);
}());
</script>
<div class="cell border-box-sizing text_cell rendered">
<div class="inner_cell">
<div class="text_cell_render border-box-sizing rendered_html">
<h1 id="late-interaction-text-embedding-models">Late Interaction Text Embedding Models</h1>
<p>As of version 0.3.0 FastEmbed supports Late Interaction Text Embedding Models and currently available with one of the most popular embedding model of the family - ColBERT.</p>
<h2 id="what-is-a-late-interaction-text-embedding-model">What is a Late Interaction Text Embedding Model?</h2>
<p>Late Interaction Text Embedding Model is a kind of information retrieval model which performs query and documents interactions at the scoring stage.
In order to better understand it, we can compare it to the models without interaction.<br />
For instance, if you take a sentence-transformer model, compute embeddings for your documents, compute embeddings for your queries, and just compare them by cosine similarity, then you're retrieving points without interaction.</p>
<p>It is a pretty much easy and straightforward approach, however we might be sacrificing some precision due to its simplicity. It is caused by several facts:
- there is no interaction between queries and documents at the early stage (embedding generation) nor at the late stage (during scoring).
- we are trying to encapsulate all the document information in only one pooled embedding, and obviously, some information might be lost.</p>
<p>Late Interaction Text Embedding models are trying to address it by computing embeddings for each token in queries and documents, and then finding the most similar ones via model specific operation, e.g. ColBERT (Contextual Late Interaction over BERT) uses MaxSim operation.
With this approach we can have not only a better representation of the documents, but also make queries and documents more aware one of another.</p>
<p>For more information on ColBERT and MaxSim operation, you can check out <a href="https://jina.ai/news/what-is-colbert-and-late-interaction-and-why-they-matter-in-search/">this blogpost</a> by Jina AI.</p>
<h2 id="colbert-in-fastembed">ColBERT in FastEmbed</h2>
<p>FastEmbed provides a simple way to use ColBERT model, similar to the ones it has with <code>TextEmbedding</code>.</p>
</div>
</div>
</div>
<div class="cell border-box-sizing code_cell rendered">
<div class="input">
<div class="highlight"><pre><span></span><code><span class="kn">from</span><span class="w"> </span><span class="nn">fastembed</span><span class="w"> </span><span class="kn">import</span> <span class="n">LateInteractionTextEmbedding</span>
<span class="n">LateInteractionTextEmbedding</span><span class="o">.</span><span class="n">list_supported_models</span><span class="p">()</span>
</code></pre></div>
</div>
<div class="output_wrapper">
<div class="output">
<div class="output_area">
<div class="output_subarea output_stream output_stderr output_text">
<pre>
<code>/Users/joein/work/qdrant/fastembed/venv/lib/python3.10/site-packages/tqdm/auto.py:21: TqdmWarning: IProgress not found. Please update jupyter and ipywidgets. See https://ipywidgets.readthedocs.io/en/stable/user_install.html
from .autonotebook import tqdm as notebook_tqdm
</code>
</pre>
</div>
</div>
<div class="output_area">
<div class="output_text output_subarea output_execute_result">
<pre>
<code>[{'model': 'colbert-ir/colbertv2.0',
'dim': 128,
'description': 'Late interaction model',
'size_in_GB': 0.44,
'sources': {'hf': 'colbert-ir/colbertv2.0'},
'model_file': 'model.onnx'}]</code>
</pre>
</div>
</div>
</div>
</div>
</div>
<div class="cell border-box-sizing code_cell rendered">
<div class="input">
<div class="highlight"><pre><span></span><code><span class="n">embedding_model</span> <span class="o">=</span> <span class="n">LateInteractionTextEmbedding</span><span class="p">(</span><span class="s2">&quot;colbert-ir/colbertv2.0&quot;</span><span class="p">)</span>
</code></pre></div>
</div>
<div class="output_wrapper">
<div class="output">
<div class="output_area">
<div class="output_subarea output_stream output_stderr output_text">
<pre>
<code>Fetching 5 files: 0%| | 0/5 [00:00&lt;?, ?it/s]
config.json: 100%|██████████| 743/743 [00:00&lt;00:00, 4.56MB/s]
tokenizer_config.json: 100%|██████████| 405/405 [00:00&lt;00:00, 3.34MB/s]
Fetching 5 files: 20%|██ | 1/5 [00:00&lt;00:01, 3.64it/s]
tokenizer.json: 0%| | 0.00/466k [00:00&lt;?, ?B/s]
special_tokens_map.json: 100%|██████████| 112/112 [00:00&lt;00:00, 727kB/s]
tokenizer.json: 100%|██████████| 466k/466k [00:00&lt;00:00, 1.48MB/s]
model.onnx: 0%| | 0.00/436M [00:00&lt;?, ?B/s]
model.onnx: 2%|▏ | 10.5M/436M [00:00&lt;00:34, 12.2MB/s]
model.onnx: 5%|▍ | 21.0M/436M [00:01&lt;00:20, 20.3MB/s]
model.onnx: 7%|▋ | 31.5M/436M [00:01&lt;00:15, 25.7MB/s]
model.onnx: 10%|▉ | 41.9M/436M [00:01&lt;00:13, 29.4MB/s]
model.onnx: 12%|█▏ | 52.4M/436M [00:01&lt;00:12, 31.9MB/s]
model.onnx: 14%|█▍ | 62.9M/436M [00:02&lt;00:11, 33.7MB/s]
model.onnx: 17%|█▋ | 73.4M/436M [00:02&lt;00:10, 34.9MB/s]
model.onnx: 19%|█▉ | 83.9M/436M [00:02&lt;00:09, 35.5MB/s]
model.onnx: 22%|██▏ | 94.4M/436M [00:03&lt;00:09, 36.1MB/s]
model.onnx: 24%|██▍ | 105M/436M [00:03&lt;00:09, 36.6MB/s]
model.onnx: 26%|██▋ | 115M/436M [00:03&lt;00:08, 36.9MB/s]
model.onnx: 29%|██▉ | 126M/436M [00:03&lt;00:08, 37.1MB/s]
model.onnx: 31%|███▏ | 136M/436M [00:04&lt;00:08, 37.3MB/s]
model.onnx: 34%|███▎ | 147M/436M [00:04&lt;00:07, 37.4MB/s]
model.onnx: 36%|███▌ | 157M/436M [00:04&lt;00:07, 37.4MB/s]
model.onnx: 38%|███▊ | 168M/436M [00:05&lt;00:07, 37.5MB/s]
model.onnx: 41%|████ | 178M/436M [00:05&lt;00:06, 37.6MB/s]
model.onnx: 43%|████▎ | 189M/436M [00:05&lt;00:06, 37.6MB/s]
model.onnx: 46%|████▌ | 199M/436M [00:05&lt;00:06, 37.6MB/s]
model.onnx: 48%|████▊ | 210M/436M [00:06&lt;00:06, 37.5MB/s]
model.onnx: 50%|█████ | 220M/436M [00:06&lt;00:05, 37.5MB/s]
model.onnx: 53%|█████▎ | 231M/436M [00:06&lt;00:05, 37.6MB/s]
model.onnx: 55%|█████▌ | 241M/436M [00:06&lt;00:05, 37.6MB/s]
model.onnx: 58%|█████▊ | 252M/436M [00:07&lt;00:04, 37.6MB/s]
model.onnx: 60%|██████ | 262M/436M [00:07&lt;00:04, 37.7MB/s]
model.onnx: 63%|██████▎ | 273M/436M [00:07&lt;00:04, 37.7MB/s]
model.onnx: 65%|██████▍ | 283M/436M [00:08&lt;00:04, 36.0MB/s]
model.onnx: 67%|██████▋ | 294M/436M [00:08&lt;00:03, 36.4MB/s]
model.onnx: 70%|██████▉ | 304M/436M [00:08&lt;00:03, 36.8MB/s]
model.onnx: 72%|███████▏ | 315M/436M [00:08&lt;00:03, 37.0MB/s]
model.onnx: 75%|███████▍ | 325M/436M [00:09&lt;00:02, 37.3MB/s]
model.onnx: 77%|███████▋ | 336M/436M [00:09&lt;00:03, 30.8MB/s]
model.onnx: 79%|███████▉ | 346M/436M [00:10&lt;00:02, 32.6MB/s]
model.onnx: 82%|████████▏ | 357M/436M [00:10&lt;00:02, 33.9MB/s]
model.onnx: 84%|████████▍ | 367M/436M [00:10&lt;00:01, 34.8MB/s]
model.onnx: 87%|████████▋ | 377M/436M [00:10&lt;00:01, 35.7MB/s]
model.onnx: 89%|████████▉ | 388M/436M [00:11&lt;00:01, 36.2MB/s]
model.onnx: 91%|█████████▏| 398M/436M [00:11&lt;00:01, 36.6MB/s]
model.onnx: 94%|█████████▍| 409M/436M [00:11&lt;00:00, 36.9MB/s]
model.onnx: 96%|█████████▌| 419M/436M [00:11&lt;00:00, 37.1MB/s]
model.onnx: 99%|█████████▊| 430M/436M [00:12&lt;00:00, 37.3MB/s]
model.onnx: 100%|██████████| 436M/436M [00:12&lt;00:00, 35.1MB/s]
Fetching 5 files: 100%|██████████| 5/5 [00:13&lt;00:00, 2.68s/it]
</code>
</pre>
</div>
</div>
</div>
</div>
</div>
<div class="cell border-box-sizing code_cell rendered">
<div class="input">
<div class="highlight"><pre><span></span><code><span class="n">documents</span> <span class="o">=</span> <span class="p">[</span>
<span class="s2">&quot;ColBERT is a late interaction text embedding model, however, there are also other models such as TwinBERT.&quot;</span><span class="p">,</span>
<span class="s2">&quot;On the contrary to the late interaction models, the early interaction models contains interaction steps at embedding generation process&quot;</span><span class="p">,</span>
<span class="p">]</span>
<span class="n">queries</span> <span class="o">=</span> <span class="p">[</span>
<span class="s2">&quot;Are there any other late interaction text embedding models except ColBERT?&quot;</span><span class="p">,</span>
<span class="s2">&quot;What is the difference between late interaction and early interaction text embedding models?&quot;</span><span class="p">,</span>
<span class="p">]</span>
</code></pre></div>
</div>
</div>
<div class="cell border-box-sizing text_cell rendered">
<div class="inner_cell">
<div class="text_cell_render border-box-sizing rendered_html">
<p><em>NOTE</em>: ColBERT computes query and documents embeddings differently, make sure to use the corresponding methods.</p>
</div>
</div>
</div>
<div class="cell border-box-sizing code_cell rendered">
<div class="input">
<div class="highlight"><pre><span></span><code><span class="n">document_embeddings</span> <span class="o">=</span> <span class="nb">list</span><span class="p">(</span>
<span class="n">embedding_model</span><span class="o">.</span><span class="n">embed</span><span class="p">(</span><span class="n">documents</span><span class="p">)</span>
<span class="p">)</span> <span class="c1"># embed and qury_embed return generators,</span>
<span class="c1"># which we need to evaluate by writing them to a list</span>
<span class="n">query_embeddings</span> <span class="o">=</span> <span class="nb">list</span><span class="p">(</span><span class="n">embedding_model</span><span class="o">.</span><span class="n">query_embed</span><span class="p">(</span><span class="n">queries</span><span class="p">))</span>
</code></pre></div>
</div>
</div>
<div class="cell border-box-sizing code_cell rendered">
<div class="input">
<div class="highlight"><pre><span></span><code><span class="n">document_embeddings</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">shape</span><span class="p">,</span> <span class="n">query_embeddings</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">shape</span>
</code></pre></div>
</div>
<div class="output_wrapper">
<div class="output">
<div class="output_area">
<div class="output_text output_subarea output_execute_result">
<pre>
<code>((26, 128), (32, 128))</code>
</pre>
</div>
</div>
</div>
</div>
</div>
<div class="cell border-box-sizing text_cell rendered">
<div class="inner_cell">
<div class="text_cell_render border-box-sizing rendered_html">
<p>Don't worry about query embeddings having the bigger shape in this case.
ColBERT authors recommend to pad queries with [MASK] tokens to 32 tokens.
They also recommends to truncate queries to 32 tokens, however we don't do that in FastEmbed, so you can put some straight into the queries.</p>
</div>
</div>
</div>
<div class="cell border-box-sizing text_cell rendered">
<div class="inner_cell">
<div class="text_cell_render border-box-sizing rendered_html">
<h2 id="maxsim-operator">MaxSim operator</h2>
</div>
</div>
</div>
<div class="cell border-box-sizing text_cell rendered">
<div class="inner_cell">
<div class="text_cell_render border-box-sizing rendered_html">
<p>Qdrant will support ColBERT as of the next version (v1.10), however, at the moment, you can compute embedding similarities manually. </p>
</div>
</div>
</div>
<div class="cell border-box-sizing code_cell rendered">
<div class="input">
<div class="highlight"><pre><span></span><code><span class="kn">import</span><span class="w"> </span><span class="nn">numpy</span><span class="w"> </span><span class="k">as</span><span class="w"> </span><span class="nn">np</span>
<span class="k">def</span><span class="w"> </span><span class="nf">compute_relevance_scores</span><span class="p">(</span>
<span class="n">query_embedding</span><span class="p">:</span> <span class="n">np</span><span class="o">.</span><span class="n">array</span><span class="p">,</span> <span class="n">document_embeddings</span><span class="p">:</span> <span class="n">np</span><span class="o">.</span><span class="n">array</span><span class="p">,</span> <span class="n">k</span><span class="p">:</span> <span class="nb">int</span>
<span class="p">)</span> <span class="o">-&amp;</span><span class="n">gt</span><span class="p">;</span> <span class="nb">list</span><span class="p">[</span><span class="nb">int</span><span class="p">]:</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Compute relevance scores for top-k documents given a query.</span>
<span class="sd"> :param query_embedding: Numpy array representing the query embedding, shape: [num_query_terms, embedding_dim]</span>
<span class="sd"> :param document_embeddings: Numpy array representing embeddings for documents, shape: [num_documents, max_doc_length, embedding_dim]</span>
<span class="sd"> :param k: Number of top documents to return</span>
<span class="sd"> :return: Indices of the top-k documents based on their relevance scores</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="c1"># Compute batch dot-product of query_embedding and document_embeddings</span>
<span class="c1"># Resulting shape: [num_documents, num_query_terms, max_doc_length]</span>
<span class="n">scores</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">matmul</span><span class="p">(</span><span class="n">query_embedding</span><span class="p">,</span> <span class="n">document_embeddings</span><span class="o">.</span><span class="n">transpose</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">1</span><span class="p">))</span>
<span class="c1"># Apply max-pooling across document terms (axis=2) to find the max similarity per query term</span>
<span class="c1"># Shape after max-pool: [num_documents, num_query_terms]</span>
<span class="n">max_scores_per_query_term</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">max</span><span class="p">(</span><span class="n">scores</span><span class="p">,</span> <span class="n">axis</span><span class="o">=</span><span class="mi">2</span><span class="p">)</span>
<span class="c1"># Sum the scores across query terms to get the total score for each document</span>
<span class="c1"># Shape after sum: [num_documents]</span>
<span class="n">total_scores</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">sum</span><span class="p">(</span><span class="n">max_scores_per_query_term</span><span class="p">,</span> <span class="n">axis</span><span class="o">=</span><span class="mi">1</span><span class="p">)</span>
<span class="c1"># Sort the documents based on their total scores and get the indices of the top-k documents</span>
<span class="n">sorted_indices</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">argsort</span><span class="p">(</span><span class="n">total_scores</span><span class="p">)[::</span><span class="o">-</span><span class="mi">1</span><span class="p">][:</span><span class="n">k</span><span class="p">]</span>
<span class="k">return</span> <span class="n">sorted_indices</span>
</code></pre></div>
</div>
</div>
<div class="cell border-box-sizing code_cell rendered">
<div class="input">
<div class="highlight"><pre><span></span><code><span class="n">sorted_indices</span> <span class="o">=</span> <span class="n">compute_relevance_scores</span><span class="p">(</span>
<span class="n">np</span><span class="o">.</span><span class="n">array</span><span class="p">(</span><span class="n">query_embeddings</span><span class="p">[</span><span class="mi">0</span><span class="p">]),</span> <span class="n">np</span><span class="o">.</span><span class="n">array</span><span class="p">(</span><span class="n">document_embeddings</span><span class="p">),</span> <span class="n">k</span><span class="o">=</span><span class="mi">3</span>
<span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Sorted document indices:&quot;</span><span class="p">,</span> <span class="n">sorted_indices</span><span class="p">)</span>
</code></pre></div>
</div>
<div class="output_wrapper">
<div class="output">
<div class="output_area">
<div class="output_subarea output_stream output_stdout output_text">
<pre>
<code>Sorted document indices: [0 1]
</code>
</pre>
</div>
</div>
</div>
</div>
</div>
<div class="cell border-box-sizing code_cell rendered">
<div class="input">
<div class="highlight"><pre><span></span><code><span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Query: </span><span class="si">{</span><span class="n">queries</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
<span class="k">for</span> <span class="n">index</span> <span class="ow">in</span> <span class="n">sorted_indices</span><span class="p">:</span>
<span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Document: </span><span class="si">{</span><span class="n">documents</span><span class="p">[</span><span class="n">index</span><span class="p">]</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
</code></pre></div>
</div>
<div class="output_wrapper">
<div class="output">
<div class="output_area">
<div class="output_subarea output_stream output_stdout output_text">
<pre>
<code>Query: Are there any other late interaction text embedding models except ColBERT?
Document: ColBERT is a late interaction text embedding model, however, there are also other models such as TwinBERT.
Document: On the contrary to the late interaction models, the early interaction models contains interaction steps at embedding generation process
</code>
</pre>
</div>
</div>
</div>
</div>
</div>
<div class="cell border-box-sizing text_cell rendered">
<div class="inner_cell">
<div class="text_cell_render border-box-sizing rendered_html">
<h2 id="use-case-recommendation">Use-case recommendation</h2>
</div>
</div>
</div>
<div class="cell border-box-sizing text_cell rendered">
<div class="inner_cell">
<div class="text_cell_render border-box-sizing rendered_html">
<p>Despite ColBERT allows to compute embeddings independently and spare some workload offline, it still computes more resources than no interaction models. Due to this, it might be more reasonable to use ColBERT not as a first-stage retriever, but as a re-ranker.</p>
<p>The first-stage retriever would then be a no-interaction model, which e.g. retrieves first 100 or 500 examples, and leave the final ranking to the ColBERT model.</p>
</div>
</div>
</div>
<div class="cell border-box-sizing code_cell rendered">
<div class="input">
<div class="highlight"><pre><span></span><code>
</code></pre></div>
</div>
</div>
</article>
</div>
<script>var target=document.getElementById(location.hash.slice(1));target&&target.name&&(target.checked=target.name.startsWith("__tabbed_"))</script>
</div>
</main>
<footer class="md-footer">
<div class="md-footer-meta md-typeset">
<div class="md-footer-meta__inner md-grid">
<div class="md-copyright">
<div class="md-copyright__highlight">
Maintained by <a href="https://github.com/qdrant">Qdrant</a>. Originally created by <a href="https://nirantk.com/about">Nirant Kasliwal</a>.
</div>
Made with
<a href="https://squidfunk.github.io/mkdocs-material/" target="_blank" rel="noopener">
Material for MkDocs
</a>
</div>
</div>
</div>
</footer>
</div>
<div class="md-dialog" data-md-component="dialog">
<div class="md-dialog__inner md-typeset"></div>
</div>
<script id="__config" type="application/json">{"annotate": null, "base": "../..", "features": ["search.suggest", "search.highlight", "navigation.instant", "navigation.tracking", "navigation.expand", "navigation.sections", "content.code.annotate", "toc.follow", "header.autohide", "announce.dismiss"], "search": "../../assets/javascripts/workers/search.2c215733.min.js", "tags": null, "translations": {"clipboard.copied": "Copied to clipboard", "clipboard.copy": "Copy to clipboard", "search.result.more.one": "1 more on this page", "search.result.more.other": "# more on this page", "search.result.none": "No matching documents", "search.result.one": "1 matching document", "search.result.other": "# matching documents", "search.result.placeholder": "Type to start searching", "search.result.term.missing": "Missing", "select.version": "Select version"}, "version": null}</script>
<script src="../../assets/javascripts/bundle.d7400e89.min.js"></script>
</body>
</html>