Buckets:
| import{s as Za,o as Ba,n as vs}from"../chunks/scheduler.37c15a92.js";import{S as $a,i as ga,g as b,s as r,r as M,m as O,H as fa,A as va,h as w,f as n,c as m,j as Bs,u as J,x as h,n as tt,E as Ua,k as Os,y as _,a,v as u,t as o,b as Z,d as p,w as y,p as B}from"../chunks/index.2bf4358c.js";import{T as $s}from"../chunks/Tip.363c041f.js";import{Y as ja}from"../chunks/Youtube.1e50a667.js";import{C as f}from"../chunks/CodeBlock.4e987730.js";import{C as Ia}from"../chunks/CourseFloatingBanner.6add7356.js";import{F as xa}from"../chunks/FrameworkSwitchCourse.8d4d4ab6.js";import{H as gs,E as Ca}from"../chunks/getInferenceSnippets.24b50994.js";function Ga(d){let l,i;return l=new Ia({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 Wa(d){let l,i;return l=new Ia({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 Ra(d){let l,i;return l=new ja({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 Na(d){let l,i;return l=new ja({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 Va(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">"distilbert-base-cased-distilled-squad"</span> | |
| tokenizer = AutoTokenizer.from_pretrained(model_checkpoint) | |
| model = TFAutoModelForQuestionAnswering.from_pretrained(model_checkpoint) | |
| inputs = tokenizer(question, context, return_tensors=<span class="hljs-string">"tf"</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 Xa(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">"distilbert-base-cased-distilled-squad"</span> | |
| tokenizer = AutoTokenizer.from_pretrained(model_checkpoint) | |
| model = AutoModelForQuestionAnswering.from_pretrained(model_checkpoint) | |
| inputs = tokenizer(question, context, return_tensors=<span class="hljs-string">"pt"</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 za(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 Qa(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 Ha(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 Ea(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 Fa(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 Ya(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 Sa(d){let l,i="จากนั้นเราจะ mask ค่าตรงที่ <code>start_index > 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 Aa(d){let l,i="จากนั้นเราจะ mask ค่าตรงที่ <code>start_index > 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 qa(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:vs,d(e){e&&n(l)}}}function La(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:vs,d(e){e&&n(l)}}}function Da(d){let l,i,e,c;return l=new f({props:{code:"XyUyMCUzRCUyMGlucHV0cy5wb3AoJTIyb3ZlcmZsb3dfdG9fc2FtcGxlX21hcHBpbmclMjIpJTBBb2Zmc2V0cyUyMCUzRCUyMGlucHV0cy5wb3AoJTIyb2Zmc2V0X21hcHBpbmclMjIpJTBBJTBBaW5wdXRzJTIwJTNEJTIwaW5wdXRzLmNvbnZlcnRfdG9fdGVuc29ycyglMjJ0ZiUyMiklMEFwcmludChpbnB1dHMlNUIlMjJpbnB1dF9pZHMlMjIlNUQuc2hhcGUp",highlighted:`_ = inputs.pop(<span class="hljs-string">"overflow_to_sample_mapping"</span>) | |
| offsets = inputs.pop(<span class="hljs-string">"offset_mapping"</span>) | |
| inputs = inputs.convert_to_tensors(<span class="hljs-string">"tf"</span>) | |
| <span class="hljs-built_in">print</span>(inputs[<span class="hljs-string">"input_ids"</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 Pa(d){let l,i,e,c;return l=new f({props:{code:"XyUyMCUzRCUyMGlucHV0cy5wb3AoJTIyb3ZlcmZsb3dfdG9fc2FtcGxlX21hcHBpbmclMjIpJTBBb2Zmc2V0cyUyMCUzRCUyMGlucHV0cy5wb3AoJTIyb2Zmc2V0X21hcHBpbmclMjIpJTBBJTBBaW5wdXRzJTIwJTNEJTIwaW5wdXRzLmNvbnZlcnRfdG9fdGVuc29ycyglMjJwdCUyMiklMEFwcmludChpbnB1dHMlNUIlMjJpbnB1dF9pZHMlMjIlNUQuc2hhcGUp",highlighted:`_ = inputs.pop(<span class="hljs-string">"overflow_to_sample_mapping"</span>) | |
| offsets = inputs.pop(<span class="hljs-string">"offset_mapping"</span>) | |
| inputs = inputs.convert_to_tensors(<span class="hljs-string">"pt"</span>) | |
| <span class="hljs-built_in">print</span>(inputs[<span class="hljs-string">"input_ids"</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 Ka(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 Oa(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 ti(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">"attention_mask"</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 ei(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">"attention_mask"</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 li(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 si(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 ni(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 ai(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 ii(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:vs,d(e){e&&n(l)}}}function ri(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:vs,d(e){e&&n(l)}}}function mi(d){let l,i,e,c,T,U,k,ll,$,g,Ge,mt,tn=`ในบทนี้ เราจะเรียนเกี่ยวกับการใช้งาน pipeline เพื่อทำ <code>question-answering</code> และดูว่าเราจะสามารถใช้ข้อมูลจาก offset เพื่อเอาไว้หาคำตอบให้กับคำถาม input จากบริบทรอบๆ (context) ได้อย่างไร | |
| ขั้นตอนนี้จะคล้ายๆกับตอนที่เราใช้ offset เพื่อรวมรวม entity ประเภทเดียวกันเข้าด้วยกัน ในบทที่แล้ว | |
| จากนั้น เราจะมาดูกันว่าเราจะจัดการกับ context ที่ยาวมากๆ จนบางส่วนต้องถูกตัดทอนออกได้อย่างไร คุณสามารถข้ามส่วนนี้หากคุณไม่สนใจ question answering`,sl,v,x,We,ot,nl,pt,en='อย่างที่คุณได้เรียนใน<a href="/course/chapter1">บทที่ 1</a> เราสามารถใช้ <code>question-answering</code> pipeline เพื่อคำนวณคำตอบของคำถาม input ได้ :',al,ct,il,Mt,rl,Jt,ln="ใน pipeline อื่นๆ เราไม่สามารถตัดทอนและแยกข้อความที่ยาวเกินกว่าความยาวสูงสุดที่โมเดลกำหนดได้ (และอาจพลาดตัดข้อมูลที่ส่วนท้ายของเอกสารได้ด้วย) แต่ pipeline ที่เราจะเรียนกันนี้ สามารถจัดการกับ context ที่ยาวมากได้ และจะ return คำตอบให้กับคำถาม แม้ว่าจะอยู่ในตอนท้าย:",ml,ut,ol,yt,pl,dt,sn="เรามาดูกันว่ามันทำงานอย่างไร!",cl,bt,Ml,wt,nn=`เช่นเดียวกับ 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>):`,Jl,C,G,Re,Tt,an="เราจะทำการตัดคำให้กับส่วนที่เป็นคำถามและส่วน context ไปด้วยกัน โดยจะตัดคำให้กับส่วนคำถามก่อน",ul,st,rn='<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"/>',yl,ht,mn=`โมเดลสำหรับ question answering นั้นทำงานแตกต่างไปจากโมเดลอื่น ที่คุณเคยเห็นมาแล้วเล็กน้อย จากภาพด้านบน | |
| โมเดลจะถูกการเทรนให้ทำนาย index ของ token ที่เป็นจุดเริ่มต้นของข้อความคำตอบ (ซึ่งก็คือ index ที่ 21) และ index ของ token สุดท้ายของข้อความคำตอบ | |
| (ซึ่งก็คือ index ที่ 24) นี่คือสาเหตุที่โมเดลเหล่านั้นไม่ return tensor ของ logit หนึ่งตัว แต่สองตัว: tensor แรก คือ logits สำหรับ token เริ่มต้นของคำตอบ | |
| และอีก tensor เป็น logits สำหรับ token สุดท้ายของคำตอบ เนื่องจากในกรณีนี้ เรามีเพียง input เดียว ซึ่งมี 66 token เราจะได้ผลลัพธ์ดังนี้:`,dl,ft,bl,W,R,Ne,Ut,on=`ในการแปลงค่า 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>:`,wl,N,V,Ve,jt,pn="หลังจากที่ เราได้ mask ค่า logits ตำแหน่งที่เราไม่ต้องการจะทำนาย เรียบร้อยแล้ว ตอนนี้เราก็สามารถคำนวณ softmax ได้:",Tl,X,z,Xe,j,xs,ze,cn="start_index",Cs,Qe,Mn="end_index",Gs,He,Jn="start_index <= end_index",Ws,Ee,un="(start_index, end_index)",Rs,Fe,yn="start_index",Ns,Ye,dn="end_index",Vs,Se,bn="start_index",Xs,Ae,wn="end_index",zs,hl,_a='<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>',fl,et,Qs,Ul,ka='<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>',jl,qe,Tn="start_index <= end_index",Il,It,hn="ขั้นแรก เราจะคำนวณผลคูณที่เป็นไปได้ทั้งหมด:",_l,_t,kl,Q,H,Le,kt,fn="ตอนนี้เราแค่ต้องหา index ที่มีค่า probability สูงสุด เนื่องจาก PyTorch จะ return ค่าในรูป flattened tensor เราจึงต้องใช้การหารแล้วปัดลง (floor division) <code>//</code> และโมดูลัส <code>%</code> เพื่อคำนวณ <code>start_index</code> และ <code>end_index</code>:",Zl,Zt,Bl,Bt,Un="ตอนนี้ เราก็ได้ score ที่ถูกต้องสำหรับคำตอบแล้ว (คุณสามารถตรวจสอบได้โดยเปรียบเทียบกับผลลัพธ์แรกในส่วนก่อนหน้า):",$l,$t,gl,nt,vl,gt,jn="เรามี <code>start_index</code> และ <code>end_index</code> ของ token ที่จะเอามาเป็นคำตอบได้แล้ว ดังนั้นตอนนี้เราเพียงแค่ต้องแปลงเป็น index ของตัวอักษร ใน context เท่านั้น นี่คือจุดที่ offsets จะมีประโยชน์มาก เราสามารถใช้งานมันได้เหมือนที่เราทำใน token classification:",xl,vt,Cl,xt,In="ตอนนี้ เราแค่ต้องฟอร์แมตทุกอย่างเพื่อให้ได้ผลลัพธ์ที่ต้องการ:",Gl,Ct,Wl,Gt,Rl,Wt,_n="ยอดเยี่ยม! เราได้คำตอบเหมือนกับในตัวอย่างแรกของเรา!",Nl,at,Vl,Rt,Xl,Nt,kn="หากคุณต้องการ tokenize คำถามและบริบทที่ค่อยข้างยาว ที่เราใช้เป็นตัวอย่างก่อนหน้านี้ คุณจะได้ token ที่มีความยาวสูงกว่าความยาวสูงสุดที่จำกัดไว้ใน pipeline <code>question-answering</code> (ซึ่งคือ 384):",zl,Vt,Ql,Xt,Hl,zt,Zn=`ดังนั้น เราจึงจำเป็นจะต้องตัดทอน input ของเราให้ความยาวเท่ากับความยาวสูงสุด มีหลายวิธีที่เราสามารถทำได้ อย่างไรก็ตาม เราไม่ต้องการตัดคำถามให้สั้นลง เราต้องการตัดเฉพาะตัวบริบทเท่านั้น | |
| เนื่องจากบริบทอยู่ในตำแหน่งของประโยคที่สอง เราจะใช้กลยุทธ์การตัดทอนที่เรียกว่า <code>"only_second"</code> | |
| อย่างไรก็ตาม ปัญหาหนึ่งที่อาจจะเกิดขึ้นก็คือ คำตอบของคำถามอาจจะอยู่ในส่วนที่ถูกตัดออกไป เช่นในตัวอย่างข้างบน เราได้เลือกคำถามที่คำตอบอยู่ในตอนท้ายของบริบท และเมื่อเราตัดทอนส่วนท้ายของบริบทออกไป คำตอบที่เราต้องการก็จะหายไปด้วย:`,El,Qt,Fl,Ht,Yl,Et,Bn="ซึ่งหมายความว่า มันจะยากมากที่โมเดลของเราจะเลือกคำตอบได้ถูกต้อง เพื่อแก้ไขปัญหานี้ ไปป์ไลน์ <code>question-answering</code> จะแบ่งบริบทออกเป็นส่วนย่อยๆ ที่ไม่ยาวเกินความยาวสูงสุด",Sl,Ft,$n=`เพื่อให้แน่ใจว่า เราจะไม่แบ่งบริบทผิดตำแหน่งจนโมเดลไม่สามารถค้นหาคำตอบได้ เราจะแบ่งโดย ให้บริบทย่อยแต่ละส่วนมีส่วนที่ทับซ้อนกันด้วย | |
| เราสามารถใช้ tokenizer (ทั้งแบบเร็วและช้า) ทำสิ่งนี้ให้เราได้ โดยคุณจะต้องตั้งค่า <code>return_overflowing_tokens=True</code> นอกจากนั้น เพื่อกำหนดว่าเราจะให้ข้อความทับซ้อนกันมากแค่ไหน เราจำกำหนดค่าให้กับ argument <code>stride</code>`,Al,Yt,gn="ดูตัวอย่างข้างล่างนี้ :",ql,St,Ll,At,Dl,qt,vn="คุณจะเห็นว่า ตอนนี้ประโยคถูกแบ่งออกเป็นส่วนๆ โดยแต่ละส่วนจะมีไม่เกิน 6 token และมี token ที่ทับซ้อนกัน 2 token (สังเกตว่า ประโยคสุดท้ายมีเพียง 4 token ในกรณี เราจะต้องเพิ่ม padding token ทีหลังเพื่อให้มันยาวเท่ากับส่วนอื่นๆ)",Pl,Lt,xn="มาดูผลลัพธ์ของการ tokenization อย่างละเอียดยิ่งขึ้น:",Kl,Dt,Ol,Pt,ts,Kt,Cn="ผลลัพธ์จากการแบ่งประโยคนี้ คือ <code>input_ids</code> และ <code>attention_mask</code> ส่วนคีย์สุดท้าย <code>overflow_to_sample_mapping</code> เป็น map ที่บอกเราว่าแต่ละประโยคย่อยมาจากประโยค input ตำแหน่งที่เท่าไร ในตัวอย่างของเรา เราใช้แค่ประโยคเดียวเป็น input และเราได้ 7 ประโยคย่อยเป็น output แปลว่าทุกประโยคย่อยก็จะถูก map ไปหาประโยคหลักที่มี ID เดียวกัน :",es,Ot,ls,te,ss,ee,Gn="feature นี้จะมีประโยชน์เมื่อเราใช้ประโยคหลายเป็น input ตัวอย่างเช่น:",ns,le,as,se,Wn="เราจะได้ :",is,ne,rs,ae,Rn="ซึ่งหมายความว่า ประโยคแรกถูกแบ่งออกเป็น 7 ส่วน และ ประโยคที่สองถูกแบ่งออกเป็น 4 ส่วน",ms,ie,Nn="กลับมาดูกันว่า เราจะจัดการกับบริบทยาวๆได้อย่างไร ไปป์ไลน์ <code>question-answering</code> จำกัดความยาวสูงสุดไว้ที่ 384 และค่า stride ถูกตั้งไว้ที่ 128 ซึ่งสอดคล้องกับค่าที่ใช้ตอนที่โมเดลถูก fine-tune (คุณสามารถปรับ parameters เหล่านั้นได้ โดยตั้งค่า <code>max_seq_len</code> และ <code>stride</code> เมื่อเรียกไปป์ไลน์) เราจะใช้ค่าเริ่มต้นพวกนี้ในการแบ่งบริบทเป็นส่วนย่อยๆ นอกจากนี้ เราจะตั้งค่า padding (เพื่อให้มีแต่ละส่วนที่มีความยาวเท่ากัน และเพื่อที่เราจะได้นำมันไปสร้าง tensor ได้) และค่า offsets ด้วย:",os,re,ps,me,Vn=`<code>inputs</code> เหล่านั้นจะมี input ID และ attention masks เช่นเดียวกับ offsets และ <code>overflow_to_sample_mapping</code> ที่เราเพิ่งพูดถึง | |
| เนื่องจากทั้งสองอย่างหลังนี้ไม่ใช่ parameters ที่ใช้โดยโมเดล เราจะเอามันออกจาก <code>inputs</code> ก่อนที่จะแปลง <code>inputs</code> เป็น tensor:`,cs,E,F,De,oe,Xn="บริบทแบบยาวของเรา ตอนนี้ถูกแบ่งออกเป็นสองส่วน ซึ่งหมายความว่า หลังจากเราใส่มันเข้าไปในโมเดลแล้ว เราจะได้ค่า start logits และ end logits อย่างละ 2 เซ็ต :",Ms,pe,Js,Y,S,Pe,ce,zn="เช่นเดียวกับตัวอย่างก่อน ก่อนอื่นเราจะปิด(mask) token ที่ไม่ได้เป็นส่วนหนึ่งของบริบท ก่อนที่จะใช้ softmax นอกจากนี้เราจะปิด padding tokens ทั้งหมดด้วย (ตามการตั้งค่าใน attention mask):",us,A,q,Ke,Me,Qn="จากนั้นเราจะใช้ softmax เพื่อแปลง logits เป็นความน่าจะเป็น:",ys,L,D,Oe,Je,Hn="ขั้นตอนต่อไปนั้น คล้ายกับสิ่งที่เราทำกับบริบทแบบสั้นก่อนหน้านี้ เราจะรัน process เดียวกันนี้กับประโยคย่อยทั้งสองส่วนที่เราได้มา จากนั้น เราจะแจกจ่าย score ไปให้กับทุกๆ span ของคำตอบที่เป็นไปได้ และสุดท้ายเราจะเลือก span ที่มี score สูงที่สุด",ds,P,K,tl,ue,bs,ye,En="output ที่เราได้คือ span คำตอบที่ดีที่สุดของแต่ละประโยคย่อย ที่โมเดลคำนวณได้ เราจะเห็นว่าโมเดลให้ค่าความมั่นใจที่สูงมากๆกับ span คำตอบในประโยคที่สองมากกว่าประโยคแรก (ซึ่งเป็นสัญญาณที่ดี!) สิ่งที่เราต้องทำหลังจากนี้ก็คือ map ค่า span ไปสู่ตัวอักษร เพื่อดูว่า คำตอบที่โมเดลคำนวณได้คืออะไร",ws,it,Ts,de,Fn="ค่า <code>offsets</code> ที่เราใช้ก่อนหน้านี้ เป็น list ของ offsets โดยที่แต่ละประโยคย่อยจะมีหนึ่ง list :",hs,be,fs,we,Us,Te,Yn="ถ้าไม่นับผลลัพธ์แรกที่เรา print ออกมาด้วย เราก็จะได้ผลลัพธ์เดียวกันกับผลลัพธ์จากไปป์ไลน์ — เย้!",js,rt,Is,he,Sn="บทนี้ถือว่าเป็น การสรุปจบการเรียนรู้ความสามารถของ tokenizer แบบละเอียด ในบทต่อไปคุณจะได้ใช้ความรู้ที่เรียนมานี้ เพื่อฝึกฝนอีก โดยคุณจะได้ฝึก fine-tune โมเดลเพื่อ task ทั่วๆไป ของ NLP",_s,fe,ks,el,Zs;T=new xa({props:{fw:d[0]}}),k=new gs({props:{title:"การใช้งานตัวตัดคำแบบเร็ว (Fast tokenizers) ใน QA pipeline",local:"การใชงานตวตดคำแบบเรว-fast-tokenizers-ใน-qa-pipeline",headingTag:"h1"}});const An=[Wa,Ga],Ue=[];function qn(t,s){return t[0]==="pt"?0:1}$=qn(d),g=Ue[$]=An[$](d);const Ln=[Na,Ra],je=[];function Dn(t,s){return t[0]==="pt"?0:1}v=Dn(d),x=je[v]=Ln[v](d),ot=new gs({props:{title:"การใช้ question-answering pipeline",local:"การใช-question-answering-pipeline",headingTag:"h2"}}),ct=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">"question-answering"</span>) | |
| context = <span class="hljs-string">""" | |
| 🤗 Transformers is backed by the three most popular deep learning libraries — Jax, PyTorch, and TensorFlow — with a seamless integration | |
| between them. It's straightforward to train your models with one before loading them for inference with the other. | |
| """</span> | |
| question = <span class="hljs-string">"Which deep learning libraries back 🤗 Transformers?"</span> | |
| question_answerer(question=question, context=context)`,wrap:!1}}),Mt=new f({props:{code:"JTdCJ3Njb3JlJyUzQSUyMDAuOTc3NzMlMkMlMEElMjAnc3RhcnQnJTNBJTIwNzglMkMlMEElMjAnZW5kJyUzQSUyMDEwNSUyQyUwQSUyMCdhbnN3ZXInJTNBJTIwJ0pheCUyQyUyMFB5VG9yY2glMjBhbmQlMjBUZW5zb3JGbG93JyU3RA==",highlighted:`{<span class="hljs-string">'score'</span>: <span class="hljs-number">0.97773</span>, | |
| <span class="hljs-string">'start'</span>: <span class="hljs-number">78</span>, | |
| <span class="hljs-string">'end'</span>: <span class="hljs-number">105</span>, | |
| <span class="hljs-string">'answer'</span>: <span class="hljs-string">'Jax, PyTorch and TensorFlow'</span>}`,wrap:!1}}),ut=new f({props:{code:"bG9uZ19jb250ZXh0JTIwJTNEJTIwJTIyJTIyJTIyJTBBJUYwJTlGJUE0JTk3JTIwVHJhbnNmb3JtZXJzJTNBJTIwU3RhdGUlMjBvZiUyMHRoZSUyMEFydCUyME5MUCUwQSUwQSVGMCU5RiVBNCU5NyUyMFRyYW5zZm9ybWVycyUyMHByb3ZpZGVzJTIwdGhvdXNhbmRzJTIwb2YlMjBwcmV0cmFpbmVkJTIwbW9kZWxzJTIwdG8lMjBwZXJmb3JtJTIwdGFza3MlMjBvbiUyMHRleHRzJTIwc3VjaCUyMGFzJTIwY2xhc3NpZmljYXRpb24lMkMlMjBpbmZvcm1hdGlvbiUyMGV4dHJhY3Rpb24lMkMlMEFxdWVzdGlvbiUyMGFuc3dlcmluZyUyQyUyMHN1bW1hcml6YXRpb24lMkMlMjB0cmFuc2xhdGlvbiUyQyUyMHRleHQlMjBnZW5lcmF0aW9uJTIwYW5kJTIwbW9yZSUyMGluJTIwb3ZlciUyMDEwMCUyMGxhbmd1YWdlcy4lMEFJdHMlMjBhaW0lMjBpcyUyMHRvJTIwbWFrZSUyMGN1dHRpbmctZWRnZSUyME5MUCUyMGVhc2llciUyMHRvJTIwdXNlJTIwZm9yJTIwZXZlcnlvbmUuJTBBJTBBJUYwJTlGJUE0JTk3JTIwVHJhbnNmb3JtZXJzJTIwcHJvdmlkZXMlMjBBUElzJTIwdG8lMjBxdWlja2x5JTIwZG93bmxvYWQlMjBhbmQlMjB1c2UlMjB0aG9zZSUyMHByZXRyYWluZWQlMjBtb2RlbHMlMjBvbiUyMGElMjBnaXZlbiUyMHRleHQlMkMlMjBmaW5lLXR1bmUlMjB0aGVtJTIwb24lMjB5b3VyJTIwb3duJTIwZGF0YXNldHMlMjBhbmQlMEF0aGVuJTIwc2hhcmUlMjB0aGVtJTIwd2l0aCUyMHRoZSUyMGNvbW11bml0eSUyMG9uJTIwb3VyJTIwbW9kZWwlMjBodWIuJTIwQXQlMjB0aGUlMjBzYW1lJTIwdGltZSUyQyUyMGVhY2glMjBweXRob24lMjBtb2R1bGUlMjBkZWZpbmluZyUyMGFuJTIwYXJjaGl0ZWN0dXJlJTIwaXMlMjBmdWxseSUyMHN0YW5kYWxvbmUlMjBhbmQlMEFjYW4lMjBiZSUyMG1vZGlmaWVkJTIwdG8lMjBlbmFibGUlMjBxdWljayUyMHJlc2VhcmNoJTIwZXhwZXJpbWVudHMuJTBBJTBBV2h5JTIwc2hvdWxkJTIwSSUyMHVzZSUyMHRyYW5zZm9ybWVycyUzRiUwQSUwQTEuJTIwRWFzeS10by11c2UlMjBzdGF0ZS1vZi10aGUtYXJ0JTIwbW9kZWxzJTNBJTBBJTIwJTIwLSUyMEhpZ2glMjBwZXJmb3JtYW5jZSUyMG9uJTIwTkxVJTIwYW5kJTIwTkxHJTIwdGFza3MuJTBBJTIwJTIwLSUyMExvdyUyMGJhcnJpZXIlMjB0byUyMGVudHJ5JTIwZm9yJTIwZWR1Y2F0b3JzJTIwYW5kJTIwcHJhY3RpdGlvbmVycy4lMEElMjAlMjAtJTIwRmV3JTIwdXNlci1mYWNpbmclMjBhYnN0cmFjdGlvbnMlMjB3aXRoJTIwanVzdCUyMHRocmVlJTIwY2xhc3NlcyUyMHRvJTIwbGVhcm4uJTBBJTIwJTIwLSUyMEElMjB1bmlmaWVkJTIwQVBJJTIwZm9yJTIwdXNpbmclMjBhbGwlMjBvdXIlMjBwcmV0cmFpbmVkJTIwbW9kZWxzLiUwQSUyMCUyMC0lMjBMb3dlciUyMGNvbXB1dGUlMjBjb3N0cyUyQyUyMHNtYWxsZXIlMjBjYXJib24lMjBmb290cHJpbnQlM0ElMEElMEEyLiUyMFJlc2VhcmNoZXJzJTIwY2FuJTIwc2hhcmUlMjB0cmFpbmVkJTIwbW9kZWxzJTIwaW5zdGVhZCUyMG9mJTIwYWx3YXlzJTIwcmV0cmFpbmluZy4lMEElMjAlMjAtJTIwUHJhY3RpdGlvbmVycyUyMGNhbiUyMHJlZHVjZSUyMGNvbXB1dGUlMjB0aW1lJTIwYW5kJTIwcHJvZHVjdGlvbiUyMGNvc3RzLiUwQSUyMCUyMC0lMjBEb3plbnMlMjBvZiUyMGFyY2hpdGVjdHVyZXMlMjB3aXRoJTIwb3ZlciUyMDEwJTJDMDAwJTIwcHJldHJhaW5lZCUyMG1vZGVscyUyQyUyMHNvbWUlMjBpbiUyMG1vcmUlMjB0aGFuJTIwMTAwJTIwbGFuZ3VhZ2VzLiUwQSUwQTMuJTIwQ2hvb3NlJTIwdGhlJTIwcmlnaHQlMjBmcmFtZXdvcmslMjBmb3IlMjBldmVyeSUyMHBhcnQlMjBvZiUyMGElMjBtb2RlbCdzJTIwbGlmZXRpbWUlM0ElMEElMjAlMjAtJTIwVHJhaW4lMjBzdGF0ZS1vZi10aGUtYXJ0JTIwbW9kZWxzJTIwaW4lMjAzJTIwbGluZXMlMjBvZiUyMGNvZGUuJTBBJTIwJTIwLSUyME1vdmUlMjBhJTIwc2luZ2xlJTIwbW9kZWwlMjBiZXR3ZWVuJTIwVEYyLjAlMkZQeVRvcmNoJTIwZnJhbWV3b3JrcyUyMGF0JTIwd2lsbC4lMEElMjAlMjAtJTIwU2VhbWxlc3NseSUyMHBpY2slMjB0aGUlMjByaWdodCUyMGZyYW1ld29yayUyMGZvciUyMHRyYWluaW5nJTJDJTIwZXZhbHVhdGlvbiUyMGFuZCUyMHByb2R1Y3Rpb24uJTBBJTBBNC4lMjBFYXNpbHklMjBjdXN0b21pemUlMjBhJTIwbW9kZWwlMjBvciUyMGFuJTIwZXhhbXBsZSUyMHRvJTIweW91ciUyMG5lZWRzJTNBJTBBJTIwJTIwLSUyMFdlJTIwcHJvdmlkZSUyMGV4YW1wbGVzJTIwZm9yJTIwZWFjaCUyMGFyY2hpdGVjdHVyZSUyMHRvJTIwcmVwcm9kdWNlJTIwdGhlJTIwcmVzdWx0cyUyMHB1Ymxpc2hlZCUyMGJ5JTIwaXRzJTIwb3JpZ2luYWwlMjBhdXRob3JzLiUwQSUyMCUyMC0lMjBNb2RlbCUyMGludGVybmFscyUyMGFyZSUyMGV4cG9zZWQlMjBhcyUyMGNvbnNpc3RlbnRseSUyMGFzJTIwcG9zc2libGUuJTBBJTIwJTIwLSUyME1vZGVsJTIwZmlsZXMlMjBjYW4lMjBiZSUyMHVzZWQlMjBpbmRlcGVuZGVudGx5JTIwb2YlMjB0aGUlMjBsaWJyYXJ5JTIwZm9yJTIwcXVpY2slMjBleHBlcmltZW50cy4lMEElMEElRjAlOUYlQTQlOTclMjBUcmFuc2Zvcm1lcnMlMjBpcyUyMGJhY2tlZCUyMGJ5JTIwdGhlJTIwdGhyZWUlMjBtb3N0JTIwcG9wdWxhciUyMGRlZXAlMjBsZWFybmluZyUyMGxpYnJhcmllcyUyMCVFMiU4MCU5NCUyMEpheCUyQyUyMFB5VG9yY2glMjBhbmQlMjBUZW5zb3JGbG93JTIwJUUyJTgwJTk0JTIwd2l0aCUyMGElMjBzZWFtbGVzcyUyMGludGVncmF0aW9uJTBBYmV0d2VlbiUyMHRoZW0uJTIwSXQncyUyMHN0cmFpZ2h0Zm9yd2FyZCUyMHRvJTIwdHJhaW4lMjB5b3VyJTIwbW9kZWxzJTIwd2l0aCUyMG9uZSUyMGJlZm9yZSUyMGxvYWRpbmclMjB0aGVtJTIwZm9yJTIwaW5mZXJlbmNlJTIwd2l0aCUyMHRoZSUyMG90aGVyLiUwQSUyMiUyMiUyMiUwQXF1ZXN0aW9uX2Fuc3dlcmVyKHF1ZXN0aW9uJTNEcXVlc3Rpb24lMkMlMjBjb250ZXh0JTNEbG9uZ19jb250ZXh0KQ==",highlighted:`long_context = <span class="hljs-string">""" | |
| 🤗 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'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's straightforward to train your models with one before loading them for inference with the other. | |
| """</span> | |
| question_answerer(question=question, context=long_context)`,wrap:!1}}),yt=new f({props:{code:"JTdCJ3Njb3JlJyUzQSUyMDAuOTcxNDklMkMlMEElMjAnc3RhcnQnJTNBJTIwMTg5MiUyQyUwQSUyMCdlbmQnJTNBJTIwMTkxOSUyQyUwQSUyMCdhbnN3ZXInJTNBJTIwJ0pheCUyQyUyMFB5VG9yY2glMjBhbmQlMjBUZW5zb3JGbG93JyU3RA==",highlighted:`{<span class="hljs-string">'score'</span>: <span class="hljs-number">0.97149</span>, | |
| <span class="hljs-string">'start'</span>: <span class="hljs-number">1892</span>, | |
| <span class="hljs-string">'end'</span>: <span class="hljs-number">1919</span>, | |
| <span class="hljs-string">'answer'</span>: <span class="hljs-string">'Jax, PyTorch and TensorFlow'</span>}`,wrap:!1}}),bt=new gs({props:{title:"การใช้งานโมเดลสำหรับงาน question answering",local:"การใชงานโมเดลสำหรบงาน-question-answering",headingTag:"h2"}});const Pn=[Xa,Va],Ie=[];function Kn(t,s){return t[0]==="pt"?0:1}C=Kn(d),G=Ie[C]=Pn[C](d),ft=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 On=[Qa,za],_e=[];function ta(t,s){return t[0]==="pt"?0:1}W=ta(d),R=_e[W]=On[W](d);const ea=[Ea,Ha],ke=[];function la(t,s){return t[0]==="pt"?0:1}N=la(d),V=ke[N]=ea[N](d);const sa=[Ya,Fa],Ze=[];function na(t,s){return t[0]==="pt"?0:1}X=na(d),z=Ze[X]=sa[X](d),_t=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 aa=[Aa,Sa],Be=[];function ia(t,s){return t[0]==="pt"?0:1}Q=ia(d),H=Be[Q]=aa[Q](d),Zt=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}}),$t=new f({props:{code:"MC45Nzc3Mw==",highlighted:'<span class="hljs-number">0.97773</span>',wrap:!1}}),nt=new $s({props:{$$slots:{default:[qa]},$$scope:{ctx:d}}}),vt=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">"offset_mapping"</span>] | |
| start_char, _ = offsets[start_index] | |
| _, end_char = offsets[end_index] | |
| answer = context[start_char:end_char]`,wrap:!1}}),Ct=new f({props:{code:"cmVzdWx0JTIwJTNEJTIwJTdCJTBBJTIwJTIwJTIwJTIwJTIyYW5zd2VyJTIyJTNBJTIwYW5zd2VyJTJDJTBBJTIwJTIwJTIwJTIwJTIyc3RhcnQlMjIlM0ElMjBzdGFydF9jaGFyJTJDJTBBJTIwJTIwJTIwJTIwJTIyZW5kJTIyJTNBJTIwZW5kX2NoYXIlMkMlMEElMjAlMjAlMjAlMjAlMjJzY29yZSUyMiUzQSUyMHNjb3JlcyU1QnN0YXJ0X2luZGV4JTJDJTIwZW5kX2luZGV4JTVEJTJDJTBBJTdEJTBBcHJpbnQocmVzdWx0KQ==",highlighted:`result = { | |
| <span class="hljs-string">"answer"</span>: answer, | |
| <span class="hljs-string">"start"</span>: start_char, | |
| <span class="hljs-string">"end"</span>: end_char, | |
| <span class="hljs-string">"score"</span>: scores[start_index, end_index], | |
| } | |
| <span class="hljs-built_in">print</span>(result)`,wrap:!1}}),Gt=new f({props:{code:"JTdCJ2Fuc3dlciclM0ElMjAnSmF4JTJDJTIwUHlUb3JjaCUyMGFuZCUyMFRlbnNvckZsb3cnJTJDJTBBJTIwJ3N0YXJ0JyUzQSUyMDc4JTJDJTBBJTIwJ2VuZCclM0ElMjAxMDUlMkMlMEElMjAnc2NvcmUnJTNBJTIwMC45Nzc3MyU3RA==",highlighted:`{<span class="hljs-string">'answer'</span>: <span class="hljs-string">'Jax, PyTorch and TensorFlow'</span>, | |
| <span class="hljs-string">'start'</span>: <span class="hljs-number">78</span>, | |
| <span class="hljs-string">'end'</span>: <span class="hljs-number">105</span>, | |
| <span class="hljs-string">'score'</span>: <span class="hljs-number">0.97773</span>}`,wrap:!1}}),at=new $s({props:{$$slots:{default:[La]},$$scope:{ctx:d}}}),Rt=new gs({props:{title:"การจัดการกับบริบทยาว (long contexts)",local:"การจดการกบบรบทยาว-long-contexts",headingTag:"h2"}}),Vt=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">"input_ids"</span>]))`,wrap:!1}}),Xt=new f({props:{code:"NDYx",highlighted:'<span class="hljs-number">461</span>',wrap:!1}}),Qt=new f({props:{code:"aW5wdXRzJTIwJTNEJTIwdG9rZW5pemVyKHF1ZXN0aW9uJTJDJTIwbG9uZ19jb250ZXh0JTJDJTIwbWF4X2xlbmd0aCUzRDM4NCUyQyUyMHRydW5jYXRpb24lM0QlMjJvbmx5X3NlY29uZCUyMiklMEFwcmludCh0b2tlbml6ZXIuZGVjb2RlKGlucHV0cyU1QiUyMmlucHV0X2lkcyUyMiU1RCkp",highlighted:`inputs = tokenizer(question, long_context, max_length=<span class="hljs-number">384</span>, truncation=<span class="hljs-string">"only_second"</span>) | |
| <span class="hljs-built_in">print</span>(tokenizer.decode(inputs[<span class="hljs-string">"input_ids"</span>]))`,wrap:!1}}),Ht=new f({props:{code:"JTIyJTIyJTIyJTBBJTVCQ0xTJTVEJTIwV2hpY2glMjBkZWVwJTIwbGVhcm5pbmclMjBsaWJyYXJpZXMlMjBiYWNrJTIwJTVCVU5LJTVEJTIwVHJhbnNmb3JtZXJzJTNGJTIwJTVCU0VQJTVEJTIwJTVCVU5LJTVEJTIwVHJhbnNmb3JtZXJzJTIwJTNBJTIwU3RhdGUlMjBvZiUyMHRoZSUyMEFydCUyME5MUCUwQSUwQSU1QlVOSyU1RCUyMFRyYW5zZm9ybWVycyUyMHByb3ZpZGVzJTIwdGhvdXNhbmRzJTIwb2YlMjBwcmV0cmFpbmVkJTIwbW9kZWxzJTIwdG8lMjBwZXJmb3JtJTIwdGFza3MlMjBvbiUyMHRleHRzJTIwc3VjaCUyMGFzJTIwY2xhc3NpZmljYXRpb24lMkMlMjBpbmZvcm1hdGlvbiUyMGV4dHJhY3Rpb24lMkMlMEFxdWVzdGlvbiUyMGFuc3dlcmluZyUyQyUyMHN1bW1hcml6YXRpb24lMkMlMjB0cmFuc2xhdGlvbiUyQyUyMHRleHQlMjBnZW5lcmF0aW9uJTIwYW5kJTIwbW9yZSUyMGluJTIwb3ZlciUyMDEwMCUyMGxhbmd1YWdlcy4lMEFJdHMlMjBhaW0lMjBpcyUyMHRvJTIwbWFrZSUyMGN1dHRpbmctZWRnZSUyME5MUCUyMGVhc2llciUyMHRvJTIwdXNlJTIwZm9yJTIwZXZlcnlvbmUuJTBBJTBBJTVCVU5LJTVEJTIwVHJhbnNmb3JtZXJzJTIwcHJvdmlkZXMlMjBBUElzJTIwdG8lMjBxdWlja2x5JTIwZG93bmxvYWQlMjBhbmQlMjB1c2UlMjB0aG9zZSUyMHByZXRyYWluZWQlMjBtb2RlbHMlMjBvbiUyMGElMjBnaXZlbiUyMHRleHQlMkMlMjBmaW5lLXR1bmUlMjB0aGVtJTIwb24lMjB5b3VyJTIwb3duJTIwZGF0YXNldHMlMjBhbmQlMEF0aGVuJTIwc2hhcmUlMjB0aGVtJTIwd2l0aCUyMHRoZSUyMGNvbW11bml0eSUyMG9uJTIwb3VyJTIwbW9kZWwlMjBodWIuJTIwQXQlMjB0aGUlMjBzYW1lJTIwdGltZSUyQyUyMGVhY2glMjBweXRob24lMjBtb2R1bGUlMjBkZWZpbmluZyUyMGFuJTIwYXJjaGl0ZWN0dXJlJTIwaXMlMjBmdWxseSUyMHN0YW5kYWxvbmUlMjBhbmQlMEFjYW4lMjBiZSUyMG1vZGlmaWVkJTIwdG8lMjBlbmFibGUlMjBxdWljayUyMHJlc2VhcmNoJTIwZXhwZXJpbWVudHMuJTBBJTBBV2h5JTIwc2hvdWxkJTIwSSUyMHVzZSUyMHRyYW5zZm9ybWVycyUzRiUwQSUwQTEuJTIwRWFzeS10by11c2UlMjBzdGF0ZS1vZi10aGUtYXJ0JTIwbW9kZWxzJTNBJTBBJTIwJTIwLSUyMEhpZ2glMjBwZXJmb3JtYW5jZSUyMG9uJTIwTkxVJTIwYW5kJTIwTkxHJTIwdGFza3MuJTBBJTIwJTIwLSUyMExvdyUyMGJhcnJpZXIlMjB0byUyMGVudHJ5JTIwZm9yJTIwZWR1Y2F0b3JzJTIwYW5kJTIwcHJhY3RpdGlvbmVycy4lMEElMjAlMjAtJTIwRmV3JTIwdXNlci1mYWNpbmclMjBhYnN0cmFjdGlvbnMlMjB3aXRoJTIwanVzdCUyMHRocmVlJTIwY2xhc3NlcyUyMHRvJTIwbGVhcm4uJTBBJTIwJTIwLSUyMEElMjB1bmlmaWVkJTIwQVBJJTIwZm9yJTIwdXNpbmclMjBhbGwlMjBvdXIlMjBwcmV0cmFpbmVkJTIwbW9kZWxzLiUwQSUyMCUyMC0lMjBMb3dlciUyMGNvbXB1dGUlMjBjb3N0cyUyQyUyMHNtYWxsZXIlMjBjYXJib24lMjBmb290cHJpbnQlM0ElMEElMEEyLiUyMFJlc2VhcmNoZXJzJTIwY2FuJTIwc2hhcmUlMjB0cmFpbmVkJTIwbW9kZWxzJTIwaW5zdGVhZCUyMG9mJTIwYWx3YXlzJTIwcmV0cmFpbmluZy4lMEElMjAlMjAtJTIwUHJhY3RpdGlvbmVycyUyMGNhbiUyMHJlZHVjZSUyMGNvbXB1dGUlMjB0aW1lJTIwYW5kJTIwcHJvZHVjdGlvbiUyMGNvc3RzLiUwQSUyMCUyMC0lMjBEb3plbnMlMjBvZiUyMGFyY2hpdGVjdHVyZXMlMjB3aXRoJTIwb3ZlciUyMDEwJTJDMDAwJTIwcHJldHJhaW5lZCUyMG1vZGVscyUyQyUyMHNvbWUlMjBpbiUyMG1vcmUlMjB0aGFuJTIwMTAwJTIwbGFuZ3VhZ2VzLiUwQSUwQTMuJTIwQ2hvb3NlJTIwdGhlJTIwcmlnaHQlMjBmcmFtZXdvcmslMjBmb3IlMjBldmVyeSUyMHBhcnQlMjBvZiUyMGElMjBtb2RlbCdzJTIwbGlmZXRpbWUlM0ElMEElMjAlMjAtJTIwVHJhaW4lMjBzdGF0ZS1vZi10aGUtYXJ0JTIwbW9kZWxzJTIwaW4lMjAzJTIwbGluZXMlMjBvZiUyMGNvZGUuJTBBJTIwJTIwLSUyME1vdmUlMjBhJTIwc2luZ2xlJTIwbW9kZWwlMjBiZXR3ZWVuJTIwVEYyLjAlMkZQeVRvcmNoJTIwZnJhbWV3b3JrcyUyMGF0JTIwd2lsbC4lMEElMjAlMjAtJTIwU2VhbWxlc3NseSUyMHBpY2slMjB0aGUlMjByaWdodCUyMGZyYW1ld29yayUyMGZvciUyMHRyYWluaW5nJTJDJTIwZXZhbHVhdGlvbiUyMGFuZCUyMHByb2R1Y3Rpb24uJTBBJTBBNC4lMjBFYXNpbHklMjBjdXN0b21pemUlMjBhJTIwbW9kZWwlMjBvciUyMGFuJTIwZXhhbXBsZSUyMHRvJTIweW91ciUyMG5lZWRzJTNBJTBBJTIwJTIwLSUyMFdlJTIwcHJvdmlkZSUyMGV4YW1wbGVzJTIwZm9yJTIwZWFjaCUyMGFyY2hpdGVjdHVyZSUyMHRvJTIwcmVwcm9kdWNlJTIwdGhlJTIwcmVzdWx0cyUyMHB1Ymxpc2hlZCUyMGJ5JTIwaXRzJTIwb3JpZ2luYWwlMjBhdXRob3JzLiUwQSUyMCUyMC0lMjBNb2RlbCUyMGludGVybmFsJTIwJTVCU0VQJTVEJTBBJTIyJTIyJTIy",highlighted:`<span class="hljs-string">""" | |
| [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] | |
| """</span>`,wrap:!1}}),St=new f({props:{code:"c2VudGVuY2UlMjAlM0QlMjAlMjJUaGlzJTIwc2VudGVuY2UlMjBpcyUyMG5vdCUyMHRvbyUyMGxvbmclMjBidXQlMjB3ZSUyMGFyZSUyMGdvaW5nJTIwdG8lMjBzcGxpdCUyMGl0JTIwYW55d2F5LiUyMiUwQWlucHV0cyUyMCUzRCUyMHRva2VuaXplciglMEElMjAlMjAlMjAlMjBzZW50ZW5jZSUyQyUyMHRydW5jYXRpb24lM0RUcnVlJTJDJTIwcmV0dXJuX292ZXJmbG93aW5nX3Rva2VucyUzRFRydWUlMkMlMjBtYXhfbGVuZ3RoJTNENiUyQyUyMHN0cmlkZSUzRDIlMEEpJTBBJTBBZm9yJTIwaWRzJTIwaW4lMjBpbnB1dHMlNUIlMjJpbnB1dF9pZHMlMjIlNUQlM0ElMEElMjAlMjAlMjAlMjBwcmludCh0b2tlbml6ZXIuZGVjb2RlKGlkcykp",highlighted:`sentence = <span class="hljs-string">"This sentence is not too long but we are going to split it anyway."</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">"input_ids"</span>]: | |
| <span class="hljs-built_in">print</span>(tokenizer.decode(ids))`,wrap:!1}}),At=new f({props:{code:"JyU1QkNMUyU1RCUyMFRoaXMlMjBzZW50ZW5jZSUyMGlzJTIwbm90JTIwJTVCU0VQJTVEJyUwQSclNUJDTFMlNUQlMjBpcyUyMG5vdCUyMHRvbyUyMGxvbmclMjAlNUJTRVAlNUQnJTBBJyU1QkNMUyU1RCUyMHRvbyUyMGxvbmclMjBidXQlMjB3ZSUyMCU1QlNFUCU1RCclMEEnJTVCQ0xTJTVEJTIwYnV0JTIwd2UlMjBhcmUlMjBnb2luZyUyMCU1QlNFUCU1RCclMEEnJTVCQ0xTJTVEJTIwYXJlJTIwZ29pbmclMjB0byUyMHNwbGl0JTIwJTVCU0VQJTVEJyUwQSclNUJDTFMlNUQlMjB0byUyMHNwbGl0JTIwaXQlMjBhbnl3YXklMjAlNUJTRVAlNUQnJTBBJyU1QkNMUyU1RCUyMGl0JTIwYW55d2F5LiUyMCU1QlNFUCU1RCc=",highlighted:`<span class="hljs-string">'[CLS] This sentence is not [SEP]'</span> | |
| <span class="hljs-string">'[CLS] is not too long [SEP]'</span> | |
| <span class="hljs-string">'[CLS] too long but we [SEP]'</span> | |
| <span class="hljs-string">'[CLS] but we are going [SEP]'</span> | |
| <span class="hljs-string">'[CLS] are going to split [SEP]'</span> | |
| <span class="hljs-string">'[CLS] to split it anyway [SEP]'</span> | |
| <span class="hljs-string">'[CLS] it anyway. [SEP]'</span>`,wrap:!1}}),Dt=new f({props:{code:"cHJpbnQoaW5wdXRzLmtleXMoKSk=",highlighted:'<span class="hljs-built_in">print</span>(inputs.keys())',wrap:!1}}),Pt=new f({props:{code:"ZGljdF9rZXlzKCU1QidpbnB1dF9pZHMnJTJDJTIwJ2F0dGVudGlvbl9tYXNrJyUyQyUyMCdvdmVyZmxvd190b19zYW1wbGVfbWFwcGluZyclNUQp",highlighted:'dict_keys([<span class="hljs-string">'input_ids'</span>, <span class="hljs-string">'attention_mask'</span>, <span class="hljs-string">'overflow_to_sample_mapping'</span>])',wrap:!1}}),Ot=new f({props:{code:"cHJpbnQoaW5wdXRzJTVCJTIyb3ZlcmZsb3dfdG9fc2FtcGxlX21hcHBpbmclMjIlNUQp",highlighted:'<span class="hljs-built_in">print</span>(inputs[<span class="hljs-string">"overflow_to_sample_mapping"</span>])',wrap:!1}}),te=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}}),le=new f({props:{code:"c2VudGVuY2VzJTIwJTNEJTIwJTVCJTBBJTIwJTIwJTIwJTIwJTIyVGhpcyUyMHNlbnRlbmNlJTIwaXMlMjBub3QlMjB0b28lMjBsb25nJTIwYnV0JTIwd2UlMjBhcmUlMjBnb2luZyUyMHRvJTIwc3BsaXQlMjBpdCUyMGFueXdheS4lMjIlMkMlMEElMjAlMjAlMjAlMjAlMjJUaGlzJTIwc2VudGVuY2UlMjBpcyUyMHNob3J0ZXIlMjBidXQlMjB3aWxsJTIwc3RpbGwlMjBnZXQlMjBzcGxpdC4lMjIlMkMlMEElNUQlMEFpbnB1dHMlMjAlM0QlMjB0b2tlbml6ZXIoJTBBJTIwJTIwJTIwJTIwc2VudGVuY2VzJTJDJTIwdHJ1bmNhdGlvbiUzRFRydWUlMkMlMjByZXR1cm5fb3ZlcmZsb3dpbmdfdG9rZW5zJTNEVHJ1ZSUyQyUyMG1heF9sZW5ndGglM0Q2JTJDJTIwc3RyaWRlJTNEMiUwQSklMEElMEFwcmludChpbnB1dHMlNUIlMjJvdmVyZmxvd190b19zYW1wbGVfbWFwcGluZyUyMiU1RCk=",highlighted:`sentences = [ | |
| <span class="hljs-string">"This sentence is not too long but we are going to split it anyway."</span>, | |
| <span class="hljs-string">"This sentence is shorter but will still get split."</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">"overflow_to_sample_mapping"</span>])`,wrap:!1}}),ne=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}}),re=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">"longest"</span>, | |
| truncation=<span class="hljs-string">"only_second"</span>, | |
| return_overflowing_tokens=<span class="hljs-literal">True</span>, | |
| return_offsets_mapping=<span class="hljs-literal">True</span>, | |
| )`,wrap:!1}});const ra=[Pa,Da],$e=[];function ma(t,s){return t[0]==="pt"?0:1}E=ma(d),F=$e[E]=ra[E](d),pe=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 oa=[Oa,Ka],ge=[];function pa(t,s){return t[0]==="pt"?0:1}Y=pa(d),S=ge[Y]=oa[Y](d);const ca=[ei,ti],ve=[];function Ma(t,s){return t[0]==="pt"?0:1}A=Ma(d),q=ve[A]=ca[A](d);const Ja=[si,li],xe=[];function ua(t,s){return t[0]==="pt"?0:1}L=ua(d),D=xe[L]=Ja[L](d);const ya=[ai,ni],Ce=[];function da(t,s){return t[0]==="pt"?0:1}return P=da(d),K=Ce[P]=ya[P](d),ue=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 $s({props:{$$slots:{default:[ii]},$$scope:{ctx:d}}}),be=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">"answer"</span>: answer, <span class="hljs-string">"start"</span>: start_char, <span class="hljs-string">"end"</span>: end_char, <span class="hljs-string">"score"</span>: score} | |
| <span class="hljs-built_in">print</span>(result)`,wrap:!1}}),we=new f({props:{code:"JTdCJ2Fuc3dlciclM0ElMjAnJTVDbiVGMCU5RiVBNCU5NyUyMFRyYW5zZm9ybWVycyUzQSUyMFN0YXRlJTIwb2YlMjB0aGUlMjBBcnQlMjBOTFAnJTJDJTIwJ3N0YXJ0JyUzQSUyMDAlMkMlMjAnZW5kJyUzQSUyMDM3JTJDJTIwJ3Njb3JlJyUzQSUyMDAuMzM4NjclN0QlMEElN0InYW5zd2VyJyUzQSUyMCdKYXglMkMlMjBQeVRvcmNoJTIwYW5kJTIwVGVuc29yRmxvdyclMkMlMjAnc3RhcnQnJTNBJTIwMTg5MiUyQyUyMCdlbmQnJTNBJTIwMTkxOSUyQyUyMCdzY29yZSclM0ElMjAwLjk3MTQ5JTdE",highlighted:`{<span class="hljs-string">'answer'</span>: <span class="hljs-string">'\\n🤗 Transformers: State of the Art NLP'</span>, <span class="hljs-string">'start'</span>: <span class="hljs-number">0</span>, <span class="hljs-string">'end'</span>: <span class="hljs-number">37</span>, <span class="hljs-string">'score'</span>: <span class="hljs-number">0.33867</span>} | |
| {<span class="hljs-string">'answer'</span>: <span class="hljs-string">'Jax, PyTorch and TensorFlow'</span>, <span class="hljs-string">'start'</span>: <span class="hljs-number">1892</span>, <span class="hljs-string">'end'</span>: <span class="hljs-number">1919</span>, <span class="hljs-string">'score'</span>: <span class="hljs-number">0.97149</span>}`,wrap:!1}}),rt=new $s({props:{$$slots:{default:[ri]},$$scope:{ctx:d}}}),fe=new Ca({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),ll=r(),g.c(),Ge=r(),mt=b("p"),mt.innerHTML=tn,sl=r(),x.c(),We=r(),M(ot.$$.fragment),nl=r(),pt=b("p"),pt.innerHTML=en,al=r(),M(ct.$$.fragment),il=r(),M(Mt.$$.fragment),rl=r(),Jt=b("p"),Jt.textContent=ln,ml=r(),M(ut.$$.fragment),ol=r(),M(yt.$$.fragment),pl=r(),dt=b("p"),dt.textContent=sn,cl=r(),M(bt.$$.fragment),Ml=r(),wt=b("p"),wt.innerHTML=nn,Jl=r(),G.c(),Re=r(),Tt=b("p"),Tt.textContent=an,ul=r(),st=b("div"),st.innerHTML=rn,yl=r(),ht=b("p"),ht.textContent=mn,dl=r(),M(ft.$$.fragment),bl=r(),R.c(),Ne=r(),Ut=b("p"),Ut.innerHTML=on,wl=r(),V.c(),Ve=r(),jt=b("p"),jt.textContent=pn,Tl=r(),z.c(),Xe=r(),j=b("p"),xs=O(`ตอนนี้ เราสามารถหาค่า argmax ของ probabilities ของจุดเริ่มต้นและจุดสิ้นสุดได้แล้ว | |
| แต่ปัญหาที่อาจจะเกิดขึ้นก็คือ index ของจุดเริ่มต้น นั้นอยู่เกิน index ของจุดสิ้นสุด ดังนั้นเราจึงต้องหาวิธีจัดการปัญหานี้ เราจะคำนวณ probabilities ของ `),ze=b("code"),ze.textContent=cn,Cs=O(" และ "),Qe=b("code"),Qe.textContent=Mn,Gs=O(" ที่เป็นไปได้จริง ซึ่งหมายถึง "),He=b("code"),He.textContent=Jn,Ws=O(" จากนั้นเราจะเลือกใช้แค่ tuple "),Ee=b("code"),Ee.textContent=un,Rs=O(` ที่มีความเป็นไปได้สูงสุด | |
| สมมติว่า เหตุการณ์ที่ “คำตอบเริ่มต้นที่ `),Fe=b("code"),Fe.textContent=yn,Ns=O("” และ “คำตอบสิ้นสุดที่ "),Ye=b("code"),Ye.textContent=dn,Vs=O("” ไม่มีความเกี่ยวข้องกัน (independent) ความน่าจะเป็นที่ คำตอบจะเริ่มต้นที่ "),Se=b("code"),Se.textContent=bn,Xs=O(" และสิ้นสุดที่ "),Ae=b("code"),Ae.textContent=wn,zs=O(` คือ: | |
| `),hl=new fa(!1),fl=r(),et=b("p"),Qs=O("การคำนวณ score ทำได้โดยคำนวณผลคูณทั้งหมดของ"),Ul=new fa(!1),jl=O(" โดยที่ "),qe=b("code"),qe.textContent=Tn,Il=r(),It=b("p"),It.textContent=hn,_l=r(),M(_t.$$.fragment),kl=r(),H.c(),Le=r(),kt=b("p"),kt.innerHTML=fn,Zl=r(),M(Zt.$$.fragment),Bl=r(),Bt=b("p"),Bt.textContent=Un,$l=r(),M($t.$$.fragment),gl=r(),M(nt.$$.fragment),vl=r(),gt=b("p"),gt.innerHTML=jn,xl=r(),M(vt.$$.fragment),Cl=r(),xt=b("p"),xt.textContent=In,Gl=r(),M(Ct.$$.fragment),Wl=r(),M(Gt.$$.fragment),Rl=r(),Wt=b("p"),Wt.textContent=_n,Nl=r(),M(at.$$.fragment),Vl=r(),M(Rt.$$.fragment),Xl=r(),Nt=b("p"),Nt.innerHTML=kn,zl=r(),M(Vt.$$.fragment),Ql=r(),M(Xt.$$.fragment),Hl=r(),zt=b("p"),zt.innerHTML=Zn,El=r(),M(Qt.$$.fragment),Fl=r(),M(Ht.$$.fragment),Yl=r(),Et=b("p"),Et.innerHTML=Bn,Sl=r(),Ft=b("p"),Ft.innerHTML=$n,Al=r(),Yt=b("p"),Yt.textContent=gn,ql=r(),M(St.$$.fragment),Ll=r(),M(At.$$.fragment),Dl=r(),qt=b("p"),qt.textContent=vn,Pl=r(),Lt=b("p"),Lt.textContent=xn,Kl=r(),M(Dt.$$.fragment),Ol=r(),M(Pt.$$.fragment),ts=r(),Kt=b("p"),Kt.innerHTML=Cn,es=r(),M(Ot.$$.fragment),ls=r(),M(te.$$.fragment),ss=r(),ee=b("p"),ee.textContent=Gn,ns=r(),M(le.$$.fragment),as=r(),se=b("p"),se.textContent=Wn,is=r(),M(ne.$$.fragment),rs=r(),ae=b("p"),ae.textContent=Rn,ms=r(),ie=b("p"),ie.innerHTML=Nn,os=r(),M(re.$$.fragment),ps=r(),me=b("p"),me.innerHTML=Vn,cs=r(),F.c(),De=r(),oe=b("p"),oe.textContent=Xn,Ms=r(),M(pe.$$.fragment),Js=r(),S.c(),Pe=r(),ce=b("p"),ce.textContent=zn,us=r(),q.c(),Ke=r(),Me=b("p"),Me.textContent=Qn,ys=r(),D.c(),Oe=r(),Je=b("p"),Je.textContent=Hn,ds=r(),K.c(),tl=r(),M(ue.$$.fragment),bs=r(),ye=b("p"),ye.textContent=En,ws=r(),M(it.$$.fragment),Ts=r(),de=b("p"),de.innerHTML=Fn,hs=r(),M(be.$$.fragment),fs=r(),M(we.$$.fragment),Us=r(),Te=b("p"),Te.textContent=Yn,js=r(),M(rt.$$.fragment),Is=r(),he=b("p"),he.textContent=Sn,_s=r(),M(fe.$$.fragment),ks=r(),el=b("p"),this.h()},l(t){const s=va("svelte-u9bgzb",document.head);l=w(s,"META",{name:!0,content:!0}),s.forEach(n),i=m(t),e=w(t,"P",{}),Bs(e).forEach(n),c=m(t),J(T.$$.fragment,t),U=m(t),J(k.$$.fragment,t),ll=m(t),g.l(t),Ge=m(t),mt=w(t,"P",{"data-svelte-h":!0}),h(mt)!=="svelte-1y1g560"&&(mt.innerHTML=tn),sl=m(t),x.l(t),We=m(t),J(ot.$$.fragment,t),nl=m(t),pt=w(t,"P",{"data-svelte-h":!0}),h(pt)!=="svelte-tmj02y"&&(pt.innerHTML=en),al=m(t),J(ct.$$.fragment,t),il=m(t),J(Mt.$$.fragment,t),rl=m(t),Jt=w(t,"P",{"data-svelte-h":!0}),h(Jt)!=="svelte-v5cov2"&&(Jt.textContent=ln),ml=m(t),J(ut.$$.fragment,t),ol=m(t),J(yt.$$.fragment,t),pl=m(t),dt=w(t,"P",{"data-svelte-h":!0}),h(dt)!=="svelte-1atxoyq"&&(dt.textContent=sn),cl=m(t),J(bt.$$.fragment,t),Ml=m(t),wt=w(t,"P",{"data-svelte-h":!0}),h(wt)!=="svelte-l8m0xk"&&(wt.innerHTML=nn),Jl=m(t),G.l(t),Re=m(t),Tt=w(t,"P",{"data-svelte-h":!0}),h(Tt)!=="svelte-17wzyec"&&(Tt.textContent=an),ul=m(t),st=w(t,"DIV",{class:!0,"data-svelte-h":!0}),h(st)!=="svelte-47wedv"&&(st.innerHTML=rn),yl=m(t),ht=w(t,"P",{"data-svelte-h":!0}),h(ht)!=="svelte-10j6uaj"&&(ht.textContent=mn),dl=m(t),J(ft.$$.fragment,t),bl=m(t),R.l(t),Ne=m(t),Ut=w(t,"P",{"data-svelte-h":!0}),h(Ut)!=="svelte-psx7g"&&(Ut.innerHTML=on),wl=m(t),V.l(t),Ve=m(t),jt=w(t,"P",{"data-svelte-h":!0}),h(jt)!=="svelte-1ihn1yv"&&(jt.textContent=pn),Tl=m(t),z.l(t),Xe=m(t),j=w(t,"P",{});var I=Bs(j);xs=tt(I,`ตอนนี้ เราสามารถหาค่า argmax ของ probabilities ของจุดเริ่มต้นและจุดสิ้นสุดได้แล้ว | |
| แต่ปัญหาที่อาจจะเกิดขึ้นก็คือ index ของจุดเริ่มต้น นั้นอยู่เกิน index ของจุดสิ้นสุด ดังนั้นเราจึงต้องหาวิธีจัดการปัญหานี้ เราจะคำนวณ probabilities ของ `),ze=w(I,"CODE",{"data-svelte-h":!0}),h(ze)!=="svelte-8eqb3b"&&(ze.textContent=cn),Cs=tt(I," และ "),Qe=w(I,"CODE",{"data-svelte-h":!0}),h(Qe)!=="svelte-9cistc"&&(Qe.textContent=Mn),Gs=tt(I," ที่เป็นไปได้จริง ซึ่งหมายถึง "),He=w(I,"CODE",{"data-svelte-h":!0}),h(He)!=="svelte-1kp3szf"&&(He.textContent=Jn),Ws=tt(I," จากนั้นเราจะเลือกใช้แค่ tuple "),Ee=w(I,"CODE",{"data-svelte-h":!0}),h(Ee)!=="svelte-boh5bq"&&(Ee.textContent=un),Rs=tt(I,` ที่มีความเป็นไปได้สูงสุด | |
| สมมติว่า เหตุการณ์ที่ “คำตอบเริ่มต้นที่ `),Fe=w(I,"CODE",{"data-svelte-h":!0}),h(Fe)!=="svelte-8eqb3b"&&(Fe.textContent=yn),Ns=tt(I,"” และ “คำตอบสิ้นสุดที่ "),Ye=w(I,"CODE",{"data-svelte-h":!0}),h(Ye)!=="svelte-9cistc"&&(Ye.textContent=dn),Vs=tt(I,"” ไม่มีความเกี่ยวข้องกัน (independent) ความน่าจะเป็นที่ คำตอบจะเริ่มต้นที่ "),Se=w(I,"CODE",{"data-svelte-h":!0}),h(Se)!=="svelte-8eqb3b"&&(Se.textContent=bn),Xs=tt(I," และสิ้นสุดที่ "),Ae=w(I,"CODE",{"data-svelte-h":!0}),h(Ae)!=="svelte-9cistc"&&(Ae.textContent=wn),zs=tt(I,` คือ: | |
| `),hl=Ua(I,!1),I.forEach(n),fl=m(t),et=w(t,"P",{});var lt=Bs(et);Qs=tt(lt,"การคำนวณ score ทำได้โดยคำนวณผลคูณทั้งหมดของ"),Ul=Ua(lt,!1),jl=tt(lt," โดยที่ "),qe=w(lt,"CODE",{"data-svelte-h":!0}),h(qe)!=="svelte-1kp3szf"&&(qe.textContent=Tn),lt.forEach(n),Il=m(t),It=w(t,"P",{"data-svelte-h":!0}),h(It)!=="svelte-19m0rud"&&(It.textContent=hn),_l=m(t),J(_t.$$.fragment,t),kl=m(t),H.l(t),Le=m(t),kt=w(t,"P",{"data-svelte-h":!0}),h(kt)!=="svelte-tdr177"&&(kt.innerHTML=fn),Zl=m(t),J(Zt.$$.fragment,t),Bl=m(t),Bt=w(t,"P",{"data-svelte-h":!0}),h(Bt)!=="svelte-puutj5"&&(Bt.textContent=Un),$l=m(t),J($t.$$.fragment,t),gl=m(t),J(nt.$$.fragment,t),vl=m(t),gt=w(t,"P",{"data-svelte-h":!0}),h(gt)!=="svelte-1tpr9s"&&(gt.innerHTML=jn),xl=m(t),J(vt.$$.fragment,t),Cl=m(t),xt=w(t,"P",{"data-svelte-h":!0}),h(xt)!=="svelte-1vuhqzj"&&(xt.textContent=In),Gl=m(t),J(Ct.$$.fragment,t),Wl=m(t),J(Gt.$$.fragment,t),Rl=m(t),Wt=w(t,"P",{"data-svelte-h":!0}),h(Wt)!=="svelte-1awnsfs"&&(Wt.textContent=_n),Nl=m(t),J(at.$$.fragment,t),Vl=m(t),J(Rt.$$.fragment,t),Xl=m(t),Nt=w(t,"P",{"data-svelte-h":!0}),h(Nt)!=="svelte-14p8ixq"&&(Nt.innerHTML=kn),zl=m(t),J(Vt.$$.fragment,t),Ql=m(t),J(Xt.$$.fragment,t),Hl=m(t),zt=w(t,"P",{"data-svelte-h":!0}),h(zt)!=="svelte-13ybocv"&&(zt.innerHTML=Zn),El=m(t),J(Qt.$$.fragment,t),Fl=m(t),J(Ht.$$.fragment,t),Yl=m(t),Et=w(t,"P",{"data-svelte-h":!0}),h(Et)!=="svelte-1gp042a"&&(Et.innerHTML=Bn),Sl=m(t),Ft=w(t,"P",{"data-svelte-h":!0}),h(Ft)!=="svelte-zxg9vy"&&(Ft.innerHTML=$n),Al=m(t),Yt=w(t,"P",{"data-svelte-h":!0}),h(Yt)!=="svelte-bt81y7"&&(Yt.textContent=gn),ql=m(t),J(St.$$.fragment,t),Ll=m(t),J(At.$$.fragment,t),Dl=m(t),qt=w(t,"P",{"data-svelte-h":!0}),h(qt)!=="svelte-1gvxhgv"&&(qt.textContent=vn),Pl=m(t),Lt=w(t,"P",{"data-svelte-h":!0}),h(Lt)!=="svelte-l0uwqk"&&(Lt.textContent=xn),Kl=m(t),J(Dt.$$.fragment,t),Ol=m(t),J(Pt.$$.fragment,t),ts=m(t),Kt=w(t,"P",{"data-svelte-h":!0}),h(Kt)!=="svelte-k5gtjs"&&(Kt.innerHTML=Cn),es=m(t),J(Ot.$$.fragment,t),ls=m(t),J(te.$$.fragment,t),ss=m(t),ee=w(t,"P",{"data-svelte-h":!0}),h(ee)!=="svelte-ivznwp"&&(ee.textContent=Gn),ns=m(t),J(le.$$.fragment,t),as=m(t),se=w(t,"P",{"data-svelte-h":!0}),h(se)!=="svelte-16eh5ge"&&(se.textContent=Wn),is=m(t),J(ne.$$.fragment,t),rs=m(t),ae=w(t,"P",{"data-svelte-h":!0}),h(ae)!=="svelte-mvmwjh"&&(ae.textContent=Rn),ms=m(t),ie=w(t,"P",{"data-svelte-h":!0}),h(ie)!=="svelte-1knj1si"&&(ie.innerHTML=Nn),os=m(t),J(re.$$.fragment,t),ps=m(t),me=w(t,"P",{"data-svelte-h":!0}),h(me)!=="svelte-5zg0ke"&&(me.innerHTML=Vn),cs=m(t),F.l(t),De=m(t),oe=w(t,"P",{"data-svelte-h":!0}),h(oe)!=="svelte-3e6ghp"&&(oe.textContent=Xn),Ms=m(t),J(pe.$$.fragment,t),Js=m(t),S.l(t),Pe=m(t),ce=w(t,"P",{"data-svelte-h":!0}),h(ce)!=="svelte-mgk1n9"&&(ce.textContent=zn),us=m(t),q.l(t),Ke=m(t),Me=w(t,"P",{"data-svelte-h":!0}),h(Me)!=="svelte-1rc61wr"&&(Me.textContent=Qn),ys=m(t),D.l(t),Oe=m(t),Je=w(t,"P",{"data-svelte-h":!0}),h(Je)!=="svelte-8i7goq"&&(Je.textContent=Hn),ds=m(t),K.l(t),tl=m(t),J(ue.$$.fragment,t),bs=m(t),ye=w(t,"P",{"data-svelte-h":!0}),h(ye)!=="svelte-1wvnuzu"&&(ye.textContent=En),ws=m(t),J(it.$$.fragment,t),Ts=m(t),de=w(t,"P",{"data-svelte-h":!0}),h(de)!=="svelte-174er3z"&&(de.innerHTML=Fn),hs=m(t),J(be.$$.fragment,t),fs=m(t),J(we.$$.fragment,t),Us=m(t),Te=w(t,"P",{"data-svelte-h":!0}),h(Te)!=="svelte-249oiy"&&(Te.textContent=Yn),js=m(t),J(rt.$$.fragment,t),Is=m(t),he=w(t,"P",{"data-svelte-h":!0}),h(he)!=="svelte-1jfx96i"&&(he.textContent=Sn),_s=m(t),J(fe.$$.fragment,t),ks=m(t),el=w(t,"P",{}),Bs(el).forEach(n),this.h()},h(){Os(l,"name","hf:doc:metadata"),Os(l,"content",oi),Os(st,"class","flex justify-center"),hl.a=null,Ul.a=jl},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,ll,s),Ue[$].m(t,s),a(t,Ge,s),a(t,mt,s),a(t,sl,s),je[v].m(t,s),a(t,We,s),u(ot,t,s),a(t,nl,s),a(t,pt,s),a(t,al,s),u(ct,t,s),a(t,il,s),u(Mt,t,s),a(t,rl,s),a(t,Jt,s),a(t,ml,s),u(ut,t,s),a(t,ol,s),u(yt,t,s),a(t,pl,s),a(t,dt,s),a(t,cl,s),u(bt,t,s),a(t,Ml,s),a(t,wt,s),a(t,Jl,s),Ie[C].m(t,s),a(t,Re,s),a(t,Tt,s),a(t,ul,s),a(t,st,s),a(t,yl,s),a(t,ht,s),a(t,dl,s),u(ft,t,s),a(t,bl,s),_e[W].m(t,s),a(t,Ne,s),a(t,Ut,s),a(t,wl,s),ke[N].m(t,s),a(t,Ve,s),a(t,jt,s),a(t,Tl,s),Ze[X].m(t,s),a(t,Xe,s),a(t,j,s),_(j,xs),_(j,ze),_(j,Cs),_(j,Qe),_(j,Gs),_(j,He),_(j,Ws),_(j,Ee),_(j,Rs),_(j,Fe),_(j,Ns),_(j,Ye),_(j,Vs),_(j,Se),_(j,Xs),_(j,Ae),_(j,zs),hl.m(_a,j),a(t,fl,s),a(t,et,s),_(et,Qs),Ul.m(ka,et),_(et,jl),_(et,qe),a(t,Il,s),a(t,It,s),a(t,_l,s),u(_t,t,s),a(t,kl,s),Be[Q].m(t,s),a(t,Le,s),a(t,kt,s),a(t,Zl,s),u(Zt,t,s),a(t,Bl,s),a(t,Bt,s),a(t,$l,s),u($t,t,s),a(t,gl,s),u(nt,t,s),a(t,vl,s),a(t,gt,s),a(t,xl,s),u(vt,t,s),a(t,Cl,s),a(t,xt,s),a(t,Gl,s),u(Ct,t,s),a(t,Wl,s),u(Gt,t,s),a(t,Rl,s),a(t,Wt,s),a(t,Nl,s),u(at,t,s),a(t,Vl,s),u(Rt,t,s),a(t,Xl,s),a(t,Nt,s),a(t,zl,s),u(Vt,t,s),a(t,Ql,s),u(Xt,t,s),a(t,Hl,s),a(t,zt,s),a(t,El,s),u(Qt,t,s),a(t,Fl,s),u(Ht,t,s),a(t,Yl,s),a(t,Et,s),a(t,Sl,s),a(t,Ft,s),a(t,Al,s),a(t,Yt,s),a(t,ql,s),u(St,t,s),a(t,Ll,s),u(At,t,s),a(t,Dl,s),a(t,qt,s),a(t,Pl,s),a(t,Lt,s),a(t,Kl,s),u(Dt,t,s),a(t,Ol,s),u(Pt,t,s),a(t,ts,s),a(t,Kt,s),a(t,es,s),u(Ot,t,s),a(t,ls,s),u(te,t,s),a(t,ss,s),a(t,ee,s),a(t,ns,s),u(le,t,s),a(t,as,s),a(t,se,s),a(t,is,s),u(ne,t,s),a(t,rs,s),a(t,ae,s),a(t,ms,s),a(t,ie,s),a(t,os,s),u(re,t,s),a(t,ps,s),a(t,me,s),a(t,cs,s),$e[E].m(t,s),a(t,De,s),a(t,oe,s),a(t,Ms,s),u(pe,t,s),a(t,Js,s),ge[Y].m(t,s),a(t,Pe,s),a(t,ce,s),a(t,us,s),ve[A].m(t,s),a(t,Ke,s),a(t,Me,s),a(t,ys,s),xe[L].m(t,s),a(t,Oe,s),a(t,Je,s),a(t,ds,s),Ce[P].m(t,s),a(t,tl,s),u(ue,t,s),a(t,bs,s),a(t,ye,s),a(t,ws,s),u(it,t,s),a(t,Ts,s),a(t,de,s),a(t,hs,s),u(be,t,s),a(t,fs,s),u(we,t,s),a(t,Us,s),a(t,Te,s),a(t,js,s),u(rt,t,s),a(t,Is,s),a(t,he,s),a(t,_s,s),u(fe,t,s),a(t,ks,s),a(t,el,s),Zs=!0},p(t,[s]){const I={};s&1&&(I.fw=t[0]),T.$set(I);let lt=$;$=qn(t),$!==lt&&(B(),o(Ue[lt],1,1,()=>{Ue[lt]=null}),Z(),g=Ue[$],g||(g=Ue[$]=An[$](t),g.c()),p(g,1),g.m(Ge.parentNode,Ge));let Hs=v;v=Dn(t),v!==Hs&&(B(),o(je[Hs],1,1,()=>{je[Hs]=null}),Z(),x=je[v],x||(x=je[v]=Ln[v](t),x.c()),p(x,1),x.m(We.parentNode,We));let Es=C;C=Kn(t),C!==Es&&(B(),o(Ie[Es],1,1,()=>{Ie[Es]=null}),Z(),G=Ie[C],G||(G=Ie[C]=Pn[C](t),G.c()),p(G,1),G.m(Re.parentNode,Re));let Fs=W;W=ta(t),W!==Fs&&(B(),o(_e[Fs],1,1,()=>{_e[Fs]=null}),Z(),R=_e[W],R||(R=_e[W]=On[W](t),R.c()),p(R,1),R.m(Ne.parentNode,Ne));let Ys=N;N=la(t),N!==Ys&&(B(),o(ke[Ys],1,1,()=>{ke[Ys]=null}),Z(),V=ke[N],V||(V=ke[N]=ea[N](t),V.c()),p(V,1),V.m(Ve.parentNode,Ve));let Ss=X;X=na(t),X!==Ss&&(B(),o(Ze[Ss],1,1,()=>{Ze[Ss]=null}),Z(),z=Ze[X],z||(z=Ze[X]=sa[X](t),z.c()),p(z,1),z.m(Xe.parentNode,Xe));let As=Q;Q=ia(t),Q!==As&&(B(),o(Be[As],1,1,()=>{Be[As]=null}),Z(),H=Be[Q],H||(H=Be[Q]=aa[Q](t),H.c()),p(H,1),H.m(Le.parentNode,Le));const ba={};s&2&&(ba.$$scope={dirty:s,ctx:t}),nt.$set(ba);const wa={};s&2&&(wa.$$scope={dirty:s,ctx:t}),at.$set(wa);let qs=E;E=ma(t),E!==qs&&(B(),o($e[qs],1,1,()=>{$e[qs]=null}),Z(),F=$e[E],F||(F=$e[E]=ra[E](t),F.c()),p(F,1),F.m(De.parentNode,De));let Ls=Y;Y=pa(t),Y!==Ls&&(B(),o(ge[Ls],1,1,()=>{ge[Ls]=null}),Z(),S=ge[Y],S||(S=ge[Y]=oa[Y](t),S.c()),p(S,1),S.m(Pe.parentNode,Pe));let Ds=A;A=Ma(t),A!==Ds&&(B(),o(ve[Ds],1,1,()=>{ve[Ds]=null}),Z(),q=ve[A],q||(q=ve[A]=ca[A](t),q.c()),p(q,1),q.m(Ke.parentNode,Ke));let Ps=L;L=ua(t),L!==Ps&&(B(),o(xe[Ps],1,1,()=>{xe[Ps]=null}),Z(),D=xe[L],D||(D=xe[L]=Ja[L](t),D.c()),p(D,1),D.m(Oe.parentNode,Oe));let Ks=P;P=da(t),P!==Ks&&(B(),o(Ce[Ks],1,1,()=>{Ce[Ks]=null}),Z(),K=Ce[P],K||(K=Ce[P]=ya[P](t),K.c()),p(K,1),K.m(tl.parentNode,tl));const Ta={};s&2&&(Ta.$$scope={dirty:s,ctx:t}),it.$set(Ta);const ha={};s&2&&(ha.$$scope={dirty:s,ctx:t}),rt.$set(ha)},i(t){Zs||(p(T.$$.fragment,t),p(k.$$.fragment,t),p(g),p(x),p(ot.$$.fragment,t),p(ct.$$.fragment,t),p(Mt.$$.fragment,t),p(ut.$$.fragment,t),p(yt.$$.fragment,t),p(bt.$$.fragment,t),p(G),p(ft.$$.fragment,t),p(R),p(V),p(z),p(_t.$$.fragment,t),p(H),p(Zt.$$.fragment,t),p($t.$$.fragment,t),p(nt.$$.fragment,t),p(vt.$$.fragment,t),p(Ct.$$.fragment,t),p(Gt.$$.fragment,t),p(at.$$.fragment,t),p(Rt.$$.fragment,t),p(Vt.$$.fragment,t),p(Xt.$$.fragment,t),p(Qt.$$.fragment,t),p(Ht.$$.fragment,t),p(St.$$.fragment,t),p(At.$$.fragment,t),p(Dt.$$.fragment,t),p(Pt.$$.fragment,t),p(Ot.$$.fragment,t),p(te.$$.fragment,t),p(le.$$.fragment,t),p(ne.$$.fragment,t),p(re.$$.fragment,t),p(F),p(pe.$$.fragment,t),p(S),p(q),p(D),p(K),p(ue.$$.fragment,t),p(it.$$.fragment,t),p(be.$$.fragment,t),p(we.$$.fragment,t),p(rt.$$.fragment,t),p(fe.$$.fragment,t),Zs=!0)},o(t){o(T.$$.fragment,t),o(k.$$.fragment,t),o(g),o(x),o(ot.$$.fragment,t),o(ct.$$.fragment,t),o(Mt.$$.fragment,t),o(ut.$$.fragment,t),o(yt.$$.fragment,t),o(bt.$$.fragment,t),o(G),o(ft.$$.fragment,t),o(R),o(V),o(z),o(_t.$$.fragment,t),o(H),o(Zt.$$.fragment,t),o($t.$$.fragment,t),o(nt.$$.fragment,t),o(vt.$$.fragment,t),o(Ct.$$.fragment,t),o(Gt.$$.fragment,t),o(at.$$.fragment,t),o(Rt.$$.fragment,t),o(Vt.$$.fragment,t),o(Xt.$$.fragment,t),o(Qt.$$.fragment,t),o(Ht.$$.fragment,t),o(St.$$.fragment,t),o(At.$$.fragment,t),o(Dt.$$.fragment,t),o(Pt.$$.fragment,t),o(Ot.$$.fragment,t),o(te.$$.fragment,t),o(le.$$.fragment,t),o(ne.$$.fragment,t),o(re.$$.fragment,t),o(F),o(pe.$$.fragment,t),o(S),o(q),o(D),o(K),o(ue.$$.fragment,t),o(it.$$.fragment,t),o(be.$$.fragment,t),o(we.$$.fragment,t),o(rt.$$.fragment,t),o(fe.$$.fragment,t),Zs=!1},d(t){t&&(n(i),n(e),n(c),n(U),n(ll),n(Ge),n(mt),n(sl),n(We),n(nl),n(pt),n(al),n(il),n(rl),n(Jt),n(ml),n(ol),n(pl),n(dt),n(cl),n(Ml),n(wt),n(Jl),n(Re),n(Tt),n(ul),n(st),n(yl),n(ht),n(dl),n(bl),n(Ne),n(Ut),n(wl),n(Ve),n(jt),n(Tl),n(Xe),n(j),n(fl),n(et),n(Il),n(It),n(_l),n(kl),n(Le),n(kt),n(Zl),n(Bl),n(Bt),n($l),n(gl),n(vl),n(gt),n(xl),n(Cl),n(xt),n(Gl),n(Wl),n(Rl),n(Wt),n(Nl),n(Vl),n(Xl),n(Nt),n(zl),n(Ql),n(Hl),n(zt),n(El),n(Fl),n(Yl),n(Et),n(Sl),n(Ft),n(Al),n(Yt),n(ql),n(Ll),n(Dl),n(qt),n(Pl),n(Lt),n(Kl),n(Ol),n(ts),n(Kt),n(es),n(ls),n(ss),n(ee),n(ns),n(as),n(se),n(is),n(rs),n(ae),n(ms),n(ie),n(os),n(ps),n(me),n(cs),n(De),n(oe),n(Ms),n(Js),n(Pe),n(ce),n(us),n(Ke),n(Me),n(ys),n(Oe),n(Je),n(ds),n(tl),n(bs),n(ye),n(ws),n(Ts),n(de),n(hs),n(fs),n(Us),n(Te),n(js),n(Is),n(he),n(_s),n(ks),n(el)),n(l),y(T,t),y(k,t),Ue[$].d(t),je[v].d(t),y(ot,t),y(ct,t),y(Mt,t),y(ut,t),y(yt,t),y(bt,t),Ie[C].d(t),y(ft,t),_e[W].d(t),ke[N].d(t),Ze[X].d(t),y(_t,t),Be[Q].d(t),y(Zt,t),y($t,t),y(nt,t),y(vt,t),y(Ct,t),y(Gt,t),y(at,t),y(Rt,t),y(Vt,t),y(Xt,t),y(Qt,t),y(Ht,t),y(St,t),y(At,t),y(Dt,t),y(Pt,t),y(Ot,t),y(te,t),y(le,t),y(ne,t),y(re,t),$e[E].d(t),y(pe,t),ge[Y].d(t),ve[A].d(t),xe[L].d(t),Ce[P].d(t),y(ue,t),y(it,t),y(be,t),y(we,t),y(rt,t),y(fe,t)}}}const oi='{"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 pi(d,l,i){let e="pt";return Ba(()=>{const c=new URLSearchParams(window.location.search);i(0,e=c.get("fw")||"pt")}),[e]}class Ti extends $a{constructor(l){super(),ga(this,l,pi,mi,Za,{})}}export{Ti as component}; | |
Xet Storage Details
- Size:
- 102 kB
- Xet hash:
- f5f897beea015c048262e8146405112f48504c9ce76e740b783ea0d9abb3ae84
·
Xet efficiently stores files, intelligently splitting them into unique chunks and accelerating uploads and downloads. More info.