import{s as $a,o as ga,n as Cs}from"../chunks/scheduler.cc52f4b9.js";import{S as va,i as xa,e as b,s as r,c as M,q as O,H as ja,h as Ca,a as w,d as n,b as m,f as gs,g as J,j as h,r as tt,w as Ia,k as en,l as _,m as a,n as u,o,u as Z,t as p,p as y,v as B}from"../chunks/index.85964560.js";import{T as vs}from"../chunks/Tip.72f3abad.js";import{C as Ga,H as xs,E as Wa}from"../chunks/MermaidChart.svelte_svelte_type_style_lang.4cab8d21.js";import{Y as _a}from"../chunks/Youtube.2feacd03.js";import{C as f}from"../chunks/CodeBlock.b43b1e5c.js";import{C as ka}from"../chunks/CourseFloatingBanner.d24cbe55.js";import{F as Ra}from"../chunks/FrameworkSwitchCourse.17523e75.js";function Na(d){let l,i;return l=new ka({props:{chapter:6,classNames:"absolute z-10 right-0 top-0",notebooks:[{label:"Google Colab",value:"https://colab.research.google.com/github/huggingface/notebooks/blob/master/course/th/chapter6/section3b_tf.ipynb"},{label:"Aws Studio",value:"https://studiolab.sagemaker.aws/import/github/huggingface/notebooks/blob/master/course/th/chapter6/section3b_tf.ipynb"}]}}),{c(){M(l.$$.fragment)},l(e){J(l.$$.fragment,e)},m(e,c){u(l,e,c),i=!0},i(e){i||(p(l.$$.fragment,e),i=!0)},o(e){o(l.$$.fragment,e),i=!1},d(e){y(l,e)}}}function Va(d){let l,i;return l=new ka({props:{chapter:6,classNames:"absolute z-10 right-0 top-0",notebooks:[{label:"Google Colab",value:"https://colab.research.google.com/github/huggingface/notebooks/blob/master/course/th/chapter6/section3b_pt.ipynb"},{label:"Aws Studio",value:"https://studiolab.sagemaker.aws/import/github/huggingface/notebooks/blob/master/course/th/chapter6/section3b_pt.ipynb"}]}}),{c(){M(l.$$.fragment)},l(e){J(l.$$.fragment,e)},m(e,c){u(l,e,c),i=!0},i(e){i||(p(l.$$.fragment,e),i=!0)},o(e){o(l.$$.fragment,e),i=!1},d(e){y(l,e)}}}function Xa(d){let l,i;return l=new _a({props:{id:"b3u8RzBCX9Y"}}),{c(){M(l.$$.fragment)},l(e){J(l.$$.fragment,e)},m(e,c){u(l,e,c),i=!0},i(e){i||(p(l.$$.fragment,e),i=!0)},o(e){o(l.$$.fragment,e),i=!1},d(e){y(l,e)}}}function za(d){let l,i;return l=new _a({props:{id:"_wxyB3j3mk4"}}),{c(){M(l.$$.fragment)},l(e){J(l.$$.fragment,e)},m(e,c){u(l,e,c),i=!0},i(e){i||(p(l.$$.fragment,e),i=!0)},o(e){o(l.$$.fragment,e),i=!1},d(e){y(l,e)}}}function Qa(d){let l,i;return l=new f({props:{code:"ZnJvbSUyMHRyYW5zZm9ybWVycyUyMGltcG9ydCUyMEF1dG9Ub2tlbml6ZXIlMkMlMjBURkF1dG9Nb2RlbEZvclF1ZXN0aW9uQW5zd2VyaW5nJTBBJTBBbW9kZWxfY2hlY2twb2ludCUyMCUzRCUyMCUyMmRpc3RpbGJlcnQtYmFzZS1jYXNlZC1kaXN0aWxsZWQtc3F1YWQlMjIlMEF0b2tlbml6ZXIlMjAlM0QlMjBBdXRvVG9rZW5pemVyLmZyb21fcHJldHJhaW5lZChtb2RlbF9jaGVja3BvaW50KSUwQW1vZGVsJTIwJTNEJTIwVEZBdXRvTW9kZWxGb3JRdWVzdGlvbkFuc3dlcmluZy5mcm9tX3ByZXRyYWluZWQobW9kZWxfY2hlY2twb2ludCklMEElMEFpbnB1dHMlMjAlM0QlMjB0b2tlbml6ZXIocXVlc3Rpb24lMkMlMjBjb250ZXh0JTJDJTIwcmV0dXJuX3RlbnNvcnMlM0QlMjJ0ZiUyMiklMEFvdXRwdXRzJTIwJTNEJTIwbW9kZWwoKippbnB1dHMp",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)`,wrap:!1}}),{c(){M(l.$$.fragment)},l(e){J(l.$$.fragment,e)},m(e,c){u(l,e,c),i=!0},i(e){i||(p(l.$$.fragment,e),i=!0)},o(e){o(l.$$.fragment,e),i=!1},d(e){y(l,e)}}}function Ha(d){let l,i;return l=new f({props:{code:"ZnJvbSUyMHRyYW5zZm9ybWVycyUyMGltcG9ydCUyMEF1dG9Ub2tlbml6ZXIlMkMlMjBBdXRvTW9kZWxGb3JRdWVzdGlvbkFuc3dlcmluZyUwQSUwQW1vZGVsX2NoZWNrcG9pbnQlMjAlM0QlMjAlMjJkaXN0aWxiZXJ0LWJhc2UtY2FzZWQtZGlzdGlsbGVkLXNxdWFkJTIyJTBBdG9rZW5pemVyJTIwJTNEJTIwQXV0b1Rva2VuaXplci5mcm9tX3ByZXRyYWluZWQobW9kZWxfY2hlY2twb2ludCklMEFtb2RlbCUyMCUzRCUyMEF1dG9Nb2RlbEZvclF1ZXN0aW9uQW5zd2VyaW5nLmZyb21fcHJldHJhaW5lZChtb2RlbF9jaGVja3BvaW50KSUwQSUwQWlucHV0cyUyMCUzRCUyMHRva2VuaXplcihxdWVzdGlvbiUyQyUyMGNvbnRleHQlMkMlMjByZXR1cm5fdGVuc29ycyUzRCUyMnB0JTIyKSUwQW91dHB1dHMlMjAlM0QlMjBtb2RlbCgqKmlucHV0cyk=",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)`,wrap:!1}}),{c(){M(l.$$.fragment)},l(e){J(l.$$.fragment,e)},m(e,c){u(l,e,c),i=!0},i(e){i||(p(l.$$.fragment,e),i=!0)},o(e){o(l.$$.fragment,e),i=!1},d(e){y(l,e)}}}function Ea(d){let l,i;return l=new f({props:{code:"KDElMkMlMjA2NiklMjAoMSUyQyUyMDY2KQ==",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>)',wrap:!1}}),{c(){M(l.$$.fragment)},l(e){J(l.$$.fragment,e)},m(e,c){u(l,e,c),i=!0},i(e){i||(p(l.$$.fragment,e),i=!0)},o(e){o(l.$$.fragment,e),i=!1},d(e){y(l,e)}}}function Fa(d){let l,i;return l=new f({props:{code:"dG9yY2guU2l6ZSglNUIxJTJDJTIwNjYlNUQpJTIwdG9yY2guU2l6ZSglNUIxJTJDJTIwNjYlNUQp",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>])',wrap:!1}}),{c(){M(l.$$.fragment)},l(e){J(l.$$.fragment,e)},m(e,c){u(l,e,c),i=!0},i(e){i||(p(l.$$.fragment,e),i=!0)},o(e){o(l.$$.fragment,e),i=!1},d(e){y(l,e)}}}function Ya(d){let l,i;return l=new f({props:{code:"aW1wb3J0JTIwdGVuc29yZmxvdyUyMGFzJTIwdGYlMEElMEFzZXF1ZW5jZV9pZHMlMjAlM0QlMjBpbnB1dHMuc2VxdWVuY2VfaWRzKCklMEElMjMlMjBNYXNrJTIwZXZlcnl0aGluZyUyMGFwYXJ0JTIwZnJvbSUyMHRoZSUyMHRva2VucyUyMG9mJTIwdGhlJTIwY29udGV4dCUwQW1hc2slMjAlM0QlMjAlNUJpJTIwISUzRCUyMDElMjBmb3IlMjBpJTIwaW4lMjBzZXF1ZW5jZV9pZHMlNUQlMEElMjMlMjBVbm1hc2slMjB0aGUlMjAlNUJDTFMlNUQlMjB0b2tlbiUwQW1hc2slNUIwJTVEJTIwJTNEJTIwRmFsc2UlMEFtYXNrJTIwJTNEJTIwdGYuY29uc3RhbnQobWFzayklNUJOb25lJTVEJTBBJTBBc3RhcnRfbG9naXRzJTIwJTNEJTIwdGYud2hlcmUobWFzayUyQyUyMC0xMDAwMCUyQyUyMHN0YXJ0X2xvZ2l0cyklMEFlbmRfbG9naXRzJTIwJTNEJTIwdGYud2hlcmUobWFzayUyQyUyMC0xMDAwMCUyQyUyMGVuZF9sb2dpdHMp",highlighted:`<span class="hljs-keyword">import</span> tensorflow <span class="hljs-keyword">as</span> tf

sequence_ids = inputs.sequence_ids()
<span class="hljs-comment"># Mask everything apart from the tokens of the context</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"># Unmask the [CLS] token</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)`,wrap:!1}}),{c(){M(l.$$.fragment)},l(e){J(l.$$.fragment,e)},m(e,c){u(l,e,c),i=!0},i(e){i||(p(l.$$.fragment,e),i=!0)},o(e){o(l.$$.fragment,e),i=!1},d(e){y(l,e)}}}function Sa(d){let l,i;return l=new f({props:{code:"aW1wb3J0JTIwdG9yY2glMEElMEFzZXF1ZW5jZV9pZHMlMjAlM0QlMjBpbnB1dHMuc2VxdWVuY2VfaWRzKCklMEElMjMlMjBNYXNrJTIwZXZlcnl0aGluZyUyMGFwYXJ0JTIwZnJvbSUyMHRoZSUyMHRva2VucyUyMG9mJTIwdGhlJTIwY29udGV4dCUwQW1hc2slMjAlM0QlMjAlNUJpJTIwISUzRCUyMDElMjBmb3IlMjBpJTIwaW4lMjBzZXF1ZW5jZV9pZHMlNUQlMEElMjMlMjBVbm1hc2slMjB0aGUlMjAlNUJDTFMlNUQlMjB0b2tlbiUwQW1hc2slNUIwJTVEJTIwJTNEJTIwRmFsc2UlMEFtYXNrJTIwJTNEJTIwdG9yY2gudGVuc29yKG1hc2spJTVCTm9uZSU1RCUwQSUwQXN0YXJ0X2xvZ2l0cyU1Qm1hc2slNUQlMjAlM0QlMjAtMTAwMDAlMEFlbmRfbG9naXRzJTVCbWFzayU1RCUyMCUzRCUyMC0xMDAwMA==",highlighted:`<span class="hljs-keyword">import</span> torch

sequence_ids = inputs.sequence_ids()
<span class="hljs-comment"># Mask everything apart from the tokens of the context</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"># Unmask the [CLS] token</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>`,wrap:!1}}),{c(){M(l.$$.fragment)},l(e){J(l.$$.fragment,e)},m(e,c){u(l,e,c),i=!0},i(e){i||(p(l.$$.fragment,e),i=!0)},o(e){o(l.$$.fragment,e),i=!1},d(e){y(l,e)}}}function Aa(d){let l,i;return l=new f({props:{code:"c3RhcnRfcHJvYmFiaWxpdGllcyUyMCUzRCUyMHRmLm1hdGguc29mdG1heChzdGFydF9sb2dpdHMlMkMlMjBheGlzJTNELTEpJTVCMCU1RC5udW1weSgpJTBBZW5kX3Byb2JhYmlsaXRpZXMlMjAlM0QlMjB0Zi5tYXRoLnNvZnRtYXgoZW5kX2xvZ2l0cyUyQyUyMGF4aXMlM0QtMSklNUIwJTVELm51bXB5KCk=",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()`,wrap:!1}}),{c(){M(l.$$.fragment)},l(e){J(l.$$.fragment,e)},m(e,c){u(l,e,c),i=!0},i(e){i||(p(l.$$.fragment,e),i=!0)},o(e){o(l.$$.fragment,e),i=!1},d(e){y(l,e)}}}function qa(d){let l,i;return l=new f({props:{code:"c3RhcnRfcHJvYmFiaWxpdGllcyUyMCUzRCUyMHRvcmNoLm5uLmZ1bmN0aW9uYWwuc29mdG1heChzdGFydF9sb2dpdHMlMkMlMjBkaW0lM0QtMSklNUIwJTVEJTBBZW5kX3Byb2JhYmlsaXRpZXMlMjAlM0QlMjB0b3JjaC5ubi5mdW5jdGlvbmFsLnNvZnRtYXgoZW5kX2xvZ2l0cyUyQyUyMGRpbSUzRC0xKSU1QjAlNUQ=",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>]`,wrap:!1}}),{c(){M(l.$$.fragment)},l(e){J(l.$$.fragment,e)},m(e,c){u(l,e,c),i=!0},i(e){i||(p(l.$$.fragment,e),i=!0)},o(e){o(l.$$.fragment,e),i=!1},d(e){y(l,e)}}}function La(d){let l,i="จากนั้นเราจะ mask ค่าตรงที่ <code>start_index &gt; end_index</code> ให้เป็น <code>0</code> (ค่า probabilities อื่นๆ เป็นจำนวนบวกทั้งหมด) ฟังก์ชัน <code>np.triu()</code> จะคำนวณ ส่วนสามเหลี่ยมบนของ tensor 2 มิติ ที่เราใส่ไปเป็น argument ดังนั้นมันจะทำการ mask ให้เรา:",e,c,T;return c=new f({props:{code:"c2NvcmVzJTIwJTNEJTIwbnAudHJpdShzY29yZXMp",highlighted:"scores = np.triu(scores)",wrap:!1}}),{c(){l=b("p"),l.innerHTML=i,e=r(),M(c.$$.fragment)},l(U){l=w(U,"P",{"data-svelte-h":!0}),h(l)!=="svelte-lk48dr"&&(l.innerHTML=i),e=m(U),J(c.$$.fragment,U)},m(U,k){a(U,l,k),a(U,e,k),u(c,U,k),T=!0},i(U){T||(p(c.$$.fragment,U),T=!0)},o(U){o(c.$$.fragment,U),T=!1},d(U){U&&(n(l),n(e)),y(c,U)}}}function Da(d){let l,i="จากนั้นเราจะ mask ค่าตรงที่ <code>start_index &gt; end_index</code> ให้เป็น <code>0</code> (ค่า probabilities อื่นๆ เป็นจำนวนบวกทั้งหมด) ฟังก์ชัน <code>torch.triu()</code> จะคำนวณ ส่วนสามเหลี่ยมบนของ tensor 2 มิติ ที่เราใส่ไปเป็น argument ดังนั้นมันจะทำการ mask ให้เรา:",e,c,T;return c=new f({props:{code:"c2NvcmVzJTIwJTNEJTIwdG9yY2gudHJpdShzY29yZXMp",highlighted:"scores = torch.triu(scores)",wrap:!1}}),{c(){l=b("p"),l.innerHTML=i,e=r(),M(c.$$.fragment)},l(U){l=w(U,"P",{"data-svelte-h":!0}),h(l)!=="svelte-15l6rx7"&&(l.innerHTML=i),e=m(U),J(c.$$.fragment,U)},m(U,k){a(U,l,k),a(U,e,k),u(c,U,k),T=!0},i(U){T||(p(c.$$.fragment,U),T=!0)},o(U){o(c.$$.fragment,U),T=!1},d(U){U&&(n(l),n(e)),y(c,U)}}}function Pa(d){let l,i="✏️ <strong>ลองทำดู!</strong> คำนวณ index เริ่มต้นและสิ้นสุด เพื่อหาคำตอบที่น่าจะเป็นไปได้มากที่สุด 5 คำตอบ";return{c(){l=b("p"),l.innerHTML=i},l(e){l=w(e,"P",{"data-svelte-h":!0}),h(l)!=="svelte-j06qkb"&&(l.innerHTML=i)},m(e,c){a(e,l,c)},p:Cs,d(e){e&&n(l)}}}function Ka(d){let l,i="✏️ <strong>ลองดูสิ!</strong> ใช้คะแนนที่ดีที่สุดที่คุณคำนวณไว้ก่อนหน้านี้ เพื่อคำนวณคำตอบที่น่าจะเป็นไปได้มากที่สุดห้าลำดับ ในการตรวจสอบผลลัพธ์ของคุณ ให้กลับไปที่ pipeline แรกแล้วตั้งค่า <code>top_k=5</code> ตอนที่รัน pipeline";return{c(){l=b("p"),l.innerHTML=i},l(e){l=w(e,"P",{"data-svelte-h":!0}),h(l)!=="svelte-1mqpduk"&&(l.innerHTML=i)},m(e,c){a(e,l,c)},p:Cs,d(e){e&&n(l)}}}function Oa(d){let l,i,e,c;return l=new f({props:{code:"XyUyMCUzRCUyMGlucHV0cy5wb3AoJTIyb3ZlcmZsb3dfdG9fc2FtcGxlX21hcHBpbmclMjIpJTBBb2Zmc2V0cyUyMCUzRCUyMGlucHV0cy5wb3AoJTIyb2Zmc2V0X21hcHBpbmclMjIpJTBBJTBBaW5wdXRzJTIwJTNEJTIwaW5wdXRzLmNvbnZlcnRfdG9fdGVuc29ycyglMjJ0ZiUyMiklMEFwcmludChpbnB1dHMlNUIlMjJpbnB1dF9pZHMlMjIlNUQuc2hhcGUp",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)`,wrap:!1}}),e=new f({props:{code:"KDIlMkMlMjAzODQp",highlighted:'(<span class="hljs-number">2</span>, <span class="hljs-number">384</span>)',wrap:!1}}),{c(){M(l.$$.fragment),i=r(),M(e.$$.fragment)},l(T){J(l.$$.fragment,T),i=m(T),J(e.$$.fragment,T)},m(T,U){u(l,T,U),a(T,i,U),u(e,T,U),c=!0},i(T){c||(p(l.$$.fragment,T),p(e.$$.fragment,T),c=!0)},o(T){o(l.$$.fragment,T),o(e.$$.fragment,T),c=!1},d(T){T&&n(i),y(l,T),y(e,T)}}}function ti(d){let l,i,e,c;return l=new f({props:{code:"XyUyMCUzRCUyMGlucHV0cy5wb3AoJTIyb3ZlcmZsb3dfdG9fc2FtcGxlX21hcHBpbmclMjIpJTBBb2Zmc2V0cyUyMCUzRCUyMGlucHV0cy5wb3AoJTIyb2Zmc2V0X21hcHBpbmclMjIpJTBBJTBBaW5wdXRzJTIwJTNEJTIwaW5wdXRzLmNvbnZlcnRfdG9fdGVuc29ycyglMjJwdCUyMiklMEFwcmludChpbnB1dHMlNUIlMjJpbnB1dF9pZHMlMjIlNUQuc2hhcGUp",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)`,wrap:!1}}),e=new f({props:{code:"dG9yY2guU2l6ZSglNUIyJTJDJTIwMzg0JTVEKQ==",highlighted:'torch.Size([<span class="hljs-number">2</span>, <span class="hljs-number">384</span>])',wrap:!1}}),{c(){M(l.$$.fragment),i=r(),M(e.$$.fragment)},l(T){J(l.$$.fragment,T),i=m(T),J(e.$$.fragment,T)},m(T,U){u(l,T,U),a(T,i,U),u(e,T,U),c=!0},i(T){c||(p(l.$$.fragment,T),p(e.$$.fragment,T),c=!0)},o(T){o(l.$$.fragment,T),o(e.$$.fragment,T),c=!1},d(T){T&&n(i),y(l,T),y(e,T)}}}function ei(d){let l,i;return l=new f({props:{code:"KDIlMkMlMjAzODQpJTIwKDIlMkMlMjAzODQp",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>)',wrap:!1}}),{c(){M(l.$$.fragment)},l(e){J(l.$$.fragment,e)},m(e,c){u(l,e,c),i=!0},i(e){i||(p(l.$$.fragment,e),i=!0)},o(e){o(l.$$.fragment,e),i=!1},d(e){y(l,e)}}}function li(d){let l,i;return l=new f({props:{code:"dG9yY2guU2l6ZSglNUIyJTJDJTIwMzg0JTVEKSUyMHRvcmNoLlNpemUoJTVCMiUyQyUyMDM4NCU1RCk=",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>])',wrap:!1}}),{c(){M(l.$$.fragment)},l(e){J(l.$$.fragment,e)},m(e,c){u(l,e,c),i=!0},i(e){i||(p(l.$$.fragment,e),i=!0)},o(e){o(l.$$.fragment,e),i=!1},d(e){y(l,e)}}}function si(d){let l,i;return l=new f({props:{code:"c2VxdWVuY2VfaWRzJTIwJTNEJTIwaW5wdXRzLnNlcXVlbmNlX2lkcygpJTBBJTIzJTIwTWFzayUyMGV2ZXJ5dGhpbmclMjBhcGFydCUyMGZyb20lMjB0aGUlMjB0b2tlbnMlMjBvZiUyMHRoZSUyMGNvbnRleHQlMEFtYXNrJTIwJTNEJTIwJTVCaSUyMCElM0QlMjAxJTIwZm9yJTIwaSUyMGluJTIwc2VxdWVuY2VfaWRzJTVEJTBBJTIzJTIwVW5tYXNrJTIwdGhlJTIwJTVCQ0xTJTVEJTIwdG9rZW4lMEFtYXNrJTVCMCU1RCUyMCUzRCUyMEZhbHNlJTBBJTIzJTIwTWFzayUyMGFsbCUyMHRoZSUyMCU1QlBBRCU1RCUyMHRva2VucyUwQW1hc2slMjAlM0QlMjB0Zi5tYXRoLmxvZ2ljYWxfb3IodGYuY29uc3RhbnQobWFzayklNUJOb25lJTVEJTJDJTIwaW5wdXRzJTVCJTIyYXR0ZW50aW9uX21hc2slMjIlNUQlMjAlM0QlM0QlMjAwKSUwQSUwQXN0YXJ0X2xvZ2l0cyUyMCUzRCUyMHRmLndoZXJlKG1hc2slMkMlMjAtMTAwMDAlMkMlMjBzdGFydF9sb2dpdHMpJTBBZW5kX2xvZ2l0cyUyMCUzRCUyMHRmLndoZXJlKG1hc2slMkMlMjAtMTAwMDAlMkMlMjBlbmRfbG9naXRzKQ==",highlighted:`sequence_ids = inputs.sequence_ids()
<span class="hljs-comment"># Mask everything apart from the tokens of the context</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"># Unmask the [CLS] token</span>
mask[<span class="hljs-number">0</span>] = <span class="hljs-literal">False</span>
<span class="hljs-comment"># Mask all the [PAD] tokens</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)`,wrap:!1}}),{c(){M(l.$$.fragment)},l(e){J(l.$$.fragment,e)},m(e,c){u(l,e,c),i=!0},i(e){i||(p(l.$$.fragment,e),i=!0)},o(e){o(l.$$.fragment,e),i=!1},d(e){y(l,e)}}}function ni(d){let l,i;return l=new f({props:{code:"c2VxdWVuY2VfaWRzJTIwJTNEJTIwaW5wdXRzLnNlcXVlbmNlX2lkcygpJTBBJTIzJTIwTWFzayUyMGV2ZXJ5dGhpbmclMjBhcGFydCUyMGZyb20lMjB0aGUlMjB0b2tlbnMlMjBvZiUyMHRoZSUyMGNvbnRleHQlMEFtYXNrJTIwJTNEJTIwJTVCaSUyMCElM0QlMjAxJTIwZm9yJTIwaSUyMGluJTIwc2VxdWVuY2VfaWRzJTVEJTBBJTIzJTIwVW5tYXNrJTIwdGhlJTIwJTVCQ0xTJTVEJTIwdG9rZW4lMEFtYXNrJTVCMCU1RCUyMCUzRCUyMEZhbHNlJTBBJTIzJTIwTWFzayUyMGFsbCUyMHRoZSUyMCU1QlBBRCU1RCUyMHRva2VucyUwQW1hc2slMjAlM0QlMjB0b3JjaC5sb2dpY2FsX29yKHRvcmNoLnRlbnNvcihtYXNrKSU1Qk5vbmUlNUQlMkMlMjAoaW5wdXRzJTVCJTIyYXR0ZW50aW9uX21hc2slMjIlNUQlMjAlM0QlM0QlMjAwKSklMEElMEFzdGFydF9sb2dpdHMlNUJtYXNrJTVEJTIwJTNEJTIwLTEwMDAwJTBBZW5kX2xvZ2l0cyU1Qm1hc2slNUQlMjAlM0QlMjAtMTAwMDA=",highlighted:`sequence_ids = inputs.sequence_ids()
<span class="hljs-comment"># Mask everything apart from the tokens of the context</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"># Unmask the [CLS] token</span>
mask[<span class="hljs-number">0</span>] = <span class="hljs-literal">False</span>
<span class="hljs-comment"># Mask all the [PAD] tokens</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>`,wrap:!1}}),{c(){M(l.$$.fragment)},l(e){J(l.$$.fragment,e)},m(e,c){u(l,e,c),i=!0},i(e){i||(p(l.$$.fragment,e),i=!0)},o(e){o(l.$$.fragment,e),i=!1},d(e){y(l,e)}}}function ai(d){let l,i;return l=new f({props:{code:"c3RhcnRfcHJvYmFiaWxpdGllcyUyMCUzRCUyMHRmLm1hdGguc29mdG1heChzdGFydF9sb2dpdHMlMkMlMjBheGlzJTNELTEpLm51bXB5KCklMEFlbmRfcHJvYmFiaWxpdGllcyUyMCUzRCUyMHRmLm1hdGguc29mdG1heChlbmRfbG9naXRzJTJDJTIwYXhpcyUzRC0xKS5udW1weSgp",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()`,wrap:!1}}),{c(){M(l.$$.fragment)},l(e){J(l.$$.fragment,e)},m(e,c){u(l,e,c),i=!0},i(e){i||(p(l.$$.fragment,e),i=!0)},o(e){o(l.$$.fragment,e),i=!1},d(e){y(l,e)}}}function ii(d){let l,i;return l=new f({props:{code:"c3RhcnRfcHJvYmFiaWxpdGllcyUyMCUzRCUyMHRvcmNoLm5uLmZ1bmN0aW9uYWwuc29mdG1heChzdGFydF9sb2dpdHMlMkMlMjBkaW0lM0QtMSklMEFlbmRfcHJvYmFiaWxpdGllcyUyMCUzRCUyMHRvcmNoLm5uLmZ1bmN0aW9uYWwuc29mdG1heChlbmRfbG9naXRzJTJDJTIwZGltJTNELTEp",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>)`,wrap:!1}}),{c(){M(l.$$.fragment)},l(e){J(l.$$.fragment,e)},m(e,c){u(l,e,c),i=!0},i(e){i||(p(l.$$.fragment,e),i=!0)},o(e){o(l.$$.fragment,e),i=!1},d(e){y(l,e)}}}function ri(d){let l,i;return l=new f({props:{code:"Y2FuZGlkYXRlcyUyMCUzRCUyMCU1QiU1RCUwQWZvciUyMHN0YXJ0X3Byb2JzJTJDJTIwZW5kX3Byb2JzJTIwaW4lMjB6aXAoc3RhcnRfcHJvYmFiaWxpdGllcyUyQyUyMGVuZF9wcm9iYWJpbGl0aWVzKSUzQSUwQSUyMCUyMCUyMCUyMHNjb3JlcyUyMCUzRCUyMHN0YXJ0X3Byb2JzJTVCJTNBJTJDJTIwTm9uZSU1RCUyMColMjBlbmRfcHJvYnMlNUJOb25lJTJDJTIwJTNBJTVEJTBBJTIwJTIwJTIwJTIwaWR4JTIwJTNEJTIwbnAudHJpdShzY29yZXMpLmFyZ21heCgpLml0ZW0oKSUwQSUwQSUyMCUyMCUyMCUyMHN0YXJ0X2lkeCUyMCUzRCUyMGlkeCUyMCUyRiUyRiUyMHNjb3Jlcy5zaGFwZSU1QjElNUQlMEElMjAlMjAlMjAlMjBlbmRfaWR4JTIwJTNEJTIwaWR4JTIwJTI1JTIwc2NvcmVzLnNoYXBlJTVCMSU1RCUwQSUyMCUyMCUyMCUyMHNjb3JlJTIwJTNEJTIwc2NvcmVzJTVCc3RhcnRfaWR4JTJDJTIwZW5kX2lkeCU1RC5pdGVtKCklMEElMjAlMjAlMjAlMjBjYW5kaWRhdGVzLmFwcGVuZCgoc3RhcnRfaWR4JTJDJTIwZW5kX2lkeCUyQyUyMHNjb3JlKSklMEElMEFwcmludChjYW5kaWRhdGVzKQ==",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)`,wrap:!1}}),{c(){M(l.$$.fragment)},l(e){J(l.$$.fragment,e)},m(e,c){u(l,e,c),i=!0},i(e){i||(p(l.$$.fragment,e),i=!0)},o(e){o(l.$$.fragment,e),i=!1},d(e){y(l,e)}}}function mi(d){let l,i;return l=new f({props:{code:"Y2FuZGlkYXRlcyUyMCUzRCUyMCU1QiU1RCUwQWZvciUyMHN0YXJ0X3Byb2JzJTJDJTIwZW5kX3Byb2JzJTIwaW4lMjB6aXAoc3RhcnRfcHJvYmFiaWxpdGllcyUyQyUyMGVuZF9wcm9iYWJpbGl0aWVzKSUzQSUwQSUyMCUyMCUyMCUyMHNjb3JlcyUyMCUzRCUyMHN0YXJ0X3Byb2JzJTVCJTNBJTJDJTIwTm9uZSU1RCUyMColMjBlbmRfcHJvYnMlNUJOb25lJTJDJTIwJTNBJTVEJTBBJTIwJTIwJTIwJTIwaWR4JTIwJTNEJTIwdG9yY2gudHJpdShzY29yZXMpLmFyZ21heCgpLml0ZW0oKSUwQSUwQSUyMCUyMCUyMCUyMHN0YXJ0X2lkeCUyMCUzRCUyMGlkeCUyMCUyRiUyRiUyMHNjb3Jlcy5zaGFwZSU1QjElNUQlMEElMjAlMjAlMjAlMjBlbmRfaWR4JTIwJTNEJTIwaWR4JTIwJTI1JTIwc2NvcmVzLnNoYXBlJTVCMSU1RCUwQSUyMCUyMCUyMCUyMHNjb3JlJTIwJTNEJTIwc2NvcmVzJTVCc3RhcnRfaWR4JTJDJTIwZW5kX2lkeCU1RC5pdGVtKCklMEElMjAlMjAlMjAlMjBjYW5kaWRhdGVzLmFwcGVuZCgoc3RhcnRfaWR4JTJDJTIwZW5kX2lkeCUyQyUyMHNjb3JlKSklMEElMEFwcmludChjYW5kaWRhdGVzKQ==",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)`,wrap:!1}}),{c(){M(l.$$.fragment)},l(e){J(l.$$.fragment,e)},m(e,c){u(l,e,c),i=!0},i(e){i||(p(l.$$.fragment,e),i=!0)},o(e){o(l.$$.fragment,e),i=!1},d(e){y(l,e)}}}function oi(d){let l,i="✏️ <strong>ลองดูสิ!</strong> ปรับโค้ดด้านบนเพื่อให้มัน return score และ span ของคำตอบที่น่าจะเป็นไปได้มากที่สุด 5 ลำดับ (โดยเปรียบเทียบ score ของทุกประโยคย่อย)";return{c(){l=b("p"),l.innerHTML=i},l(e){l=w(e,"P",{"data-svelte-h":!0}),h(l)!=="svelte-engj7j"&&(l.innerHTML=i)},m(e,c){a(e,l,c)},p:Cs,d(e){e&&n(l)}}}function pi(d){let l,i="✏️ <strong>ลองดูสิ!</strong> ใช้ score ที่ดีที่สุดที่คุณคำนวณได้ก่อนหน้านี้ เพื่อแสดงคำตอบที่น่าจะเป็นไปได้มากที่สุด 5 ลำดับ (สำหรับบริบททั้งหมด ไม่ใช่แต่ละส่วน) เพื่อตรวจสอบผลลัพธ์ของคุณ ให้กลับไปที่ไปป์ไลน์แรกแล้วตั้งค่า <code>top_k=5</code> เวลารัน";return{c(){l=b("p"),l.innerHTML=i},l(e){l=w(e,"P",{"data-svelte-h":!0}),h(l)!=="svelte-rragf2"&&(l.innerHTML=i)},m(e,c){a(e,l,c)},p:Cs,d(e){e&&n(l)}}}function ci(d){let l,i,e,c,T,U,k,sl,mt,nl,$,g,We,ot,ln=`ในบทนี้ เราจะเรียนเกี่ยวกับการใช้งาน pipeline เพื่อทำ <code>question-answering</code> และดูว่าเราจะสามารถใช้ข้อมูลจาก offset เพื่อเอาไว้หาคำตอบให้กับคำถาม input จากบริบทรอบๆ (context) ได้อย่างไร
ขั้นตอนนี้จะคล้ายๆกับตอนที่เราใช้ offset เพื่อรวมรวม entity ประเภทเดียวกันเข้าด้วยกัน ในบทที่แล้ว
จากนั้น เราจะมาดูกันว่าเราจะจัดการกับ context ที่ยาวมากๆ จนบางส่วนต้องถูกตัดทอนออกได้อย่างไร คุณสามารถข้ามส่วนนี้หากคุณไม่สนใจ question answering`,al,v,x,Re,pt,il,ct,sn='อย่างที่คุณได้เรียนใน<a href="/course/chapter1">บทที่ 1</a> เราสามารถใช้ <code>question-answering</code> pipeline เพื่อคำนวณคำตอบของคำถาม input ได้ :',rl,Mt,ml,Jt,ol,ut,nn="ใน pipeline อื่นๆ เราไม่สามารถตัดทอนและแยกข้อความที่ยาวเกินกว่าความยาวสูงสุดที่โมเดลกำหนดได้ (และอาจพลาดตัดข้อมูลที่ส่วนท้ายของเอกสารได้ด้วย) แต่ pipeline ที่เราจะเรียนกันนี้ สามารถจัดการกับ context ที่ยาวมากได้ และจะ return คำตอบให้กับคำถาม แม้ว่าจะอยู่ในตอนท้าย:",pl,yt,cl,dt,Ml,bt,an="เรามาดูกันว่ามันทำงานอย่างไร!",Jl,wt,ul,Tt,rn=`เช่นเดียวกับ pipeline อื่นๆ เราจะเริ่มต้นด้วยการ tokenize ข้อความ input ของเรา แล้วส่งผลลัพธ์ที่ได้ต่อไปยังตัวโมเดล
ค่าเริ่มต้นของ checkpoint สำหรับ <code>question-answering</code> pipeline คือ <a href="https://huggingface.co/distilbert-base-cased-distilled-squad" rel="nofollow"><code>distilbert-base-cased-distilled-squad</code></a>
(คำว่า “squad” มาจากชื่อของชุดข้อมูลที่โมเดลใช้เพื่อ fine-tune ซึ่งก็คือ SQuAD dataset เราจะพูดถึงชุดข้อมูลนี้เพิ่มเติมใน<a href="/course/chapter7/7">บทที่ 7</a>):`,yl,C,G,Ne,ht,mn="เราจะทำการตัดคำให้กับส่วนที่เป็นคำถามและส่วน context ไปด้วยกัน โดยจะตัดคำให้กับส่วนคำถามก่อน",dl,st,on='<img class="block dark:hidden" src="https://huggingface.co/datasets/huggingface-course/documentation-images/resolve/main/en/chapter6/question_tokens.svg" alt="An example of tokenization of question and context"/> <img class="hidden dark:block" src="https://huggingface.co/datasets/huggingface-course/documentation-images/resolve/main/en/chapter6/question_tokens-dark.svg" alt="An example of tokenization of question and context"/>',bl,ft,pn=`โมเดลสำหรับ question answering นั้นทำงานแตกต่างไปจากโมเดลอื่น ที่คุณเคยเห็นมาแล้วเล็กน้อย จากภาพด้านบน
โมเดลจะถูกการเทรนให้ทำนาย index ของ token ที่เป็นจุดเริ่มต้นของข้อความคำตอบ (ซึ่งก็คือ index ที่ 21) และ index ของ token สุดท้ายของข้อความคำตอบ
(ซึ่งก็คือ index ที่ 24) นี่คือสาเหตุที่โมเดลเหล่านั้นไม่ return tensor ของ logit หนึ่งตัว แต่สองตัว: tensor แรก คือ logits สำหรับ token เริ่มต้นของคำตอบ
และอีก tensor เป็น logits สำหรับ token สุดท้ายของคำตอบ เนื่องจากในกรณีนี้ เรามีเพียง input เดียว ซึ่งมี 66 token เราจะได้ผลลัพธ์ดังนี้:`,wl,Ut,Tl,W,R,Ve,jt,cn=`ในการแปลงค่า logits ให้เป็นค่าความน่าจะเป็น (probabilities) เราจะใช้ฟังก์ชัน softmax  แต่ก่อนอื่น เราจะต้องทำการปกปิด (mask) index ที่ไม่ได้เป็นส่วนหนึ่งของ context ก่อน
อินพุตของเราคือ <code>[CLS] question [SEP] context [SEP]</code> ดังนั้น เราจะ mask แต่ละ token ในส่วนที่เป็นคำถาม รวมถึง token <code>[SEP]</code> ด้วย อย่างไรก็ตาม เราจะเก็บ <code>[CLS]</code> ไว้
เนื่องจากโมเดลบางตัวอาจจะใช้มัน เพื่อระบุว่าคำตอบไม่อยู่ใน context
เนื่องจากเราจะใช้ softmax ในภายหลัง เราจึงเพียงแค่ต้องแทนที่ค่า logits ที่เราต้องการ mask ด้วยตัวเลขติดลบจำนวนมาก ในตัวอย่างนี้ เราใช้ <code>-10000</code>:`,hl,N,V,Xe,It,Mn="หลังจากที่ เราได้ mask ค่า logits ตำแหน่งที่เราไม่ต้องการจะทำนาย เรียบร้อยแล้ว ตอนนี้เราก็สามารถคำนวณ softmax ได้:",fl,X,z,ze,j,Gs,Qe,Jn="start_index",Ws,He,un="end_index",Rs,Ee,yn="start_index <= end_index",Ns,Fe,dn="(start_index, end_index)",Vs,Ye,bn="start_index",Xs,Se,wn="end_index",zs,Ae,Tn="start_index",Qs,qe,hn="end_index",Hs,Ul,Za='<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>×</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">×</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>',jl,et,Es,Il,Ba='<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>×</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">×</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>',_l,Le,fn="start_index <= end_index",kl,_t,Un="ขั้นแรก เราจะคำนวณผลคูณที่เป็นไปได้ทั้งหมด:",Zl,kt,Bl,Q,H,De,Zt,jn="ตอนนี้เราแค่ต้องหา index ที่มีค่า probability สูงสุด เนื่องจาก PyTorch จะ return ค่าในรูป flattened tensor เราจึงต้องใช้การหารแล้วปัดลง (floor division) <code>//</code> และโมดูลัส <code>%</code> เพื่อคำนวณ <code>start_index</code> และ <code>end_index</code>:",$l,Bt,gl,$t,In="ตอนนี้ เราก็ได้ score ที่ถูกต้องสำหรับคำตอบแล้ว (คุณสามารถตรวจสอบได้โดยเปรียบเทียบกับผลลัพธ์แรกในส่วนก่อนหน้า):",vl,gt,xl,nt,Cl,vt,_n="เรามี <code>start_index</code> และ <code>end_index</code> ของ token ที่จะเอามาเป็นคำตอบได้แล้ว ดังนั้นตอนนี้เราเพียงแค่ต้องแปลงเป็น index ของตัวอักษร ใน context เท่านั้น นี่คือจุดที่ offsets จะมีประโยชน์มาก เราสามารถใช้งานมันได้เหมือนที่เราทำใน token classification:",Gl,xt,Wl,Ct,kn="ตอนนี้ เราแค่ต้องฟอร์แมตทุกอย่างเพื่อให้ได้ผลลัพธ์ที่ต้องการ:",Rl,Gt,Nl,Wt,Vl,Rt,Zn="ยอดเยี่ยม! เราได้คำตอบเหมือนกับในตัวอย่างแรกของเรา!",Xl,at,zl,Nt,Ql,Vt,Bn="หากคุณต้องการ tokenize คำถามและบริบทที่ค่อยข้างยาว ที่เราใช้เป็นตัวอย่างก่อนหน้านี้ คุณจะได้ token ที่มีความยาวสูงกว่าความยาวสูงสุดที่จำกัดไว้ใน pipeline <code>question-answering</code> (ซึ่งคือ 384):",Hl,Xt,El,zt,Fl,Qt,$n=`ดังนั้น เราจึงจำเป็นจะต้องตัดทอน input ของเราให้ความยาวเท่ากับความยาวสูงสุด มีหลายวิธีที่เราสามารถทำได้ อย่างไรก็ตาม เราไม่ต้องการตัดคำถามให้สั้นลง เราต้องการตัดเฉพาะตัวบริบทเท่านั้น
เนื่องจากบริบทอยู่ในตำแหน่งของประโยคที่สอง เราจะใช้กลยุทธ์การตัดทอนที่เรียกว่า <code>&quot;only_second&quot;</code>
อย่างไรก็ตาม ปัญหาหนึ่งที่อาจจะเกิดขึ้นก็คือ คำตอบของคำถามอาจจะอยู่ในส่วนที่ถูกตัดออกไป เช่นในตัวอย่างข้างบน เราได้เลือกคำถามที่คำตอบอยู่ในตอนท้ายของบริบท และเมื่อเราตัดทอนส่วนท้ายของบริบทออกไป คำตอบที่เราต้องการก็จะหายไปด้วย:`,Yl,Ht,Sl,Et,Al,Ft,gn="ซึ่งหมายความว่า มันจะยากมากที่โมเดลของเราจะเลือกคำตอบได้ถูกต้อง เพื่อแก้ไขปัญหานี้ ไปป์ไลน์ <code>question-answering</code> จะแบ่งบริบทออกเป็นส่วนย่อยๆ ที่ไม่ยาวเกินความยาวสูงสุด",ql,Yt,vn=`เพื่อให้แน่ใจว่า เราจะไม่แบ่งบริบทผิดตำแหน่งจนโมเดลไม่สามารถค้นหาคำตอบได้ เราจะแบ่งโดย ให้บริบทย่อยแต่ละส่วนมีส่วนที่ทับซ้อนกันด้วย
เราสามารถใช้ tokenizer (ทั้งแบบเร็วและช้า) ทำสิ่งนี้ให้เราได้ โดยคุณจะต้องตั้งค่า <code>return_overflowing_tokens=True</code> นอกจากนั้น เพื่อกำหนดว่าเราจะให้ข้อความทับซ้อนกันมากแค่ไหน เราจำกำหนดค่าให้กับ argument <code>stride</code>`,Ll,St,xn="ดูตัวอย่างข้างล่างนี้ :",Dl,At,Pl,qt,Kl,Lt,Cn="คุณจะเห็นว่า ตอนนี้ประโยคถูกแบ่งออกเป็นส่วนๆ โดยแต่ละส่วนจะมีไม่เกิน 6 token และมี token ที่ทับซ้อนกัน 2 token (สังเกตว่า ประโยคสุดท้ายมีเพียง 4 token ในกรณี เราจะต้องเพิ่ม padding token ทีหลังเพื่อให้มันยาวเท่ากับส่วนอื่นๆ)",Ol,Dt,Gn="มาดูผลลัพธ์ของการ tokenization อย่างละเอียดยิ่งขึ้น:",ts,Pt,es,Kt,ls,Ot,Wn="ผลลัพธ์จากการแบ่งประโยคนี้ คือ <code>input_ids</code> และ <code>attention_mask</code> ส่วนคีย์สุดท้าย <code>overflow_to_sample_mapping</code> เป็น  map ที่บอกเราว่าแต่ละประโยคย่อยมาจากประโยค input ตำแหน่งที่เท่าไร ในตัวอย่างของเรา เราใช้แค่ประโยคเดียวเป็น input และเราได้ 7 ประโยคย่อยเป็น output แปลว่าทุกประโยคย่อยก็จะถูก map ไปหาประโยคหลักที่มี ID เดียวกัน :",ss,te,ns,ee,as,le,Rn="feature นี้จะมีประโยชน์เมื่อเราใช้ประโยคหลายเป็น input ตัวอย่างเช่น:",is,se,rs,ne,Nn="เราจะได้ :",ms,ae,os,ie,Vn="ซึ่งหมายความว่า ประโยคแรกถูกแบ่งออกเป็น 7 ส่วน และ ประโยคที่สองถูกแบ่งออกเป็น 4 ส่วน",ps,re,Xn="กลับมาดูกันว่า เราจะจัดการกับบริบทยาวๆได้อย่างไร ไปป์ไลน์ <code>question-answering</code> จำกัดความยาวสูงสุดไว้ที่ 384 และค่า stride ถูกตั้งไว้ที่ 128 ซึ่งสอดคล้องกับค่าที่ใช้ตอนที่โมเดลถูก fine-tune (คุณสามารถปรับ parameters เหล่านั้นได้ โดยตั้งค่า <code>max_seq_len</code> และ <code>stride</code> เมื่อเรียกไปป์ไลน์) เราจะใช้ค่าเริ่มต้นพวกนี้ในการแบ่งบริบทเป็นส่วนย่อยๆ นอกจากนี้ เราจะตั้งค่า padding (เพื่อให้มีแต่ละส่วนที่มีความยาวเท่ากัน และเพื่อที่เราจะได้นำมันไปสร้าง tensor ได้) และค่า offsets ด้วย:",cs,me,Ms,oe,zn=`<code>inputs</code> เหล่านั้นจะมี input ID และ attention masks เช่นเดียวกับ offsets และ <code>overflow_to_sample_mapping</code> ที่เราเพิ่งพูดถึง
เนื่องจากทั้งสองอย่างหลังนี้ไม่ใช่ parameters ที่ใช้โดยโมเดล เราจะเอามันออกจาก <code>inputs</code> ก่อนที่จะแปลง <code>inputs</code> เป็น tensor:`,Js,E,F,Pe,pe,Qn="บริบทแบบยาวของเรา ตอนนี้ถูกแบ่งออกเป็นสองส่วน ซึ่งหมายความว่า หลังจากเราใส่มันเข้าไปในโมเดลแล้ว เราจะได้ค่า start logits และ end logits อย่างละ 2 เซ็ต :",us,ce,ys,Y,S,Ke,Me,Hn="เช่นเดียวกับตัวอย่างก่อน ก่อนอื่นเราจะปิด(mask) token ที่ไม่ได้เป็นส่วนหนึ่งของบริบท ก่อนที่จะใช้ softmax นอกจากนี้เราจะปิด padding tokens ทั้งหมดด้วย (ตามการตั้งค่าใน attention mask):",ds,A,q,Oe,Je,En="จากนั้นเราจะใช้ softmax เพื่อแปลง logits เป็นความน่าจะเป็น:",bs,L,D,tl,ue,Fn="ขั้นตอนต่อไปนั้น คล้ายกับสิ่งที่เราทำกับบริบทแบบสั้นก่อนหน้านี้ เราจะรัน process เดียวกันนี้กับประโยคย่อยทั้งสองส่วนที่เราได้มา จากนั้น เราจะแจกจ่าย score ไปให้กับทุกๆ span ของคำตอบที่เป็นไปได้ และสุดท้ายเราจะเลือก span ที่มี score สูงที่สุด",ws,P,K,el,ye,Ts,de,Yn="output ที่เราได้คือ span คำตอบที่ดีที่สุดของแต่ละประโยคย่อย ที่โมเดลคำนวณได้ เราจะเห็นว่าโมเดลให้ค่าความมั่นใจที่สูงมากๆกับ span คำตอบในประโยคที่สองมากกว่าประโยคแรก (ซึ่งเป็นสัญญาณที่ดี!) สิ่งที่เราต้องทำหลังจากนี้ก็คือ map ค่า span ไปสู่ตัวอักษร เพื่อดูว่า คำตอบที่โมเดลคำนวณได้คืออะไร",hs,it,fs,be,Sn="ค่า <code>offsets</code> ที่เราใช้ก่อนหน้านี้ เป็น list ของ offsets โดยที่แต่ละประโยคย่อยจะมีหนึ่ง list :",Us,we,js,Te,Is,he,An="ถ้าไม่นับผลลัพธ์แรกที่เรา print ออกมาด้วย เราก็จะได้ผลลัพธ์เดียวกันกับผลลัพธ์จากไปป์ไลน์ — เย้!",_s,rt,ks,fe,qn="บทนี้ถือว่าเป็น การสรุปจบการเรียนรู้ความสามารถของ tokenizer แบบละเอียด ในบทต่อไปคุณจะได้ใช้ความรู้ที่เรียนมานี้ เพื่อฝึกฝนอีก โดยคุณจะได้ฝึก fine-tune โมเดลเพื่อ task ทั่วๆไป ของ NLP",Zs,Ue,Bs,ll,$s;T=new Ra({props:{fw:d[0]}}),k=new Ga({props:{containerStyle:"float: right; margin-left: 10px; display: inline-flex; position: relative; z-index: 10;"}}),mt=new xs({props:{title:"การใช้งานตัวตัดคำแบบเร็ว (Fast tokenizers) ใน QA pipeline",local:"การใชงานตวตดคำแบบเรว-fast-tokenizers-ใน-qa-pipeline",headingTag:"h1"}});const Ln=[Va,Na],je=[];function Dn(t,s){return t[0]==="pt"?0:1}$=Dn(d),g=je[$]=Ln[$](d);const Pn=[za,Xa],Ie=[];function Kn(t,s){return t[0]==="pt"?0:1}v=Kn(d),x=Ie[v]=Pn[v](d),pt=new xs({props:{title:"การใช้ question-answering pipeline",local:"การใช-question-answering-pipeline",headingTag:"h2"}}),Mt=new f({props:{code:"ZnJvbSUyMHRyYW5zZm9ybWVycyUyMGltcG9ydCUyMHBpcGVsaW5lJTBBJTBBcXVlc3Rpb25fYW5zd2VyZXIlMjAlM0QlMjBwaXBlbGluZSglMjJxdWVzdGlvbi1hbnN3ZXJpbmclMjIpJTBBY29udGV4dCUyMCUzRCUyMCUyMiUyMiUyMiUwQSVGMCU5RiVBNCU5NyUyMFRyYW5zZm9ybWVycyUyMGlzJTIwYmFja2VkJTIwYnklMjB0aGUlMjB0aHJlZSUyMG1vc3QlMjBwb3B1bGFyJTIwZGVlcCUyMGxlYXJuaW5nJTIwbGlicmFyaWVzJTIwJUUyJTgwJTk0JTIwSmF4JTJDJTIwUHlUb3JjaCUyQyUyMGFuZCUyMFRlbnNvckZsb3clMjAlRTIlODAlOTQlMjB3aXRoJTIwYSUyMHNlYW1sZXNzJTIwaW50ZWdyYXRpb24lMEFiZXR3ZWVuJTIwdGhlbS4lMjBJdCdzJTIwc3RyYWlnaHRmb3J3YXJkJTIwdG8lMjB0cmFpbiUyMHlvdXIlMjBtb2RlbHMlMjB3aXRoJTIwb25lJTIwYmVmb3JlJTIwbG9hZGluZyUyMHRoZW0lMjBmb3IlMjBpbmZlcmVuY2UlMjB3aXRoJTIwdGhlJTIwb3RoZXIuJTBBJTIyJTIyJTIyJTBBcXVlc3Rpb24lMjAlM0QlMjAlMjJXaGljaCUyMGRlZXAlMjBsZWFybmluZyUyMGxpYnJhcmllcyUyMGJhY2slMjAlRjAlOUYlQTQlOTclMjBUcmFuc2Zvcm1lcnMlM0YlMjIlMEFxdWVzdGlvbl9hbnN3ZXJlcihxdWVzdGlvbiUzRHF1ZXN0aW9uJTJDJTIwY29udGV4dCUzRGNvbnRleHQp",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;
🤗 Transformers is backed by the three most popular deep learning libraries — Jax, PyTorch, and TensorFlow — 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>
question = <span class="hljs-string">&quot;Which deep learning libraries back 🤗 Transformers?&quot;</span>
question_answerer(question=question, context=context)`,wrap:!1}}),Jt=new f({props:{code:"JTdCJ3Njb3JlJyUzQSUyMDAuOTc3NzMlMkMlMEElMjAnc3RhcnQnJTNBJTIwNzglMkMlMEElMjAnZW5kJyUzQSUyMDEwNSUyQyUwQSUyMCdhbnN3ZXInJTNBJTIwJ0pheCUyQyUyMFB5VG9yY2glMjBhbmQlMjBUZW5zb3JGbG93JyU3RA==",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>}`,wrap:!1}}),yt=new f({props:{code:"bG9uZ19jb250ZXh0JTIwJTNEJTIwJTIyJTIyJTIyJTBBJUYwJTlGJUE0JTk3JTIwVHJhbnNmb3JtZXJzJTNBJTIwU3RhdGUlMjBvZiUyMHRoZSUyMEFydCUyME5MUCUwQSUwQSVGMCU5RiVBNCU5NyUyMFRyYW5zZm9ybWVycyUyMHByb3ZpZGVzJTIwdGhvdXNhbmRzJTIwb2YlMjBwcmV0cmFpbmVkJTIwbW9kZWxzJTIwdG8lMjBwZXJmb3JtJTIwdGFza3MlMjBvbiUyMHRleHRzJTIwc3VjaCUyMGFzJTIwY2xhc3NpZmljYXRpb24lMkMlMjBpbmZvcm1hdGlvbiUyMGV4dHJhY3Rpb24lMkMlMEFxdWVzdGlvbiUyMGFuc3dlcmluZyUyQyUyMHN1bW1hcml6YXRpb24lMkMlMjB0cmFuc2xhdGlvbiUyQyUyMHRleHQlMjBnZW5lcmF0aW9uJTIwYW5kJTIwbW9yZSUyMGluJTIwb3ZlciUyMDEwMCUyMGxhbmd1YWdlcy4lMEFJdHMlMjBhaW0lMjBpcyUyMHRvJTIwbWFrZSUyMGN1dHRpbmctZWRnZSUyME5MUCUyMGVhc2llciUyMHRvJTIwdXNlJTIwZm9yJTIwZXZlcnlvbmUuJTBBJTBBJUYwJTlGJUE0JTk3JTIwVHJhbnNmb3JtZXJzJTIwcHJvdmlkZXMlMjBBUElzJTIwdG8lMjBxdWlja2x5JTIwZG93bmxvYWQlMjBhbmQlMjB1c2UlMjB0aG9zZSUyMHByZXRyYWluZWQlMjBtb2RlbHMlMjBvbiUyMGElMjBnaXZlbiUyMHRleHQlMkMlMjBmaW5lLXR1bmUlMjB0aGVtJTIwb24lMjB5b3VyJTIwb3duJTIwZGF0YXNldHMlMjBhbmQlMEF0aGVuJTIwc2hhcmUlMjB0aGVtJTIwd2l0aCUyMHRoZSUyMGNvbW11bml0eSUyMG9uJTIwb3VyJTIwbW9kZWwlMjBodWIuJTIwQXQlMjB0aGUlMjBzYW1lJTIwdGltZSUyQyUyMGVhY2glMjBweXRob24lMjBtb2R1bGUlMjBkZWZpbmluZyUyMGFuJTIwYXJjaGl0ZWN0dXJlJTIwaXMlMjBmdWxseSUyMHN0YW5kYWxvbmUlMjBhbmQlMEFjYW4lMjBiZSUyMG1vZGlmaWVkJTIwdG8lMjBlbmFibGUlMjBxdWljayUyMHJlc2VhcmNoJTIwZXhwZXJpbWVudHMuJTBBJTBBV2h5JTIwc2hvdWxkJTIwSSUyMHVzZSUyMHRyYW5zZm9ybWVycyUzRiUwQSUwQTEuJTIwRWFzeS10by11c2UlMjBzdGF0ZS1vZi10aGUtYXJ0JTIwbW9kZWxzJTNBJTBBJTIwJTIwLSUyMEhpZ2glMjBwZXJmb3JtYW5jZSUyMG9uJTIwTkxVJTIwYW5kJTIwTkxHJTIwdGFza3MuJTBBJTIwJTIwLSUyMExvdyUyMGJhcnJpZXIlMjB0byUyMGVudHJ5JTIwZm9yJTIwZWR1Y2F0b3JzJTIwYW5kJTIwcHJhY3RpdGlvbmVycy4lMEElMjAlMjAtJTIwRmV3JTIwdXNlci1mYWNpbmclMjBhYnN0cmFjdGlvbnMlMjB3aXRoJTIwanVzdCUyMHRocmVlJTIwY2xhc3NlcyUyMHRvJTIwbGVhcm4uJTBBJTIwJTIwLSUyMEElMjB1bmlmaWVkJTIwQVBJJTIwZm9yJTIwdXNpbmclMjBhbGwlMjBvdXIlMjBwcmV0cmFpbmVkJTIwbW9kZWxzLiUwQSUyMCUyMC0lMjBMb3dlciUyMGNvbXB1dGUlMjBjb3N0cyUyQyUyMHNtYWxsZXIlMjBjYXJib24lMjBmb290cHJpbnQlM0ElMEElMEEyLiUyMFJlc2VhcmNoZXJzJTIwY2FuJTIwc2hhcmUlMjB0cmFpbmVkJTIwbW9kZWxzJTIwaW5zdGVhZCUyMG9mJTIwYWx3YXlzJTIwcmV0cmFpbmluZy4lMEElMjAlMjAtJTIwUHJhY3RpdGlvbmVycyUyMGNhbiUyMHJlZHVjZSUyMGNvbXB1dGUlMjB0aW1lJTIwYW5kJTIwcHJvZHVjdGlvbiUyMGNvc3RzLiUwQSUyMCUyMC0lMjBEb3plbnMlMjBvZiUyMGFyY2hpdGVjdHVyZXMlMjB3aXRoJTIwb3ZlciUyMDEwJTJDMDAwJTIwcHJldHJhaW5lZCUyMG1vZGVscyUyQyUyMHNvbWUlMjBpbiUyMG1vcmUlMjB0aGFuJTIwMTAwJTIwbGFuZ3VhZ2VzLiUwQSUwQTMuJTIwQ2hvb3NlJTIwdGhlJTIwcmlnaHQlMjBmcmFtZXdvcmslMjBmb3IlMjBldmVyeSUyMHBhcnQlMjBvZiUyMGElMjBtb2RlbCdzJTIwbGlmZXRpbWUlM0ElMEElMjAlMjAtJTIwVHJhaW4lMjBzdGF0ZS1vZi10aGUtYXJ0JTIwbW9kZWxzJTIwaW4lMjAzJTIwbGluZXMlMjBvZiUyMGNvZGUuJTBBJTIwJTIwLSUyME1vdmUlMjBhJTIwc2luZ2xlJTIwbW9kZWwlMjBiZXR3ZWVuJTIwVEYyLjAlMkZQeVRvcmNoJTIwZnJhbWV3b3JrcyUyMGF0JTIwd2lsbC4lMEElMjAlMjAtJTIwU2VhbWxlc3NseSUyMHBpY2slMjB0aGUlMjByaWdodCUyMGZyYW1ld29yayUyMGZvciUyMHRyYWluaW5nJTJDJTIwZXZhbHVhdGlvbiUyMGFuZCUyMHByb2R1Y3Rpb24uJTBBJTBBNC4lMjBFYXNpbHklMjBjdXN0b21pemUlMjBhJTIwbW9kZWwlMjBvciUyMGFuJTIwZXhhbXBsZSUyMHRvJTIweW91ciUyMG5lZWRzJTNBJTBBJTIwJTIwLSUyMFdlJTIwcHJvdmlkZSUyMGV4YW1wbGVzJTIwZm9yJTIwZWFjaCUyMGFyY2hpdGVjdHVyZSUyMHRvJTIwcmVwcm9kdWNlJTIwdGhlJTIwcmVzdWx0cyUyMHB1Ymxpc2hlZCUyMGJ5JTIwaXRzJTIwb3JpZ2luYWwlMjBhdXRob3JzLiUwQSUyMCUyMC0lMjBNb2RlbCUyMGludGVybmFscyUyMGFyZSUyMGV4cG9zZWQlMjBhcyUyMGNvbnNpc3RlbnRseSUyMGFzJTIwcG9zc2libGUuJTBBJTIwJTIwLSUyME1vZGVsJTIwZmlsZXMlMjBjYW4lMjBiZSUyMHVzZWQlMjBpbmRlcGVuZGVudGx5JTIwb2YlMjB0aGUlMjBsaWJyYXJ5JTIwZm9yJTIwcXVpY2slMjBleHBlcmltZW50cy4lMEElMEElRjAlOUYlQTQlOTclMjBUcmFuc2Zvcm1lcnMlMjBpcyUyMGJhY2tlZCUyMGJ5JTIwdGhlJTIwdGhyZWUlMjBtb3N0JTIwcG9wdWxhciUyMGRlZXAlMjBsZWFybmluZyUyMGxpYnJhcmllcyUyMCVFMiU4MCU5NCUyMEpheCUyQyUyMFB5VG9yY2glMjBhbmQlMjBUZW5zb3JGbG93JTIwJUUyJTgwJTk0JTIwd2l0aCUyMGElMjBzZWFtbGVzcyUyMGludGVncmF0aW9uJTBBYmV0d2VlbiUyMHRoZW0uJTIwSXQncyUyMHN0cmFpZ2h0Zm9yd2FyZCUyMHRvJTIwdHJhaW4lMjB5b3VyJTIwbW9kZWxzJTIwd2l0aCUyMG9uZSUyMGJlZm9yZSUyMGxvYWRpbmclMjB0aGVtJTIwZm9yJTIwaW5mZXJlbmNlJTIwd2l0aCUyMHRoZSUyMG90aGVyLiUwQSUyMiUyMiUyMiUwQXF1ZXN0aW9uX2Fuc3dlcmVyKHF1ZXN0aW9uJTNEcXVlc3Rpb24lMkMlMjBjb250ZXh0JTNEbG9uZ19jb250ZXh0KQ==",highlighted:`long_context = <span class="hljs-string">&quot;&quot;&quot;
🤗 Transformers: State of the Art NLP

🤗 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.

🤗 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.

🤗 Transformers is backed by the three most popular deep learning libraries — Jax, PyTorch and TensorFlow — 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>
question_answerer(question=question, context=long_context)`,wrap:!1}}),dt=new f({props:{code:"JTdCJ3Njb3JlJyUzQSUyMDAuOTcxNDklMkMlMEElMjAnc3RhcnQnJTNBJTIwMTg5MiUyQyUwQSUyMCdlbmQnJTNBJTIwMTkxOSUyQyUwQSUyMCdhbnN3ZXInJTNBJTIwJ0pheCUyQyUyMFB5VG9yY2glMjBhbmQlMjBUZW5zb3JGbG93JyU3RA==",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>}`,wrap:!1}}),wt=new xs({props:{title:"การใช้งานโมเดลสำหรับงาน question answering",local:"การใชงานโมเดลสำหรบงาน-question-answering",headingTag:"h2"}});const On=[Ha,Qa],_e=[];function ta(t,s){return t[0]==="pt"?0:1}C=ta(d),G=_e[C]=On[C](d),Ut=new f({props:{code:"c3RhcnRfbG9naXRzJTIwJTNEJTIwb3V0cHV0cy5zdGFydF9sb2dpdHMlMEFlbmRfbG9naXRzJTIwJTNEJTIwb3V0cHV0cy5lbmRfbG9naXRzJTBBcHJpbnQoc3RhcnRfbG9naXRzLnNoYXBlJTJDJTIwZW5kX2xvZ2l0cy5zaGFwZSk=",highlighted:`start_logits = outputs.start_logits
end_logits = outputs.end_logits
<span class="hljs-built_in">print</span>(start_logits.shape, end_logits.shape)`,wrap:!1}});const ea=[Fa,Ea],ke=[];function la(t,s){return t[0]==="pt"?0:1}W=la(d),R=ke[W]=ea[W](d);const sa=[Sa,Ya],Ze=[];function na(t,s){return t[0]==="pt"?0:1}N=na(d),V=Ze[N]=sa[N](d);const aa=[qa,Aa],Be=[];function ia(t,s){return t[0]==="pt"?0:1}X=ia(d),z=Be[X]=aa[X](d),kt=new f({props:{code:"c2NvcmVzJTIwJTNEJTIwc3RhcnRfcHJvYmFiaWxpdGllcyU1QiUzQSUyQyUyME5vbmUlNUQlMjAqJTIwZW5kX3Byb2JhYmlsaXRpZXMlNUJOb25lJTJDJTIwJTNBJTVE",highlighted:'scores = start_probabilities[:, <span class="hljs-literal">None</span>] * end_probabilities[<span class="hljs-literal">None</span>, :]',wrap:!1}});const ra=[Da,La],$e=[];function ma(t,s){return t[0]==="pt"?0:1}Q=ma(d),H=$e[Q]=ra[Q](d),Bt=new f({props:{code:"bWF4X2luZGV4JTIwJTNEJTIwc2NvcmVzLmFyZ21heCgpLml0ZW0oKSUwQXN0YXJ0X2luZGV4JTIwJTNEJTIwbWF4X2luZGV4JTIwJTJGJTJGJTIwc2NvcmVzLnNoYXBlJTVCMSU1RCUwQWVuZF9pbmRleCUyMCUzRCUyMG1heF9pbmRleCUyMCUyNSUyMHNjb3Jlcy5zaGFwZSU1QjElNUQlMEFwcmludChzY29yZXMlNUJzdGFydF9pbmRleCUyQyUyMGVuZF9pbmRleCU1RCk=",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])`,wrap:!1}}),gt=new f({props:{code:"MC45Nzc3Mw==",highlighted:'<span class="hljs-number">0.97773</span>',wrap:!1}}),nt=new vs({props:{$$slots:{default:[Pa]},$$scope:{ctx:d}}}),xt=new f({props:{code:"aW5wdXRzX3dpdGhfb2Zmc2V0cyUyMCUzRCUyMHRva2VuaXplcihxdWVzdGlvbiUyQyUyMGNvbnRleHQlMkMlMjByZXR1cm5fb2Zmc2V0c19tYXBwaW5nJTNEVHJ1ZSklMEFvZmZzZXRzJTIwJTNEJTIwaW5wdXRzX3dpdGhfb2Zmc2V0cyU1QiUyMm9mZnNldF9tYXBwaW5nJTIyJTVEJTBBJTBBc3RhcnRfY2hhciUyQyUyMF8lMjAlM0QlMjBvZmZzZXRzJTVCc3RhcnRfaW5kZXglNUQlMEFfJTJDJTIwZW5kX2NoYXIlMjAlM0QlMjBvZmZzZXRzJTVCZW5kX2luZGV4JTVEJTBBYW5zd2VyJTIwJTNEJTIwY29udGV4dCU1QnN0YXJ0X2NoYXIlM0FlbmRfY2hhciU1RA==",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]`,wrap:!1}}),Gt=new f({props:{code:"cmVzdWx0JTIwJTNEJTIwJTdCJTBBJTIwJTIwJTIwJTIwJTIyYW5zd2VyJTIyJTNBJTIwYW5zd2VyJTJDJTBBJTIwJTIwJTIwJTIwJTIyc3RhcnQlMjIlM0ElMjBzdGFydF9jaGFyJTJDJTBBJTIwJTIwJTIwJTIwJTIyZW5kJTIyJTNBJTIwZW5kX2NoYXIlMkMlMEElMjAlMjAlMjAlMjAlMjJzY29yZSUyMiUzQSUyMHNjb3JlcyU1QnN0YXJ0X2luZGV4JTJDJTIwZW5kX2luZGV4JTVEJTJDJTBBJTdEJTBBcHJpbnQocmVzdWx0KQ==",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)`,wrap:!1}}),Wt=new f({props:{code:"JTdCJ2Fuc3dlciclM0ElMjAnSmF4JTJDJTIwUHlUb3JjaCUyMGFuZCUyMFRlbnNvckZsb3cnJTJDJTBBJTIwJ3N0YXJ0JyUzQSUyMDc4JTJDJTBBJTIwJ2VuZCclM0ElMjAxMDUlMkMlMEElMjAnc2NvcmUnJTNBJTIwMC45Nzc3MyU3RA==",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>}`,wrap:!1}}),at=new vs({props:{$$slots:{default:[Ka]},$$scope:{ctx:d}}}),Nt=new xs({props:{title:"การจัดการกับบริบทยาว (long contexts)",local:"การจดการกบบรบทยาว-long-contexts",headingTag:"h2"}}),Xt=new f({props:{code:"aW5wdXRzJTIwJTNEJTIwdG9rZW5pemVyKHF1ZXN0aW9uJTJDJTIwbG9uZ19jb250ZXh0KSUwQXByaW50KGxlbihpbnB1dHMlNUIlMjJpbnB1dF9pZHMlMjIlNUQpKQ==",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>]))`,wrap:!1}}),zt=new f({props:{code:"NDYx",highlighted:'<span class="hljs-number">461</span>',wrap:!1}}),Ht=new f({props:{code:"aW5wdXRzJTIwJTNEJTIwdG9rZW5pemVyKHF1ZXN0aW9uJTJDJTIwbG9uZ19jb250ZXh0JTJDJTIwbWF4X2xlbmd0aCUzRDM4NCUyQyUyMHRydW5jYXRpb24lM0QlMjJvbmx5X3NlY29uZCUyMiklMEFwcmludCh0b2tlbml6ZXIuZGVjb2RlKGlucHV0cyU1QiUyMmlucHV0X2lkcyUyMiU1RCkp",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>]))`,wrap:!1}}),Et=new f({props:{code:"JTIyJTIyJTIyJTBBJTVCQ0xTJTVEJTIwV2hpY2glMjBkZWVwJTIwbGVhcm5pbmclMjBsaWJyYXJpZXMlMjBiYWNrJTIwJTVCVU5LJTVEJTIwVHJhbnNmb3JtZXJzJTNGJTIwJTVCU0VQJTVEJTIwJTVCVU5LJTVEJTIwVHJhbnNmb3JtZXJzJTIwJTNBJTIwU3RhdGUlMjBvZiUyMHRoZSUyMEFydCUyME5MUCUwQSUwQSU1QlVOSyU1RCUyMFRyYW5zZm9ybWVycyUyMHByb3ZpZGVzJTIwdGhvdXNhbmRzJTIwb2YlMjBwcmV0cmFpbmVkJTIwbW9kZWxzJTIwdG8lMjBwZXJmb3JtJTIwdGFza3MlMjBvbiUyMHRleHRzJTIwc3VjaCUyMGFzJTIwY2xhc3NpZmljYXRpb24lMkMlMjBpbmZvcm1hdGlvbiUyMGV4dHJhY3Rpb24lMkMlMEFxdWVzdGlvbiUyMGFuc3dlcmluZyUyQyUyMHN1bW1hcml6YXRpb24lMkMlMjB0cmFuc2xhdGlvbiUyQyUyMHRleHQlMjBnZW5lcmF0aW9uJTIwYW5kJTIwbW9yZSUyMGluJTIwb3ZlciUyMDEwMCUyMGxhbmd1YWdlcy4lMEFJdHMlMjBhaW0lMjBpcyUyMHRvJTIwbWFrZSUyMGN1dHRpbmctZWRnZSUyME5MUCUyMGVhc2llciUyMHRvJTIwdXNlJTIwZm9yJTIwZXZlcnlvbmUuJTBBJTBBJTVCVU5LJTVEJTIwVHJhbnNmb3JtZXJzJTIwcHJvdmlkZXMlMjBBUElzJTIwdG8lMjBxdWlja2x5JTIwZG93bmxvYWQlMjBhbmQlMjB1c2UlMjB0aG9zZSUyMHByZXRyYWluZWQlMjBtb2RlbHMlMjBvbiUyMGElMjBnaXZlbiUyMHRleHQlMkMlMjBmaW5lLXR1bmUlMjB0aGVtJTIwb24lMjB5b3VyJTIwb3duJTIwZGF0YXNldHMlMjBhbmQlMEF0aGVuJTIwc2hhcmUlMjB0aGVtJTIwd2l0aCUyMHRoZSUyMGNvbW11bml0eSUyMG9uJTIwb3VyJTIwbW9kZWwlMjBodWIuJTIwQXQlMjB0aGUlMjBzYW1lJTIwdGltZSUyQyUyMGVhY2glMjBweXRob24lMjBtb2R1bGUlMjBkZWZpbmluZyUyMGFuJTIwYXJjaGl0ZWN0dXJlJTIwaXMlMjBmdWxseSUyMHN0YW5kYWxvbmUlMjBhbmQlMEFjYW4lMjBiZSUyMG1vZGlmaWVkJTIwdG8lMjBlbmFibGUlMjBxdWljayUyMHJlc2VhcmNoJTIwZXhwZXJpbWVudHMuJTBBJTBBV2h5JTIwc2hvdWxkJTIwSSUyMHVzZSUyMHRyYW5zZm9ybWVycyUzRiUwQSUwQTEuJTIwRWFzeS10by11c2UlMjBzdGF0ZS1vZi10aGUtYXJ0JTIwbW9kZWxzJTNBJTBBJTIwJTIwLSUyMEhpZ2glMjBwZXJmb3JtYW5jZSUyMG9uJTIwTkxVJTIwYW5kJTIwTkxHJTIwdGFza3MuJTBBJTIwJTIwLSUyMExvdyUyMGJhcnJpZXIlMjB0byUyMGVudHJ5JTIwZm9yJTIwZWR1Y2F0b3JzJTIwYW5kJTIwcHJhY3RpdGlvbmVycy4lMEElMjAlMjAtJTIwRmV3JTIwdXNlci1mYWNpbmclMjBhYnN0cmFjdGlvbnMlMjB3aXRoJTIwanVzdCUyMHRocmVlJTIwY2xhc3NlcyUyMHRvJTIwbGVhcm4uJTBBJTIwJTIwLSUyMEElMjB1bmlmaWVkJTIwQVBJJTIwZm9yJTIwdXNpbmclMjBhbGwlMjBvdXIlMjBwcmV0cmFpbmVkJTIwbW9kZWxzLiUwQSUyMCUyMC0lMjBMb3dlciUyMGNvbXB1dGUlMjBjb3N0cyUyQyUyMHNtYWxsZXIlMjBjYXJib24lMjBmb290cHJpbnQlM0ElMEElMEEyLiUyMFJlc2VhcmNoZXJzJTIwY2FuJTIwc2hhcmUlMjB0cmFpbmVkJTIwbW9kZWxzJTIwaW5zdGVhZCUyMG9mJTIwYWx3YXlzJTIwcmV0cmFpbmluZy4lMEElMjAlMjAtJTIwUHJhY3RpdGlvbmVycyUyMGNhbiUyMHJlZHVjZSUyMGNvbXB1dGUlMjB0aW1lJTIwYW5kJTIwcHJvZHVjdGlvbiUyMGNvc3RzLiUwQSUyMCUyMC0lMjBEb3plbnMlMjBvZiUyMGFyY2hpdGVjdHVyZXMlMjB3aXRoJTIwb3ZlciUyMDEwJTJDMDAwJTIwcHJldHJhaW5lZCUyMG1vZGVscyUyQyUyMHNvbWUlMjBpbiUyMG1vcmUlMjB0aGFuJTIwMTAwJTIwbGFuZ3VhZ2VzLiUwQSUwQTMuJTIwQ2hvb3NlJTIwdGhlJTIwcmlnaHQlMjBmcmFtZXdvcmslMjBmb3IlMjBldmVyeSUyMHBhcnQlMjBvZiUyMGElMjBtb2RlbCdzJTIwbGlmZXRpbWUlM0ElMEElMjAlMjAtJTIwVHJhaW4lMjBzdGF0ZS1vZi10aGUtYXJ0JTIwbW9kZWxzJTIwaW4lMjAzJTIwbGluZXMlMjBvZiUyMGNvZGUuJTBBJTIwJTIwLSUyME1vdmUlMjBhJTIwc2luZ2xlJTIwbW9kZWwlMjBiZXR3ZWVuJTIwVEYyLjAlMkZQeVRvcmNoJTIwZnJhbWV3b3JrcyUyMGF0JTIwd2lsbC4lMEElMjAlMjAtJTIwU2VhbWxlc3NseSUyMHBpY2slMjB0aGUlMjByaWdodCUyMGZyYW1ld29yayUyMGZvciUyMHRyYWluaW5nJTJDJTIwZXZhbHVhdGlvbiUyMGFuZCUyMHByb2R1Y3Rpb24uJTBBJTBBNC4lMjBFYXNpbHklMjBjdXN0b21pemUlMjBhJTIwbW9kZWwlMjBvciUyMGFuJTIwZXhhbXBsZSUyMHRvJTIweW91ciUyMG5lZWRzJTNBJTBBJTIwJTIwLSUyMFdlJTIwcHJvdmlkZSUyMGV4YW1wbGVzJTIwZm9yJTIwZWFjaCUyMGFyY2hpdGVjdHVyZSUyMHRvJTIwcmVwcm9kdWNlJTIwdGhlJTIwcmVzdWx0cyUyMHB1Ymxpc2hlZCUyMGJ5JTIwaXRzJTIwb3JpZ2luYWwlMjBhdXRob3JzLiUwQSUyMCUyMC0lMjBNb2RlbCUyMGludGVybmFsJTIwJTVCU0VQJTVEJTBBJTIyJTIyJTIy",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>`,wrap:!1}}),At=new f({props:{code:"c2VudGVuY2UlMjAlM0QlMjAlMjJUaGlzJTIwc2VudGVuY2UlMjBpcyUyMG5vdCUyMHRvbyUyMGxvbmclMjBidXQlMjB3ZSUyMGFyZSUyMGdvaW5nJTIwdG8lMjBzcGxpdCUyMGl0JTIwYW55d2F5LiUyMiUwQWlucHV0cyUyMCUzRCUyMHRva2VuaXplciglMEElMjAlMjAlMjAlMjBzZW50ZW5jZSUyQyUyMHRydW5jYXRpb24lM0RUcnVlJTJDJTIwcmV0dXJuX292ZXJmbG93aW5nX3Rva2VucyUzRFRydWUlMkMlMjBtYXhfbGVuZ3RoJTNENiUyQyUyMHN0cmlkZSUzRDIlMEEpJTBBJTBBZm9yJTIwaWRzJTIwaW4lMjBpbnB1dHMlNUIlMjJpbnB1dF9pZHMlMjIlNUQlM0ElMEElMjAlMjAlMjAlMjBwcmludCh0b2tlbml6ZXIuZGVjb2RlKGlkcykp",highlighted:`sentence = <span class="hljs-string">&quot;This sentence is not too long but we are going to split it anyway.&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))`,wrap:!1}}),qt=new f({props:{code:"JyU1QkNMUyU1RCUyMFRoaXMlMjBzZW50ZW5jZSUyMGlzJTIwbm90JTIwJTVCU0VQJTVEJyUwQSclNUJDTFMlNUQlMjBpcyUyMG5vdCUyMHRvbyUyMGxvbmclMjAlNUJTRVAlNUQnJTBBJyU1QkNMUyU1RCUyMHRvbyUyMGxvbmclMjBidXQlMjB3ZSUyMCU1QlNFUCU1RCclMEEnJTVCQ0xTJTVEJTIwYnV0JTIwd2UlMjBhcmUlMjBnb2luZyUyMCU1QlNFUCU1RCclMEEnJTVCQ0xTJTVEJTIwYXJlJTIwZ29pbmclMjB0byUyMHNwbGl0JTIwJTVCU0VQJTVEJyUwQSclNUJDTFMlNUQlMjB0byUyMHNwbGl0JTIwaXQlMjBhbnl3YXklMjAlNUJTRVAlNUQnJTBBJyU1QkNMUyU1RCUyMGl0JTIwYW55d2F5LiUyMCU1QlNFUCU1RCc=",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>`,wrap:!1}}),Pt=new f({props:{code:"cHJpbnQoaW5wdXRzLmtleXMoKSk=",highlighted:'<span class="hljs-built_in">print</span>(inputs.keys())',wrap:!1}}),Kt=new f({props:{code:"ZGljdF9rZXlzKCU1QidpbnB1dF9pZHMnJTJDJTIwJ2F0dGVudGlvbl9tYXNrJyUyQyUyMCdvdmVyZmxvd190b19zYW1wbGVfbWFwcGluZyclNUQp",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>])',wrap:!1}}),te=new f({props:{code:"cHJpbnQoaW5wdXRzJTVCJTIyb3ZlcmZsb3dfdG9fc2FtcGxlX21hcHBpbmclMjIlNUQp",highlighted:'<span class="hljs-built_in">print</span>(inputs[<span class="hljs-string">&quot;overflow_to_sample_mapping&quot;</span>])',wrap:!1}}),ee=new f({props:{code:"JTVCMCUyQyUyMDAlMkMlMjAwJTJDJTIwMCUyQyUyMDAlMkMlMjAwJTJDJTIwMCU1RA==",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>]',wrap:!1}}),se=new f({props:{code:"c2VudGVuY2VzJTIwJTNEJTIwJTVCJTBBJTIwJTIwJTIwJTIwJTIyVGhpcyUyMHNlbnRlbmNlJTIwaXMlMjBub3QlMjB0b28lMjBsb25nJTIwYnV0JTIwd2UlMjBhcmUlMjBnb2luZyUyMHRvJTIwc3BsaXQlMjBpdCUyMGFueXdheS4lMjIlMkMlMEElMjAlMjAlMjAlMjAlMjJUaGlzJTIwc2VudGVuY2UlMjBpcyUyMHNob3J0ZXIlMjBidXQlMjB3aWxsJTIwc3RpbGwlMjBnZXQlMjBzcGxpdC4lMjIlMkMlMEElNUQlMEFpbnB1dHMlMjAlM0QlMjB0b2tlbml6ZXIoJTBBJTIwJTIwJTIwJTIwc2VudGVuY2VzJTJDJTIwdHJ1bmNhdGlvbiUzRFRydWUlMkMlMjByZXR1cm5fb3ZlcmZsb3dpbmdfdG9rZW5zJTNEVHJ1ZSUyQyUyMG1heF9sZW5ndGglM0Q2JTJDJTIwc3RyaWRlJTNEMiUwQSklMEElMEFwcmludChpbnB1dHMlNUIlMjJvdmVyZmxvd190b19zYW1wbGVfbWFwcGluZyUyMiU1RCk=",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-string">&quot;This sentence is shorter but will still get split.&quot;</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>])`,wrap:!1}}),ae=new f({props:{code:"JTVCMCUyQyUyMDAlMkMlMjAwJTJDJTIwMCUyQyUyMDAlMkMlMjAwJTJDJTIwMCUyQyUyMDElMkMlMjAxJTJDJTIwMSUyQyUyMDElNUQ=",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>]',wrap:!1}}),me=new f({props:{code:"aW5wdXRzJTIwJTNEJTIwdG9rZW5pemVyKCUwQSUyMCUyMCUyMCUyMHF1ZXN0aW9uJTJDJTBBJTIwJTIwJTIwJTIwbG9uZ19jb250ZXh0JTJDJTBBJTIwJTIwJTIwJTIwc3RyaWRlJTNEMTI4JTJDJTBBJTIwJTIwJTIwJTIwbWF4X2xlbmd0aCUzRDM4NCUyQyUwQSUyMCUyMCUyMCUyMHBhZGRpbmclM0QlMjJsb25nZXN0JTIyJTJDJTBBJTIwJTIwJTIwJTIwdHJ1bmNhdGlvbiUzRCUyMm9ubHlfc2Vjb25kJTIyJTJDJTBBJTIwJTIwJTIwJTIwcmV0dXJuX292ZXJmbG93aW5nX3Rva2VucyUzRFRydWUlMkMlMEElMjAlMjAlMjAlMjByZXR1cm5fb2Zmc2V0c19tYXBwaW5nJTNEVHJ1ZSUyQyUwQSk=",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>,
)`,wrap:!1}});const oa=[ti,Oa],ge=[];function pa(t,s){return t[0]==="pt"?0:1}E=pa(d),F=ge[E]=oa[E](d),ce=new f({props:{code:"b3V0cHV0cyUyMCUzRCUyMG1vZGVsKCoqaW5wdXRzKSUwQSUwQXN0YXJ0X2xvZ2l0cyUyMCUzRCUyMG91dHB1dHMuc3RhcnRfbG9naXRzJTBBZW5kX2xvZ2l0cyUyMCUzRCUyMG91dHB1dHMuZW5kX2xvZ2l0cyUwQXByaW50KHN0YXJ0X2xvZ2l0cy5zaGFwZSUyQyUyMGVuZF9sb2dpdHMuc2hhcGUp",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)`,wrap:!1}});const ca=[li,ei],ve=[];function Ma(t,s){return t[0]==="pt"?0:1}Y=Ma(d),S=ve[Y]=ca[Y](d);const Ja=[ni,si],xe=[];function ua(t,s){return t[0]==="pt"?0:1}A=ua(d),q=xe[A]=Ja[A](d);const ya=[ii,ai],Ce=[];function da(t,s){return t[0]==="pt"?0:1}L=da(d),D=Ce[L]=ya[L](d);const ba=[mi,ri],Ge=[];function wa(t,s){return t[0]==="pt"?0:1}return P=wa(d),K=Ge[P]=ba[P](d),ye=new f({props:{code:"JTVCKDAlMkMlMjAxOCUyQyUyMDAuMzM4NjcpJTJDJTIwKDE3MyUyQyUyMDE4NCUyQyUyMDAuOTcxNDkpJTVE",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>)]',wrap:!1}}),it=new vs({props:{$$slots:{default:[oi]},$$scope:{ctx:d}}}),we=new f({props:{code:"Zm9yJTIwY2FuZGlkYXRlJTJDJTIwb2Zmc2V0JTIwaW4lMjB6aXAoY2FuZGlkYXRlcyUyQyUyMG9mZnNldHMpJTNBJTBBJTIwJTIwJTIwJTIwc3RhcnRfdG9rZW4lMkMlMjBlbmRfdG9rZW4lMkMlMjBzY29yZSUyMCUzRCUyMGNhbmRpZGF0ZSUwQSUyMCUyMCUyMCUyMHN0YXJ0X2NoYXIlMkMlMjBfJTIwJTNEJTIwb2Zmc2V0JTVCc3RhcnRfdG9rZW4lNUQlMEElMjAlMjAlMjAlMjBfJTJDJTIwZW5kX2NoYXIlMjAlM0QlMjBvZmZzZXQlNUJlbmRfdG9rZW4lNUQlMEElMjAlMjAlMjAlMjBhbnN3ZXIlMjAlM0QlMjBsb25nX2NvbnRleHQlNUJzdGFydF9jaGFyJTNBZW5kX2NoYXIlNUQlMEElMjAlMjAlMjAlMjByZXN1bHQlMjAlM0QlMjAlN0IlMjJhbnN3ZXIlMjIlM0ElMjBhbnN3ZXIlMkMlMjAlMjJzdGFydCUyMiUzQSUyMHN0YXJ0X2NoYXIlMkMlMjAlMjJlbmQlMjIlM0ElMjBlbmRfY2hhciUyQyUyMCUyMnNjb3JlJTIyJTNBJTIwc2NvcmUlN0QlMEElMjAlMjAlMjAlMjBwcmludChyZXN1bHQp",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)`,wrap:!1}}),Te=new f({props:{code:"JTdCJ2Fuc3dlciclM0ElMjAnJTVDbiVGMCU5RiVBNCU5NyUyMFRyYW5zZm9ybWVycyUzQSUyMFN0YXRlJTIwb2YlMjB0aGUlMjBBcnQlMjBOTFAnJTJDJTIwJ3N0YXJ0JyUzQSUyMDAlMkMlMjAnZW5kJyUzQSUyMDM3JTJDJTIwJ3Njb3JlJyUzQSUyMDAuMzM4NjclN0QlMEElN0InYW5zd2VyJyUzQSUyMCdKYXglMkMlMjBQeVRvcmNoJTIwYW5kJTIwVGVuc29yRmxvdyclMkMlMjAnc3RhcnQnJTNBJTIwMTg5MiUyQyUyMCdlbmQnJTNBJTIwMTkxOSUyQyUyMCdzY29yZSclM0ElMjAwLjk3MTQ5JTdE",highlighted:`{<span class="hljs-string">&#x27;answer&#x27;</span>: <span class="hljs-string">&#x27;\\n🤗 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>}`,wrap:!1}}),rt=new vs({props:{$$slots:{default:[pi]},$$scope:{ctx:d}}}),Ue=new Wa({props:{source:"https://github.com/huggingface/course/blob/main/chapters/th/chapter6/3b.mdx"}}),{c(){l=b("meta"),i=r(),e=b("p"),c=r(),M(T.$$.fragment),U=r(),M(k.$$.fragment),sl=r(),M(mt.$$.fragment),nl=r(),g.c(),We=r(),ot=b("p"),ot.innerHTML=ln,al=r(),x.c(),Re=r(),M(pt.$$.fragment),il=r(),ct=b("p"),ct.innerHTML=sn,rl=r(),M(Mt.$$.fragment),ml=r(),M(Jt.$$.fragment),ol=r(),ut=b("p"),ut.textContent=nn,pl=r(),M(yt.$$.fragment),cl=r(),M(dt.$$.fragment),Ml=r(),bt=b("p"),bt.textContent=an,Jl=r(),M(wt.$$.fragment),ul=r(),Tt=b("p"),Tt.innerHTML=rn,yl=r(),G.c(),Ne=r(),ht=b("p"),ht.textContent=mn,dl=r(),st=b("div"),st.innerHTML=on,bl=r(),ft=b("p"),ft.textContent=pn,wl=r(),M(Ut.$$.fragment),Tl=r(),R.c(),Ve=r(),jt=b("p"),jt.innerHTML=cn,hl=r(),V.c(),Xe=r(),It=b("p"),It.textContent=Mn,fl=r(),z.c(),ze=r(),j=b("p"),Gs=O(`ตอนนี้ เราสามารถหาค่า argmax ของ probabilities ของจุดเริ่มต้นและจุดสิ้นสุดได้แล้ว
แต่ปัญหาที่อาจจะเกิดขึ้นก็คือ index ของจุดเริ่มต้น นั้นอยู่เกิน index ของจุดสิ้นสุด ดังนั้นเราจึงต้องหาวิธีจัดการปัญหานี้ เราจะคำนวณ probabilities ของ `),Qe=b("code"),Qe.textContent=Jn,Ws=O(" และ "),He=b("code"),He.textContent=un,Rs=O(" ที่เป็นไปได้จริง ซึ่งหมายถึง "),Ee=b("code"),Ee.textContent=yn,Ns=O(" จากนั้นเราจะเลือกใช้แค่ tuple "),Fe=b("code"),Fe.textContent=dn,Vs=O(` ที่มีความเป็นไปได้สูงสุด
สมมติว่า เหตุการณ์ที่ “คำตอบเริ่มต้นที่ `),Ye=b("code"),Ye.textContent=bn,Xs=O("” และ “คำตอบสิ้นสุดที่ "),Se=b("code"),Se.textContent=wn,zs=O("” ไม่มีความเกี่ยวข้องกัน (independent) ความน่าจะเป็นที่ คำตอบจะเริ่มต้นที่ "),Ae=b("code"),Ae.textContent=Tn,Qs=O(" และสิ้นสุดที่ "),qe=b("code"),qe.textContent=hn,Hs=O(` คือ:
`),Ul=new ja(!1),jl=r(),et=b("p"),Es=O("การคำนวณ score ทำได้โดยคำนวณผลคูณทั้งหมดของ"),Il=new ja(!1),_l=O(" โดยที่ "),Le=b("code"),Le.textContent=fn,kl=r(),_t=b("p"),_t.textContent=Un,Zl=r(),M(kt.$$.fragment),Bl=r(),H.c(),De=r(),Zt=b("p"),Zt.innerHTML=jn,$l=r(),M(Bt.$$.fragment),gl=r(),$t=b("p"),$t.textContent=In,vl=r(),M(gt.$$.fragment),xl=r(),M(nt.$$.fragment),Cl=r(),vt=b("p"),vt.innerHTML=_n,Gl=r(),M(xt.$$.fragment),Wl=r(),Ct=b("p"),Ct.textContent=kn,Rl=r(),M(Gt.$$.fragment),Nl=r(),M(Wt.$$.fragment),Vl=r(),Rt=b("p"),Rt.textContent=Zn,Xl=r(),M(at.$$.fragment),zl=r(),M(Nt.$$.fragment),Ql=r(),Vt=b("p"),Vt.innerHTML=Bn,Hl=r(),M(Xt.$$.fragment),El=r(),M(zt.$$.fragment),Fl=r(),Qt=b("p"),Qt.innerHTML=$n,Yl=r(),M(Ht.$$.fragment),Sl=r(),M(Et.$$.fragment),Al=r(),Ft=b("p"),Ft.innerHTML=gn,ql=r(),Yt=b("p"),Yt.innerHTML=vn,Ll=r(),St=b("p"),St.textContent=xn,Dl=r(),M(At.$$.fragment),Pl=r(),M(qt.$$.fragment),Kl=r(),Lt=b("p"),Lt.textContent=Cn,Ol=r(),Dt=b("p"),Dt.textContent=Gn,ts=r(),M(Pt.$$.fragment),es=r(),M(Kt.$$.fragment),ls=r(),Ot=b("p"),Ot.innerHTML=Wn,ss=r(),M(te.$$.fragment),ns=r(),M(ee.$$.fragment),as=r(),le=b("p"),le.textContent=Rn,is=r(),M(se.$$.fragment),rs=r(),ne=b("p"),ne.textContent=Nn,ms=r(),M(ae.$$.fragment),os=r(),ie=b("p"),ie.textContent=Vn,ps=r(),re=b("p"),re.innerHTML=Xn,cs=r(),M(me.$$.fragment),Ms=r(),oe=b("p"),oe.innerHTML=zn,Js=r(),F.c(),Pe=r(),pe=b("p"),pe.textContent=Qn,us=r(),M(ce.$$.fragment),ys=r(),S.c(),Ke=r(),Me=b("p"),Me.textContent=Hn,ds=r(),q.c(),Oe=r(),Je=b("p"),Je.textContent=En,bs=r(),D.c(),tl=r(),ue=b("p"),ue.textContent=Fn,ws=r(),K.c(),el=r(),M(ye.$$.fragment),Ts=r(),de=b("p"),de.textContent=Yn,hs=r(),M(it.$$.fragment),fs=r(),be=b("p"),be.innerHTML=Sn,Us=r(),M(we.$$.fragment),js=r(),M(Te.$$.fragment),Is=r(),he=b("p"),he.textContent=An,_s=r(),M(rt.$$.fragment),ks=r(),fe=b("p"),fe.textContent=qn,Zs=r(),M(Ue.$$.fragment),Bs=r(),ll=b("p"),this.h()},l(t){const s=Ca("svelte-u9bgzb",document.head);l=w(s,"META",{name:!0,content:!0}),s.forEach(n),i=m(t),e=w(t,"P",{}),gs(e).forEach(n),c=m(t),J(T.$$.fragment,t),U=m(t),J(k.$$.fragment,t),sl=m(t),J(mt.$$.fragment,t),nl=m(t),g.l(t),We=m(t),ot=w(t,"P",{"data-svelte-h":!0}),h(ot)!=="svelte-1y1g560"&&(ot.innerHTML=ln),al=m(t),x.l(t),Re=m(t),J(pt.$$.fragment,t),il=m(t),ct=w(t,"P",{"data-svelte-h":!0}),h(ct)!=="svelte-tmj02y"&&(ct.innerHTML=sn),rl=m(t),J(Mt.$$.fragment,t),ml=m(t),J(Jt.$$.fragment,t),ol=m(t),ut=w(t,"P",{"data-svelte-h":!0}),h(ut)!=="svelte-v5cov2"&&(ut.textContent=nn),pl=m(t),J(yt.$$.fragment,t),cl=m(t),J(dt.$$.fragment,t),Ml=m(t),bt=w(t,"P",{"data-svelte-h":!0}),h(bt)!=="svelte-1atxoyq"&&(bt.textContent=an),Jl=m(t),J(wt.$$.fragment,t),ul=m(t),Tt=w(t,"P",{"data-svelte-h":!0}),h(Tt)!=="svelte-l8m0xk"&&(Tt.innerHTML=rn),yl=m(t),G.l(t),Ne=m(t),ht=w(t,"P",{"data-svelte-h":!0}),h(ht)!=="svelte-17wzyec"&&(ht.textContent=mn),dl=m(t),st=w(t,"DIV",{class:!0,"data-svelte-h":!0}),h(st)!=="svelte-47wedv"&&(st.innerHTML=on),bl=m(t),ft=w(t,"P",{"data-svelte-h":!0}),h(ft)!=="svelte-10j6uaj"&&(ft.textContent=pn),wl=m(t),J(Ut.$$.fragment,t),Tl=m(t),R.l(t),Ve=m(t),jt=w(t,"P",{"data-svelte-h":!0}),h(jt)!=="svelte-psx7g"&&(jt.innerHTML=cn),hl=m(t),V.l(t),Xe=m(t),It=w(t,"P",{"data-svelte-h":!0}),h(It)!=="svelte-1ihn1yv"&&(It.textContent=Mn),fl=m(t),z.l(t),ze=m(t),j=w(t,"P",{});var I=gs(j);Gs=tt(I,`ตอนนี้ เราสามารถหาค่า argmax ของ probabilities ของจุดเริ่มต้นและจุดสิ้นสุดได้แล้ว
แต่ปัญหาที่อาจจะเกิดขึ้นก็คือ index ของจุดเริ่มต้น นั้นอยู่เกิน index ของจุดสิ้นสุด ดังนั้นเราจึงต้องหาวิธีจัดการปัญหานี้ เราจะคำนวณ probabilities ของ `),Qe=w(I,"CODE",{"data-svelte-h":!0}),h(Qe)!=="svelte-8eqb3b"&&(Qe.textContent=Jn),Ws=tt(I," และ "),He=w(I,"CODE",{"data-svelte-h":!0}),h(He)!=="svelte-9cistc"&&(He.textContent=un),Rs=tt(I," ที่เป็นไปได้จริง ซึ่งหมายถึง "),Ee=w(I,"CODE",{"data-svelte-h":!0}),h(Ee)!=="svelte-1kp3szf"&&(Ee.textContent=yn),Ns=tt(I," จากนั้นเราจะเลือกใช้แค่ tuple "),Fe=w(I,"CODE",{"data-svelte-h":!0}),h(Fe)!=="svelte-boh5bq"&&(Fe.textContent=dn),Vs=tt(I,` ที่มีความเป็นไปได้สูงสุด
สมมติว่า เหตุการณ์ที่ “คำตอบเริ่มต้นที่ `),Ye=w(I,"CODE",{"data-svelte-h":!0}),h(Ye)!=="svelte-8eqb3b"&&(Ye.textContent=bn),Xs=tt(I,"” และ “คำตอบสิ้นสุดที่ "),Se=w(I,"CODE",{"data-svelte-h":!0}),h(Se)!=="svelte-9cistc"&&(Se.textContent=wn),zs=tt(I,"” ไม่มีความเกี่ยวข้องกัน (independent) ความน่าจะเป็นที่ คำตอบจะเริ่มต้นที่ "),Ae=w(I,"CODE",{"data-svelte-h":!0}),h(Ae)!=="svelte-8eqb3b"&&(Ae.textContent=Tn),Qs=tt(I," และสิ้นสุดที่ "),qe=w(I,"CODE",{"data-svelte-h":!0}),h(qe)!=="svelte-9cistc"&&(qe.textContent=hn),Hs=tt(I,` คือ:
`),Ul=Ia(I,!1),I.forEach(n),jl=m(t),et=w(t,"P",{});var lt=gs(et);Es=tt(lt,"การคำนวณ score ทำได้โดยคำนวณผลคูณทั้งหมดของ"),Il=Ia(lt,!1),_l=tt(lt," โดยที่ "),Le=w(lt,"CODE",{"data-svelte-h":!0}),h(Le)!=="svelte-1kp3szf"&&(Le.textContent=fn),lt.forEach(n),kl=m(t),_t=w(t,"P",{"data-svelte-h":!0}),h(_t)!=="svelte-19m0rud"&&(_t.textContent=Un),Zl=m(t),J(kt.$$.fragment,t),Bl=m(t),H.l(t),De=m(t),Zt=w(t,"P",{"data-svelte-h":!0}),h(Zt)!=="svelte-tdr177"&&(Zt.innerHTML=jn),$l=m(t),J(Bt.$$.fragment,t),gl=m(t),$t=w(t,"P",{"data-svelte-h":!0}),h($t)!=="svelte-puutj5"&&($t.textContent=In),vl=m(t),J(gt.$$.fragment,t),xl=m(t),J(nt.$$.fragment,t),Cl=m(t),vt=w(t,"P",{"data-svelte-h":!0}),h(vt)!=="svelte-1tpr9s"&&(vt.innerHTML=_n),Gl=m(t),J(xt.$$.fragment,t),Wl=m(t),Ct=w(t,"P",{"data-svelte-h":!0}),h(Ct)!=="svelte-1vuhqzj"&&(Ct.textContent=kn),Rl=m(t),J(Gt.$$.fragment,t),Nl=m(t),J(Wt.$$.fragment,t),Vl=m(t),Rt=w(t,"P",{"data-svelte-h":!0}),h(Rt)!=="svelte-1awnsfs"&&(Rt.textContent=Zn),Xl=m(t),J(at.$$.fragment,t),zl=m(t),J(Nt.$$.fragment,t),Ql=m(t),Vt=w(t,"P",{"data-svelte-h":!0}),h(Vt)!=="svelte-14p8ixq"&&(Vt.innerHTML=Bn),Hl=m(t),J(Xt.$$.fragment,t),El=m(t),J(zt.$$.fragment,t),Fl=m(t),Qt=w(t,"P",{"data-svelte-h":!0}),h(Qt)!=="svelte-13ybocv"&&(Qt.innerHTML=$n),Yl=m(t),J(Ht.$$.fragment,t),Sl=m(t),J(Et.$$.fragment,t),Al=m(t),Ft=w(t,"P",{"data-svelte-h":!0}),h(Ft)!=="svelte-1gp042a"&&(Ft.innerHTML=gn),ql=m(t),Yt=w(t,"P",{"data-svelte-h":!0}),h(Yt)!=="svelte-zxg9vy"&&(Yt.innerHTML=vn),Ll=m(t),St=w(t,"P",{"data-svelte-h":!0}),h(St)!=="svelte-bt81y7"&&(St.textContent=xn),Dl=m(t),J(At.$$.fragment,t),Pl=m(t),J(qt.$$.fragment,t),Kl=m(t),Lt=w(t,"P",{"data-svelte-h":!0}),h(Lt)!=="svelte-1gvxhgv"&&(Lt.textContent=Cn),Ol=m(t),Dt=w(t,"P",{"data-svelte-h":!0}),h(Dt)!=="svelte-l0uwqk"&&(Dt.textContent=Gn),ts=m(t),J(Pt.$$.fragment,t),es=m(t),J(Kt.$$.fragment,t),ls=m(t),Ot=w(t,"P",{"data-svelte-h":!0}),h(Ot)!=="svelte-k5gtjs"&&(Ot.innerHTML=Wn),ss=m(t),J(te.$$.fragment,t),ns=m(t),J(ee.$$.fragment,t),as=m(t),le=w(t,"P",{"data-svelte-h":!0}),h(le)!=="svelte-ivznwp"&&(le.textContent=Rn),is=m(t),J(se.$$.fragment,t),rs=m(t),ne=w(t,"P",{"data-svelte-h":!0}),h(ne)!=="svelte-16eh5ge"&&(ne.textContent=Nn),ms=m(t),J(ae.$$.fragment,t),os=m(t),ie=w(t,"P",{"data-svelte-h":!0}),h(ie)!=="svelte-mvmwjh"&&(ie.textContent=Vn),ps=m(t),re=w(t,"P",{"data-svelte-h":!0}),h(re)!=="svelte-1knj1si"&&(re.innerHTML=Xn),cs=m(t),J(me.$$.fragment,t),Ms=m(t),oe=w(t,"P",{"data-svelte-h":!0}),h(oe)!=="svelte-5zg0ke"&&(oe.innerHTML=zn),Js=m(t),F.l(t),Pe=m(t),pe=w(t,"P",{"data-svelte-h":!0}),h(pe)!=="svelte-3e6ghp"&&(pe.textContent=Qn),us=m(t),J(ce.$$.fragment,t),ys=m(t),S.l(t),Ke=m(t),Me=w(t,"P",{"data-svelte-h":!0}),h(Me)!=="svelte-mgk1n9"&&(Me.textContent=Hn),ds=m(t),q.l(t),Oe=m(t),Je=w(t,"P",{"data-svelte-h":!0}),h(Je)!=="svelte-1rc61wr"&&(Je.textContent=En),bs=m(t),D.l(t),tl=m(t),ue=w(t,"P",{"data-svelte-h":!0}),h(ue)!=="svelte-8i7goq"&&(ue.textContent=Fn),ws=m(t),K.l(t),el=m(t),J(ye.$$.fragment,t),Ts=m(t),de=w(t,"P",{"data-svelte-h":!0}),h(de)!=="svelte-1wvnuzu"&&(de.textContent=Yn),hs=m(t),J(it.$$.fragment,t),fs=m(t),be=w(t,"P",{"data-svelte-h":!0}),h(be)!=="svelte-174er3z"&&(be.innerHTML=Sn),Us=m(t),J(we.$$.fragment,t),js=m(t),J(Te.$$.fragment,t),Is=m(t),he=w(t,"P",{"data-svelte-h":!0}),h(he)!=="svelte-249oiy"&&(he.textContent=An),_s=m(t),J(rt.$$.fragment,t),ks=m(t),fe=w(t,"P",{"data-svelte-h":!0}),h(fe)!=="svelte-1jfx96i"&&(fe.textContent=qn),Zs=m(t),J(Ue.$$.fragment,t),Bs=m(t),ll=w(t,"P",{}),gs(ll).forEach(n),this.h()},h(){en(l,"name","hf:doc:metadata"),en(l,"content",Mi),en(st,"class","flex justify-center"),Ul.a=null,Il.a=_l},m(t,s){_(document.head,l),a(t,i,s),a(t,e,s),a(t,c,s),u(T,t,s),a(t,U,s),u(k,t,s),a(t,sl,s),u(mt,t,s),a(t,nl,s),je[$].m(t,s),a(t,We,s),a(t,ot,s),a(t,al,s),Ie[v].m(t,s),a(t,Re,s),u(pt,t,s),a(t,il,s),a(t,ct,s),a(t,rl,s),u(Mt,t,s),a(t,ml,s),u(Jt,t,s),a(t,ol,s),a(t,ut,s),a(t,pl,s),u(yt,t,s),a(t,cl,s),u(dt,t,s),a(t,Ml,s),a(t,bt,s),a(t,Jl,s),u(wt,t,s),a(t,ul,s),a(t,Tt,s),a(t,yl,s),_e[C].m(t,s),a(t,Ne,s),a(t,ht,s),a(t,dl,s),a(t,st,s),a(t,bl,s),a(t,ft,s),a(t,wl,s),u(Ut,t,s),a(t,Tl,s),ke[W].m(t,s),a(t,Ve,s),a(t,jt,s),a(t,hl,s),Ze[N].m(t,s),a(t,Xe,s),a(t,It,s),a(t,fl,s),Be[X].m(t,s),a(t,ze,s),a(t,j,s),_(j,Gs),_(j,Qe),_(j,Ws),_(j,He),_(j,Rs),_(j,Ee),_(j,Ns),_(j,Fe),_(j,Vs),_(j,Ye),_(j,Xs),_(j,Se),_(j,zs),_(j,Ae),_(j,Qs),_(j,qe),_(j,Hs),Ul.m(Za,j),a(t,jl,s),a(t,et,s),_(et,Es),Il.m(Ba,et),_(et,_l),_(et,Le),a(t,kl,s),a(t,_t,s),a(t,Zl,s),u(kt,t,s),a(t,Bl,s),$e[Q].m(t,s),a(t,De,s),a(t,Zt,s),a(t,$l,s),u(Bt,t,s),a(t,gl,s),a(t,$t,s),a(t,vl,s),u(gt,t,s),a(t,xl,s),u(nt,t,s),a(t,Cl,s),a(t,vt,s),a(t,Gl,s),u(xt,t,s),a(t,Wl,s),a(t,Ct,s),a(t,Rl,s),u(Gt,t,s),a(t,Nl,s),u(Wt,t,s),a(t,Vl,s),a(t,Rt,s),a(t,Xl,s),u(at,t,s),a(t,zl,s),u(Nt,t,s),a(t,Ql,s),a(t,Vt,s),a(t,Hl,s),u(Xt,t,s),a(t,El,s),u(zt,t,s),a(t,Fl,s),a(t,Qt,s),a(t,Yl,s),u(Ht,t,s),a(t,Sl,s),u(Et,t,s),a(t,Al,s),a(t,Ft,s),a(t,ql,s),a(t,Yt,s),a(t,Ll,s),a(t,St,s),a(t,Dl,s),u(At,t,s),a(t,Pl,s),u(qt,t,s),a(t,Kl,s),a(t,Lt,s),a(t,Ol,s),a(t,Dt,s),a(t,ts,s),u(Pt,t,s),a(t,es,s),u(Kt,t,s),a(t,ls,s),a(t,Ot,s),a(t,ss,s),u(te,t,s),a(t,ns,s),u(ee,t,s),a(t,as,s),a(t,le,s),a(t,is,s),u(se,t,s),a(t,rs,s),a(t,ne,s),a(t,ms,s),u(ae,t,s),a(t,os,s),a(t,ie,s),a(t,ps,s),a(t,re,s),a(t,cs,s),u(me,t,s),a(t,Ms,s),a(t,oe,s),a(t,Js,s),ge[E].m(t,s),a(t,Pe,s),a(t,pe,s),a(t,us,s),u(ce,t,s),a(t,ys,s),ve[Y].m(t,s),a(t,Ke,s),a(t,Me,s),a(t,ds,s),xe[A].m(t,s),a(t,Oe,s),a(t,Je,s),a(t,bs,s),Ce[L].m(t,s),a(t,tl,s),a(t,ue,s),a(t,ws,s),Ge[P].m(t,s),a(t,el,s),u(ye,t,s),a(t,Ts,s),a(t,de,s),a(t,hs,s),u(it,t,s),a(t,fs,s),a(t,be,s),a(t,Us,s),u(we,t,s),a(t,js,s),u(Te,t,s),a(t,Is,s),a(t,he,s),a(t,_s,s),u(rt,t,s),a(t,ks,s),a(t,fe,s),a(t,Zs,s),u(Ue,t,s),a(t,Bs,s),a(t,ll,s),$s=!0},p(t,[s]){const I={};s&1&&(I.fw=t[0]),T.$set(I);let lt=$;$=Dn(t),$!==lt&&(B(),o(je[lt],1,1,()=>{je[lt]=null}),Z(),g=je[$],g||(g=je[$]=Ln[$](t),g.c()),p(g,1),g.m(We.parentNode,We));let Fs=v;v=Kn(t),v!==Fs&&(B(),o(Ie[Fs],1,1,()=>{Ie[Fs]=null}),Z(),x=Ie[v],x||(x=Ie[v]=Pn[v](t),x.c()),p(x,1),x.m(Re.parentNode,Re));let Ys=C;C=ta(t),C!==Ys&&(B(),o(_e[Ys],1,1,()=>{_e[Ys]=null}),Z(),G=_e[C],G||(G=_e[C]=On[C](t),G.c()),p(G,1),G.m(Ne.parentNode,Ne));let Ss=W;W=la(t),W!==Ss&&(B(),o(ke[Ss],1,1,()=>{ke[Ss]=null}),Z(),R=ke[W],R||(R=ke[W]=ea[W](t),R.c()),p(R,1),R.m(Ve.parentNode,Ve));let As=N;N=na(t),N!==As&&(B(),o(Ze[As],1,1,()=>{Ze[As]=null}),Z(),V=Ze[N],V||(V=Ze[N]=sa[N](t),V.c()),p(V,1),V.m(Xe.parentNode,Xe));let qs=X;X=ia(t),X!==qs&&(B(),o(Be[qs],1,1,()=>{Be[qs]=null}),Z(),z=Be[X],z||(z=Be[X]=aa[X](t),z.c()),p(z,1),z.m(ze.parentNode,ze));let Ls=Q;Q=ma(t),Q!==Ls&&(B(),o($e[Ls],1,1,()=>{$e[Ls]=null}),Z(),H=$e[Q],H||(H=$e[Q]=ra[Q](t),H.c()),p(H,1),H.m(De.parentNode,De));const Ta={};s&2&&(Ta.$$scope={dirty:s,ctx:t}),nt.$set(Ta);const ha={};s&2&&(ha.$$scope={dirty:s,ctx:t}),at.$set(ha);let Ds=E;E=pa(t),E!==Ds&&(B(),o(ge[Ds],1,1,()=>{ge[Ds]=null}),Z(),F=ge[E],F||(F=ge[E]=oa[E](t),F.c()),p(F,1),F.m(Pe.parentNode,Pe));let Ps=Y;Y=Ma(t),Y!==Ps&&(B(),o(ve[Ps],1,1,()=>{ve[Ps]=null}),Z(),S=ve[Y],S||(S=ve[Y]=ca[Y](t),S.c()),p(S,1),S.m(Ke.parentNode,Ke));let Ks=A;A=ua(t),A!==Ks&&(B(),o(xe[Ks],1,1,()=>{xe[Ks]=null}),Z(),q=xe[A],q||(q=xe[A]=Ja[A](t),q.c()),p(q,1),q.m(Oe.parentNode,Oe));let Os=L;L=da(t),L!==Os&&(B(),o(Ce[Os],1,1,()=>{Ce[Os]=null}),Z(),D=Ce[L],D||(D=Ce[L]=ya[L](t),D.c()),p(D,1),D.m(tl.parentNode,tl));let tn=P;P=wa(t),P!==tn&&(B(),o(Ge[tn],1,1,()=>{Ge[tn]=null}),Z(),K=Ge[P],K||(K=Ge[P]=ba[P](t),K.c()),p(K,1),K.m(el.parentNode,el));const fa={};s&2&&(fa.$$scope={dirty:s,ctx:t}),it.$set(fa);const Ua={};s&2&&(Ua.$$scope={dirty:s,ctx:t}),rt.$set(Ua)},i(t){$s||(p(T.$$.fragment,t),p(k.$$.fragment,t),p(mt.$$.fragment,t),p(g),p(x),p(pt.$$.fragment,t),p(Mt.$$.fragment,t),p(Jt.$$.fragment,t),p(yt.$$.fragment,t),p(dt.$$.fragment,t),p(wt.$$.fragment,t),p(G),p(Ut.$$.fragment,t),p(R),p(V),p(z),p(kt.$$.fragment,t),p(H),p(Bt.$$.fragment,t),p(gt.$$.fragment,t),p(nt.$$.fragment,t),p(xt.$$.fragment,t),p(Gt.$$.fragment,t),p(Wt.$$.fragment,t),p(at.$$.fragment,t),p(Nt.$$.fragment,t),p(Xt.$$.fragment,t),p(zt.$$.fragment,t),p(Ht.$$.fragment,t),p(Et.$$.fragment,t),p(At.$$.fragment,t),p(qt.$$.fragment,t),p(Pt.$$.fragment,t),p(Kt.$$.fragment,t),p(te.$$.fragment,t),p(ee.$$.fragment,t),p(se.$$.fragment,t),p(ae.$$.fragment,t),p(me.$$.fragment,t),p(F),p(ce.$$.fragment,t),p(S),p(q),p(D),p(K),p(ye.$$.fragment,t),p(it.$$.fragment,t),p(we.$$.fragment,t),p(Te.$$.fragment,t),p(rt.$$.fragment,t),p(Ue.$$.fragment,t),$s=!0)},o(t){o(T.$$.fragment,t),o(k.$$.fragment,t),o(mt.$$.fragment,t),o(g),o(x),o(pt.$$.fragment,t),o(Mt.$$.fragment,t),o(Jt.$$.fragment,t),o(yt.$$.fragment,t),o(dt.$$.fragment,t),o(wt.$$.fragment,t),o(G),o(Ut.$$.fragment,t),o(R),o(V),o(z),o(kt.$$.fragment,t),o(H),o(Bt.$$.fragment,t),o(gt.$$.fragment,t),o(nt.$$.fragment,t),o(xt.$$.fragment,t),o(Gt.$$.fragment,t),o(Wt.$$.fragment,t),o(at.$$.fragment,t),o(Nt.$$.fragment,t),o(Xt.$$.fragment,t),o(zt.$$.fragment,t),o(Ht.$$.fragment,t),o(Et.$$.fragment,t),o(At.$$.fragment,t),o(qt.$$.fragment,t),o(Pt.$$.fragment,t),o(Kt.$$.fragment,t),o(te.$$.fragment,t),o(ee.$$.fragment,t),o(se.$$.fragment,t),o(ae.$$.fragment,t),o(me.$$.fragment,t),o(F),o(ce.$$.fragment,t),o(S),o(q),o(D),o(K),o(ye.$$.fragment,t),o(it.$$.fragment,t),o(we.$$.fragment,t),o(Te.$$.fragment,t),o(rt.$$.fragment,t),o(Ue.$$.fragment,t),$s=!1},d(t){t&&(n(i),n(e),n(c),n(U),n(sl),n(nl),n(We),n(ot),n(al),n(Re),n(il),n(ct),n(rl),n(ml),n(ol),n(ut),n(pl),n(cl),n(Ml),n(bt),n(Jl),n(ul),n(Tt),n(yl),n(Ne),n(ht),n(dl),n(st),n(bl),n(ft),n(wl),n(Tl),n(Ve),n(jt),n(hl),n(Xe),n(It),n(fl),n(ze),n(j),n(jl),n(et),n(kl),n(_t),n(Zl),n(Bl),n(De),n(Zt),n($l),n(gl),n($t),n(vl),n(xl),n(Cl),n(vt),n(Gl),n(Wl),n(Ct),n(Rl),n(Nl),n(Vl),n(Rt),n(Xl),n(zl),n(Ql),n(Vt),n(Hl),n(El),n(Fl),n(Qt),n(Yl),n(Sl),n(Al),n(Ft),n(ql),n(Yt),n(Ll),n(St),n(Dl),n(Pl),n(Kl),n(Lt),n(Ol),n(Dt),n(ts),n(es),n(ls),n(Ot),n(ss),n(ns),n(as),n(le),n(is),n(rs),n(ne),n(ms),n(os),n(ie),n(ps),n(re),n(cs),n(Ms),n(oe),n(Js),n(Pe),n(pe),n(us),n(ys),n(Ke),n(Me),n(ds),n(Oe),n(Je),n(bs),n(tl),n(ue),n(ws),n(el),n(Ts),n(de),n(hs),n(fs),n(be),n(Us),n(js),n(Is),n(he),n(_s),n(ks),n(fe),n(Zs),n(Bs),n(ll)),n(l),y(T,t),y(k,t),y(mt,t),je[$].d(t),Ie[v].d(t),y(pt,t),y(Mt,t),y(Jt,t),y(yt,t),y(dt,t),y(wt,t),_e[C].d(t),y(Ut,t),ke[W].d(t),Ze[N].d(t),Be[X].d(t),y(kt,t),$e[Q].d(t),y(Bt,t),y(gt,t),y(nt,t),y(xt,t),y(Gt,t),y(Wt,t),y(at,t),y(Nt,t),y(Xt,t),y(zt,t),y(Ht,t),y(Et,t),y(At,t),y(qt,t),y(Pt,t),y(Kt,t),y(te,t),y(ee,t),y(se,t),y(ae,t),y(me,t),ge[E].d(t),y(ce,t),ve[Y].d(t),xe[A].d(t),Ce[L].d(t),Ge[P].d(t),y(ye,t),y(it,t),y(we,t),y(Te,t),y(rt,t),y(Ue,t)}}}const Mi='{"title":"การใช้งานตัวตัดคำแบบเร็ว (Fast tokenizers) ใน QA pipeline","local":"การใชงานตวตดคำแบบเรว-fast-tokenizers-ใน-qa-pipeline","sections":[{"title":"การใช้ question-answering pipeline","local":"การใช-question-answering-pipeline","sections":[],"depth":2},{"title":"การใช้งานโมเดลสำหรับงาน question answering","local":"การใชงานโมเดลสำหรบงาน-question-answering","sections":[],"depth":2},{"title":"การจัดการกับบริบทยาว (long contexts)","local":"การจดการกบบรบทยาว-long-contexts","sections":[],"depth":2}],"depth":1}';function Ji(d,l,i){let e="pt";return ga(()=>{const c=new URLSearchParams(window.location.search);i(0,e=c.get("fw")||"pt")}),[e]}class Ui extends va{constructor(l){super(),xa(this,l,Ji,ci,$a,{})}}export{Ui as component};
