import{S as Mm,i as Fm,s as Om,e as l,k as d,w as g,t as r,Y as Tm,M as Im,c as u,d as t,m as f,x,a as p,h as o,Z as Cm,b as C,N as Nm,G as s,g as m,y as $,o as h,p as ne,q as _,B as q,v as Um,n as ae}from"../../chunks/vendor-hf-doc-builder.js";import{T as Wr}from"../../chunks/Tip-hf-doc-builder.js";import{Y as Lm}from"../../chunks/Youtube-hf-doc-builder.js";import{I as Qr}from"../../chunks/IconCopyLink-hf-doc-builder.js";import{C as j}from"../../chunks/CodeBlock-hf-doc-builder.js";import{C as Sm}from"../../chunks/CourseFloatingBanner-hf-doc-builder.js";import{F as Gm}from"../../chunks/FrameworkSwitchCourse-hf-doc-builder.js";function Jm(k){let a,c;return a=new Sm({props:{chapter:6,classNames:"absolute z-10 right-0 top-0",notebooks:[{label:"English",value:"https://colab.research.google.com/github/huggingface/notebooks/blob/master/course/en/chapter6/section3b_tf.ipynb"},{label:"Fran\xE7ais",value:"https://colab.research.google.com/github/huggingface/notebooks/blob/master/course/fr/chapter6/section3b_tf.ipynb"},{label:"English",value:"https://studiolab.sagemaker.aws/import/github/huggingface/notebooks/blob/master/course/en/chapter6/section3b_tf.ipynb"},{label:"Fran\xE7ais",value:"https://studiolab.sagemaker.aws/import/github/huggingface/notebooks/blob/master/course/fr/chapter6/section3b_tf.ipynb"}]}}),{c(){g(a.$$.fragment)},l(n){x(a.$$.fragment,n)},m(n,b){$(a,n,b),c=!0},i(n){c||(_(a.$$.fragment,n),c=!0)},o(n){h(a.$$.fragment,n),c=!1},d(n){q(a,n)}}}function Km(k){let a,c;return a=new Sm({props:{chapter:6,classNames:"absolute z-10 right-0 top-0",notebooks:[{label:"English",value:"https://colab.research.google.com/github/huggingface/notebooks/blob/master/course/en/chapter6/section3b_pt.ipynb"},{label:"Fran\xE7ais",value:"https://colab.research.google.com/github/huggingface/notebooks/blob/master/course/fr/chapter6/section3b_pt.ipynb"},{label:"English",value:"https://studiolab.sagemaker.aws/import/github/huggingface/notebooks/blob/master/course/en/chapter6/section3b_pt.ipynb"},{label:"Fran\xE7ais",value:"https://studiolab.sagemaker.aws/import/github/huggingface/notebooks/blob/master/course/fr/chapter6/section3b_pt.ipynb"}]}}),{c(){g(a.$$.fragment)},l(n){x(a.$$.fragment,n)},m(n,b){$(a,n,b),c=!0},i(n){c||(_(a.$$.fragment,n),c=!0)},o(n){h(a.$$.fragment,n),c=!1},d(n){q(a,n)}}}function Wm(k){let a,c;return a=new Lm({props:{id:"b3u8RzBCX9Y"}}),{c(){g(a.$$.fragment)},l(n){x(a.$$.fragment,n)},m(n,b){$(a,n,b),c=!0},i(n){c||(_(a.$$.fragment,n),c=!0)},o(n){h(a.$$.fragment,n),c=!1},d(n){q(a,n)}}}function Qm(k){let a,c;return a=new Lm({props:{id:"_wxyB3j3mk4"}}),{c(){g(a.$$.fragment)},l(n){x(a.$$.fragment,n)},m(n,b){$(a,n,b),c=!0},i(n){c||(_(a.$$.fragment,n),c=!0)},o(n){h(a.$$.fragment,n),c=!1},d(n){q(a,n)}}}function Hm(k){let a,c;return a=new j({props:{code:`from transformers import AutoTokenizer, TFAutoModelForQuestionAnswering

model_checkpoint = "distilbert-base-cased-distilled-squad"
tokenizer = AutoTokenizer.from_pretrained(model_checkpoint)
model = TFAutoModelForQuestionAnswering.from_pretrained(model_checkpoint)

inputs = tokenizer(question, context, return_tensors="tf")
outputs = model(**inputs)`,highlighted:`<span class="hljs-keyword">from</span> transformers <span class="hljs-keyword">import</span> AutoTokenizer, TFAutoModelForQuestionAnswering

model_checkpoint = <span class="hljs-string">&quot;distilbert-base-cased-distilled-squad&quot;</span>
tokenizer = AutoTokenizer.from_pretrained(model_checkpoint)
model = TFAutoModelForQuestionAnswering.from_pretrained(model_checkpoint)

inputs = tokenizer(question, context, return_tensors=<span class="hljs-string">&quot;tf&quot;</span>)
outputs = model(**inputs)`}}),{c(){g(a.$$.fragment)},l(n){x(a.$$.fragment,n)},m(n,b){$(a,n,b),c=!0},i(n){c||(_(a.$$.fragment,n),c=!0)},o(n){h(a.$$.fragment,n),c=!1},d(n){q(a,n)}}}function Rm(k){let a,c;return a=new j({props:{code:`from transformers import AutoTokenizer, AutoModelForQuestionAnswering

model_checkpoint = "distilbert-base-cased-distilled-squad"
tokenizer = AutoTokenizer.from_pretrained(model_checkpoint)
model = AutoModelForQuestionAnswering.from_pretrained(model_checkpoint)

inputs = tokenizer(question, context, return_tensors="pt")
outputs = model(**inputs)`,highlighted:`<span class="hljs-keyword">from</span> transformers <span class="hljs-keyword">import</span> AutoTokenizer, AutoModelForQuestionAnswering

model_checkpoint = <span class="hljs-string">&quot;distilbert-base-cased-distilled-squad&quot;</span>
tokenizer = AutoTokenizer.from_pretrained(model_checkpoint)
model = AutoModelForQuestionAnswering.from_pretrained(model_checkpoint)

inputs = tokenizer(question, context, return_tensors=<span class="hljs-string">&quot;pt&quot;</span>)
outputs = model(**inputs)`}}),{c(){g(a.$$.fragment)},l(n){x(a.$$.fragment,n)},m(n,b){$(a,n,b),c=!0},i(n){c||(_(a.$$.fragment,n),c=!0)},o(n){h(a.$$.fragment,n),c=!1},d(n){q(a,n)}}}function Vm(k){let a,c;return a=new j({props:{code:"(1, 66) (1, 66)",highlighted:'(<span class="hljs-number">1</span>, <span class="hljs-number">66</span>) (<span class="hljs-number">1</span>, <span class="hljs-number">66</span>)'}}),{c(){g(a.$$.fragment)},l(n){x(a.$$.fragment,n)},m(n,b){$(a,n,b),c=!0},i(n){c||(_(a.$$.fragment,n),c=!0)},o(n){h(a.$$.fragment,n),c=!1},d(n){q(a,n)}}}function Bm(k){let a,c;return a=new j({props:{code:"torch.Size([1, 66]) torch.Size([1, 66])",highlighted:'torch.Size([<span class="hljs-number">1</span>, <span class="hljs-number">66</span>]) torch.Size([<span class="hljs-number">1</span>, <span class="hljs-number">66</span>])'}}),{c(){g(a.$$.fragment)},l(n){x(a.$$.fragment,n)},m(n,b){$(a,n,b),c=!0},i(n){c||(_(a.$$.fragment,n),c=!0)},o(n){h(a.$$.fragment,n),c=!1},d(n){q(a,n)}}}function Ym(k){let a,c;return a=new j({props:{code:`import tensorflow as tf

sequence_ids = inputs.sequence_ids()
# Masque tout, sauf les tokens du contexte
mask = [i != 1 for i in sequence_ids]
# D\xE9masquer le token [CLS]
mask[0] = False
mask = tf.constant(mask)[None]

start_logits = tf.where(mask, -10000, start_logits)
end_logits = tf.where(mask, -10000, end_logits)`,highlighted:`<span class="hljs-keyword">import</span> tensorflow <span class="hljs-keyword">as</span> tf

sequence_ids = inputs.sequence_ids()
<span class="hljs-comment"># Masque tout, sauf les tokens du contexte</span>
mask = [i != <span class="hljs-number">1</span> <span class="hljs-keyword">for</span> i <span class="hljs-keyword">in</span> sequence_ids]
<span class="hljs-comment"># D\xE9masquer le token [CLS]</span>
mask[<span class="hljs-number">0</span>] = <span class="hljs-literal">False</span>
mask = tf.constant(mask)[<span class="hljs-literal">None</span>]

start_logits = tf.where(mask, -<span class="hljs-number">10000</span>, start_logits)
end_logits = tf.where(mask, -<span class="hljs-number">10000</span>, end_logits)`}}),{c(){g(a.$$.fragment)},l(n){x(a.$$.fragment,n)},m(n,b){$(a,n,b),c=!0},i(n){c||(_(a.$$.fragment,n),c=!0)},o(n){h(a.$$.fragment,n),c=!1},d(n){q(a,n)}}}function Xm(k){let a,c;return a=new j({props:{code:`import torch

sequence_ids = inputs.sequence_ids()
# Masque tout, sauf les tokens du contexte
mask = [i != 1 for i in sequence_ids]
# D\xE9masquer le token [CLS]
mask[0] = False
mask = torch.tensor(mask)[None]

start_logits[mask] = -10000
end_logits[mask] = -10000`,highlighted:`<span class="hljs-keyword">import</span> torch

sequence_ids = inputs.sequence_ids()
<span class="hljs-comment"># Masque tout, sauf les tokens du contexte</span>
mask = [i != <span class="hljs-number">1</span> <span class="hljs-keyword">for</span> i <span class="hljs-keyword">in</span> sequence_ids]
<span class="hljs-comment"># D\xE9masquer le token [CLS]</span>
mask[<span class="hljs-number">0</span>] = <span class="hljs-literal">False</span>
mask = torch.tensor(mask)[<span class="hljs-literal">None</span>]

start_logits[mask] = -<span class="hljs-number">10000</span>
end_logits[mask] = -<span class="hljs-number">10000</span>`}}),{c(){g(a.$$.fragment)},l(n){x(a.$$.fragment,n)},m(n,b){$(a,n,b),c=!0},i(n){c||(_(a.$$.fragment,n),c=!0)},o(n){h(a.$$.fragment,n),c=!1},d(n){q(a,n)}}}function Zm(k){let a,c;return a=new j({props:{code:`start_probabilities = tf.math.softmax(start_logits, axis=-1)[0].numpy()
end_probabilities = tf.math.softmax(end_logits, axis=-1)[0].numpy()`,highlighted:`start_probabilities = tf.math.softmax(start_logits, axis=-<span class="hljs-number">1</span>)[<span class="hljs-number">0</span>].numpy()
end_probabilities = tf.math.softmax(end_logits, axis=-<span class="hljs-number">1</span>)[<span class="hljs-number">0</span>].numpy()`}}),{c(){g(a.$$.fragment)},l(n){x(a.$$.fragment,n)},m(n,b){$(a,n,b),c=!0},i(n){c||(_(a.$$.fragment,n),c=!0)},o(n){h(a.$$.fragment,n),c=!1},d(n){q(a,n)}}}function ec(k){let a,c;return a=new j({props:{code:`start_probabilities = torch.nn.functional.softmax(start_logits, dim=-1)[0]
end_probabilities = torch.nn.functional.softmax(end_logits, dim=-1)[0]`,highlighted:`start_probabilities = torch.nn.functional.softmax(start_logits, dim=-<span class="hljs-number">1</span>)[<span class="hljs-number">0</span>]
end_probabilities = torch.nn.functional.softmax(end_logits, dim=-<span class="hljs-number">1</span>)[<span class="hljs-number">0</span>]`}}),{c(){g(a.$$.fragment)},l(n){x(a.$$.fragment,n)},m(n,b){$(a,n,b),c=!0},i(n){c||(_(a.$$.fragment,n),c=!0)},o(n){h(a.$$.fragment,n),c=!1},d(n){q(a,n)}}}function sc(k){let a,c,n,b,v,w,P,T,N,z,S,A,D,W;return D=new j({props:{code:"scores = np.triu(scores)",highlighted:"scores = np.triu(scores)"}}),{c(){a=l("p"),c=r("Ensuite, nous masquerons les valeurs o\xF9 "),n=l("code"),b=r("start_index > end_index"),v=r(" en les mettant \xE0 "),w=l("code"),P=r("0"),T=r(" (les autres probabilit\xE9s sont toutes des nombres positifs). La fonction "),N=l("code"),z=r("np.triu()"),S=r(" renvoie la partie triangulaire sup\xE9rieure du tenseur 2D pass\xE9 en argument, elle fera donc ce masquage pour nous :"),A=d(),g(D.$$.fragment)},l(E){a=u(E,"P",{});var y=p(a);c=o(y,"Ensuite, nous masquerons les valeurs o\xF9 "),n=u(y,"CODE",{});var B=p(n);b=o(B,"start_index > end_index"),B.forEach(t),v=o(y," en les mettant \xE0 "),w=u(y,"CODE",{});var F=p(w);P=o(F,"0"),F.forEach(t),T=o(y," (les autres probabilit\xE9s sont toutes des nombres positifs). La fonction "),N=u(y,"CODE",{});var Oe=p(N);z=o(Oe,"np.triu()"),Oe.forEach(t),S=o(y," renvoie la partie triangulaire sup\xE9rieure du tenseur 2D pass\xE9 en argument, elle fera donc ce masquage pour nous :"),y.forEach(t),A=f(E),x(D.$$.fragment,E)},m(E,y){m(E,a,y),s(a,c),s(a,n),s(n,b),s(a,v),s(a,w),s(w,P),s(a,T),s(a,N),s(N,z),s(a,S),m(E,A,y),$(D,E,y),W=!0},i(E){W||(_(D.$$.fragment,E),W=!0)},o(E){h(D.$$.fragment,E),W=!1},d(E){E&&t(a),E&&t(A),q(D,E)}}}function tc(k){let a,c,n,b,v,w,P,T,N,z,S,A,D,W;return D=new j({props:{code:"scores = torch.triu(scores)",highlighted:"scores = torch.triu(scores)"}}),{c(){a=l("p"),c=r("Ensuite, nous masquerons les valeurs o\xF9 "),n=l("code"),b=r("start_index > end_index"),v=r(" en les mettant \xE0 "),w=l("code"),P=r("0"),T=r(" (les autres probabilit\xE9s sont toutes des nombres positifs). La fonction "),N=l("code"),z=r("torch.triu()"),S=r(" renvoie la partie triangulaire sup\xE9rieure du tenseur 2D pass\xE9 en argument, elle fera donc ce masquage pour nous :"),A=d(),g(D.$$.fragment)},l(E){a=u(E,"P",{});var y=p(a);c=o(y,"Ensuite, nous masquerons les valeurs o\xF9 "),n=u(y,"CODE",{});var B=p(n);b=o(B,"start_index > end_index"),B.forEach(t),v=o(y," en les mettant \xE0 "),w=u(y,"CODE",{});var F=p(w);P=o(F,"0"),F.forEach(t),T=o(y," (les autres probabilit\xE9s sont toutes des nombres positifs). La fonction "),N=u(y,"CODE",{});var Oe=p(N);z=o(Oe,"torch.triu()"),Oe.forEach(t),S=o(y," renvoie la partie triangulaire sup\xE9rieure du tenseur 2D pass\xE9 en argument, elle fera donc ce masquage pour nous :"),y.forEach(t),A=f(E),x(D.$$.fragment,E)},m(E,y){m(E,a,y),s(a,c),s(a,n),s(n,b),s(a,v),s(a,w),s(w,P),s(a,T),s(a,N),s(N,z),s(a,S),m(E,A,y),$(D,E,y),W=!0},i(E){W||(_(D.$$.fragment,E),W=!0)},o(E){h(D.$$.fragment,E),W=!1},d(E){E&&t(a),E&&t(A),q(D,E)}}}function nc(k){let a,c,n,b,v;return{c(){a=l("p"),c=r("\u270F\uFE0F "),n=l("strong"),b=r("Essayez !"),v=r(" Calculez les indices de d\xE9but et de fin pour les cinq r\xE9ponses les plus probables.")},l(w){a=u(w,"P",{});var P=p(a);c=o(P,"\u270F\uFE0F "),n=u(P,"STRONG",{});var T=p(n);b=o(T,"Essayez !"),T.forEach(t),v=o(P," Calculez les indices de d\xE9but et de fin pour les cinq r\xE9ponses les plus probables."),P.forEach(t)},m(w,P){m(w,a,P),s(a,c),s(a,n),s(n,b),s(a,v)},d(w){w&&t(a)}}}function ac(k){let a,c,n,b,v,w,P,T;return{c(){a=l("p"),c=r("\u270F\uFE0F "),n=l("strong"),b=r("Essayez !"),v=r(" Utilisez les meilleurs scores que vous avez calcul\xE9s pr\xE9c\xE9demment pour afficher les cinq r\xE9ponses les plus probables. Pour v\xE9rifier vos r\xE9sultats, retournez au premier pipeline et passez dans "),w=l("code"),P=r("top_k=5"),T=r(" lorsque vous l\u2019appelez.")},l(N){a=u(N,"P",{});var z=p(a);c=o(z,"\u270F\uFE0F "),n=u(z,"STRONG",{});var S=p(n);b=o(S,"Essayez !"),S.forEach(t),v=o(z," Utilisez les meilleurs scores que vous avez calcul\xE9s pr\xE9c\xE9demment pour afficher les cinq r\xE9ponses les plus probables. Pour v\xE9rifier vos r\xE9sultats, retournez au premier pipeline et passez dans "),w=u(z,"CODE",{});var A=p(w);P=o(A,"top_k=5"),A.forEach(t),T=o(z," lorsque vous l\u2019appelez."),z.forEach(t)},m(N,z){m(N,a,z),s(a,c),s(a,n),s(n,b),s(a,v),s(a,w),s(w,P),s(a,T)},d(N){N&&t(a)}}}function rc(k){let a,c,n,b;return a=new j({props:{code:`_ = inputs.pop("overflow_to_sample_mapping")
offsets = inputs.pop("offset_mapping")

inputs = inputs.convert_to_tensors("tf")
print(inputs["input_ids"].shape)`,highlighted:`_ = inputs.pop(<span class="hljs-string">&quot;overflow_to_sample_mapping&quot;</span>)
offsets = inputs.pop(<span class="hljs-string">&quot;offset_mapping&quot;</span>)

inputs = inputs.convert_to_tensors(<span class="hljs-string">&quot;tf&quot;</span>)
<span class="hljs-built_in">print</span>(inputs[<span class="hljs-string">&quot;input_ids&quot;</span>].shape)`}}),n=new j({props:{code:"(2, 384)",highlighted:'(<span class="hljs-number">2</span>, <span class="hljs-number">384</span>)'}}),{c(){g(a.$$.fragment),c=d(),g(n.$$.fragment)},l(v){x(a.$$.fragment,v),c=f(v),x(n.$$.fragment,v)},m(v,w){$(a,v,w),m(v,c,w),$(n,v,w),b=!0},i(v){b||(_(a.$$.fragment,v),_(n.$$.fragment,v),b=!0)},o(v){h(a.$$.fragment,v),h(n.$$.fragment,v),b=!1},d(v){q(a,v),v&&t(c),q(n,v)}}}function oc(k){let a,c,n,b;return a=new j({props:{code:`_ = inputs.pop("overflow_to_sample_mapping")
offsets = inputs.pop("offset_mapping")

inputs = inputs.convert_to_tensors("pt")
print(inputs["input_ids"].shape)`,highlighted:`_ = inputs.pop(<span class="hljs-string">&quot;overflow_to_sample_mapping&quot;</span>)
offsets = inputs.pop(<span class="hljs-string">&quot;offset_mapping&quot;</span>)

inputs = inputs.convert_to_tensors(<span class="hljs-string">&quot;pt&quot;</span>)
<span class="hljs-built_in">print</span>(inputs[<span class="hljs-string">&quot;input_ids&quot;</span>].shape)`}}),n=new j({props:{code:"torch.Size([2, 384])",highlighted:'torch.Size([<span class="hljs-number">2</span>, <span class="hljs-number">384</span>])'}}),{c(){g(a.$$.fragment),c=d(),g(n.$$.fragment)},l(v){x(a.$$.fragment,v),c=f(v),x(n.$$.fragment,v)},m(v,w){$(a,v,w),m(v,c,w),$(n,v,w),b=!0},i(v){b||(_(a.$$.fragment,v),_(n.$$.fragment,v),b=!0)},o(v){h(a.$$.fragment,v),h(n.$$.fragment,v),b=!1},d(v){q(a,v),v&&t(c),q(n,v)}}}function ic(k){let a,c;return a=new j({props:{code:"(2, 384) (2, 384)",highlighted:'(<span class="hljs-number">2</span>, <span class="hljs-number">384</span>) (<span class="hljs-number">2</span>, <span class="hljs-number">384</span>)'}}),{c(){g(a.$$.fragment)},l(n){x(a.$$.fragment,n)},m(n,b){$(a,n,b),c=!0},i(n){c||(_(a.$$.fragment,n),c=!0)},o(n){h(a.$$.fragment,n),c=!1},d(n){q(a,n)}}}function lc(k){let a,c;return a=new j({props:{code:"torch.Size([2, 384]) torch.Size([2, 384])",highlighted:'torch.Size([<span class="hljs-number">2</span>, <span class="hljs-number">384</span>]) torch.Size([<span class="hljs-number">2</span>, <span class="hljs-number">384</span>])'}}),{c(){g(a.$$.fragment)},l(n){x(a.$$.fragment,n)},m(n,b){$(a,n,b),c=!0},i(n){c||(_(a.$$.fragment,n),c=!0)},o(n){h(a.$$.fragment,n),c=!1},d(n){q(a,n)}}}function uc(k){let a,c;return a=new j({props:{code:`sequence_ids = inputs.sequence_ids()
# Masque tout, sauf les tokens du contexte
mask = [i != 1 for i in sequence_ids]
# D\xE9masquer le jeton [CLS]
mask[0] = False
# Masquer tous les tokens [PAD]
mask = tf.math.logical_or(tf.constant(mask)[None], inputs["attention_mask"] == 0)

start_logits = tf.where(mask, -10000, start_logits)
end_logits = tf.where(mask, -10000, end_logits)`,highlighted:`sequence_ids = inputs.sequence_ids()
<span class="hljs-comment"># Masque tout, sauf les tokens du contexte</span>
mask = [i != <span class="hljs-number">1</span> <span class="hljs-keyword">for</span> i <span class="hljs-keyword">in</span> sequence_ids]
<span class="hljs-comment"># D\xE9masquer le jeton [CLS]</span>
mask[<span class="hljs-number">0</span>] = <span class="hljs-literal">False</span>
<span class="hljs-comment"># Masquer tous les tokens [PAD]</span>
mask = tf.math.logical_or(tf.constant(mask)[<span class="hljs-literal">None</span>], inputs[<span class="hljs-string">&quot;attention_mask&quot;</span>] == <span class="hljs-number">0</span>)

start_logits = tf.where(mask, -<span class="hljs-number">10000</span>, start_logits)
end_logits = tf.where(mask, -<span class="hljs-number">10000</span>, end_logits)`}}),{c(){g(a.$$.fragment)},l(n){x(a.$$.fragment,n)},m(n,b){$(a,n,b),c=!0},i(n){c||(_(a.$$.fragment,n),c=!0)},o(n){h(a.$$.fragment,n),c=!1},d(n){q(a,n)}}}function pc(k){let a,c;return a=new j({props:{code:`sequence_ids = inputs.sequence_ids()
# Masque tout, sauf les tokens du contexte
mask = [i != 1 for i in sequence_ids]
# D\xE9masquer le jeton [CLS]
mask[0] = False
# Masquer tous les tokens [PAD]
mask = torch.logical_or(torch.tensor(mask)[None], (inputs["attention_mask"] == 0))

start_logits[mask] = -10000
end_logits[mask] = -10000`,highlighted:`sequence_ids = inputs.sequence_ids()
<span class="hljs-comment"># Masque tout, sauf les tokens du contexte</span>
mask = [i != <span class="hljs-number">1</span> <span class="hljs-keyword">for</span> i <span class="hljs-keyword">in</span> sequence_ids]
<span class="hljs-comment"># D\xE9masquer le jeton [CLS]</span>
mask[<span class="hljs-number">0</span>] = <span class="hljs-literal">False</span>
<span class="hljs-comment"># Masquer tous les tokens [PAD]</span>
mask = torch.logical_or(torch.tensor(mask)[<span class="hljs-literal">None</span>], (inputs[<span class="hljs-string">&quot;attention_mask&quot;</span>] == <span class="hljs-number">0</span>))

start_logits[mask] = -<span class="hljs-number">10000</span>
end_logits[mask] = -<span class="hljs-number">10000</span>`}}),{c(){g(a.$$.fragment)},l(n){x(a.$$.fragment,n)},m(n,b){$(a,n,b),c=!0},i(n){c||(_(a.$$.fragment,n),c=!0)},o(n){h(a.$$.fragment,n),c=!1},d(n){q(a,n)}}}function mc(k){let a,c;return a=new j({props:{code:`start_probabilities = tf.math.softmax(start_logits, axis=-1).numpy()
end_probabilities = tf.math.softmax(end_logits, axis=-1).numpy()`,highlighted:`start_probabilities = tf.math.softmax(start_logits, axis=-<span class="hljs-number">1</span>).numpy()
end_probabilities = tf.math.softmax(end_logits, axis=-<span class="hljs-number">1</span>).numpy()`}}),{c(){g(a.$$.fragment)},l(n){x(a.$$.fragment,n)},m(n,b){$(a,n,b),c=!0},i(n){c||(_(a.$$.fragment,n),c=!0)},o(n){h(a.$$.fragment,n),c=!1},d(n){q(a,n)}}}function cc(k){let a,c;return a=new j({props:{code:`start_probabilities = torch.nn.functional.softmax(start_logits, dim=-1)
end_probabilities = torch.nn.functional.softmax(end_logits, dim=-1)`,highlighted:`start_probabilities = torch.nn.functional.softmax(start_logits, dim=-<span class="hljs-number">1</span>)
end_probabilities = torch.nn.functional.softmax(end_logits, dim=-<span class="hljs-number">1</span>)`}}),{c(){g(a.$$.fragment)},l(n){x(a.$$.fragment,n)},m(n,b){$(a,n,b),c=!0},i(n){c||(_(a.$$.fragment,n),c=!0)},o(n){h(a.$$.fragment,n),c=!1},d(n){q(a,n)}}}function dc(k){let a,c;return a=new j({props:{code:`candidates = []
for start_probs, end_probs in zip(start_probabilities, end_probabilities):
    scores = start_probs[:, None] * end_probs[None, :]
    idx = np.triu(scores).argmax().item()

    start_idx = idx // scores.shape[1]
    end_idx = idx % scores.shape[1]
    score = scores[start_idx, end_idx].item()
    candidates.append((start_idx, end_idx, score))

print(candidates)`,highlighted:`candidates = []
<span class="hljs-keyword">for</span> start_probs, end_probs <span class="hljs-keyword">in</span> <span class="hljs-built_in">zip</span>(start_probabilities, end_probabilities):
    scores = start_probs[:, <span class="hljs-literal">None</span>] * end_probs[<span class="hljs-literal">None</span>, :]
    idx = np.triu(scores).argmax().item()

    start_idx = idx // scores.shape[<span class="hljs-number">1</span>]
    end_idx = idx % scores.shape[<span class="hljs-number">1</span>]
    score = scores[start_idx, end_idx].item()
    candidates.append((start_idx, end_idx, score))

<span class="hljs-built_in">print</span>(candidates)`}}),{c(){g(a.$$.fragment)},l(n){x(a.$$.fragment,n)},m(n,b){$(a,n,b),c=!0},i(n){c||(_(a.$$.fragment,n),c=!0)},o(n){h(a.$$.fragment,n),c=!1},d(n){q(a,n)}}}function fc(k){let a,c;return a=new j({props:{code:`candidates = []
for start_probs, end_probs in zip(start_probabilities, end_probabilities):
    scores = start_probs[:, None] * end_probs[None, :]
    idx = torch.triu(scores).argmax().item()

    start_idx = idx // scores.shape[1]
    end_idx = idx % scores.shape[1]
    score = scores[start_idx, end_idx].item()
    candidates.append((start_idx, end_idx, score))

print(candidates)`,highlighted:`candidates = []
<span class="hljs-keyword">for</span> start_probs, end_probs <span class="hljs-keyword">in</span> <span class="hljs-built_in">zip</span>(start_probabilities, end_probabilities):
    scores = start_probs[:, <span class="hljs-literal">None</span>] * end_probs[<span class="hljs-literal">None</span>, :]
    idx = torch.triu(scores).argmax().item()

    start_idx = idx // scores.shape[<span class="hljs-number">1</span>]
    end_idx = idx % scores.shape[<span class="hljs-number">1</span>]
    score = scores[start_idx, end_idx].item()
    candidates.append((start_idx, end_idx, score))

<span class="hljs-built_in">print</span>(candidates)`}}),{c(){g(a.$$.fragment)},l(n){x(a.$$.fragment,n)},m(n,b){$(a,n,b),c=!0},i(n){c||(_(a.$$.fragment,n),c=!0)},o(n){h(a.$$.fragment,n),c=!1},d(n){q(a,n)}}}function hc(k){let a,c,n,b,v;return{c(){a=l("p"),c=r("\u270F\uFE0F "),n=l("strong"),b=r("Essayez !"),v=r(" Adaptez le code ci-dessus pour renvoyer les scores et les \xE9tendues des cinq r\xE9ponses les plus probables (au total, pas par morceau).")},l(w){a=u(w,"P",{});var P=p(a);c=o(P,"\u270F\uFE0F "),n=u(P,"STRONG",{});var T=p(n);b=o(T,"Essayez !"),T.forEach(t),v=o(P," Adaptez le code ci-dessus pour renvoyer les scores et les \xE9tendues des cinq r\xE9ponses les plus probables (au total, pas par morceau)."),P.forEach(t)},m(w,P){m(w,a,P),s(a,c),s(a,n),s(n,b),s(a,v)},d(w){w&&t(a)}}}function _c(k){let a,c,n,b,v,w,P,T;return{c(){a=l("p"),c=r("\u270F\uFE0F "),n=l("strong"),b=r("Essayez !"),v=r(" Utilisez les meilleurs scores que vous avez calcul\xE9s auparavant pour montrer les cinq r\xE9ponses les plus probables (pour l\u2019ensemble du contexte, pas pour chaque morceau). Pour v\xE9rifier vos r\xE9sultats, retournez au premier pipeline et sp\xE9cifiez "),w=l("code"),P=r("top_k=5"),T=r(" en argument en l\u2019appelant.")},l(N){a=u(N,"P",{});var z=p(a);c=o(z,"\u270F\uFE0F "),n=u(z,"STRONG",{});var S=p(n);b=o(S,"Essayez !"),S.forEach(t),v=o(z," Utilisez les meilleurs scores que vous avez calcul\xE9s auparavant pour montrer les cinq r\xE9ponses les plus probables (pour l\u2019ensemble du contexte, pas pour chaque morceau). Pour v\xE9rifier vos r\xE9sultats, retournez au premier pipeline et sp\xE9cifiez "),w=u(z,"CODE",{});var A=p(w);P=o(A,"top_k=5"),A.forEach(t),T=o(z," en argument en l\u2019appelant."),z.forEach(t)},m(N,z){m(N,a,z),s(a,c),s(a,n),s(n,b),s(a,v),s(a,w),s(w,P),s(a,T)},d(N){N&&t(a)}}}function bc(k){let a,c,n,b,v,w,P,T,N,z,S,A,D,W,E,y,B,F,Oe,Gt,Hr,Rr,Jt,Vr,Br,fa,re,oe,Zs,Ie,Ke,Kt,ns,Yr,et,Xr,Wt,Zr,ha,Pe,eo,st,so,to,Qt,no,ao,_a,as,ba,rs,va,tt,ro,ga,os,xa,is,$a,nt,oo,qa,Ue,We,Ht,ls,io,Rt,lo,ka,O,uo,Vt,po,mo,Bt,co,fo,us,Yt,ho,_o,Xt,bo,vo,at,go,xo,wa,ie,le,rt,ot,$o,ja,Ge,ps,qu,qo,ms,ku,Ea,I,ko,Zt,wo,jo,en,Eo,yo,sn,Po,zo,tn,To,Co,nn,No,Lo,ya,cs,Pa,ue,pe,it,M,So,an,Ao,Do,rn,Mo,Fo,on,Oo,Io,ln,Uo,Go,un,Jo,Ko,pn,Wo,Qo,za,Qe,Ho,mn,Ro,Vo,Ta,me,ce,lt,ut,Bo,Ca,de,fe,pt,U,Yo,cn,Xo,Zo,dn,ei,si,fn,ti,ni,hn,ai,ri,_n,oi,ii,Na,K,li,bn,ui,pi,vn,mi,ci,gn,di,fi,xn,hi,_i,La,Am='<span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><mrow><mi mathvariant="normal">s</mi><mi mathvariant="normal">t</mi><mi mathvariant="normal">a</mi><mi mathvariant="normal">r</mi><mi mathvariant="normal">t</mi><mi mathvariant="normal">_</mi><mi mathvariant="normal">p</mi><mi mathvariant="normal">r</mi><mi mathvariant="normal">o</mi><mi mathvariant="normal">b</mi><mi mathvariant="normal">a</mi><mi mathvariant="normal">b</mi><mi mathvariant="normal">i</mi><mi mathvariant="normal">l</mi><mi mathvariant="normal">i</mi><mi mathvariant="normal">t</mi><mi mathvariant="normal">i</mi><mi mathvariant="normal">e</mi><mi mathvariant="normal">s</mi></mrow><mo stretchy="false">[</mo><mrow><mi mathvariant="normal">s</mi><mi mathvariant="normal">t</mi><mi mathvariant="normal">a</mi><mi mathvariant="normal">r</mi><mi mathvariant="normal">t</mi><mi mathvariant="normal">_</mi><mi mathvariant="normal">i</mi><mi mathvariant="normal">n</mi><mi mathvariant="normal">d</mi><mi mathvariant="normal">e</mi><mi mathvariant="normal">x</mi></mrow><mo stretchy="false">]</mo><mo>\xD7</mo><mrow><mi mathvariant="normal">e</mi><mi mathvariant="normal">n</mi><mi mathvariant="normal">d</mi><mi mathvariant="normal">_</mi><mi mathvariant="normal">p</mi><mi mathvariant="normal">r</mi><mi mathvariant="normal">o</mi><mi mathvariant="normal">b</mi><mi mathvariant="normal">a</mi><mi mathvariant="normal">b</mi><mi mathvariant="normal">i</mi><mi mathvariant="normal">l</mi><mi mathvariant="normal">i</mi><mi mathvariant="normal">t</mi><mi mathvariant="normal">i</mi><mi mathvariant="normal">e</mi><mi mathvariant="normal">s</mi></mrow><mo stretchy="false">[</mo><mrow><mi mathvariant="normal">e</mi><mi mathvariant="normal">n</mi><mi mathvariant="normal">d</mi><mi mathvariant="normal">_</mi><mi mathvariant="normal">i</mi><mi mathvariant="normal">n</mi><mi mathvariant="normal">d</mi><mi mathvariant="normal">e</mi><mi mathvariant="normal">x</mi></mrow><mo stretchy="false">]</mo></mrow><annotation encoding="application/x-tex">\\mathrm{start\\_probabilities}[\\mathrm{start\\_index}] \\times \\mathrm{end\\_probabilities}[\\mathrm{end\\_index}]</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1.06em;vertical-align:-0.31em;"></span><span class="mord"><span class="mord mathrm">start_probabilities</span></span><span class="mopen">[</span><span class="mord"><span class="mord mathrm">start_index</span></span><span class="mclose">]</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">\xD7</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1.06em;vertical-align:-0.31em;"></span><span class="mord"><span class="mord mathrm">end_probabilities</span></span><span class="mopen">[</span><span class="mord"><span class="mord mathrm">end_index</span></span><span class="mclose">]</span></span></span></span></span>',Sa,ze,bi,Aa,Dm='<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mrow><mi mathvariant="normal">s</mi><mi mathvariant="normal">t</mi><mi mathvariant="normal">a</mi><mi mathvariant="normal">r</mi><mi mathvariant="normal">t</mi><mi mathvariant="normal">_</mi><mi mathvariant="normal">p</mi><mi mathvariant="normal">r</mi><mi mathvariant="normal">o</mi><mi mathvariant="normal">b</mi><mi mathvariant="normal">a</mi><mi mathvariant="normal">b</mi><mi mathvariant="normal">i</mi><mi mathvariant="normal">l</mi><mi mathvariant="normal">i</mi><mi mathvariant="normal">t</mi><mi mathvariant="normal">i</mi><mi mathvariant="normal">e</mi><mi mathvariant="normal">s</mi></mrow><mo stretchy="false">[</mo><mrow><mi mathvariant="normal">s</mi><mi mathvariant="normal">t</mi><mi mathvariant="normal">a</mi><mi mathvariant="normal">r</mi><mi mathvariant="normal">t</mi><mi mathvariant="normal">_</mi><mi mathvariant="normal">i</mi><mi mathvariant="normal">n</mi><mi mathvariant="normal">d</mi><mi mathvariant="normal">e</mi><mi mathvariant="normal">x</mi></mrow><mo stretchy="false">]</mo><mo>\xD7</mo><mrow><mi mathvariant="normal">e</mi><mi mathvariant="normal">n</mi><mi mathvariant="normal">d</mi><mi mathvariant="normal">_</mi><mi mathvariant="normal">p</mi><mi mathvariant="normal">r</mi><mi mathvariant="normal">o</mi><mi mathvariant="normal">b</mi><mi mathvariant="normal">a</mi><mi mathvariant="normal">b</mi><mi mathvariant="normal">i</mi><mi mathvariant="normal">l</mi><mi mathvariant="normal">i</mi><mi mathvariant="normal">t</mi><mi mathvariant="normal">i</mi><mi mathvariant="normal">e</mi><mi mathvariant="normal">s</mi></mrow><mo stretchy="false">[</mo><mrow><mi mathvariant="normal">e</mi><mi mathvariant="normal">n</mi><mi mathvariant="normal">d</mi><mi mathvariant="normal">_</mi><mi mathvariant="normal">i</mi><mi mathvariant="normal">n</mi><mi mathvariant="normal">d</mi><mi mathvariant="normal">e</mi><mi mathvariant="normal">x</mi></mrow><mo stretchy="false">]</mo></mrow><annotation encoding="application/x-tex">\\mathrm{start\\_probabilities}[\\mathrm{start\\_index}] \\times \\mathrm{end\\_probabilities}[\\mathrm{end\\_index}]</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1.06em;vertical-align:-0.31em;"></span><span class="mord"><span class="mord mathrm">start_probabilities</span></span><span class="mopen">[</span><span class="mord"><span class="mord mathrm">start_index</span></span><span class="mclose">]</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">\xD7</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1.06em;vertical-align:-0.31em;"></span><span class="mord"><span class="mord mathrm">end_probabilities</span></span><span class="mopen">[</span><span class="mord"><span class="mord mathrm">end_index</span></span><span class="mclose">]</span></span></span></span>',Da,$n,vi,gi,Ma,mt,xi,Fa,ds,Oa,he,_e,ct,Q,$i,qn,qi,ki,kn,wi,ji,wn,Ei,yi,jn,Pi,zi,Ia,fs,Ua,dt,Ti,Ga,hs,Ja,He,Ka,G,Ci,En,Ni,Li,yn,Si,Ai,Pn,Di,Mi,zn,Fi,Oi,Tn,Ii,Ui,Wa,_s,Qa,ft,Gi,Ha,bs,Ra,vs,Va,ht,Ji,Ba,Re,Ya,Je,Ve,Cn,gs,Ki,Nn,Wi,Xa,Te,Qi,Ln,Hi,Ri,Sn,Vi,Bi,Za,xs,er,$s,sr,Be,Yi,An,Xi,Zi,tr,qs,nr,ks,ar,Ye,el,Dn,sl,tl,rr,Y,nl,Mn,al,rl,Fn,ol,il,On,ll,ul,or,ws,ir,js,lr,H,pl,In,ml,cl,Un,dl,fl,Gn,hl,_l,Jn,bl,vl,ur,_t,gl,pr,Es,mr,ys,cr,Ce,xl,Kn,$l,ql,Wn,kl,wl,dr,Ps,fr,zs,hr,bt,jl,_r,Ts,br,vt,El,vr,Cs,gr,gt,yl,xr,L,Pl,Qn,zl,Tl,Hn,Cl,Nl,Rn,Ll,Sl,Vn,Al,Dl,Bn,Ml,Fl,Yn,Ol,Il,Xn,Ul,Gl,$r,Ns,qr,R,Jl,Zn,Kl,Wl,ea,Ql,Hl,sa,Rl,Vl,ta,Bl,Yl,kr,be,ve,xt,$t,Xl,wr,Ls,jr,ge,xe,qt,X,Zl,na,eu,su,aa,tu,nu,ra,au,ru,Er,$e,qe,kt,wt,ou,yr,ke,we,jt,Et,iu,Pr,je,Ee,yt,Ss,zr,Xe,lu,oa,uu,pu,Tr,Ze,Cr,Ne,mu,ia,cu,du,la,fu,hu,Nr,As,Lr,Ds,Sr,Pt,_u,Ar,es,Dr,Le,bu,ua,vu,gu,pa,xu,$u,Mr;n=new Gm({props:{fw:k[0]}}),T=new Qr({});const wu=[Km,Jm],Ms=[];function ju(e,i){return e[0]==="pt"?0:1}E=ju(k),y=Ms[E]=wu[E](k);const Eu=[Qm,Wm],Fs=[];function yu(e,i){return e[0]==="pt"?0:1}re=yu(k),oe=Fs[re]=Eu[re](k),ns=new Qr({}),as=new j({props:{code:`from transformers import pipeline

question_answerer = pipeline("question-answering")
context = """
\u{1F917} Transformers is backed by the three most popular deep learning libraries
 \u2014 Jax, PyTorch, and TensorFlow \u2014 with a seamless integration between them. 
It's straightforward to train your models with one before loading them for inference with the other.
"""
# \u{1F917} Transformers s'appuie sur les trois biblioth\xE8ques d'apprentissage profond les plus populaires
# (Jax, PyTorch et TensorFlow) avec une int\xE9gration transparente entre elles.
# C'est simple d'entra\xEEner vos mod\xE8les avec l'une avant de les charger pour l'inf\xE9rence avec l'autre.
question = "Which deep learning libraries back \u{1F917} Transformers?"
# Quelles biblioth\xE8ques d'apprentissage profond derri\xE8re \u{1F917} Transformers ?
question_answerer(question=question, context=context)`,highlighted:`<span class="hljs-keyword">from</span> transformers <span class="hljs-keyword">import</span> pipeline

question_answerer = pipeline(<span class="hljs-string">&quot;question-answering&quot;</span>)
context = <span class="hljs-string">&quot;&quot;&quot;
\u{1F917} Transformers is backed by the three most popular deep learning libraries
 \u2014 Jax, PyTorch, and TensorFlow \u2014 with a seamless integration between them. 
It&#x27;s straightforward to train your models with one before loading them for inference with the other.
&quot;&quot;&quot;</span>
<span class="hljs-comment"># \u{1F917} Transformers s&#x27;appuie sur les trois biblioth\xE8ques d&#x27;apprentissage profond les plus populaires</span>
<span class="hljs-comment"># (Jax, PyTorch et TensorFlow) avec une int\xE9gration transparente entre elles.</span>
<span class="hljs-comment"># C&#x27;est simple d&#x27;entra\xEEner vos mod\xE8les avec l&#x27;une avant de les charger pour l&#x27;inf\xE9rence avec l&#x27;autre.</span>
question = <span class="hljs-string">&quot;Which deep learning libraries back \u{1F917} Transformers?&quot;</span>
<span class="hljs-comment"># Quelles biblioth\xE8ques d&#x27;apprentissage profond derri\xE8re \u{1F917} Transformers ?</span>
question_answerer(question=question, context=context)`}}),rs=new j({props:{code:`{'score': 0.97773,
 'start': 78,
 'end': 105,
 'answer': 'Jax, PyTorch and TensorFlow'}`,highlighted:`{<span class="hljs-string">&#x27;score&#x27;</span>: <span class="hljs-number">0.97773</span>,
 <span class="hljs-string">&#x27;start&#x27;</span>: <span class="hljs-number">78</span>,
 <span class="hljs-string">&#x27;end&#x27;</span>: <span class="hljs-number">105</span>,
 <span class="hljs-string">&#x27;answer&#x27;</span>: <span class="hljs-string">&#x27;Jax, PyTorch and TensorFlow&#x27;</span>}`}}),os=new j({props:{code:`long_context = """
\u{1F917} Transformers: State of the Art NLP

\u{1F917} Transformers provides thousands of pretrained models to perform tasks on texts such as classification, information extraction,
question answering, summarization, translation, text generation and more in over 100 languages.
Its aim is to make cutting-edge NLP easier to use for everyone.

\u{1F917} Transformers provides APIs to quickly download and use those pretrained models on a given text, fine-tune them on your own datasets and
then share them with the community on our model hub. At the same time, each python module defining an architecture is fully standalone and
can be modified to enable quick research experiments.

Why should I use transformers?

1. Easy-to-use state-of-the-art models:
  - High performance on NLU and NLG tasks.
  - Low barrier to entry for educators and practitioners.
  - Few user-facing abstractions with just three classes to learn.
  - A unified API for using all our pretrained models.
  - Lower compute costs, smaller carbon footprint:

2. Researchers can share trained models instead of always retraining.
  - Practitioners can reduce compute time and production costs.
  - Dozens of architectures with over 10,000 pretrained models, some in more than 100 languages.

3. Choose the right framework for every part of a model's lifetime:
  - Train state-of-the-art models in 3 lines of code.
  - Move a single model between TF2.0/PyTorch frameworks at will.
  - Seamlessly pick the right framework for training, evaluation and production.

4. Easily customize a model or an example to your needs:
  - We provide examples for each architecture to reproduce the results published by its original authors.
  - Model internals are exposed as consistently as possible.
  - Model files can be used independently of the library for quick experiments.

\u{1F917} Transformers is backed by the three most popular deep learning libraries \u2014 Jax, PyTorch and TensorFlow \u2014 with a seamless integration
between them. It's straightforward to train your models with one before loading them for inference with the other.
"""

long_context - fr = """
\u{1F917} Transformers : l'\xE9tat de l'art du NLP

\u{1F917} Transformers fournit des milliers de mod\xE8les pr\xE9-entra\xEEn\xE9s pour effectuer des t\xE2ches sur des textes telles que la classification, 
l'extraction d'informations, la r\xE9ponse \xE0 des questions, le r\xE9sum\xE9 de textes, la traduction, la g\xE9n\xE9ration de texte et plus encore dans plus de 100 langues.
Son objectif est de rendre le traitement automatique des langues de pointe plus facile \xE0 utiliser pour tout le monde.

\u{1F917} Transformers fournit des API permettant de t\xE9l\xE9charger et d'utiliser rapidement ces mod\xE8les pr\xE9-entra\xEEn\xE9s sur un texte donn\xE9, de les affiner sur vos propres ensembles de donn\xE9es et de les partager avec la communaut\xE9 sur notre site Web.
puis de les partager avec la communaut\xE9 sur notre hub de mod\xE8les. En m\xEAme temps, chaque module python d\xE9finissant une architecture est enti\xE8rement autonome et peut \xEAtre modifi\xE9 pour permettre des exp\xE9riences de recherche rapides.
peut \xEAtre modifi\xE9 pour permettre des exp\xE9riences de recherche rapides.

Pourquoi devrais-je utiliser des transformateurs ?

1. Des mod\xE8les de pointe faciles \xE0 utiliser :
  - Haute performance sur les t\xE2ches NLU et NLG.
  - Faible barri\xE8re \xE0 l'entr\xE9e pour les \xE9ducateurs et les praticiens.
  - Peu d'abstractions pour l'utilisateur avec seulement trois classes \xE0 apprendre.
  - Une API unifi\xE9e pour utiliser tous nos mod\xE8les pr\xE9-entra\xEEn\xE9s.
  - Des co\xFBts de calcul plus faibles, une empreinte carbone r\xE9duite :

2. Les chercheurs peuvent partager les mod\xE8les form\xE9s au lieu de toujours les reformer.
  - Les praticiens peuvent r\xE9duire le temps de calcul et les co\xFBts de production.
  - Des dizaines d'architectures avec plus de 10 000 mod\xE8les pr\xE9-form\xE9s, certains dans plus de 100 langues.

3. Choisissez le cadre appropri\xE9 pour chaque \xE9tape de la vie d'un mod\xE8le :
  - Entra\xEEnez des mod\xE8les de pointe en 3 lignes de code.
  - D\xE9placez un seul mod\xE8le entre les frameworks TF2.0/PyTorch \xE0 volont\xE9.
  - Choisissez de mani\xE8re transparente le bon framework pour l'entra\xEEnement, l'\xE9valuation et la production.

4. Adaptez facilement un mod\xE8le ou un exemple \xE0 vos besoins :
  - Nous fournissons des exemples pour chaque architecture afin de reproduire les r\xE9sultats publi\xE9s par ses auteurs originaux.
  - Les \xE9l\xE9ments internes des mod\xE8les sont expos\xE9s de mani\xE8re aussi coh\xE9rente que possible.
  - Les fichiers de mod\xE8les peuvent \xEAtre utilis\xE9s ind\xE9pendamment de la biblioth\xE8que pour des exp\xE9riences rapides.

\u{1F917} Transformers s'appuie sur les trois biblioth\xE8ques d'apprentissage profond les plus populaires (Jax, PyTorch et TensorFlow) avec une int\xE9gration parfaite
entre elles. Il est simple d'entra\xEEner vos mod\xE8les avec l'une avant de les charger pour l'inf\xE9rence avec l'autre.
"""
question_answerer(question=question, context=long_context)`,highlighted:`long_context = <span class="hljs-string">&quot;&quot;&quot;
\u{1F917} Transformers: State of the Art NLP

\u{1F917} Transformers provides thousands of pretrained models to perform tasks on texts such as classification, information extraction,
question answering, summarization, translation, text generation and more in over 100 languages.
Its aim is to make cutting-edge NLP easier to use for everyone.

\u{1F917} Transformers provides APIs to quickly download and use those pretrained models on a given text, fine-tune them on your own datasets and
then share them with the community on our model hub. At the same time, each python module defining an architecture is fully standalone and
can be modified to enable quick research experiments.

Why should I use transformers?

1. Easy-to-use state-of-the-art models:
  - High performance on NLU and NLG tasks.
  - Low barrier to entry for educators and practitioners.
  - Few user-facing abstractions with just three classes to learn.
  - A unified API for using all our pretrained models.
  - Lower compute costs, smaller carbon footprint:

2. Researchers can share trained models instead of always retraining.
  - Practitioners can reduce compute time and production costs.
  - Dozens of architectures with over 10,000 pretrained models, some in more than 100 languages.

3. Choose the right framework for every part of a model&#x27;s lifetime:
  - Train state-of-the-art models in 3 lines of code.
  - Move a single model between TF2.0/PyTorch frameworks at will.
  - Seamlessly pick the right framework for training, evaluation and production.

4. Easily customize a model or an example to your needs:
  - We provide examples for each architecture to reproduce the results published by its original authors.
  - Model internals are exposed as consistently as possible.
  - Model files can be used independently of the library for quick experiments.

\u{1F917} Transformers is backed by the three most popular deep learning libraries \u2014 Jax, PyTorch and TensorFlow \u2014 with a seamless integration
between them. It&#x27;s straightforward to train your models with one before loading them for inference with the other.
&quot;&quot;&quot;</span>

long_context - fr = <span class="hljs-string">&quot;&quot;&quot;
\u{1F917} Transformers : l&#x27;\xE9tat de l&#x27;art du NLP

\u{1F917} Transformers fournit des milliers de mod\xE8les pr\xE9-entra\xEEn\xE9s pour effectuer des t\xE2ches sur des textes telles que la classification, 
l&#x27;extraction d&#x27;informations, la r\xE9ponse \xE0 des questions, le r\xE9sum\xE9 de textes, la traduction, la g\xE9n\xE9ration de texte et plus encore dans plus de 100 langues.
Son objectif est de rendre le traitement automatique des langues de pointe plus facile \xE0 utiliser pour tout le monde.

\u{1F917} Transformers fournit des API permettant de t\xE9l\xE9charger et d&#x27;utiliser rapidement ces mod\xE8les pr\xE9-entra\xEEn\xE9s sur un texte donn\xE9, de les affiner sur vos propres ensembles de donn\xE9es et de les partager avec la communaut\xE9 sur notre site Web.
puis de les partager avec la communaut\xE9 sur notre hub de mod\xE8les. En m\xEAme temps, chaque module python d\xE9finissant une architecture est enti\xE8rement autonome et peut \xEAtre modifi\xE9 pour permettre des exp\xE9riences de recherche rapides.
peut \xEAtre modifi\xE9 pour permettre des exp\xE9riences de recherche rapides.

Pourquoi devrais-je utiliser des transformateurs ?

1. Des mod\xE8les de pointe faciles \xE0 utiliser :
  - Haute performance sur les t\xE2ches NLU et NLG.
  - Faible barri\xE8re \xE0 l&#x27;entr\xE9e pour les \xE9ducateurs et les praticiens.
  - Peu d&#x27;abstractions pour l&#x27;utilisateur avec seulement trois classes \xE0 apprendre.
  - Une API unifi\xE9e pour utiliser tous nos mod\xE8les pr\xE9-entra\xEEn\xE9s.
  - Des co\xFBts de calcul plus faibles, une empreinte carbone r\xE9duite :

2. Les chercheurs peuvent partager les mod\xE8les form\xE9s au lieu de toujours les reformer.
  - Les praticiens peuvent r\xE9duire le temps de calcul et les co\xFBts de production.
  - Des dizaines d&#x27;architectures avec plus de 10 000 mod\xE8les pr\xE9-form\xE9s, certains dans plus de 100 langues.

3. Choisissez le cadre appropri\xE9 pour chaque \xE9tape de la vie d&#x27;un mod\xE8le :
  - Entra\xEEnez des mod\xE8les de pointe en 3 lignes de code.
  - D\xE9placez un seul mod\xE8le entre les frameworks TF2.0/PyTorch \xE0 volont\xE9.
  - Choisissez de mani\xE8re transparente le bon framework pour l&#x27;entra\xEEnement, l&#x27;\xE9valuation et la production.

4. Adaptez facilement un mod\xE8le ou un exemple \xE0 vos besoins :
  - Nous fournissons des exemples pour chaque architecture afin de reproduire les r\xE9sultats publi\xE9s par ses auteurs originaux.
  - Les \xE9l\xE9ments internes des mod\xE8les sont expos\xE9s de mani\xE8re aussi coh\xE9rente que possible.
  - Les fichiers de mod\xE8les peuvent \xEAtre utilis\xE9s ind\xE9pendamment de la biblioth\xE8que pour des exp\xE9riences rapides.

\u{1F917} Transformers s&#x27;appuie sur les trois biblioth\xE8ques d&#x27;apprentissage profond les plus populaires (Jax, PyTorch et TensorFlow) avec une int\xE9gration parfaite
entre elles. Il est simple d&#x27;entra\xEEner vos mod\xE8les avec l&#x27;une avant de les charger pour l&#x27;inf\xE9rence avec l&#x27;autre.
&quot;&quot;&quot;</span>
question_answerer(question=question, context=long_context)`}}),is=new j({props:{code:`{'score': 0.97149,
 'start': 1892,
 'end': 1919,
 'answer': 'Jax, PyTorch and TensorFlow'}`,highlighted:`{<span class="hljs-string">&#x27;score&#x27;</span>: <span class="hljs-number">0.97149</span>,
 <span class="hljs-string">&#x27;start&#x27;</span>: <span class="hljs-number">1892</span>,
 <span class="hljs-string">&#x27;end&#x27;</span>: <span class="hljs-number">1919</span>,
 <span class="hljs-string">&#x27;answer&#x27;</span>: <span class="hljs-string">&#x27;Jax, PyTorch and TensorFlow&#x27;</span>}`}}),ls=new Qr({});const Pu=[Rm,Hm],Os=[];function zu(e,i){return e[0]==="pt"?0:1}ie=zu(k),le=Os[ie]=Pu[ie](k),cs=new j({props:{code:`start_logits = outputs.start_logits
end_logits = outputs.end_logits
print(start_logits.shape, end_logits.shape)`,highlighted:`start_logits = outputs.start_logits
end_logits = outputs.end_logits
<span class="hljs-built_in">print</span>(start_logits.shape, end_logits.shape)`}});const Tu=[Bm,Vm],Is=[];function Cu(e,i){return e[0]==="pt"?0:1}ue=Cu(k),pe=Is[ue]=Tu[ue](k);const Nu=[Xm,Ym],Us=[];function Lu(e,i){return e[0]==="pt"?0:1}me=Lu(k),ce=Us[me]=Nu[me](k);const Su=[ec,Zm],Gs=[];function Au(e,i){return e[0]==="pt"?0:1}de=Au(k),fe=Gs[de]=Su[de](k),ds=new j({props:{code:"scores = start_probabilities[:, None] * end_probabilities[None, :]",highlighted:'scores = start_probabilities[:, <span class="hljs-literal">None</span>] * end_probabilities[<span class="hljs-literal">None</span>, :]'}});const Du=[tc,sc],Js=[];function Mu(e,i){return e[0]==="pt"?0:1}he=Mu(k),_e=Js[he]=Du[he](k),fs=new j({props:{code:`max_index = scores.argmax().item()
start_index = max_index // scores.shape[1]
end_index = max_index % scores.shape[1]
print(scores[start_index, end_index])`,highlighted:`max_index = scores.argmax().item()
start_index = max_index // scores.shape[<span class="hljs-number">1</span>]
end_index = max_index % scores.shape[<span class="hljs-number">1</span>]
<span class="hljs-built_in">print</span>(scores[start_index, end_index])`}}),hs=new j({props:{code:"0.97773",highlighted:'<span class="hljs-number">0.97773</span>'}}),He=new Wr({props:{$$slots:{default:[nc]},$$scope:{ctx:k}}}),_s=new j({props:{code:`inputs_with_offsets = tokenizer(question, context, return_offsets_mapping=True)
offsets = inputs_with_offsets["offset_mapping"]

start_char, _ = offsets[start_index]
_, end_char = offsets[end_index]
answer = context[start_char:end_char]`,highlighted:`inputs_with_offsets = tokenizer(question, context, return_offsets_mapping=<span class="hljs-literal">True</span>)
offsets = inputs_with_offsets[<span class="hljs-string">&quot;offset_mapping&quot;</span>]

start_char, _ = offsets[start_index]
_, end_char = offsets[end_index]
answer = context[start_char:end_char]`}}),bs=new j({props:{code:`result = {
    "answer": answer,
    "start": start_char,
    "end": end_char,
    "score": scores[start_index, end_index],
}
print(result)`,highlighted:`result = {
    <span class="hljs-string">&quot;answer&quot;</span>: answer,
    <span class="hljs-string">&quot;start&quot;</span>: start_char,
    <span class="hljs-string">&quot;end&quot;</span>: end_char,
    <span class="hljs-string">&quot;score&quot;</span>: scores[start_index, end_index],
}
<span class="hljs-built_in">print</span>(result)`}}),vs=new j({props:{code:`{'answer': 'Jax, PyTorch and TensorFlow',
 'start': 78,
 'end': 105,
 'score': 0.97773}`,highlighted:`{<span class="hljs-string">&#x27;answer&#x27;</span>: <span class="hljs-string">&#x27;Jax, PyTorch and TensorFlow&#x27;</span>,
 <span class="hljs-string">&#x27;start&#x27;</span>: <span class="hljs-number">78</span>,
 <span class="hljs-string">&#x27;end&#x27;</span>: <span class="hljs-number">105</span>,
 <span class="hljs-string">&#x27;score&#x27;</span>: <span class="hljs-number">0.97773</span>}`}}),Re=new Wr({props:{$$slots:{default:[ac]},$$scope:{ctx:k}}}),gs=new Qr({}),xs=new j({props:{code:`inputs = tokenizer(question, long_context)
print(len(inputs["input_ids"]))`,highlighted:`inputs = tokenizer(question, long_context)
<span class="hljs-built_in">print</span>(<span class="hljs-built_in">len</span>(inputs[<span class="hljs-string">&quot;input_ids&quot;</span>]))`}}),$s=new j({props:{code:"461",highlighted:'<span class="hljs-number">461</span>'}}),qs=new j({props:{code:`inputs = tokenizer(question, long_context, max_length=384, truncation="only_second")
print(tokenizer.decode(inputs["input_ids"]))`,highlighted:`inputs = tokenizer(question, long_context, max_length=<span class="hljs-number">384</span>, truncation=<span class="hljs-string">&quot;only_second&quot;</span>)
<span class="hljs-built_in">print</span>(tokenizer.decode(inputs[<span class="hljs-string">&quot;input_ids&quot;</span>]))`}}),ks=new j({props:{code:`"""
[CLS] Which deep learning libraries back [UNK] Transformers? [SEP] [UNK] Transformers : State of the Art NLP

[UNK] Transformers provides thousands of pretrained models to perform tasks on texts such as classification, information extraction,
question answering, summarization, translation, text generation and more in over 100 languages.
Its aim is to make cutting-edge NLP easier to use for everyone.

[UNK] Transformers provides APIs to quickly download and use those pretrained models on a given text, fine-tune them on your own datasets and
then share them with the community on our model hub. At the same time, each python module defining an architecture is fully standalone and
can be modified to enable quick research experiments.

Why should I use transformers?

1. Easy-to-use state-of-the-art models:
  - High performance on NLU and NLG tasks.
  - Low barrier to entry for educators and practitioners.
  - Few user-facing abstractions with just three classes to learn.
  - A unified API for using all our pretrained models.
  - Lower compute costs, smaller carbon footprint:

2. Researchers can share trained models instead of always retraining.
  - Practitioners can reduce compute time and production costs.
  - Dozens of architectures with over 10,000 pretrained models, some in more than 100 languages.

3. Choose the right framework for every part of a model's lifetime:
  - Train state-of-the-art models in 3 lines of code.
  - Move a single model between TF2.0/PyTorch frameworks at will.
  - Seamlessly pick the right framework for training, evaluation and production.

4. Easily customize a model or an example to your needs:
  - We provide examples for each architecture to reproduce the results published by its original authors.
  - Model internal [SEP]
"""

"""
[CLS] Quelles sont les biblioth\xE8ques d'apprentissage profond qui soutiennent [UNK] Transformers ? [SEP] [UNK] Transformers : l'\xE9tat de l'art du NLP

[UNK] Transformers fournit des milliers de mod\xE8les pr\xE9-entra\xEEn\xE9s pour effectuer des t\xE2ches sur des textes telles que la classification, l'extraction d'informations, la r\xE9ponse \xE0 des questions, le r\xE9sum\xE9, la traduction, la g\xE9n\xE9ration de textes, etc,
la r\xE9ponse \xE0 des questions, le r\xE9sum\xE9, la traduction, la g\xE9n\xE9ration de texte et plus encore dans plus de 100 langues.
Son objectif est de rendre le traitement automatique des langues de pointe plus facile \xE0 utiliser pour tous.

Transformers [UNK] fournit des API permettant de t\xE9l\xE9charger et d'utiliser rapidement ces mod\xE8les pr\xE9-entra\xEEn\xE9s sur un texte donn\xE9, de les affiner sur vos propres ensembles de donn\xE9es et de les partager avec la communaut\xE9 sur notre site Web.
puis de les partager avec la communaut\xE9 sur notre hub de mod\xE8les. En m\xEAme temps, chaque module python d\xE9finissant une architecture est enti\xE8rement autonome et peut \xEAtre modifi\xE9 pour permettre des exp\xE9riences de recherche rapides.
peut \xEAtre modifi\xE9 pour permettre des exp\xE9riences de recherche rapides.

Pourquoi devrais-je utiliser des transformateurs ?

1. Des mod\xE8les de pointe faciles \xE0 utiliser :
  - Haute performance sur les t\xE2ches NLU et NLG.
  - Faible barri\xE8re \xE0 l'entr\xE9e pour les \xE9ducateurs et les praticiens.
  - Peu d'abstractions pour l'utilisateur avec seulement trois classes \xE0 apprendre.
  - Une API unifi\xE9e pour utiliser tous nos mod\xE8les pr\xE9-entra\xEEn\xE9s.
  - Des co\xFBts de calcul plus faibles, une empreinte carbone r\xE9duite :

2. Les chercheurs peuvent partager les mod\xE8les form\xE9s au lieu de toujours les reformer.
  - Les praticiens peuvent r\xE9duire le temps de calcul et les co\xFBts de production.
  - Des dizaines d'architectures avec plus de 10 000 mod\xE8les pr\xE9-form\xE9s, certains dans plus de 100 langues.

3. Choisissez le cadre appropri\xE9 pour chaque \xE9tape de la vie d'un mod\xE8le :
  - Entra\xEEnez des mod\xE8les de pointe en 3 lignes de code.
  - D\xE9placez un seul mod\xE8le entre les frameworks TF2.0/PyTorch \xE0 volont\xE9.
  - Choisissez de mani\xE8re transparente le bon framework pour l'entra\xEEnement, l'\xE9valuation et la production.

4. Adaptez facilement un mod\xE8le ou un exemple \xE0 vos besoins :
  - Nous fournissons des exemples pour chaque architecture afin de reproduire les r\xE9sultats publi\xE9s par ses auteurs originaux.
  - Mod\xE8le interne [SEP]
"""`,highlighted:`<span class="hljs-string">&quot;&quot;&quot;
[CLS] Which deep learning libraries back [UNK] Transformers? [SEP] [UNK] Transformers : State of the Art NLP

[UNK] Transformers provides thousands of pretrained models to perform tasks on texts such as classification, information extraction,
question answering, summarization, translation, text generation and more in over 100 languages.
Its aim is to make cutting-edge NLP easier to use for everyone.

[UNK] Transformers provides APIs to quickly download and use those pretrained models on a given text, fine-tune them on your own datasets and
then share them with the community on our model hub. At the same time, each python module defining an architecture is fully standalone and
can be modified to enable quick research experiments.

Why should I use transformers?

1. Easy-to-use state-of-the-art models:
  - High performance on NLU and NLG tasks.
  - Low barrier to entry for educators and practitioners.
  - Few user-facing abstractions with just three classes to learn.
  - A unified API for using all our pretrained models.
  - Lower compute costs, smaller carbon footprint:

2. Researchers can share trained models instead of always retraining.
  - Practitioners can reduce compute time and production costs.
  - Dozens of architectures with over 10,000 pretrained models, some in more than 100 languages.

3. Choose the right framework for every part of a model&#x27;s lifetime:
  - Train state-of-the-art models in 3 lines of code.
  - Move a single model between TF2.0/PyTorch frameworks at will.
  - Seamlessly pick the right framework for training, evaluation and production.

4. Easily customize a model or an example to your needs:
  - We provide examples for each architecture to reproduce the results published by its original authors.
  - Model internal [SEP]
&quot;&quot;&quot;</span>

<span class="hljs-string">&quot;&quot;&quot;
[CLS] Quelles sont les biblioth\xE8ques d&#x27;apprentissage profond qui soutiennent [UNK] Transformers ? [SEP] [UNK] Transformers : l&#x27;\xE9tat de l&#x27;art du NLP

[UNK] Transformers fournit des milliers de mod\xE8les pr\xE9-entra\xEEn\xE9s pour effectuer des t\xE2ches sur des textes telles que la classification, l&#x27;extraction d&#x27;informations, la r\xE9ponse \xE0 des questions, le r\xE9sum\xE9, la traduction, la g\xE9n\xE9ration de textes, etc,
la r\xE9ponse \xE0 des questions, le r\xE9sum\xE9, la traduction, la g\xE9n\xE9ration de texte et plus encore dans plus de 100 langues.
Son objectif est de rendre le traitement automatique des langues de pointe plus facile \xE0 utiliser pour tous.

Transformers [UNK] fournit des API permettant de t\xE9l\xE9charger et d&#x27;utiliser rapidement ces mod\xE8les pr\xE9-entra\xEEn\xE9s sur un texte donn\xE9, de les affiner sur vos propres ensembles de donn\xE9es et de les partager avec la communaut\xE9 sur notre site Web.
puis de les partager avec la communaut\xE9 sur notre hub de mod\xE8les. En m\xEAme temps, chaque module python d\xE9finissant une architecture est enti\xE8rement autonome et peut \xEAtre modifi\xE9 pour permettre des exp\xE9riences de recherche rapides.
peut \xEAtre modifi\xE9 pour permettre des exp\xE9riences de recherche rapides.

Pourquoi devrais-je utiliser des transformateurs ?

1. Des mod\xE8les de pointe faciles \xE0 utiliser :
  - Haute performance sur les t\xE2ches NLU et NLG.
  - Faible barri\xE8re \xE0 l&#x27;entr\xE9e pour les \xE9ducateurs et les praticiens.
  - Peu d&#x27;abstractions pour l&#x27;utilisateur avec seulement trois classes \xE0 apprendre.
  - Une API unifi\xE9e pour utiliser tous nos mod\xE8les pr\xE9-entra\xEEn\xE9s.
  - Des co\xFBts de calcul plus faibles, une empreinte carbone r\xE9duite :

2. Les chercheurs peuvent partager les mod\xE8les form\xE9s au lieu de toujours les reformer.
  - Les praticiens peuvent r\xE9duire le temps de calcul et les co\xFBts de production.
  - Des dizaines d&#x27;architectures avec plus de 10 000 mod\xE8les pr\xE9-form\xE9s, certains dans plus de 100 langues.

3. Choisissez le cadre appropri\xE9 pour chaque \xE9tape de la vie d&#x27;un mod\xE8le :
  - Entra\xEEnez des mod\xE8les de pointe en 3 lignes de code.
  - D\xE9placez un seul mod\xE8le entre les frameworks TF2.0/PyTorch \xE0 volont\xE9.
  - Choisissez de mani\xE8re transparente le bon framework pour l&#x27;entra\xEEnement, l&#x27;\xE9valuation et la production.

4. Adaptez facilement un mod\xE8le ou un exemple \xE0 vos besoins :
  - Nous fournissons des exemples pour chaque architecture afin de reproduire les r\xE9sultats publi\xE9s par ses auteurs originaux.
  - Mod\xE8le interne [SEP]
&quot;&quot;&quot;</span>`}}),ws=new j({props:{code:`sentence = "This sentence is not too long but we are going to split it anyway."
# "Cette phrase n'est pas trop longue mais nous allons la diviser quand m\xEAme."
inputs = tokenizer(
    sentence, truncation=True, return_overflowing_tokens=True, max_length=6, stride=2
)

for ids in inputs["input_ids"]:
    print(tokenizer.decode(ids))`,highlighted:`sentence = <span class="hljs-string">&quot;This sentence is not too long but we are going to split it anyway.&quot;</span>
<span class="hljs-comment"># &quot;Cette phrase n&#x27;est pas trop longue mais nous allons la diviser quand m\xEAme.&quot;</span>
inputs = tokenizer(
    sentence, truncation=<span class="hljs-literal">True</span>, return_overflowing_tokens=<span class="hljs-literal">True</span>, max_length=<span class="hljs-number">6</span>, stride=<span class="hljs-number">2</span>
)

<span class="hljs-keyword">for</span> ids <span class="hljs-keyword">in</span> inputs[<span class="hljs-string">&quot;input_ids&quot;</span>]:
    <span class="hljs-built_in">print</span>(tokenizer.decode(ids))`}}),js=new j({props:{code:`'[CLS] This sentence is not [SEP]'
'[CLS] is not too long [SEP]'
'[CLS] too long but we [SEP]'
'[CLS] but we are going [SEP]'
'[CLS] are going to split [SEP]'
'[CLS] to split it anyway [SEP]'
'[CLS] it anyway. [SEP]'`,highlighted:`<span class="hljs-string">&#x27;[CLS] This sentence is not [SEP]&#x27;</span>
<span class="hljs-string">&#x27;[CLS] is not too long [SEP]&#x27;</span>
<span class="hljs-string">&#x27;[CLS] too long but we [SEP]&#x27;</span>
<span class="hljs-string">&#x27;[CLS] but we are going [SEP]&#x27;</span>
<span class="hljs-string">&#x27;[CLS] are going to split [SEP]&#x27;</span>
<span class="hljs-string">&#x27;[CLS] to split it anyway [SEP]&#x27;</span>
<span class="hljs-string">&#x27;[CLS] it anyway. [SEP]&#x27;</span>`}}),Es=new j({props:{code:"print(inputs.keys())",highlighted:'<span class="hljs-built_in">print</span>(inputs.keys())'}}),ys=new j({props:{code:"dict_keys(['input_ids', 'attention_mask', 'overflow_to_sample_mapping'])",highlighted:'dict_keys([<span class="hljs-string">&#x27;input_ids&#x27;</span>, <span class="hljs-string">&#x27;attention_mask&#x27;</span>, <span class="hljs-string">&#x27;overflow_to_sample_mapping&#x27;</span>])'}}),Ps=new j({props:{code:'print(inputs["overflow_to_sample_mapping"])',highlighted:'<span class="hljs-built_in">print</span>(inputs[<span class="hljs-string">&quot;overflow_to_sample_mapping&quot;</span>])'}}),zs=new j({props:{code:"[0, 0, 0, 0, 0, 0, 0]",highlighted:'[<span class="hljs-number">0</span>, <span class="hljs-number">0</span>, <span class="hljs-number">0</span>, <span class="hljs-number">0</span>, <span class="hljs-number">0</span>, <span class="hljs-number">0</span>, <span class="hljs-number">0</span>]'}}),Ts=new j({props:{code:`sentences = [
    "This sentence is not too long but we are going to split it anyway.",
    # Cette phrase n'est pas trop longue mais nous allons la diviser quand m\xEAme.
    "This sentence is shorter but will still get split.",
    # Cette phrase est plus courte mais sera quand m\xEAme divis\xE9e.
]
inputs = tokenizer(
    sentences, truncation=True, return_overflowing_tokens=True, max_length=6, stride=2
)

print(inputs["overflow_to_sample_mapping"])`,highlighted:`sentences = [
    <span class="hljs-string">&quot;This sentence is not too long but we are going to split it anyway.&quot;</span>,
    <span class="hljs-comment"># Cette phrase n&#x27;est pas trop longue mais nous allons la diviser quand m\xEAme.</span>
    <span class="hljs-string">&quot;This sentence is shorter but will still get split.&quot;</span>,
    <span class="hljs-comment"># Cette phrase est plus courte mais sera quand m\xEAme divis\xE9e.</span>
]
inputs = tokenizer(
    sentences, truncation=<span class="hljs-literal">True</span>, return_overflowing_tokens=<span class="hljs-literal">True</span>, max_length=<span class="hljs-number">6</span>, stride=<span class="hljs-number">2</span>
)

<span class="hljs-built_in">print</span>(inputs[<span class="hljs-string">&quot;overflow_to_sample_mapping&quot;</span>])`}}),Cs=new j({props:{code:"[0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1]",highlighted:'[<span class="hljs-number">0</span>, <span class="hljs-number">0</span>, <span class="hljs-number">0</span>, <span class="hljs-number">0</span>, <span class="hljs-number">0</span>, <span class="hljs-number">0</span>, <span class="hljs-number">0</span>, <span class="hljs-number">1</span>, <span class="hljs-number">1</span>, <span class="hljs-number">1</span>, <span class="hljs-number">1</span>]'}}),Ns=new j({props:{code:`inputs = tokenizer(
    question,
    long_context,
    stride=128,
    max_length=384,
    padding="longest",
    truncation="only_second",
    return_overflowing_tokens=True,
    return_offsets_mapping=True,
)`,highlighted:`inputs = tokenizer(
    question,
    long_context,
    stride=<span class="hljs-number">128</span>,
    max_length=<span class="hljs-number">384</span>,
    padding=<span class="hljs-string">&quot;longest&quot;</span>,
    truncation=<span class="hljs-string">&quot;only_second&quot;</span>,
    return_overflowing_tokens=<span class="hljs-literal">True</span>,
    return_offsets_mapping=<span class="hljs-literal">True</span>,
)`}});const Fu=[oc,rc],Ks=[];function Ou(e,i){return e[0]==="pt"?0:1}be=Ou(k),ve=Ks[be]=Fu[be](k),Ls=new j({props:{code:`outputs = model(**inputs)

start_logits = outputs.start_logits
end_logits = outputs.end_logits
print(start_logits.shape, end_logits.shape)`,highlighted:`outputs = model(**inputs)

start_logits = outputs.start_logits
end_logits = outputs.end_logits
<span class="hljs-built_in">print</span>(start_logits.shape, end_logits.shape)`}});const Iu=[lc,ic],Ws=[];function Uu(e,i){return e[0]==="pt"?0:1}ge=Uu(k),xe=Ws[ge]=Iu[ge](k);const Gu=[pc,uc],Qs=[];function Ju(e,i){return e[0]==="pt"?0:1}$e=Ju(k),qe=Qs[$e]=Gu[$e](k);const Ku=[cc,mc],Hs=[];function Wu(e,i){return e[0]==="pt"?0:1}ke=Wu(k),we=Hs[ke]=Ku[ke](k);const Qu=[fc,dc],Rs=[];function Hu(e,i){return e[0]==="pt"?0:1}return je=Hu(k),Ee=Rs[je]=Qu[je](k),Ss=new j({props:{code:"[(0, 18, 0.33867), (173, 184, 0.97149)]",highlighted:'[(<span class="hljs-number">0</span>, <span class="hljs-number">18</span>, <span class="hljs-number">0.33867</span>), (<span class="hljs-number">173</span>, <span class="hljs-number">184</span>, <span class="hljs-number">0.97149</span>)]'}}),Ze=new Wr({props:{$$slots:{default:[hc]},$$scope:{ctx:k}}}),As=new j({props:{code:`for candidate, offset in zip(candidates, offsets):
    start_token, end_token, score = candidate
    start_char, _ = offset[start_token]
    _, end_char = offset[end_token]
    answer = long_context[start_char:end_char]
    result = {"answer": answer, "start": start_char, "end": end_char, "score": score}
    print(result)`,highlighted:`<span class="hljs-keyword">for</span> candidate, offset <span class="hljs-keyword">in</span> <span class="hljs-built_in">zip</span>(candidates, offsets):
    start_token, end_token, score = candidate
    start_char, _ = offset[start_token]
    _, end_char = offset[end_token]
    answer = long_context[start_char:end_char]
    result = {<span class="hljs-string">&quot;answer&quot;</span>: answer, <span class="hljs-string">&quot;start&quot;</span>: start_char, <span class="hljs-string">&quot;end&quot;</span>: end_char, <span class="hljs-string">&quot;score&quot;</span>: score}
    <span class="hljs-built_in">print</span>(result)`}}),Ds=new j({props:{code:`{'answer': '\\n\u{1F917} Transformers: State of the Art NLP', 'start': 0, 'end': 37, 'score': 0.33867}
{'answer': 'Jax, PyTorch and TensorFlow', 'start': 1892, 'end': 1919, 'score': 0.97149}`,highlighted:`{<span class="hljs-string">&#x27;answer&#x27;</span>: <span class="hljs-string">&#x27;\\n\u{1F917} Transformers: State of the Art NLP&#x27;</span>, <span class="hljs-string">&#x27;start&#x27;</span>: <span class="hljs-number">0</span>, <span class="hljs-string">&#x27;end&#x27;</span>: <span class="hljs-number">37</span>, <span class="hljs-string">&#x27;score&#x27;</span>: <span class="hljs-number">0.33867</span>}
{<span class="hljs-string">&#x27;answer&#x27;</span>: <span class="hljs-string">&#x27;Jax, PyTorch and TensorFlow&#x27;</span>, <span class="hljs-string">&#x27;start&#x27;</span>: <span class="hljs-number">1892</span>, <span class="hljs-string">&#x27;end&#x27;</span>: <span class="hljs-number">1919</span>, <span class="hljs-string">&#x27;score&#x27;</span>: <span class="hljs-number">0.97149</span>}`}}),es=new Wr({props:{$$slots:{default:[_c]},$$scope:{ctx:k}}}),{c(){a=l("meta"),c=d(),g(n.$$.fragment),b=d(),v=l("h1"),w=l("a"),P=l("span"),g(T.$$.fragment),N=d(),z=l("span"),S=l("i"),A=r("Tokenizer"),D=r(" rapide dans le pipeline de QA"),W=d(),y.c(),B=d(),F=l("p"),Oe=r("Nous allons maintenant nous plonger dans le pipeline de "),Gt=l("code"),Hr=r("question-answering"),Rr=r(" et voir comment exploiter les "),Jt=l("em"),Vr=r("offsets"),Br=r(" pour extraire d\u2019u ncontexte la r\xE9ponse \xE0 la question pos\xE9e. Nous verrons ensuite comment g\xE9rer les contextes tr\xE8s longs qui finissent par \xEAtre tronqu\xE9s. Vous pouvez sauter cette section si vous n\u2019\xEAtes pas int\xE9ress\xE9 par la t\xE2che de r\xE9ponse aux questions."),fa=d(),oe.c(),Zs=d(),Ie=l("h2"),Ke=l("a"),Kt=l("span"),g(ns.$$.fragment),Yr=d(),et=l("span"),Xr=r("Utilisation du pipeline de "),Wt=l("code"),Zr=r("question-answering"),ha=d(),Pe=l("p"),eo=r("Comme nous l\u2019avons vu dans le "),st=l("a"),so=r("chapitre 1"),to=r(", nous pouvons utiliser le pipeline de "),Qt=l("code"),no=r("question-answering"),ao=r(" comme ceci pour obtenir une r\xE9ponse \xE0 une question :"),_a=d(),g(as.$$.fragment),ba=d(),g(rs.$$.fragment),va=d(),tt=l("p"),ro=r("Contrairement aux autres pipelines, qui ne peuvent pas tronquer et diviser les textes dont la longueur est sup\xE9rieure \xE0 la longueur maximale accept\xE9e par le mod\xE8le (et qui peuvent donc manquer des informations \xE0 la fin d\u2019un document), ce pipeline peut traiter des contextes tr\xE8s longs et retournera la r\xE9ponse \xE0 la question m\xEAme si elle se trouve \xE0 la fin :"),ga=d(),g(os.$$.fragment),xa=d(),g(is.$$.fragment),$a=d(),nt=l("p"),oo=r("Voyons comment il fait tout cela !"),qa=d(),Ue=l("h3"),We=l("a"),Ht=l("span"),g(ls.$$.fragment),io=d(),Rt=l("span"),lo=r("Utilisation d'un mod\xE8le pour r\xE9pondre \xE0 des questions"),ka=d(),O=l("p"),uo=r("Comme avec n\u2019importe quel autre pipeline, nous commen\xE7ons par tokeniser notre entr\xE9e et l\u2019envoyons ensuite \xE0 travers le mod\xE8le. Le "),Vt=l("em"),po=r("checkpoint"),mo=r(" utilis\xE9 par d\xE9faut pour le pipeline de "),Bt=l("code"),co=r("question-answering"),fo=r(" est "),us=l("a"),Yt=l("code"),ho=r("distilbert-base-cased-distilled-squad"),_o=r(" (le \xAB squad \xBB dans le nom vient du jeu de donn\xE9es sur lequel le mod\xE8le a \xE9t\xE9 "),Xt=l("em"),bo=r("finetun\xE9"),vo=r(", nous parlerons davantage de ce jeu de donn\xE9es dans le "),at=l("a"),go=r("chapitre 7"),xo=r(") :"),wa=d(),le.c(),rt=d(),ot=l("p"),$o=r("Notez que nous tokenizons la question et le contexte comme une paire, la question en premier."),ja=d(),Ge=l("div"),ps=l("img"),qo=d(),ms=l("img"),Ea=d(),I=l("p"),ko=r("Les mod\xE8les de r\xE9ponse aux questions fonctionnent un peu diff\xE9remment des mod\xE8les que nous avons vus jusqu\u2019\xE0 pr\xE9sent. En utilisant l\u2019image ci-dessus comme exemple, le mod\xE8le a \xE9t\xE9 entra\xEEn\xE9 \xE0 pr\xE9dire l\u2019index du "),Zt=l("em"),wo=r("token"),jo=r(" de d\xE9but de la r\xE9ponse (ici 21) et l\u2019index du "),en=l("em"),Eo=r("token"),yo=r(" o\xF9 la r\xE9ponse se termine (ici 24). C\u2019est pourquoi ces mod\xE8les ne retournent pas un tenseur de logits mais deux : un pour les logits correspondant au "),sn=l("em"),Po=r("token"),zo=r(" de d\xE9but de la r\xE9ponse, et un pour les logits correspondant au "),tn=l("em"),To=r("token"),Co=r(" de fin de la r\xE9ponse. Puisque dans ce cas nous n\u2019avons qu\u2019une seule entr\xE9e contenant 66 "),nn=l("em"),No=r("tokens"),Lo=r(", nous obtenons :"),ya=d(),g(cs.$$.fragment),Pa=d(),pe.c(),it=d(),M=l("p"),So=r("Pour convertir ces logits en probabilit\xE9s, nous allons appliquer une fonction softmax. Mais avant cela, nous devons nous assurer de masquer les indices qui ne font pas partie du contexte. Notre entr\xE9e est "),an=l("code"),Ao=r("[CLS] question [SEP] contexte [SEP]"),Do=r(" donc nous devons masquer les "),rn=l("em"),Mo=r("tokens"),Fo=r(" de la question ainsi que le "),on=l("em"),Oo=r("token"),Io=d(),ln=l("code"),Uo=r("[SEP]"),Go=r(". Nous garderons cependant le "),un=l("em"),Jo=r("token"),Ko=d(),pn=l("code"),Wo=r("[CLS]"),Qo=r(" car certains mod\xE8les l\u2019utilisent pour indiquer que la r\xE9ponse n\u2019est pas dans le contexte."),za=d(),Qe=l("p"),Ho=r("Puisque nous appliquerons une fonction softmax par la suite, il nous suffit de remplacer les logits que nous voulons masquer par un grand nombre n\xE9gatif. Ici, nous utilisons "),mn=l("code"),Ro=r("-10000"),Vo=r(" :"),Ta=d(),ce.c(),lt=d(),ut=l("p"),Bo=r("Maintenant que nous avons correctement masqu\xE9 les logits correspondant aux positions que nous ne voulons pas pr\xE9dire, nous pouvons appliquer la softmax :"),Ca=d(),fe.c(),pt=d(),U=l("p"),Yo=r("A ce stade, nous pourrions prendre l\u2019argmax des probabilit\xE9s de d\xE9but et de fin mais nous pourrions nous retrouver avec un indice de d\xE9but sup\xE9rieur \xE0 l\u2019indice de fin. Nous devons donc prendre quelques pr\xE9cautions suppl\xE9mentaires. Nous allons calculer les probabilit\xE9s de chaque "),cn=l("code"),Xo=r("start_index"),Zo=r(" et "),dn=l("code"),ei=r("end_index"),si=r(" possible o\xF9 "),fn=l("code"),ti=r("start_index<=end_index"),ni=r(", puis nous prendrons le "),hn=l("em"),ai=r("tuple"),ri=d(),_n=l("code"),oi=r("(start_index, end_index)"),ii=r(" avec la plus grande probabilit\xE9."),Na=d(),K=l("p"),li=r("En supposant que les \xE9v\xE9nements \xAB La r\xE9ponse commence \xE0 "),bn=l("code"),ui=r("start_index"),pi=r(" \xBB et \xAB La r\xE9ponse se termine \xE0 "),vn=l("code"),mi=r("end_index"),ci=r(" \xBB sont ind\xE9pendants, la probabilit\xE9 que la r\xE9ponse commence \xE0 "),gn=l("code"),di=r("end_index"),fi=r(" et se termine \xE0 "),xn=l("code"),hi=r("end_index"),_i=r(` est :
`),La=new Tm,Sa=d(),ze=l("p"),bi=r("Ainsi, pour calculer tous les scores, il suffit de calculer tous les produits "),Aa=new Tm,Da=r(" o\xF9 "),$n=l("code"),vi=r("start_index <= end_index"),gi=r("."),Ma=d(),mt=l("p"),xi=r("Calculons d\u2019abord tous les produits possibles :"),Fa=d(),g(ds.$$.fragment),Oa=d(),_e.c(),ct=d(),Q=l("p"),$i=r("Il ne nous reste plus qu\u2019\xE0 obtenir l\u2019indice du maximum. Puisque PyTorch retourne l\u2019index dans le tenseur aplati, nous devons utiliser les op\xE9rations division "),qn=l("code"),qi=r("//"),ki=r(" et modulo "),kn=l("code"),wi=r("%"),ji=r(" pour obtenir le "),wn=l("code"),Ei=r("start_index"),yi=r(" et le "),jn=l("code"),Pi=r("end_index"),zi=r(" :"),Ia=d(),g(fs.$$.fragment),Ua=d(),dt=l("p"),Ti=r("Nous n\u2019avons pas encore tout \xE0 fait termin\xE9, mais au moins nous avons d\xE9j\xE0 le score correct pour la r\xE9ponse (vous pouvez le v\xE9rifier en le comparant au premier r\xE9sultat de la section pr\xE9c\xE9dente) :"),Ga=d(),g(hs.$$.fragment),Ja=d(),g(He.$$.fragment),Ka=d(),G=l("p"),Ci=r("Nous avons les "),En=l("code"),Ni=r("start_index"),Li=r(" et "),yn=l("code"),Si=r("end_index"),Ai=r(" de la r\xE9ponse en termes de "),Pn=l("em"),Di=r("tokens"),Mi=r(". Maintenant nous devons juste convertir en indices de caract\xE8res dans le contexte. C\u2019est l\xE0 que les "),zn=l("em"),Fi=r("offsets"),Oi=r(" seront super utiles. Nous pouvons les saisir et les utiliser comme nous l\u2019avons fait dans la t\xE2che de classification des "),Tn=l("em"),Ii=r("tokens"),Ui=r(" :"),Wa=d(),g(_s.$$.fragment),Qa=d(),ft=l("p"),Gi=r("Il ne nous reste plus qu\u2019\xE0 tout formater pour obtenir notre r\xE9sultat :"),Ha=d(),g(bs.$$.fragment),Ra=d(),g(vs.$$.fragment),Va=d(),ht=l("p"),Ji=r("Super ! C\u2019est la m\xEAme chose que dans notre premier exemple !"),Ba=d(),g(Re.$$.fragment),Ya=d(),Je=l("h2"),Ve=l("a"),Cn=l("span"),g(gs.$$.fragment),Ki=d(),Nn=l("span"),Wi=r("Gestion des contextes longs"),Xa=d(),Te=l("p"),Qi=r("Si nous essayons de tokeniser la question et le long contexte que nous avons utilis\xE9 dans l\u2019exemple pr\xE9c\xE9demment, nous obtenons un nombre de "),Ln=l("em"),Hi=r("tokens"),Ri=r(" sup\xE9rieur \xE0 la longueur maximale utilis\xE9e dans le pipeline "),Sn=l("code"),Vi=r("question-answering"),Bi=r(" (qui est de 384) :"),Za=d(),g(xs.$$.fragment),er=d(),g($s.$$.fragment),sr=d(),Be=l("p"),Yi=r("Nous devrons donc tronquer nos entr\xE9es \xE0 cette longueur maximale. Il y a plusieurs fa\xE7ons de le faire mais nous ne voulons pas tronquer la question, seulement le contexte. Puisque le contexte est la deuxi\xE8me phrase, nous utilisons la strat\xE9gie de troncature "),An=l("code"),Xi=r('"only_second"'),Zi=r(". Le probl\xE8me qui se pose alors est que la r\xE9ponse \xE0 la question peut ne pas se trouver dans le contexte tronqu\xE9. Ici, par exemple, nous avons choisi une question dont la r\xE9ponse se trouve vers la fin du contexte, et lorsque nous la tronquons, cette r\xE9ponse n\u2019est pas pr\xE9sente :"),tr=d(),g(qs.$$.fragment),nr=d(),g(ks.$$.fragment),ar=d(),Ye=l("p"),el=r("Cela signifie que le mod\xE8le a du mal \xE0 trouver la bonne r\xE9ponse. Pour r\xE9soudre ce probl\xE8me, le pipeline de "),Dn=l("code"),sl=r("question-answering"),tl=r(" nous permet de diviser le contexte en morceaux plus petits, en sp\xE9cifiant la longueur maximale. Pour s\u2019assurer que nous ne divisons pas le contexte exactement au mauvais endroit pour permettre de trouver la r\xE9ponse, il inclut \xE9galement un certain chevauchement entre les morceaux."),rr=d(),Y=l("p"),nl=r("Nous pouvons demander au "),Mn=l("em"),al=r("tokenizer"),rl=r(" (rapide ou lent) de le faire pour nous en ajoutant "),Fn=l("code"),ol=r("return_overflowing_tokens=True"),il=r(", et nous pouvons sp\xE9cifier le chevauchement que nous voulons avec l\u2019argument "),On=l("code"),ll=r("stride"),ul=r(". Voici un exemple, en utilisant une phrase plus petite :"),or=d(),g(ws.$$.fragment),ir=d(),g(js.$$.fragment),lr=d(),H=l("p"),pl=r("Comme on peut le voir, la phrase a \xE9t\xE9 d\xE9coup\xE9e en morceaux de telle sorte que chaque entr\xE9e dans "),In=l("code"),ml=r('inputs["input_ids"]'),cl=r(" a au maximum 6 "),Un=l("em"),dl=r("tokens"),fl=r(" (il faudrait ajouter du "),Gn=l("em"),hl=r("padding"),_l=r(" pour que la derni\xE8re entr\xE9e ait la m\xEAme taille que les autres) et il y a un chevauchement de 2 "),Jn=l("em"),bl=r("tokens"),vl=r(" entre chacune des entr\xE9es."),ur=d(),_t=l("p"),gl=r("Regardons de plus pr\xE8s le r\xE9sultat de la tok\xE9nisation :"),pr=d(),g(Es.$$.fragment),mr=d(),g(ys.$$.fragment),cr=d(),Ce=l("p"),xl=r("Comme pr\xE9vu, nous obtenons les identifiants d\u2019entr\xE9e et un masque d\u2019attention. La derni\xE8re cl\xE9, "),Kn=l("code"),$l=r("overflow_to_sample_mapping"),ql=r(", est une carte qui nous indique \xE0 quelle phrase correspond chacun des r\xE9sultats. Ici nous avons 7 r\xE9sultats qui proviennent tous de la (seule) phrase que nous avons pass\xE9e au "),Wn=l("em"),kl=r("tokenizer"),wl=r(" :"),dr=d(),g(Ps.$$.fragment),fr=d(),g(zs.$$.fragment),hr=d(),bt=l("p"),jl=r("C\u2019est plus utile lorsque nous tokenisons plusieurs phrases ensemble. Par exemple :"),_r=d(),g(Ts.$$.fragment),br=d(),vt=l("p"),El=r("nous donne :"),vr=d(),g(Cs.$$.fragment),gr=d(),gt=l("p"),yl=r("ce qui signifie que la premi\xE8re phrase est divis\xE9e en 7 morceaux comme pr\xE9c\xE9demment et que les 4 morceaux suivants proviennent de la deuxi\xE8me phrase."),xr=d(),L=l("p"),Pl=r("Revenons maintenant \xE0 notre contexte long. Par d\xE9faut, le pipeline "),Qn=l("code"),zl=r("question-answering"),Tl=r(" utilise une longueur maximale de 384 et un "),Hn=l("em"),Cl=r("stride"),Nl=r(" de 128, qui correspondent \xE0 la fa\xE7on dont le mod\xE8le a \xE9t\xE9 "),Rn=l("em"),Ll=r("finetun\xE9"),Sl=r(" (vous pouvez ajuster ces param\xE8tres en passant les arguments "),Vn=l("code"),Al=r("max_seq_len"),Dl=r(" et "),Bn=l("code"),Ml=r("stride"),Fl=r(" lorsque vous appelez le pipeline). Nous utiliserons donc ces param\xE8tres lors de la tokenisation. Nous ajouterons aussi du "),Yn=l("em"),Ol=r("padding"),Il=r(" (pour avoir des \xE9chantillons de m\xEAme longueur afin de pouvoir construire des tenseurs) ainsi que demander les "),Xn=l("em"),Ul=r("offsets"),Gl=r(" :"),$r=d(),g(Ns.$$.fragment),qr=d(),R=l("p"),Jl=r("Ces "),Zn=l("code"),Kl=r("inputs"),Wl=r(" contiendront les identifiants d\u2019entr\xE9e, les masques d\u2019attention que le mod\xE8le attend, ainsi que les "),ea=l("em"),Ql=r("offsets"),Hl=r(" et le "),sa=l("code"),Rl=r("overflow_to_sample_mapping"),Vl=r(" dont on vient de parler. Puisque ces deux \xE9l\xE9ments ne sont pas des param\xE8tres utilis\xE9s par le mod\xE8le, nous allons les sortir des "),ta=l("code"),Bl=r("inputs"),Yl=r(" (et nous ne stockerons pas la correspondance puisqu\u2019elle n\u2019est pas utile ici) avant de le convertir en tenseur :"),kr=d(),ve.c(),xt=d(),$t=l("p"),Xl=r("Notre contexte long a \xE9t\xE9 divis\xE9 en deux, ce qui signifie qu\u2019apr\xE8s avoir travers\xE9 notre mod\xE8le, nous aurons deux ensembles de logits de d\xE9but et de fin :"),wr=d(),g(Ls.$$.fragment),jr=d(),xe.c(),qt=d(),X=l("p"),Zl=r("Comme pr\xE9c\xE9demment, nous masquons d\u2019abord les "),na=l("em"),eu=r("tokens"),su=r(" qui ne font pas partie du contexte avant de prendre le softmax. Nous masquons \xE9galement tous les "),aa=l("em"),tu=r("tokens"),nu=r(" de "),ra=l("em"),au=r("padding"),ru=r(" (tels que signal\xE9s par le masque d\u2019attention) :"),Er=d(),qe.c(),kt=d(),wt=l("p"),ou=r("Ensuite, nous pouvons utiliser la fonction softmax pour convertir nos logits en probabilit\xE9s :"),yr=d(),we.c(),jt=d(),Et=l("p"),iu=r("L\u2019\xE9tape suivante est similaire \xE0 ce que nous avons fait pour le petit contexte mais nous la r\xE9p\xE9tons pour chacun de nos deux morceaux. Nous attribuons un score \xE0 tous les espaces de r\xE9ponse possibles puis nous prenons l\u2019espace ayant le meilleur score :"),Pr=d(),Ee.c(),yt=d(),g(Ss.$$.fragment),zr=d(),Xe=l("p"),lu=r("Ces deux candidats correspondent aux meilleures r\xE9ponses que le mod\xE8le a pu trouver dans chaque morceau. Le mod\xE8le est beaucoup plus confiant dans le fait que la bonne r\xE9ponse se trouve dans la deuxi\xE8me partie (ce qui est bon signe !). Il ne nous reste plus qu\u2019\xE0 faire correspondre ces deux espaces de "),oa=l("em"),uu=r("tokens"),pu=r(" \xE0 des espaces de caract\xE8res dans le contexte (nous n\u2019avons besoin de faire correspondre que le second pour avoir notre r\xE9ponse, mais il est int\xE9ressant de voir ce que le mod\xE8le a choisi dans le premier morceau)."),Tr=d(),g(Ze.$$.fragment),Cr=d(),Ne=l("p"),mu=r("Le "),ia=l("code"),cu=r("offsets"),du=r(" que nous avons saisi plus t\xF4t est en fait une liste d\u2019"),la=l("em"),fu=r("offsets"),hu=r(" avec une liste par morceau de texte :"),Nr=d(),g(As.$$.fragment),Lr=d(),g(Ds.$$.fragment),Sr=d(),Pt=l("p"),_u=r("Si nous ignorons le premier r\xE9sultat, nous obtenons le m\xEAme r\xE9sultat que notre pipeline pour ce long contexte !"),Ar=d(),g(es.$$.fragment),Dr=d(),Le=l("p"),bu=r("Ceci conclut notre plong\xE9e en profondeur dans les capacit\xE9s du "),ua=l("em"),vu=r("tokenizer"),gu=r(". Nous mettrons \xE0 nouveau tout cela en pratique dans le prochain chapitre, lorsque nous vous montrerons comment "),pa=l("em"),xu=r("finetuner"),$u=r(" un mod\xE8le sur une s\xE9rie de t\xE2ches NLP courantes."),this.h()},l(e){const i=Im('[data-svelte="svelte-1phssyn"]',document.head);a=u(i,"META",{name:!0,content:!0}),i.forEach(t),c=f(e),x(n.$$.fragment,e),b=f(e),v=u(e,"H1",{class:!0});var Vs=p(v);w=u(Vs,"A",{id:!0,class:!0,href:!0});var zt=p(w);P=u(zt,"SPAN",{});var Tt=p(P);x(T.$$.fragment,Tt),Tt.forEach(t),zt.forEach(t),N=f(Vs),z=u(Vs,"SPAN",{});var Bs=p(z);S=u(Bs,"I",{});var Ct=p(S);A=o(Ct,"Tokenizer"),Ct.forEach(t),D=o(Bs," rapide dans le pipeline de QA"),Bs.forEach(t),Vs.forEach(t),W=f(e),y.l(e),B=f(e),F=u(e,"P",{});var Se=p(F);Oe=o(Se,"Nous allons maintenant nous plonger dans le pipeline de "),Gt=u(Se,"CODE",{});var Nt=p(Gt);Hr=o(Nt,"question-answering"),Nt.forEach(t),Rr=o(Se," et voir comment exploiter les "),Jt=u(Se,"EM",{});var Lt=p(Jt);Vr=o(Lt,"offsets"),Lt.forEach(t),Br=o(Se," pour extraire d\u2019u ncontexte la r\xE9ponse \xE0 la question pos\xE9e. Nous verrons ensuite comment g\xE9rer les contextes tr\xE8s longs qui finissent par \xEAtre tronqu\xE9s. Vous pouvez sauter cette section si vous n\u2019\xEAtes pas int\xE9ress\xE9 par la t\xE2che de r\xE9ponse aux questions."),Se.forEach(t),fa=f(e),oe.l(e),Zs=f(e),Ie=u(e,"H2",{class:!0});var Ys=p(Ie);Ke=u(Ys,"A",{id:!0,class:!0,href:!0});var ma=p(Ke);Kt=u(ma,"SPAN",{});var St=p(Kt);x(ns.$$.fragment,St),St.forEach(t),ma.forEach(t),Yr=f(Ys),et=u(Ys,"SPAN",{});var Xs=p(et);Xr=o(Xs,"Utilisation du pipeline de "),Wt=u(Xs,"CODE",{});var At=p(Wt);Zr=o(At,"question-answering"),At.forEach(t),Xs.forEach(t),Ys.forEach(t),ha=f(e),Pe=u(e,"P",{});var Ae=p(Pe);eo=o(Ae,"Comme nous l\u2019avons vu dans le "),st=u(Ae,"A",{href:!0});var Dt=p(st);so=o(Dt,"chapitre 1"),Dt.forEach(t),to=o(Ae,", nous pouvons utiliser le pipeline de "),Qt=u(Ae,"CODE",{});var ca=p(Qt);no=o(ca,"question-answering"),ca.forEach(t),ao=o(Ae," comme ceci pour obtenir une r\xE9ponse \xE0 une question :"),Ae.forEach(t),_a=f(e),x(as.$$.fragment,e),ba=f(e),x(rs.$$.fragment,e),va=f(e),tt=u(e,"P",{});var da=p(tt);ro=o(da,"Contrairement aux autres pipelines, qui ne peuvent pas tronquer et diviser les textes dont la longueur est sup\xE9rieure \xE0 la longueur maximale accept\xE9e par le mod\xE8le (et qui peuvent donc manquer des informations \xE0 la fin d\u2019un document), ce pipeline peut traiter des contextes tr\xE8s longs et retournera la r\xE9ponse \xE0 la question m\xEAme si elle se trouve \xE0 la fin :"),da.forEach(t),ga=f(e),x(os.$$.fragment,e),xa=f(e),x(is.$$.fragment,e),$a=f(e),nt=u(e,"P",{});var Ru=p(nt);oo=o(Ru,"Voyons comment il fait tout cela !"),Ru.forEach(t),qa=f(e),Ue=u(e,"H3",{class:!0});var Fr=p(Ue);We=u(Fr,"A",{id:!0,class:!0,href:!0});var Vu=p(We);Ht=u(Vu,"SPAN",{});var Bu=p(Ht);x(ls.$$.fragment,Bu),Bu.forEach(t),Vu.forEach(t),io=f(Fr),Rt=u(Fr,"SPAN",{});var Yu=p(Rt);lo=o(Yu,"Utilisation d'un mod\xE8le pour r\xE9pondre \xE0 des questions"),Yu.forEach(t),Fr.forEach(t),ka=f(e),O=u(e,"P",{});var Z=p(O);uo=o(Z,"Comme avec n\u2019importe quel autre pipeline, nous commen\xE7ons par tokeniser notre entr\xE9e et l\u2019envoyons ensuite \xE0 travers le mod\xE8le. Le "),Vt=u(Z,"EM",{});var Xu=p(Vt);po=o(Xu,"checkpoint"),Xu.forEach(t),mo=o(Z," utilis\xE9 par d\xE9faut pour le pipeline de "),Bt=u(Z,"CODE",{});var Zu=p(Bt);co=o(Zu,"question-answering"),Zu.forEach(t),fo=o(Z," est "),us=u(Z,"A",{href:!0,rel:!0});var ep=p(us);Yt=u(ep,"CODE",{});var sp=p(Yt);ho=o(sp,"distilbert-base-cased-distilled-squad"),sp.forEach(t),ep.forEach(t),_o=o(Z," (le \xAB squad \xBB dans le nom vient du jeu de donn\xE9es sur lequel le mod\xE8le a \xE9t\xE9 "),Xt=u(Z,"EM",{});var tp=p(Xt);bo=o(tp,"finetun\xE9"),tp.forEach(t),vo=o(Z,", nous parlerons davantage de ce jeu de donn\xE9es dans le "),at=u(Z,"A",{href:!0});var np=p(at);go=o(np,"chapitre 7"),np.forEach(t),xo=o(Z,") :"),Z.forEach(t),wa=f(e),le.l(e),rt=f(e),ot=u(e,"P",{});var ap=p(ot);$o=o(ap,"Notez que nous tokenizons la question et le contexte comme une paire, la question en premier."),ap.forEach(t),ja=f(e),Ge=u(e,"DIV",{class:!0});var Or=p(Ge);ps=u(Or,"IMG",{class:!0,src:!0,alt:!0}),qo=f(Or),ms=u(Or,"IMG",{class:!0,src:!0,alt:!0}),Or.forEach(t),Ea=f(e),I=u(e,"P",{});var ee=p(I);ko=o(ee,"Les mod\xE8les de r\xE9ponse aux questions fonctionnent un peu diff\xE9remment des mod\xE8les que nous avons vus jusqu\u2019\xE0 pr\xE9sent. En utilisant l\u2019image ci-dessus comme exemple, le mod\xE8le a \xE9t\xE9 entra\xEEn\xE9 \xE0 pr\xE9dire l\u2019index du "),Zt=u(ee,"EM",{});var rp=p(Zt);wo=o(rp,"token"),rp.forEach(t),jo=o(ee," de d\xE9but de la r\xE9ponse (ici 21) et l\u2019index du "),en=u(ee,"EM",{});var op=p(en);Eo=o(op,"token"),op.forEach(t),yo=o(ee," o\xF9 la r\xE9ponse se termine (ici 24). C\u2019est pourquoi ces mod\xE8les ne retournent pas un tenseur de logits mais deux : un pour les logits correspondant au "),sn=u(ee,"EM",{});var ip=p(sn);Po=o(ip,"token"),ip.forEach(t),zo=o(ee," de d\xE9but de la r\xE9ponse, et un pour les logits correspondant au "),tn=u(ee,"EM",{});var lp=p(tn);To=o(lp,"token"),lp.forEach(t),Co=o(ee," de fin de la r\xE9ponse. Puisque dans ce cas nous n\u2019avons qu\u2019une seule entr\xE9e contenant 66 "),nn=u(ee,"EM",{});var up=p(nn);No=o(up,"tokens"),up.forEach(t),Lo=o(ee,", nous obtenons :"),ee.forEach(t),ya=f(e),x(cs.$$.fragment,e),Pa=f(e),pe.l(e),it=f(e),M=u(e,"P",{});var V=p(M);So=o(V,"Pour convertir ces logits en probabilit\xE9s, nous allons appliquer une fonction softmax. Mais avant cela, nous devons nous assurer de masquer les indices qui ne font pas partie du contexte. Notre entr\xE9e est "),an=u(V,"CODE",{});var pp=p(an);Ao=o(pp,"[CLS] question [SEP] contexte [SEP]"),pp.forEach(t),Do=o(V," donc nous devons masquer les "),rn=u(V,"EM",{});var mp=p(rn);Mo=o(mp,"tokens"),mp.forEach(t),Fo=o(V," de la question ainsi que le "),on=u(V,"EM",{});var cp=p(on);Oo=o(cp,"token"),cp.forEach(t),Io=f(V),ln=u(V,"CODE",{});var dp=p(ln);Uo=o(dp,"[SEP]"),dp.forEach(t),Go=o(V,". Nous garderons cependant le "),un=u(V,"EM",{});var fp=p(un);Jo=o(fp,"token"),fp.forEach(t),Ko=f(V),pn=u(V,"CODE",{});var hp=p(pn);Wo=o(hp,"[CLS]"),hp.forEach(t),Qo=o(V," car certains mod\xE8les l\u2019utilisent pour indiquer que la r\xE9ponse n\u2019est pas dans le contexte."),V.forEach(t),za=f(e),Qe=u(e,"P",{});var Ir=p(Qe);Ho=o(Ir,"Puisque nous appliquerons une fonction softmax par la suite, il nous suffit de remplacer les logits que nous voulons masquer par un grand nombre n\xE9gatif. Ici, nous utilisons "),mn=u(Ir,"CODE",{});var _p=p(mn);Ro=o(_p,"-10000"),_p.forEach(t),Vo=o(Ir," :"),Ir.forEach(t),Ta=f(e),ce.l(e),lt=f(e),ut=u(e,"P",{});var bp=p(ut);Bo=o(bp,"Maintenant que nous avons correctement masqu\xE9 les logits correspondant aux positions que nous ne voulons pas pr\xE9dire, nous pouvons appliquer la softmax :"),bp.forEach(t),Ca=f(e),fe.l(e),pt=f(e),U=u(e,"P",{});var se=p(U);Yo=o(se,"A ce stade, nous pourrions prendre l\u2019argmax des probabilit\xE9s de d\xE9but et de fin mais nous pourrions nous retrouver avec un indice de d\xE9but sup\xE9rieur \xE0 l\u2019indice de fin. Nous devons donc prendre quelques pr\xE9cautions suppl\xE9mentaires. Nous allons calculer les probabilit\xE9s de chaque "),cn=u(se,"CODE",{});var vp=p(cn);Xo=o(vp,"start_index"),vp.forEach(t),Zo=o(se," et "),dn=u(se,"CODE",{});var gp=p(dn);ei=o(gp,"end_index"),gp.forEach(t),si=o(se," possible o\xF9 "),fn=u(se,"CODE",{});var xp=p(fn);ti=o(xp,"start_index<=end_index"),xp.forEach(t),ni=o(se,", puis nous prendrons le "),hn=u(se,"EM",{});var $p=p(hn);ai=o($p,"tuple"),$p.forEach(t),ri=f(se),_n=u(se,"CODE",{});var qp=p(_n);oi=o(qp,"(start_index, end_index)"),qp.forEach(t),ii=o(se," avec la plus grande probabilit\xE9."),se.forEach(t),Na=f(e),K=u(e,"P",{});var ye=p(K);li=o(ye,"En supposant que les \xE9v\xE9nements \xAB La r\xE9ponse commence \xE0 "),bn=u(ye,"CODE",{});var kp=p(bn);ui=o(kp,"start_index"),kp.forEach(t),pi=o(ye," \xBB et \xAB La r\xE9ponse se termine \xE0 "),vn=u(ye,"CODE",{});var wp=p(vn);mi=o(wp,"end_index"),wp.forEach(t),ci=o(ye," \xBB sont ind\xE9pendants, la probabilit\xE9 que la r\xE9ponse commence \xE0 "),gn=u(ye,"CODE",{});var jp=p(gn);di=o(jp,"end_index"),jp.forEach(t),fi=o(ye," et se termine \xE0 "),xn=u(ye,"CODE",{});var Ep=p(xn);hi=o(Ep,"end_index"),Ep.forEach(t),_i=o(ye,` est :
`),La=Cm(ye),ye.forEach(t),Sa=f(e),ze=u(e,"P",{});var Mt=p(ze);bi=o(Mt,"Ainsi, pour calculer tous les scores, il suffit de calculer tous les produits "),Aa=Cm(Mt),Da=o(Mt," o\xF9 "),$n=u(Mt,"CODE",{});var yp=p($n);vi=o(yp,"start_index <= end_index"),yp.forEach(t),gi=o(Mt,"."),Mt.forEach(t),Ma=f(e),mt=u(e,"P",{});var Pp=p(mt);xi=o(Pp,"Calculons d\u2019abord tous les produits possibles :"),Pp.forEach(t),Fa=f(e),x(ds.$$.fragment,e),Oa=f(e),_e.l(e),ct=f(e),Q=u(e,"P",{});var De=p(Q);$i=o(De,"Il ne nous reste plus qu\u2019\xE0 obtenir l\u2019indice du maximum. Puisque PyTorch retourne l\u2019index dans le tenseur aplati, nous devons utiliser les op\xE9rations division "),qn=u(De,"CODE",{});var zp=p(qn);qi=o(zp,"//"),zp.forEach(t),ki=o(De," et modulo "),kn=u(De,"CODE",{});var Tp=p(kn);wi=o(Tp,"%"),Tp.forEach(t),ji=o(De," pour obtenir le "),wn=u(De,"CODE",{});var Cp=p(wn);Ei=o(Cp,"start_index"),Cp.forEach(t),yi=o(De," et le "),jn=u(De,"CODE",{});var Np=p(jn);Pi=o(Np,"end_index"),Np.forEach(t),zi=o(De," :"),De.forEach(t),Ia=f(e),x(fs.$$.fragment,e),Ua=f(e),dt=u(e,"P",{});var Lp=p(dt);Ti=o(Lp,"Nous n\u2019avons pas encore tout \xE0 fait termin\xE9, mais au moins nous avons d\xE9j\xE0 le score correct pour la r\xE9ponse (vous pouvez le v\xE9rifier en le comparant au premier r\xE9sultat de la section pr\xE9c\xE9dente) :"),Lp.forEach(t),Ga=f(e),x(hs.$$.fragment,e),Ja=f(e),x(He.$$.fragment,e),Ka=f(e),G=u(e,"P",{});var te=p(G);Ci=o(te,"Nous avons les "),En=u(te,"CODE",{});var Sp=p(En);Ni=o(Sp,"start_index"),Sp.forEach(t),Li=o(te," et "),yn=u(te,"CODE",{});var Ap=p(yn);Si=o(Ap,"end_index"),Ap.forEach(t),Ai=o(te," de la r\xE9ponse en termes de "),Pn=u(te,"EM",{});var Dp=p(Pn);Di=o(Dp,"tokens"),Dp.forEach(t),Mi=o(te,". Maintenant nous devons juste convertir en indices de caract\xE8res dans le contexte. C\u2019est l\xE0 que les "),zn=u(te,"EM",{});var Mp=p(zn);Fi=o(Mp,"offsets"),Mp.forEach(t),Oi=o(te," seront super utiles. Nous pouvons les saisir et les utiliser comme nous l\u2019avons fait dans la t\xE2che de classification des "),Tn=u(te,"EM",{});var Fp=p(Tn);Ii=o(Fp,"tokens"),Fp.forEach(t),Ui=o(te," :"),te.forEach(t),Wa=f(e),x(_s.$$.fragment,e),Qa=f(e),ft=u(e,"P",{});var Op=p(ft);Gi=o(Op,"Il ne nous reste plus qu\u2019\xE0 tout formater pour obtenir notre r\xE9sultat :"),Op.forEach(t),Ha=f(e),x(bs.$$.fragment,e),Ra=f(e),x(vs.$$.fragment,e),Va=f(e),ht=u(e,"P",{});var Ip=p(ht);Ji=o(Ip,"Super ! C\u2019est la m\xEAme chose que dans notre premier exemple !"),Ip.forEach(t),Ba=f(e),x(Re.$$.fragment,e),Ya=f(e),Je=u(e,"H2",{class:!0});var Ur=p(Je);Ve=u(Ur,"A",{id:!0,class:!0,href:!0});var Up=p(Ve);Cn=u(Up,"SPAN",{});var Gp=p(Cn);x(gs.$$.fragment,Gp),Gp.forEach(t),Up.forEach(t),Ki=f(Ur),Nn=u(Ur,"SPAN",{});var Jp=p(Nn);Wi=o(Jp,"Gestion des contextes longs"),Jp.forEach(t),Ur.forEach(t),Xa=f(e),Te=u(e,"P",{});var Ft=p(Te);Qi=o(Ft,"Si nous essayons de tokeniser la question et le long contexte que nous avons utilis\xE9 dans l\u2019exemple pr\xE9c\xE9demment, nous obtenons un nombre de "),Ln=u(Ft,"EM",{});var Kp=p(Ln);Hi=o(Kp,"tokens"),Kp.forEach(t),Ri=o(Ft," sup\xE9rieur \xE0 la longueur maximale utilis\xE9e dans le pipeline "),Sn=u(Ft,"CODE",{});var Wp=p(Sn);Vi=o(Wp,"question-answering"),Wp.forEach(t),Bi=o(Ft," (qui est de 384) :"),Ft.forEach(t),Za=f(e),x(xs.$$.fragment,e),er=f(e),x($s.$$.fragment,e),sr=f(e),Be=u(e,"P",{});var Gr=p(Be);Yi=o(Gr,"Nous devrons donc tronquer nos entr\xE9es \xE0 cette longueur maximale. Il y a plusieurs fa\xE7ons de le faire mais nous ne voulons pas tronquer la question, seulement le contexte. Puisque le contexte est la deuxi\xE8me phrase, nous utilisons la strat\xE9gie de troncature "),An=u(Gr,"CODE",{});var Qp=p(An);Xi=o(Qp,'"only_second"'),Qp.forEach(t),Zi=o(Gr,". Le probl\xE8me qui se pose alors est que la r\xE9ponse \xE0 la question peut ne pas se trouver dans le contexte tronqu\xE9. Ici, par exemple, nous avons choisi une question dont la r\xE9ponse se trouve vers la fin du contexte, et lorsque nous la tronquons, cette r\xE9ponse n\u2019est pas pr\xE9sente :"),Gr.forEach(t),tr=f(e),x(qs.$$.fragment,e),nr=f(e),x(ks.$$.fragment,e),ar=f(e),Ye=u(e,"P",{});var Jr=p(Ye);el=o(Jr,"Cela signifie que le mod\xE8le a du mal \xE0 trouver la bonne r\xE9ponse. Pour r\xE9soudre ce probl\xE8me, le pipeline de "),Dn=u(Jr,"CODE",{});var Hp=p(Dn);sl=o(Hp,"question-answering"),Hp.forEach(t),tl=o(Jr," nous permet de diviser le contexte en morceaux plus petits, en sp\xE9cifiant la longueur maximale. Pour s\u2019assurer que nous ne divisons pas le contexte exactement au mauvais endroit pour permettre de trouver la r\xE9ponse, il inclut \xE9galement un certain chevauchement entre les morceaux."),Jr.forEach(t),rr=f(e),Y=u(e,"P",{});var ss=p(Y);nl=o(ss,"Nous pouvons demander au "),Mn=u(ss,"EM",{});var Rp=p(Mn);al=o(Rp,"tokenizer"),Rp.forEach(t),rl=o(ss," (rapide ou lent) de le faire pour nous en ajoutant "),Fn=u(ss,"CODE",{});var Vp=p(Fn);ol=o(Vp,"return_overflowing_tokens=True"),Vp.forEach(t),il=o(ss,", et nous pouvons sp\xE9cifier le chevauchement que nous voulons avec l\u2019argument "),On=u(ss,"CODE",{});var Bp=p(On);ll=o(Bp,"stride"),Bp.forEach(t),ul=o(ss,". Voici un exemple, en utilisant une phrase plus petite :"),ss.forEach(t),or=f(e),x(ws.$$.fragment,e),ir=f(e),x(js.$$.fragment,e),lr=f(e),H=u(e,"P",{});var Me=p(H);pl=o(Me,"Comme on peut le voir, la phrase a \xE9t\xE9 d\xE9coup\xE9e en morceaux de telle sorte que chaque entr\xE9e dans "),In=u(Me,"CODE",{});var Yp=p(In);ml=o(Yp,'inputs["input_ids"]'),Yp.forEach(t),cl=o(Me," a au maximum 6 "),Un=u(Me,"EM",{});var Xp=p(Un);dl=o(Xp,"tokens"),Xp.forEach(t),fl=o(Me," (il faudrait ajouter du "),Gn=u(Me,"EM",{});var Zp=p(Gn);hl=o(Zp,"padding"),Zp.forEach(t),_l=o(Me," pour que la derni\xE8re entr\xE9e ait la m\xEAme taille que les autres) et il y a un chevauchement de 2 "),Jn=u(Me,"EM",{});var em=p(Jn);bl=o(em,"tokens"),em.forEach(t),vl=o(Me," entre chacune des entr\xE9es."),Me.forEach(t),ur=f(e),_t=u(e,"P",{});var sm=p(_t);gl=o(sm,"Regardons de plus pr\xE8s le r\xE9sultat de la tok\xE9nisation :"),sm.forEach(t),pr=f(e),x(Es.$$.fragment,e),mr=f(e),x(ys.$$.fragment,e),cr=f(e),Ce=u(e,"P",{});var Ot=p(Ce);xl=o(Ot,"Comme pr\xE9vu, nous obtenons les identifiants d\u2019entr\xE9e et un masque d\u2019attention. La derni\xE8re cl\xE9, "),Kn=u(Ot,"CODE",{});var tm=p(Kn);$l=o(tm,"overflow_to_sample_mapping"),tm.forEach(t),ql=o(Ot,", est une carte qui nous indique \xE0 quelle phrase correspond chacun des r\xE9sultats. Ici nous avons 7 r\xE9sultats qui proviennent tous de la (seule) phrase que nous avons pass\xE9e au "),Wn=u(Ot,"EM",{});var nm=p(Wn);kl=o(nm,"tokenizer"),nm.forEach(t),wl=o(Ot," :"),Ot.forEach(t),dr=f(e),x(Ps.$$.fragment,e),fr=f(e),x(zs.$$.fragment,e),hr=f(e),bt=u(e,"P",{});var am=p(bt);jl=o(am,"C\u2019est plus utile lorsque nous tokenisons plusieurs phrases ensemble. Par exemple :"),am.forEach(t),_r=f(e),x(Ts.$$.fragment,e),br=f(e),vt=u(e,"P",{});var rm=p(vt);El=o(rm,"nous donne :"),rm.forEach(t),vr=f(e),x(Cs.$$.fragment,e),gr=f(e),gt=u(e,"P",{});var om=p(gt);yl=o(om,"ce qui signifie que la premi\xE8re phrase est divis\xE9e en 7 morceaux comme pr\xE9c\xE9demment et que les 4 morceaux suivants proviennent de la deuxi\xE8me phrase."),om.forEach(t),xr=f(e),L=u(e,"P",{});var J=p(L);Pl=o(J,"Revenons maintenant \xE0 notre contexte long. Par d\xE9faut, le pipeline "),Qn=u(J,"CODE",{});var im=p(Qn);zl=o(im,"question-answering"),im.forEach(t),Tl=o(J," utilise une longueur maximale de 384 et un "),Hn=u(J,"EM",{});var lm=p(Hn);Cl=o(lm,"stride"),lm.forEach(t),Nl=o(J," de 128, qui correspondent \xE0 la fa\xE7on dont le mod\xE8le a \xE9t\xE9 "),Rn=u(J,"EM",{});var um=p(Rn);Ll=o(um,"finetun\xE9"),um.forEach(t),Sl=o(J," (vous pouvez ajuster ces param\xE8tres en passant les arguments "),Vn=u(J,"CODE",{});var pm=p(Vn);Al=o(pm,"max_seq_len"),pm.forEach(t),Dl=o(J," et "),Bn=u(J,"CODE",{});var mm=p(Bn);Ml=o(mm,"stride"),mm.forEach(t),Fl=o(J," lorsque vous appelez le pipeline). Nous utiliserons donc ces param\xE8tres lors de la tokenisation. Nous ajouterons aussi du "),Yn=u(J,"EM",{});var cm=p(Yn);Ol=o(cm,"padding"),cm.forEach(t),Il=o(J," (pour avoir des \xE9chantillons de m\xEAme longueur afin de pouvoir construire des tenseurs) ainsi que demander les "),Xn=u(J,"EM",{});var dm=p(Xn);Ul=o(dm,"offsets"),dm.forEach(t),Gl=o(J," :"),J.forEach(t),$r=f(e),x(Ns.$$.fragment,e),qr=f(e),R=u(e,"P",{});var Fe=p(R);Jl=o(Fe,"Ces "),Zn=u(Fe,"CODE",{});var fm=p(Zn);Kl=o(fm,"inputs"),fm.forEach(t),Wl=o(Fe," contiendront les identifiants d\u2019entr\xE9e, les masques d\u2019attention que le mod\xE8le attend, ainsi que les "),ea=u(Fe,"EM",{});var hm=p(ea);Ql=o(hm,"offsets"),hm.forEach(t),Hl=o(Fe," et le "),sa=u(Fe,"CODE",{});var _m=p(sa);Rl=o(_m,"overflow_to_sample_mapping"),_m.forEach(t),Vl=o(Fe," dont on vient de parler. Puisque ces deux \xE9l\xE9ments ne sont pas des param\xE8tres utilis\xE9s par le mod\xE8le, nous allons les sortir des "),ta=u(Fe,"CODE",{});var bm=p(ta);Bl=o(bm,"inputs"),bm.forEach(t),Yl=o(Fe," (et nous ne stockerons pas la correspondance puisqu\u2019elle n\u2019est pas utile ici) avant de le convertir en tenseur :"),Fe.forEach(t),kr=f(e),ve.l(e),xt=f(e),$t=u(e,"P",{});var vm=p($t);Xl=o(vm,"Notre contexte long a \xE9t\xE9 divis\xE9 en deux, ce qui signifie qu\u2019apr\xE8s avoir travers\xE9 notre mod\xE8le, nous aurons deux ensembles de logits de d\xE9but et de fin :"),vm.forEach(t),wr=f(e),x(Ls.$$.fragment,e),jr=f(e),xe.l(e),qt=f(e),X=u(e,"P",{});var ts=p(X);Zl=o(ts,"Comme pr\xE9c\xE9demment, nous masquons d\u2019abord les "),na=u(ts,"EM",{});var gm=p(na);eu=o(gm,"tokens"),gm.forEach(t),su=o(ts," qui ne font pas partie du contexte avant de prendre le softmax. Nous masquons \xE9galement tous les "),aa=u(ts,"EM",{});var xm=p(aa);tu=o(xm,"tokens"),xm.forEach(t),nu=o(ts," de "),ra=u(ts,"EM",{});var $m=p(ra);au=o($m,"padding"),$m.forEach(t),ru=o(ts," (tels que signal\xE9s par le masque d\u2019attention) :"),ts.forEach(t),Er=f(e),qe.l(e),kt=f(e),wt=u(e,"P",{});var qm=p(wt);ou=o(qm,"Ensuite, nous pouvons utiliser la fonction softmax pour convertir nos logits en probabilit\xE9s :"),qm.forEach(t),yr=f(e),we.l(e),jt=f(e),Et=u(e,"P",{});var km=p(Et);iu=o(km,"L\u2019\xE9tape suivante est similaire \xE0 ce que nous avons fait pour le petit contexte mais nous la r\xE9p\xE9tons pour chacun de nos deux morceaux. Nous attribuons un score \xE0 tous les espaces de r\xE9ponse possibles puis nous prenons l\u2019espace ayant le meilleur score :"),km.forEach(t),Pr=f(e),Ee.l(e),yt=f(e),x(Ss.$$.fragment,e),zr=f(e),Xe=u(e,"P",{});var Kr=p(Xe);lu=o(Kr,"Ces deux candidats correspondent aux meilleures r\xE9ponses que le mod\xE8le a pu trouver dans chaque morceau. Le mod\xE8le est beaucoup plus confiant dans le fait que la bonne r\xE9ponse se trouve dans la deuxi\xE8me partie (ce qui est bon signe !). Il ne nous reste plus qu\u2019\xE0 faire correspondre ces deux espaces de "),oa=u(Kr,"EM",{});var wm=p(oa);uu=o(wm,"tokens"),wm.forEach(t),pu=o(Kr," \xE0 des espaces de caract\xE8res dans le contexte (nous n\u2019avons besoin de faire correspondre que le second pour avoir notre r\xE9ponse, mais il est int\xE9ressant de voir ce que le mod\xE8le a choisi dans le premier morceau)."),Kr.forEach(t),Tr=f(e),x(Ze.$$.fragment,e),Cr=f(e),Ne=u(e,"P",{});var It=p(Ne);mu=o(It,"Le "),ia=u(It,"CODE",{});var jm=p(ia);cu=o(jm,"offsets"),jm.forEach(t),du=o(It," que nous avons saisi plus t\xF4t est en fait une liste d\u2019"),la=u(It,"EM",{});var Em=p(la);fu=o(Em,"offsets"),Em.forEach(t),hu=o(It," avec une liste par morceau de texte :"),It.forEach(t),Nr=f(e),x(As.$$.fragment,e),Lr=f(e),x(Ds.$$.fragment,e),Sr=f(e),Pt=u(e,"P",{});var ym=p(Pt);_u=o(ym,"Si nous ignorons le premier r\xE9sultat, nous obtenons le m\xEAme r\xE9sultat que notre pipeline pour ce long contexte !"),ym.forEach(t),Ar=f(e),x(es.$$.fragment,e),Dr=f(e),Le=u(e,"P",{});var Ut=p(Le);bu=o(Ut,"Ceci conclut notre plong\xE9e en profondeur dans les capacit\xE9s du "),ua=u(Ut,"EM",{});var Pm=p(ua);vu=o(Pm,"tokenizer"),Pm.forEach(t),gu=o(Ut,". Nous mettrons \xE0 nouveau tout cela en pratique dans le prochain chapitre, lorsque nous vous montrerons comment "),pa=u(Ut,"EM",{});var zm=p(pa);xu=o(zm,"finetuner"),zm.forEach(t),$u=o(Ut," un mod\xE8le sur une s\xE9rie de t\xE2ches NLP courantes."),Ut.forEach(t),this.h()},h(){C(a,"name","hf:doc:metadata"),C(a,"content",JSON.stringify(vc)),C(w,"id","itokenizeri-rapide-dans-le-pipeline-de-qa"),C(w,"class","header-link block pr-1.5 text-lg no-hover:hidden with-hover:absolute with-hover:p-1.5 with-hover:opacity-0 with-hover:group-hover:opacity-100 with-hover:right-full"),C(w,"href","#itokenizeri-rapide-dans-le-pipeline-de-qa"),C(v,"class","relative group"),C(Ke,"id","utilisation-du-pipeline-de-questionanswering"),C(Ke,"class","header-link block pr-1.5 text-lg no-hover:hidden with-hover:absolute with-hover:p-1.5 with-hover:opacity-0 with-hover:group-hover:opacity-100 with-hover:right-full"),C(Ke,"href","#utilisation-du-pipeline-de-questionanswering"),C(Ie,"class","relative group"),C(st,"href","/course/fr/chapter1"),C(We,"id","utilisation-dun-modle-pour-rpondre-des-questions"),C(We,"class","header-link block pr-1.5 text-lg no-hover:hidden with-hover:absolute with-hover:p-1.5 with-hover:opacity-0 with-hover:group-hover:opacity-100 with-hover:right-full"),C(We,"href","#utilisation-dun-modle-pour-rpondre-des-questions"),C(Ue,"class","relative group"),C(us,"href","https://huggingface.co/distilbert-base-cased-distilled-squad"),C(us,"rel","nofollow"),C(at,"href","/course/fr/chapter7/7"),C(ps,"class","block dark:hidden"),Nm(ps.src,qu="https://huggingface.co/datasets/huggingface-course/documentation-images/resolve/main/en/chapter6/question_tokens.svg")||C(ps,"src",qu),C(ps,"alt","An example of tokenization of question and context"),C(ms,"class","hidden dark:block"),Nm(ms.src,ku="https://huggingface.co/datasets/huggingface-course/documentation-images/resolve/main/en/chapter6/question_tokens-dark.svg")||C(ms,"src",ku),C(ms,"alt","An example of tokenization of question and context"),C(Ge,"class","flex justify-center"),La.a=null,Aa.a=Da,C(Ve,"id","gestion-des-contextes-longs"),C(Ve,"class","header-link block pr-1.5 text-lg no-hover:hidden with-hover:absolute with-hover:p-1.5 with-hover:opacity-0 with-hover:group-hover:opacity-100 with-hover:right-full"),C(Ve,"href","#gestion-des-contextes-longs"),C(Je,"class","relative group")},m(e,i){s(document.head,a),m(e,c,i),$(n,e,i),m(e,b,i),m(e,v,i),s(v,w),s(w,P),$(T,P,null),s(v,N),s(v,z),s(z,S),s(S,A),s(z,D),m(e,W,i),Ms[E].m(e,i),m(e,B,i),m(e,F,i),s(F,Oe),s(F,Gt),s(Gt,Hr),s(F,Rr),s(F,Jt),s(Jt,Vr),s(F,Br),m(e,fa,i),Fs[re].m(e,i),m(e,Zs,i),m(e,Ie,i),s(Ie,Ke),s(Ke,Kt),$(ns,Kt,null),s(Ie,Yr),s(Ie,et),s(et,Xr),s(et,Wt),s(Wt,Zr),m(e,ha,i),m(e,Pe,i),s(Pe,eo),s(Pe,st),s(st,so),s(Pe,to),s(Pe,Qt),s(Qt,no),s(Pe,ao),m(e,_a,i),$(as,e,i),m(e,ba,i),$(rs,e,i),m(e,va,i),m(e,tt,i),s(tt,ro),m(e,ga,i),$(os,e,i),m(e,xa,i),$(is,e,i),m(e,$a,i),m(e,nt,i),s(nt,oo),m(e,qa,i),m(e,Ue,i),s(Ue,We),s(We,Ht),$(ls,Ht,null),s(Ue,io),s(Ue,Rt),s(Rt,lo),m(e,ka,i),m(e,O,i),s(O,uo),s(O,Vt),s(Vt,po),s(O,mo),s(O,Bt),s(Bt,co),s(O,fo),s(O,us),s(us,Yt),s(Yt,ho),s(O,_o),s(O,Xt),s(Xt,bo),s(O,vo),s(O,at),s(at,go),s(O,xo),m(e,wa,i),Os[ie].m(e,i),m(e,rt,i),m(e,ot,i),s(ot,$o),m(e,ja,i),m(e,Ge,i),s(Ge,ps),s(Ge,qo),s(Ge,ms),m(e,Ea,i),m(e,I,i),s(I,ko),s(I,Zt),s(Zt,wo),s(I,jo),s(I,en),s(en,Eo),s(I,yo),s(I,sn),s(sn,Po),s(I,zo),s(I,tn),s(tn,To),s(I,Co),s(I,nn),s(nn,No),s(I,Lo),m(e,ya,i),$(cs,e,i),m(e,Pa,i),Is[ue].m(e,i),m(e,it,i),m(e,M,i),s(M,So),s(M,an),s(an,Ao),s(M,Do),s(M,rn),s(rn,Mo),s(M,Fo),s(M,on),s(on,Oo),s(M,Io),s(M,ln),s(ln,Uo),s(M,Go),s(M,un),s(un,Jo),s(M,Ko),s(M,pn),s(pn,Wo),s(M,Qo),m(e,za,i),m(e,Qe,i),s(Qe,Ho),s(Qe,mn),s(mn,Ro),s(Qe,Vo),m(e,Ta,i),Us[me].m(e,i),m(e,lt,i),m(e,ut,i),s(ut,Bo),m(e,Ca,i),Gs[de].m(e,i),m(e,pt,i),m(e,U,i),s(U,Yo),s(U,cn),s(cn,Xo),s(U,Zo),s(U,dn),s(dn,ei),s(U,si),s(U,fn),s(fn,ti),s(U,ni),s(U,hn),s(hn,ai),s(U,ri),s(U,_n),s(_n,oi),s(U,ii),m(e,Na,i),m(e,K,i),s(K,li),s(K,bn),s(bn,ui),s(K,pi),s(K,vn),s(vn,mi),s(K,ci),s(K,gn),s(gn,di),s(K,fi),s(K,xn),s(xn,hi),s(K,_i),La.m(Am,K),m(e,Sa,i),m(e,ze,i),s(ze,bi),Aa.m(Dm,ze),s(ze,Da),s(ze,$n),s($n,vi),s(ze,gi),m(e,Ma,i),m(e,mt,i),s(mt,xi),m(e,Fa,i),$(ds,e,i),m(e,Oa,i),Js[he].m(e,i),m(e,ct,i),m(e,Q,i),s(Q,$i),s(Q,qn),s(qn,qi),s(Q,ki),s(Q,kn),s(kn,wi),s(Q,ji),s(Q,wn),s(wn,Ei),s(Q,yi),s(Q,jn),s(jn,Pi),s(Q,zi),m(e,Ia,i),$(fs,e,i),m(e,Ua,i),m(e,dt,i),s(dt,Ti),m(e,Ga,i),$(hs,e,i),m(e,Ja,i),$(He,e,i),m(e,Ka,i),m(e,G,i),s(G,Ci),s(G,En),s(En,Ni),s(G,Li),s(G,yn),s(yn,Si),s(G,Ai),s(G,Pn),s(Pn,Di),s(G,Mi),s(G,zn),s(zn,Fi),s(G,Oi),s(G,Tn),s(Tn,Ii),s(G,Ui),m(e,Wa,i),$(_s,e,i),m(e,Qa,i),m(e,ft,i),s(ft,Gi),m(e,Ha,i),$(bs,e,i),m(e,Ra,i),$(vs,e,i),m(e,Va,i),m(e,ht,i),s(ht,Ji),m(e,Ba,i),$(Re,e,i),m(e,Ya,i),m(e,Je,i),s(Je,Ve),s(Ve,Cn),$(gs,Cn,null),s(Je,Ki),s(Je,Nn),s(Nn,Wi),m(e,Xa,i),m(e,Te,i),s(Te,Qi),s(Te,Ln),s(Ln,Hi),s(Te,Ri),s(Te,Sn),s(Sn,Vi),s(Te,Bi),m(e,Za,i),$(xs,e,i),m(e,er,i),$($s,e,i),m(e,sr,i),m(e,Be,i),s(Be,Yi),s(Be,An),s(An,Xi),s(Be,Zi),m(e,tr,i),$(qs,e,i),m(e,nr,i),$(ks,e,i),m(e,ar,i),m(e,Ye,i),s(Ye,el),s(Ye,Dn),s(Dn,sl),s(Ye,tl),m(e,rr,i),m(e,Y,i),s(Y,nl),s(Y,Mn),s(Mn,al),s(Y,rl),s(Y,Fn),s(Fn,ol),s(Y,il),s(Y,On),s(On,ll),s(Y,ul),m(e,or,i),$(ws,e,i),m(e,ir,i),$(js,e,i),m(e,lr,i),m(e,H,i),s(H,pl),s(H,In),s(In,ml),s(H,cl),s(H,Un),s(Un,dl),s(H,fl),s(H,Gn),s(Gn,hl),s(H,_l),s(H,Jn),s(Jn,bl),s(H,vl),m(e,ur,i),m(e,_t,i),s(_t,gl),m(e,pr,i),$(Es,e,i),m(e,mr,i),$(ys,e,i),m(e,cr,i),m(e,Ce,i),s(Ce,xl),s(Ce,Kn),s(Kn,$l),s(Ce,ql),s(Ce,Wn),s(Wn,kl),s(Ce,wl),m(e,dr,i),$(Ps,e,i),m(e,fr,i),$(zs,e,i),m(e,hr,i),m(e,bt,i),s(bt,jl),m(e,_r,i),$(Ts,e,i),m(e,br,i),m(e,vt,i),s(vt,El),m(e,vr,i),$(Cs,e,i),m(e,gr,i),m(e,gt,i),s(gt,yl),m(e,xr,i),m(e,L,i),s(L,Pl),s(L,Qn),s(Qn,zl),s(L,Tl),s(L,Hn),s(Hn,Cl),s(L,Nl),s(L,Rn),s(Rn,Ll),s(L,Sl),s(L,Vn),s(Vn,Al),s(L,Dl),s(L,Bn),s(Bn,Ml),s(L,Fl),s(L,Yn),s(Yn,Ol),s(L,Il),s(L,Xn),s(Xn,Ul),s(L,Gl),m(e,$r,i),$(Ns,e,i),m(e,qr,i),m(e,R,i),s(R,Jl),s(R,Zn),s(Zn,Kl),s(R,Wl),s(R,ea),s(ea,Ql),s(R,Hl),s(R,sa),s(sa,Rl),s(R,Vl),s(R,ta),s(ta,Bl),s(R,Yl),m(e,kr,i),Ks[be].m(e,i),m(e,xt,i),m(e,$t,i),s($t,Xl),m(e,wr,i),$(Ls,e,i),m(e,jr,i),Ws[ge].m(e,i),m(e,qt,i),m(e,X,i),s(X,Zl),s(X,na),s(na,eu),s(X,su),s(X,aa),s(aa,tu),s(X,nu),s(X,ra),s(ra,au),s(X,ru),m(e,Er,i),Qs[$e].m(e,i),m(e,kt,i),m(e,wt,i),s(wt,ou),m(e,yr,i),Hs[ke].m(e,i),m(e,jt,i),m(e,Et,i),s(Et,iu),m(e,Pr,i),Rs[je].m(e,i),m(e,yt,i),$(Ss,e,i),m(e,zr,i),m(e,Xe,i),s(Xe,lu),s(Xe,oa),s(oa,uu),s(Xe,pu),m(e,Tr,i),$(Ze,e,i),m(e,Cr,i),m(e,Ne,i),s(Ne,mu),s(Ne,ia),s(ia,cu),s(Ne,du),s(Ne,la),s(la,fu),s(Ne,hu),m(e,Nr,i),$(As,e,i),m(e,Lr,i),$(Ds,e,i),m(e,Sr,i),m(e,Pt,i),s(Pt,_u),m(e,Ar,i),$(es,e,i),m(e,Dr,i),m(e,Le,i),s(Le,bu),s(Le,ua),s(ua,vu),s(Le,gu),s(Le,pa),s(pa,xu),s(Le,$u),Mr=!0},p(e,[i]){const Vs={};i&1&&(Vs.fw=e[0]),n.$set(Vs);let zt=E;E=ju(e),E!==zt&&(ae(),h(Ms[zt],1,1,()=>{Ms[zt]=null}),ne(),y=Ms[E],y||(y=Ms[E]=wu[E](e),y.c()),_(y,1),y.m(B.parentNode,B));let Tt=re;re=yu(e),re!==Tt&&(ae(),h(Fs[Tt],1,1,()=>{Fs[Tt]=null}),ne(),oe=Fs[re],oe||(oe=Fs[re]=Eu[re](e),oe.c()),_(oe,1),oe.m(Zs.parentNode,Zs));let Bs=ie;ie=zu(e),ie!==Bs&&(ae(),h(Os[Bs],1,1,()=>{Os[Bs]=null}),ne(),le=Os[ie],le||(le=Os[ie]=Pu[ie](e),le.c()),_(le,1),le.m(rt.parentNode,rt));let Ct=ue;ue=Cu(e),ue!==Ct&&(ae(),h(Is[Ct],1,1,()=>{Is[Ct]=null}),ne(),pe=Is[ue],pe||(pe=Is[ue]=Tu[ue](e),pe.c()),_(pe,1),pe.m(it.parentNode,it));let Se=me;me=Lu(e),me!==Se&&(ae(),h(Us[Se],1,1,()=>{Us[Se]=null}),ne(),ce=Us[me],ce||(ce=Us[me]=Nu[me](e),ce.c()),_(ce,1),ce.m(lt.parentNode,lt));let Nt=de;de=Au(e),de!==Nt&&(ae(),h(Gs[Nt],1,1,()=>{Gs[Nt]=null}),ne(),fe=Gs[de],fe||(fe=Gs[de]=Su[de](e),fe.c()),_(fe,1),fe.m(pt.parentNode,pt));let Lt=he;he=Mu(e),he!==Lt&&(ae(),h(Js[Lt],1,1,()=>{Js[Lt]=null}),ne(),_e=Js[he],_e||(_e=Js[he]=Du[he](e),_e.c()),_(_e,1),_e.m(ct.parentNode,ct));const Ys={};i&2&&(Ys.$$scope={dirty:i,ctx:e}),He.$set(Ys);const ma={};i&2&&(ma.$$scope={dirty:i,ctx:e}),Re.$set(ma);let St=be;be=Ou(e),be!==St&&(ae(),h(Ks[St],1,1,()=>{Ks[St]=null}),ne(),ve=Ks[be],ve||(ve=Ks[be]=Fu[be](e),ve.c()),_(ve,1),ve.m(xt.parentNode,xt));let Xs=ge;ge=Uu(e),ge!==Xs&&(ae(),h(Ws[Xs],1,1,()=>{Ws[Xs]=null}),ne(),xe=Ws[ge],xe||(xe=Ws[ge]=Iu[ge](e),xe.c()),_(xe,1),xe.m(qt.parentNode,qt));let At=$e;$e=Ju(e),$e!==At&&(ae(),h(Qs[At],1,1,()=>{Qs[At]=null}),ne(),qe=Qs[$e],qe||(qe=Qs[$e]=Gu[$e](e),qe.c()),_(qe,1),qe.m(kt.parentNode,kt));let Ae=ke;ke=Wu(e),ke!==Ae&&(ae(),h(Hs[Ae],1,1,()=>{Hs[Ae]=null}),ne(),we=Hs[ke],we||(we=Hs[ke]=Ku[ke](e),we.c()),_(we,1),we.m(jt.parentNode,jt));let Dt=je;je=Hu(e),je!==Dt&&(ae(),h(Rs[Dt],1,1,()=>{Rs[Dt]=null}),ne(),Ee=Rs[je],Ee||(Ee=Rs[je]=Qu[je](e),Ee.c()),_(Ee,1),Ee.m(yt.parentNode,yt));const ca={};i&2&&(ca.$$scope={dirty:i,ctx:e}),Ze.$set(ca);const da={};i&2&&(da.$$scope={dirty:i,ctx:e}),es.$set(da)},i(e){Mr||(_(n.$$.fragment,e),_(T.$$.fragment,e),_(y),_(oe),_(ns.$$.fragment,e),_(as.$$.fragment,e),_(rs.$$.fragment,e),_(os.$$.fragment,e),_(is.$$.fragment,e),_(ls.$$.fragment,e),_(le),_(cs.$$.fragment,e),_(pe),_(ce),_(fe),_(ds.$$.fragment,e),_(_e),_(fs.$$.fragment,e),_(hs.$$.fragment,e),_(He.$$.fragment,e),_(_s.$$.fragment,e),_(bs.$$.fragment,e),_(vs.$$.fragment,e),_(Re.$$.fragment,e),_(gs.$$.fragment,e),_(xs.$$.fragment,e),_($s.$$.fragment,e),_(qs.$$.fragment,e),_(ks.$$.fragment,e),_(ws.$$.fragment,e),_(js.$$.fragment,e),_(Es.$$.fragment,e),_(ys.$$.fragment,e),_(Ps.$$.fragment,e),_(zs.$$.fragment,e),_(Ts.$$.fragment,e),_(Cs.$$.fragment,e),_(Ns.$$.fragment,e),_(ve),_(Ls.$$.fragment,e),_(xe),_(qe),_(we),_(Ee),_(Ss.$$.fragment,e),_(Ze.$$.fragment,e),_(As.$$.fragment,e),_(Ds.$$.fragment,e),_(es.$$.fragment,e),Mr=!0)},o(e){h(n.$$.fragment,e),h(T.$$.fragment,e),h(y),h(oe),h(ns.$$.fragment,e),h(as.$$.fragment,e),h(rs.$$.fragment,e),h(os.$$.fragment,e),h(is.$$.fragment,e),h(ls.$$.fragment,e),h(le),h(cs.$$.fragment,e),h(pe),h(ce),h(fe),h(ds.$$.fragment,e),h(_e),h(fs.$$.fragment,e),h(hs.$$.fragment,e),h(He.$$.fragment,e),h(_s.$$.fragment,e),h(bs.$$.fragment,e),h(vs.$$.fragment,e),h(Re.$$.fragment,e),h(gs.$$.fragment,e),h(xs.$$.fragment,e),h($s.$$.fragment,e),h(qs.$$.fragment,e),h(ks.$$.fragment,e),h(ws.$$.fragment,e),h(js.$$.fragment,e),h(Es.$$.fragment,e),h(ys.$$.fragment,e),h(Ps.$$.fragment,e),h(zs.$$.fragment,e),h(Ts.$$.fragment,e),h(Cs.$$.fragment,e),h(Ns.$$.fragment,e),h(ve),h(Ls.$$.fragment,e),h(xe),h(qe),h(we),h(Ee),h(Ss.$$.fragment,e),h(Ze.$$.fragment,e),h(As.$$.fragment,e),h(Ds.$$.fragment,e),h(es.$$.fragment,e),Mr=!1},d(e){t(a),e&&t(c),q(n,e),e&&t(b),e&&t(v),q(T),e&&t(W),Ms[E].d(e),e&&t(B),e&&t(F),e&&t(fa),Fs[re].d(e),e&&t(Zs),e&&t(Ie),q(ns),e&&t(ha),e&&t(Pe),e&&t(_a),q(as,e),e&&t(ba),q(rs,e),e&&t(va),e&&t(tt),e&&t(ga),q(os,e),e&&t(xa),q(is,e),e&&t($a),e&&t(nt),e&&t(qa),e&&t(Ue),q(ls),e&&t(ka),e&&t(O),e&&t(wa),Os[ie].d(e),e&&t(rt),e&&t(ot),e&&t(ja),e&&t(Ge),e&&t(Ea),e&&t(I),e&&t(ya),q(cs,e),e&&t(Pa),Is[ue].d(e),e&&t(it),e&&t(M),e&&t(za),e&&t(Qe),e&&t(Ta),Us[me].d(e),e&&t(lt),e&&t(ut),e&&t(Ca),Gs[de].d(e),e&&t(pt),e&&t(U),e&&t(Na),e&&t(K),e&&t(Sa),e&&t(ze),e&&t(Ma),e&&t(mt),e&&t(Fa),q(ds,e),e&&t(Oa),Js[he].d(e),e&&t(ct),e&&t(Q),e&&t(Ia),q(fs,e),e&&t(Ua),e&&t(dt),e&&t(Ga),q(hs,e),e&&t(Ja),q(He,e),e&&t(Ka),e&&t(G),e&&t(Wa),q(_s,e),e&&t(Qa),e&&t(ft),e&&t(Ha),q(bs,e),e&&t(Ra),q(vs,e),e&&t(Va),e&&t(ht),e&&t(Ba),q(Re,e),e&&t(Ya),e&&t(Je),q(gs),e&&t(Xa),e&&t(Te),e&&t(Za),q(xs,e),e&&t(er),q($s,e),e&&t(sr),e&&t(Be),e&&t(tr),q(qs,e),e&&t(nr),q(ks,e),e&&t(ar),e&&t(Ye),e&&t(rr),e&&t(Y),e&&t(or),q(ws,e),e&&t(ir),q(js,e),e&&t(lr),e&&t(H),e&&t(ur),e&&t(_t),e&&t(pr),q(Es,e),e&&t(mr),q(ys,e),e&&t(cr),e&&t(Ce),e&&t(dr),q(Ps,e),e&&t(fr),q(zs,e),e&&t(hr),e&&t(bt),e&&t(_r),q(Ts,e),e&&t(br),e&&t(vt),e&&t(vr),q(Cs,e),e&&t(gr),e&&t(gt),e&&t(xr),e&&t(L),e&&t($r),q(Ns,e),e&&t(qr),e&&t(R),e&&t(kr),Ks[be].d(e),e&&t(xt),e&&t($t),e&&t(wr),q(Ls,e),e&&t(jr),Ws[ge].d(e),e&&t(qt),e&&t(X),e&&t(Er),Qs[$e].d(e),e&&t(kt),e&&t(wt),e&&t(yr),Hs[ke].d(e),e&&t(jt),e&&t(Et),e&&t(Pr),Rs[je].d(e),e&&t(yt),q(Ss,e),e&&t(zr),e&&t(Xe),e&&t(Tr),q(Ze,e),e&&t(Cr),e&&t(Ne),e&&t(Nr),q(As,e),e&&t(Lr),q(Ds,e),e&&t(Sr),e&&t(Pt),e&&t(Ar),q(es,e),e&&t(Dr),e&&t(Le)}}}const vc={local:"itokenizeri-rapide-dans-le-pipeline-de-qa",sections:[{local:"utilisation-du-pipeline-de-questionanswering",sections:[{local:"utilisation-dun-modle-pour-rpondre-des-questions",title:"Utilisation d'un mod\xE8le pour r\xE9pondre \xE0 des questions"}],title:"Utilisation du pipeline de `question-answering`"},{local:"gestion-des-contextes-longs",title:"Gestion des contextes longs"}],title:"<i>Tokenizer</i> rapide dans le pipeline de QA"};function gc(k,a,c){let n="pt";return Um(()=>{const b=new URLSearchParams(window.location.search);c(0,n=b.get("fw")||"pt")}),[n]}class yc extends Mm{constructor(a){super();Fm(this,a,gc,bc,Om,{})}}export{yc as default,vc as metadata};
