Buckets:
| import{s as Ba,o as Za}from"../chunks/scheduler.505acc25.js";import{S as xa,i as va,e as d,s as r,c as M,u as O,H as Ua,h as ga,a as b,d as n,b as m,f as gs,g as J,j as T,v as tt,w as fa,k as We,l as _,m as a,n as u,o,q as B,t as p,p as y,r as Z}from"../chunks/index.17dd9071.js";import{C as Ca,H as Cs,E as Ga}from"../chunks/MermaidChart.svelte_svelte_type_style_lang.fc8b4368.js";import{Y as ja}from"../chunks/Youtube.793fe4bf.js";import{C as U}from"../chunks/CodeBlock.c7edfa96.js";import{C as Ia}from"../chunks/CourseFloatingBanner.9496b79e.js";import{F as $a}from"../chunks/FrameworkSwitchCourse.7aa4b983.js";function Wa(h){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 Ra(h){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 Na(h){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 Va(h){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 Xa(h){let l,i;return l=new U({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 za(h){let l,i;return l=new U({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 Qa(h){let l,i;return l=new U({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 Ha(h){let l,i;return l=new U({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 Ea(h){let l,i;return l=new U({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 Fa(h){let l,i;return l=new U({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 Ya(h){let l,i;return l=new U({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 Sa(h){let l,i;return l=new U({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 Aa(h){let l,i="จากนั้นเราจะ mask ค่าตรงที่ <code>start_index > end_index</code> ให้เป็น <code>0</code> (ค่า probabilities อื่นๆ เป็นจำนวนบวกทั้งหมด) ฟังก์ชัน <code>np.triu()</code> จะคำนวณ ส่วนสามเหลี่ยมบนของ tensor 2 มิติ ที่เราใส่ไปเป็น argument ดังนั้นมันจะทำการ mask ให้เรา:",e,c,w;return c=new U({props:{code:"c2NvcmVzJTIwJTNEJTIwbnAudHJpdShzY29yZXMp",highlighted:"scores = np.triu(scores)",wrap:!1}}),{c(){l=d("p"),l.innerHTML=i,e=r(),M(c.$$.fragment)},l(f){l=b(f,"P",{"data-svelte-h":!0}),T(l)!=="svelte-lk48dr"&&(l.innerHTML=i),e=m(f),J(c.$$.fragment,f)},m(f,k){a(f,l,k),a(f,e,k),u(c,f,k),w=!0},i(f){w||(p(c.$$.fragment,f),w=!0)},o(f){o(c.$$.fragment,f),w=!1},d(f){f&&(n(l),n(e)),y(c,f)}}}function qa(h){let l,i="จากนั้นเราจะ mask ค่าตรงที่ <code>start_index > end_index</code> ให้เป็น <code>0</code> (ค่า probabilities อื่นๆ เป็นจำนวนบวกทั้งหมด) ฟังก์ชัน <code>torch.triu()</code> จะคำนวณ ส่วนสามเหลี่ยมบนของ tensor 2 มิติ ที่เราใส่ไปเป็น argument ดังนั้นมันจะทำการ mask ให้เรา:",e,c,w;return c=new U({props:{code:"c2NvcmVzJTIwJTNEJTIwdG9yY2gudHJpdShzY29yZXMp",highlighted:"scores = torch.triu(scores)",wrap:!1}}),{c(){l=d("p"),l.innerHTML=i,e=r(),M(c.$$.fragment)},l(f){l=b(f,"P",{"data-svelte-h":!0}),T(l)!=="svelte-15l6rx7"&&(l.innerHTML=i),e=m(f),J(c.$$.fragment,f)},m(f,k){a(f,l,k),a(f,e,k),u(c,f,k),w=!0},i(f){w||(p(c.$$.fragment,f),w=!0)},o(f){o(c.$$.fragment,f),w=!1},d(f){f&&(n(l),n(e)),y(c,f)}}}function La(h){let l,i,e,c;return l=new U({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 U({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(w){J(l.$$.fragment,w),i=m(w),J(e.$$.fragment,w)},m(w,f){u(l,w,f),a(w,i,f),u(e,w,f),c=!0},i(w){c||(p(l.$$.fragment,w),p(e.$$.fragment,w),c=!0)},o(w){o(l.$$.fragment,w),o(e.$$.fragment,w),c=!1},d(w){w&&n(i),y(l,w),y(e,w)}}}function Da(h){let l,i,e,c;return l=new U({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 U({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(w){J(l.$$.fragment,w),i=m(w),J(e.$$.fragment,w)},m(w,f){u(l,w,f),a(w,i,f),u(e,w,f),c=!0},i(w){c||(p(l.$$.fragment,w),p(e.$$.fragment,w),c=!0)},o(w){o(l.$$.fragment,w),o(e.$$.fragment,w),c=!1},d(w){w&&n(i),y(l,w),y(e,w)}}}function Pa(h){let l,i;return l=new U({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 Ka(h){let l,i;return l=new U({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 Oa(h){let l,i;return l=new U({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 ti(h){let l,i;return l=new U({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 ei(h){let l,i;return l=new U({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 li(h){let l,i;return l=new U({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 si(h){let l,i;return l=new U({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 ni(h){let l,i;return l=new U({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 ai(h){let l,i,e,c,w,f,k,nl,mt,al,x,v,Re,ot,tn=`ในบทนี้ เราจะเรียนเกี่ยวกับการใช้งาน pipeline เพื่อทำ <code>question-answering</code> และดูว่าเราจะสามารถใช้ข้อมูลจาก offset เพื่อเอาไว้หาคำตอบให้กับคำถาม input จากบริบทรอบๆ (context) ได้อย่างไร | |
| ขั้นตอนนี้จะคล้ายๆกับตอนที่เราใช้ offset เพื่อรวมรวม entity ประเภทเดียวกันเข้าด้วยกัน ในบทที่แล้ว | |
| จากนั้น เราจะมาดูกันว่าเราจะจัดการกับ context ที่ยาวมากๆ จนบางส่วนต้องถูกตัดทอนออกได้อย่างไร คุณสามารถข้ามส่วนนี้หากคุณไม่สนใจ question answering`,il,g,C,Ne,pt,rl,ct,en='อย่างที่คุณได้เรียนใน<a href="/course/chapter1">บทที่ 1</a> เราสามารถใช้ <code>question-answering</code> pipeline เพื่อคำนวณคำตอบของคำถาม input ได้ :',ml,Mt,ol,Jt,pl,ut,ln="ใน pipeline อื่นๆ เราไม่สามารถตัดทอนและแยกข้อความที่ยาวเกินกว่าความยาวสูงสุดที่โมเดลกำหนดได้ (และอาจพลาดตัดข้อมูลที่ส่วนท้ายของเอกสารได้ด้วย) แต่ pipeline ที่เราจะเรียนกันนี้ สามารถจัดการกับ context ที่ยาวมากได้ และจะ return คำตอบให้กับคำถาม แม้ว่าจะอยู่ในตอนท้าย:",cl,yt,Ml,dt,Jl,bt,sn="เรามาดูกันว่ามันทำงานอย่างไร!",ul,wt,yl,Tt,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>):`,dl,G,$,Ve,ht,an="เราจะทำการตัดคำให้กับส่วนที่เป็นคำถามและส่วน context ไปด้วยกัน โดยจะตัดคำให้กับส่วนคำถามก่อน",bl,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"/>',wl,Ut,mn=`โมเดลสำหรับ question answering นั้นทำงานแตกต่างไปจากโมเดลอื่น ที่คุณเคยเห็นมาแล้วเล็กน้อย จากภาพด้านบน | |
| โมเดลจะถูกการเทรนให้ทำนาย index ของ token ที่เป็นจุดเริ่มต้นของข้อความคำตอบ (ซึ่งก็คือ index ที่ 21) และ index ของ token สุดท้ายของข้อความคำตอบ | |
| (ซึ่งก็คือ index ที่ 24) นี่คือสาเหตุที่โมเดลเหล่านั้นไม่ return tensor ของ logit หนึ่งตัว แต่สองตัว: tensor แรก คือ logits สำหรับ token เริ่มต้นของคำตอบ | |
| และอีก tensor เป็น logits สำหรับ token สุดท้ายของคำตอบ เนื่องจากในกรณีนี้ เรามีเพียง input เดียว ซึ่งมี 66 token เราจะได้ผลลัพธ์ดังนี้:`,Tl,ft,hl,W,R,Xe,jt,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>:`,Ul,N,V,ze,It,pn="หลังจากที่ เราได้ mask ค่า logits ตำแหน่งที่เราไม่ต้องการจะทำนาย เรียบร้อยแล้ว ตอนนี้เราก็สามารถคำนวณ softmax ได้:",fl,X,z,Qe,j,Gs,He,cn="start_index",$s,Ee,Mn="end_index",Ws,Fe,Jn="start_index <= end_index",Rs,Ye,un="(start_index, end_index)",Ns,Se,yn="start_index",Vs,Ae,dn="end_index",Xs,qe,bn="start_index",zs,Le,wn="end_index",Qs,jl,_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>',Il,et,Hs,_l,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>',kl,De,Tn="start_index <= end_index",Bl,_t,hn="ขั้นแรก เราจะคำนวณผลคูณที่เป็นไปได้ทั้งหมด:",Zl,kt,xl,Q,H,Pe,Bt,Un="ตอนนี้เราแค่ต้องหา index ที่มีค่า probability สูงสุด เนื่องจาก PyTorch จะ return ค่าในรูป flattened tensor เราจึงต้องใช้การหารแล้วปัดลง (floor division) <code>//</code> และโมดูลัส <code>%</code> เพื่อคำนวณ <code>start_index</code> และ <code>end_index</code>:",vl,Zt,gl,xt,fn="ตอนนี้ เราก็ได้ score ที่ถูกต้องสำหรับคำตอบแล้ว (คุณสามารถตรวจสอบได้โดยเปรียบเทียบกับผลลัพธ์แรกในส่วนก่อนหน้า):",Cl,vt,Gl,nt,jn="<p>✏️ <strong>ลองทำดู!</strong> คำนวณ index เริ่มต้นและสิ้นสุด เพื่อหาคำตอบที่น่าจะเป็นไปได้มากที่สุด 5 คำตอบ</p>",$l,gt,In="เรามี <code>start_index</code> และ <code>end_index</code> ของ token ที่จะเอามาเป็นคำตอบได้แล้ว ดังนั้นตอนนี้เราเพียงแค่ต้องแปลงเป็น index ของตัวอักษร ใน context เท่านั้น นี่คือจุดที่ offsets จะมีประโยชน์มาก เราสามารถใช้งานมันได้เหมือนที่เราทำใน token classification:",Wl,Ct,Rl,Gt,_n="ตอนนี้ เราแค่ต้องฟอร์แมตทุกอย่างเพื่อให้ได้ผลลัพธ์ที่ต้องการ:",Nl,$t,Vl,Wt,Xl,Rt,kn="ยอดเยี่ยม! เราได้คำตอบเหมือนกับในตัวอย่างแรกของเรา!",zl,at,Bn="<p>✏️ <strong>ลองดูสิ!</strong> ใช้คะแนนที่ดีที่สุดที่คุณคำนวณไว้ก่อนหน้านี้ เพื่อคำนวณคำตอบที่น่าจะเป็นไปได้มากที่สุดห้าลำดับ ในการตรวจสอบผลลัพธ์ของคุณ ให้กลับไปที่ pipeline แรกแล้วตั้งค่า <code>top_k=5</code> ตอนที่รัน pipeline</p>",Ql,Nt,Hl,Vt,Zn="หากคุณต้องการ tokenize คำถามและบริบทที่ค่อยข้างยาว ที่เราใช้เป็นตัวอย่างก่อนหน้านี้ คุณจะได้ token ที่มีความยาวสูงกว่าความยาวสูงสุดที่จำกัดไว้ใน pipeline <code>question-answering</code> (ซึ่งคือ 384):",El,Xt,Fl,zt,Yl,Qt,xn=`ดังนั้น เราจึงจำเป็นจะต้องตัดทอน input ของเราให้ความยาวเท่ากับความยาวสูงสุด มีหลายวิธีที่เราสามารถทำได้ อย่างไรก็ตาม เราไม่ต้องการตัดคำถามให้สั้นลง เราต้องการตัดเฉพาะตัวบริบทเท่านั้น | |
| เนื่องจากบริบทอยู่ในตำแหน่งของประโยคที่สอง เราจะใช้กลยุทธ์การตัดทอนที่เรียกว่า <code>"only_second"</code> | |
| อย่างไรก็ตาม ปัญหาหนึ่งที่อาจจะเกิดขึ้นก็คือ คำตอบของคำถามอาจจะอยู่ในส่วนที่ถูกตัดออกไป เช่นในตัวอย่างข้างบน เราได้เลือกคำถามที่คำตอบอยู่ในตอนท้ายของบริบท และเมื่อเราตัดทอนส่วนท้ายของบริบทออกไป คำตอบที่เราต้องการก็จะหายไปด้วย:`,Sl,Ht,Al,Et,ql,Ft,vn="ซึ่งหมายความว่า มันจะยากมากที่โมเดลของเราจะเลือกคำตอบได้ถูกต้อง เพื่อแก้ไขปัญหานี้ ไปป์ไลน์ <code>question-answering</code> จะแบ่งบริบทออกเป็นส่วนย่อยๆ ที่ไม่ยาวเกินความยาวสูงสุด",Ll,Yt,gn=`เพื่อให้แน่ใจว่า เราจะไม่แบ่งบริบทผิดตำแหน่งจนโมเดลไม่สามารถค้นหาคำตอบได้ เราจะแบ่งโดย ให้บริบทย่อยแต่ละส่วนมีส่วนที่ทับซ้อนกันด้วย | |
| เราสามารถใช้ tokenizer (ทั้งแบบเร็วและช้า) ทำสิ่งนี้ให้เราได้ โดยคุณจะต้องตั้งค่า <code>return_overflowing_tokens=True</code> นอกจากนั้น เพื่อกำหนดว่าเราจะให้ข้อความทับซ้อนกันมากแค่ไหน เราจำกำหนดค่าให้กับ argument <code>stride</code>`,Dl,St,Cn="ดูตัวอย่างข้างล่างนี้ :",Pl,At,Kl,qt,Ol,Lt,Gn="คุณจะเห็นว่า ตอนนี้ประโยคถูกแบ่งออกเป็นส่วนๆ โดยแต่ละส่วนจะมีไม่เกิน 6 token และมี token ที่ทับซ้อนกัน 2 token (สังเกตว่า ประโยคสุดท้ายมีเพียง 4 token ในกรณี เราจะต้องเพิ่ม padding token ทีหลังเพื่อให้มันยาวเท่ากับส่วนอื่นๆ)",ts,Dt,$n="มาดูผลลัพธ์ของการ tokenization อย่างละเอียดยิ่งขึ้น:",es,Pt,ls,Kt,ss,Ot,Wn="ผลลัพธ์จากการแบ่งประโยคนี้ คือ <code>input_ids</code> และ <code>attention_mask</code> ส่วนคีย์สุดท้าย <code>overflow_to_sample_mapping</code> เป็น map ที่บอกเราว่าแต่ละประโยคย่อยมาจากประโยค input ตำแหน่งที่เท่าไร ในตัวอย่างของเรา เราใช้แค่ประโยคเดียวเป็น input และเราได้ 7 ประโยคย่อยเป็น output แปลว่าทุกประโยคย่อยก็จะถูก map ไปหาประโยคหลักที่มี ID เดียวกัน :",ns,te,as,ee,is,le,Rn="feature นี้จะมีประโยชน์เมื่อเราใช้ประโยคหลายเป็น input ตัวอย่างเช่น:",rs,se,ms,ne,Nn="เราจะได้ :",os,ae,ps,ie,Vn="ซึ่งหมายความว่า ประโยคแรกถูกแบ่งออกเป็น 7 ส่วน และ ประโยคที่สองถูกแบ่งออกเป็น 4 ส่วน",cs,re,Xn="กลับมาดูกันว่า เราจะจัดการกับบริบทยาวๆได้อย่างไร ไปป์ไลน์ <code>question-answering</code> จำกัดความยาวสูงสุดไว้ที่ 384 และค่า stride ถูกตั้งไว้ที่ 128 ซึ่งสอดคล้องกับค่าที่ใช้ตอนที่โมเดลถูก fine-tune (คุณสามารถปรับ parameters เหล่านั้นได้ โดยตั้งค่า <code>max_seq_len</code> และ <code>stride</code> เมื่อเรียกไปป์ไลน์) เราจะใช้ค่าเริ่มต้นพวกนี้ในการแบ่งบริบทเป็นส่วนย่อยๆ นอกจากนี้ เราจะตั้งค่า padding (เพื่อให้มีแต่ละส่วนที่มีความยาวเท่ากัน และเพื่อที่เราจะได้นำมันไปสร้าง tensor ได้) และค่า offsets ด้วย:",Ms,me,Js,oe,zn=`<code>inputs</code> เหล่านั้นจะมี input ID และ attention masks เช่นเดียวกับ offsets และ <code>overflow_to_sample_mapping</code> ที่เราเพิ่งพูดถึง | |
| เนื่องจากทั้งสองอย่างหลังนี้ไม่ใช่ parameters ที่ใช้โดยโมเดล เราจะเอามันออกจาก <code>inputs</code> ก่อนที่จะแปลง <code>inputs</code> เป็น tensor:`,us,E,F,Ke,pe,Qn="บริบทแบบยาวของเรา ตอนนี้ถูกแบ่งออกเป็นสองส่วน ซึ่งหมายความว่า หลังจากเราใส่มันเข้าไปในโมเดลแล้ว เราจะได้ค่า start logits และ end logits อย่างละ 2 เซ็ต :",ys,ce,ds,Y,S,Oe,Me,Hn="เช่นเดียวกับตัวอย่างก่อน ก่อนอื่นเราจะปิด(mask) token ที่ไม่ได้เป็นส่วนหนึ่งของบริบท ก่อนที่จะใช้ softmax นอกจากนี้เราจะปิด padding tokens ทั้งหมดด้วย (ตามการตั้งค่าใน attention mask):",bs,A,q,tl,Je,En="จากนั้นเราจะใช้ softmax เพื่อแปลง logits เป็นความน่าจะเป็น:",ws,L,D,el,ue,Fn="ขั้นตอนต่อไปนั้น คล้ายกับสิ่งที่เราทำกับบริบทแบบสั้นก่อนหน้านี้ เราจะรัน process เดียวกันนี้กับประโยคย่อยทั้งสองส่วนที่เราได้มา จากนั้น เราจะแจกจ่าย score ไปให้กับทุกๆ span ของคำตอบที่เป็นไปได้ และสุดท้ายเราจะเลือก span ที่มี score สูงที่สุด",Ts,P,K,ll,ye,hs,de,Yn="output ที่เราได้คือ span คำตอบที่ดีที่สุดของแต่ละประโยคย่อย ที่โมเดลคำนวณได้ เราจะเห็นว่าโมเดลให้ค่าความมั่นใจที่สูงมากๆกับ span คำตอบในประโยคที่สองมากกว่าประโยคแรก (ซึ่งเป็นสัญญาณที่ดี!) สิ่งที่เราต้องทำหลังจากนี้ก็คือ map ค่า span ไปสู่ตัวอักษร เพื่อดูว่า คำตอบที่โมเดลคำนวณได้คืออะไร",Us,it,Sn="<p>✏️ <strong>ลองดูสิ!</strong> ปรับโค้ดด้านบนเพื่อให้มัน return score และ span ของคำตอบที่น่าจะเป็นไปได้มากที่สุด 5 ลำดับ (โดยเปรียบเทียบ score ของทุกประโยคย่อย)</p>",fs,be,An="ค่า <code>offsets</code> ที่เราใช้ก่อนหน้านี้ เป็น list ของ offsets โดยที่แต่ละประโยคย่อยจะมีหนึ่ง list :",js,we,Is,Te,_s,he,qn="ถ้าไม่นับผลลัพธ์แรกที่เรา print ออกมาด้วย เราก็จะได้ผลลัพธ์เดียวกันกับผลลัพธ์จากไปป์ไลน์ — เย้!",ks,rt,Ln="<p>✏️ <strong>ลองดูสิ!</strong> ใช้ score ที่ดีที่สุดที่คุณคำนวณได้ก่อนหน้านี้ เพื่อแสดงคำตอบที่น่าจะเป็นไปได้มากที่สุด 5 ลำดับ (สำหรับบริบททั้งหมด ไม่ใช่แต่ละส่วน) เพื่อตรวจสอบผลลัพธ์ของคุณ ให้กลับไปที่ไปป์ไลน์แรกแล้วตั้งค่า <code>top_k=5</code> เวลารัน</p>",Bs,Ue,Dn="บทนี้ถือว่าเป็น การสรุปจบการเรียนรู้ความสามารถของ tokenizer แบบละเอียด ในบทต่อไปคุณจะได้ใช้ความรู้ที่เรียนมานี้ เพื่อฝึกฝนอีก โดยคุณจะได้ฝึก fine-tune โมเดลเพื่อ task ทั่วๆไป ของ NLP",Zs,fe,xs,sl,vs;w=new $a({props:{fw:h[0]}}),k=new Ca({props:{containerStyle:"float: right; margin-left: 10px; display: inline-flex; position: relative; z-index: 10;"}}),mt=new Cs({props:{title:"การใช้งานตัวตัดคำแบบเร็ว (Fast tokenizers) ใน QA pipeline",local:"การใชงานตวตดคำแบบเรว-fast-tokenizers-ใน-qa-pipeline",headingTag:"h1"}});const Pn=[Ra,Wa],je=[];function Kn(t,s){return t[0]==="pt"?0:1}x=Kn(h),v=je[x]=Pn[x](h);const On=[Va,Na],Ie=[];function ta(t,s){return t[0]==="pt"?0:1}g=ta(h),C=Ie[g]=On[g](h),pt=new Cs({props:{title:"การใช้ question-answering pipeline",local:"การใช-question-answering-pipeline",headingTag:"h2"}}),Mt=new U({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}}),Jt=new U({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}}),yt=new U({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}}),dt=new U({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}}),wt=new Cs({props:{title:"การใช้งานโมเดลสำหรับงาน question answering",local:"การใชงานโมเดลสำหรบงาน-question-answering",headingTag:"h2"}});const ea=[za,Xa],_e=[];function la(t,s){return t[0]==="pt"?0:1}G=la(h),$=_e[G]=ea[G](h),ft=new U({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 sa=[Ha,Qa],ke=[];function na(t,s){return t[0]==="pt"?0:1}W=na(h),R=ke[W]=sa[W](h);const aa=[Fa,Ea],Be=[];function ia(t,s){return t[0]==="pt"?0:1}N=ia(h),V=Be[N]=aa[N](h);const ra=[Sa,Ya],Ze=[];function ma(t,s){return t[0]==="pt"?0:1}X=ma(h),z=Ze[X]=ra[X](h),kt=new U({props:{code:"c2NvcmVzJTIwJTNEJTIwc3RhcnRfcHJvYmFiaWxpdGllcyU1QiUzQSUyQyUyME5vbmUlNUQlMjAqJTIwZW5kX3Byb2JhYmlsaXRpZXMlNUJOb25lJTJDJTIwJTNBJTVE",highlighted:'scores = start_probabilities[:, <span class="hljs-literal">None</span>] * end_probabilities[<span class="hljs-literal">None</span>, :]',wrap:!1}});const oa=[qa,Aa],xe=[];function pa(t,s){return t[0]==="pt"?0:1}Q=pa(h),H=xe[Q]=oa[Q](h),Zt=new U({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}}),vt=new U({props:{code:"MC45Nzc3Mw==",highlighted:'<span class="hljs-number">0.97773</span>',wrap:!1}}),Ct=new U({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}}),$t=new U({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}}),Wt=new U({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}}),Nt=new Cs({props:{title:"การจัดการกับบริบทยาว (long contexts)",local:"การจดการกบบรบทยาว-long-contexts",headingTag:"h2"}}),Xt=new U({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}}),zt=new U({props:{code:"NDYx",highlighted:'<span class="hljs-number">461</span>',wrap:!1}}),Ht=new U({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}}),Et=new U({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}}),At=new U({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}}),qt=new U({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}}),Pt=new U({props:{code:"cHJpbnQoaW5wdXRzLmtleXMoKSk=",highlighted:'<span class="hljs-built_in">print</span>(inputs.keys())',wrap:!1}}),Kt=new U({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}}),te=new U({props:{code:"cHJpbnQoaW5wdXRzJTVCJTIyb3ZlcmZsb3dfdG9fc2FtcGxlX21hcHBpbmclMjIlNUQp",highlighted:'<span class="hljs-built_in">print</span>(inputs[<span class="hljs-string">"overflow_to_sample_mapping"</span>])',wrap:!1}}),ee=new U({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 U({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}}),ae=new U({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 U({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 ca=[Da,La],ve=[];function Ma(t,s){return t[0]==="pt"?0:1}E=Ma(h),F=ve[E]=ca[E](h),ce=new U({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 Ja=[Ka,Pa],ge=[];function ua(t,s){return t[0]==="pt"?0:1}Y=ua(h),S=ge[Y]=Ja[Y](h);const ya=[ti,Oa],Ce=[];function da(t,s){return t[0]==="pt"?0:1}A=da(h),q=Ce[A]=ya[A](h);const ba=[li,ei],Ge=[];function wa(t,s){return t[0]==="pt"?0:1}L=wa(h),D=Ge[L]=ba[L](h);const Ta=[ni,si],$e=[];function ha(t,s){return t[0]==="pt"?0:1}return P=ha(h),K=$e[P]=Ta[P](h),ye=new U({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}}),we=new U({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}}),Te=new U({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}}),fe=new Ga({props:{source:"https://github.com/huggingface/course/blob/main/chapters/th/chapter6/3b.mdx"}}),{c(){l=d("meta"),i=r(),e=d("p"),c=r(),M(w.$$.fragment),f=r(),M(k.$$.fragment),nl=r(),M(mt.$$.fragment),al=r(),v.c(),Re=r(),ot=d("p"),ot.innerHTML=tn,il=r(),C.c(),Ne=r(),M(pt.$$.fragment),rl=r(),ct=d("p"),ct.innerHTML=en,ml=r(),M(Mt.$$.fragment),ol=r(),M(Jt.$$.fragment),pl=r(),ut=d("p"),ut.textContent=ln,cl=r(),M(yt.$$.fragment),Ml=r(),M(dt.$$.fragment),Jl=r(),bt=d("p"),bt.textContent=sn,ul=r(),M(wt.$$.fragment),yl=r(),Tt=d("p"),Tt.innerHTML=nn,dl=r(),$.c(),Ve=r(),ht=d("p"),ht.textContent=an,bl=r(),st=d("div"),st.innerHTML=rn,wl=r(),Ut=d("p"),Ut.textContent=mn,Tl=r(),M(ft.$$.fragment),hl=r(),R.c(),Xe=r(),jt=d("p"),jt.innerHTML=on,Ul=r(),V.c(),ze=r(),It=d("p"),It.textContent=pn,fl=r(),z.c(),Qe=r(),j=d("p"),Gs=O(`ตอนนี้ เราสามารถหาค่า argmax ของ probabilities ของจุดเริ่มต้นและจุดสิ้นสุดได้แล้ว | |
| แต่ปัญหาที่อาจจะเกิดขึ้นก็คือ index ของจุดเริ่มต้น นั้นอยู่เกิน index ของจุดสิ้นสุด ดังนั้นเราจึงต้องหาวิธีจัดการปัญหานี้ เราจะคำนวณ probabilities ของ `),He=d("code"),He.textContent=cn,$s=O(" และ "),Ee=d("code"),Ee.textContent=Mn,Ws=O(" ที่เป็นไปได้จริง ซึ่งหมายถึง "),Fe=d("code"),Fe.textContent=Jn,Rs=O(" จากนั้นเราจะเลือกใช้แค่ tuple "),Ye=d("code"),Ye.textContent=un,Ns=O(` ที่มีความเป็นไปได้สูงสุด | |
| สมมติว่า เหตุการณ์ที่ “คำตอบเริ่มต้นที่ `),Se=d("code"),Se.textContent=yn,Vs=O("” และ “คำตอบสิ้นสุดที่ "),Ae=d("code"),Ae.textContent=dn,Xs=O("” ไม่มีความเกี่ยวข้องกัน (independent) ความน่าจะเป็นที่ คำตอบจะเริ่มต้นที่ "),qe=d("code"),qe.textContent=bn,zs=O(" และสิ้นสุดที่ "),Le=d("code"),Le.textContent=wn,Qs=O(` คือ: | |
| `),jl=new Ua(!1),Il=r(),et=d("p"),Hs=O("การคำนวณ score ทำได้โดยคำนวณผลคูณทั้งหมดของ"),_l=new Ua(!1),kl=O(" โดยที่ "),De=d("code"),De.textContent=Tn,Bl=r(),_t=d("p"),_t.textContent=hn,Zl=r(),M(kt.$$.fragment),xl=r(),H.c(),Pe=r(),Bt=d("p"),Bt.innerHTML=Un,vl=r(),M(Zt.$$.fragment),gl=r(),xt=d("p"),xt.textContent=fn,Cl=r(),M(vt.$$.fragment),Gl=r(),nt=d("blockquote"),nt.innerHTML=jn,$l=r(),gt=d("p"),gt.innerHTML=In,Wl=r(),M(Ct.$$.fragment),Rl=r(),Gt=d("p"),Gt.textContent=_n,Nl=r(),M($t.$$.fragment),Vl=r(),M(Wt.$$.fragment),Xl=r(),Rt=d("p"),Rt.textContent=kn,zl=r(),at=d("blockquote"),at.innerHTML=Bn,Ql=r(),M(Nt.$$.fragment),Hl=r(),Vt=d("p"),Vt.innerHTML=Zn,El=r(),M(Xt.$$.fragment),Fl=r(),M(zt.$$.fragment),Yl=r(),Qt=d("p"),Qt.innerHTML=xn,Sl=r(),M(Ht.$$.fragment),Al=r(),M(Et.$$.fragment),ql=r(),Ft=d("p"),Ft.innerHTML=vn,Ll=r(),Yt=d("p"),Yt.innerHTML=gn,Dl=r(),St=d("p"),St.textContent=Cn,Pl=r(),M(At.$$.fragment),Kl=r(),M(qt.$$.fragment),Ol=r(),Lt=d("p"),Lt.textContent=Gn,ts=r(),Dt=d("p"),Dt.textContent=$n,es=r(),M(Pt.$$.fragment),ls=r(),M(Kt.$$.fragment),ss=r(),Ot=d("p"),Ot.innerHTML=Wn,ns=r(),M(te.$$.fragment),as=r(),M(ee.$$.fragment),is=r(),le=d("p"),le.textContent=Rn,rs=r(),M(se.$$.fragment),ms=r(),ne=d("p"),ne.textContent=Nn,os=r(),M(ae.$$.fragment),ps=r(),ie=d("p"),ie.textContent=Vn,cs=r(),re=d("p"),re.innerHTML=Xn,Ms=r(),M(me.$$.fragment),Js=r(),oe=d("p"),oe.innerHTML=zn,us=r(),F.c(),Ke=r(),pe=d("p"),pe.textContent=Qn,ys=r(),M(ce.$$.fragment),ds=r(),S.c(),Oe=r(),Me=d("p"),Me.textContent=Hn,bs=r(),q.c(),tl=r(),Je=d("p"),Je.textContent=En,ws=r(),D.c(),el=r(),ue=d("p"),ue.textContent=Fn,Ts=r(),K.c(),ll=r(),M(ye.$$.fragment),hs=r(),de=d("p"),de.textContent=Yn,Us=r(),it=d("blockquote"),it.innerHTML=Sn,fs=r(),be=d("p"),be.innerHTML=An,js=r(),M(we.$$.fragment),Is=r(),M(Te.$$.fragment),_s=r(),he=d("p"),he.textContent=qn,ks=r(),rt=d("blockquote"),rt.innerHTML=Ln,Bs=r(),Ue=d("p"),Ue.textContent=Dn,Zs=r(),M(fe.$$.fragment),xs=r(),sl=d("p"),this.h()},l(t){const s=ga("svelte-u9bgzb",document.head);l=b(s,"META",{name:!0,content:!0}),s.forEach(n),i=m(t),e=b(t,"P",{}),gs(e).forEach(n),c=m(t),J(w.$$.fragment,t),f=m(t),J(k.$$.fragment,t),nl=m(t),J(mt.$$.fragment,t),al=m(t),v.l(t),Re=m(t),ot=b(t,"P",{"data-svelte-h":!0}),T(ot)!=="svelte-1y1g560"&&(ot.innerHTML=tn),il=m(t),C.l(t),Ne=m(t),J(pt.$$.fragment,t),rl=m(t),ct=b(t,"P",{"data-svelte-h":!0}),T(ct)!=="svelte-tmj02y"&&(ct.innerHTML=en),ml=m(t),J(Mt.$$.fragment,t),ol=m(t),J(Jt.$$.fragment,t),pl=m(t),ut=b(t,"P",{"data-svelte-h":!0}),T(ut)!=="svelte-v5cov2"&&(ut.textContent=ln),cl=m(t),J(yt.$$.fragment,t),Ml=m(t),J(dt.$$.fragment,t),Jl=m(t),bt=b(t,"P",{"data-svelte-h":!0}),T(bt)!=="svelte-1atxoyq"&&(bt.textContent=sn),ul=m(t),J(wt.$$.fragment,t),yl=m(t),Tt=b(t,"P",{"data-svelte-h":!0}),T(Tt)!=="svelte-l8m0xk"&&(Tt.innerHTML=nn),dl=m(t),$.l(t),Ve=m(t),ht=b(t,"P",{"data-svelte-h":!0}),T(ht)!=="svelte-17wzyec"&&(ht.textContent=an),bl=m(t),st=b(t,"DIV",{class:!0,"data-svelte-h":!0}),T(st)!=="svelte-47wedv"&&(st.innerHTML=rn),wl=m(t),Ut=b(t,"P",{"data-svelte-h":!0}),T(Ut)!=="svelte-10j6uaj"&&(Ut.textContent=mn),Tl=m(t),J(ft.$$.fragment,t),hl=m(t),R.l(t),Xe=m(t),jt=b(t,"P",{"data-svelte-h":!0}),T(jt)!=="svelte-psx7g"&&(jt.innerHTML=on),Ul=m(t),V.l(t),ze=m(t),It=b(t,"P",{"data-svelte-h":!0}),T(It)!=="svelte-1ihn1yv"&&(It.textContent=pn),fl=m(t),z.l(t),Qe=m(t),j=b(t,"P",{});var I=gs(j);Gs=tt(I,`ตอนนี้ เราสามารถหาค่า argmax ของ probabilities ของจุดเริ่มต้นและจุดสิ้นสุดได้แล้ว | |
| แต่ปัญหาที่อาจจะเกิดขึ้นก็คือ index ของจุดเริ่มต้น นั้นอยู่เกิน index ของจุดสิ้นสุด ดังนั้นเราจึงต้องหาวิธีจัดการปัญหานี้ เราจะคำนวณ probabilities ของ `),He=b(I,"CODE",{"data-svelte-h":!0}),T(He)!=="svelte-8eqb3b"&&(He.textContent=cn),$s=tt(I," และ "),Ee=b(I,"CODE",{"data-svelte-h":!0}),T(Ee)!=="svelte-9cistc"&&(Ee.textContent=Mn),Ws=tt(I," ที่เป็นไปได้จริง ซึ่งหมายถึง "),Fe=b(I,"CODE",{"data-svelte-h":!0}),T(Fe)!=="svelte-1kp3szf"&&(Fe.textContent=Jn),Rs=tt(I," จากนั้นเราจะเลือกใช้แค่ tuple "),Ye=b(I,"CODE",{"data-svelte-h":!0}),T(Ye)!=="svelte-boh5bq"&&(Ye.textContent=un),Ns=tt(I,` ที่มีความเป็นไปได้สูงสุด | |
| สมมติว่า เหตุการณ์ที่ “คำตอบเริ่มต้นที่ `),Se=b(I,"CODE",{"data-svelte-h":!0}),T(Se)!=="svelte-8eqb3b"&&(Se.textContent=yn),Vs=tt(I,"” และ “คำตอบสิ้นสุดที่ "),Ae=b(I,"CODE",{"data-svelte-h":!0}),T(Ae)!=="svelte-9cistc"&&(Ae.textContent=dn),Xs=tt(I,"” ไม่มีความเกี่ยวข้องกัน (independent) ความน่าจะเป็นที่ คำตอบจะเริ่มต้นที่ "),qe=b(I,"CODE",{"data-svelte-h":!0}),T(qe)!=="svelte-8eqb3b"&&(qe.textContent=bn),zs=tt(I," และสิ้นสุดที่ "),Le=b(I,"CODE",{"data-svelte-h":!0}),T(Le)!=="svelte-9cistc"&&(Le.textContent=wn),Qs=tt(I,` คือ: | |
| `),jl=fa(I,!1),I.forEach(n),Il=m(t),et=b(t,"P",{});var lt=gs(et);Hs=tt(lt,"การคำนวณ score ทำได้โดยคำนวณผลคูณทั้งหมดของ"),_l=fa(lt,!1),kl=tt(lt," โดยที่ "),De=b(lt,"CODE",{"data-svelte-h":!0}),T(De)!=="svelte-1kp3szf"&&(De.textContent=Tn),lt.forEach(n),Bl=m(t),_t=b(t,"P",{"data-svelte-h":!0}),T(_t)!=="svelte-19m0rud"&&(_t.textContent=hn),Zl=m(t),J(kt.$$.fragment,t),xl=m(t),H.l(t),Pe=m(t),Bt=b(t,"P",{"data-svelte-h":!0}),T(Bt)!=="svelte-tdr177"&&(Bt.innerHTML=Un),vl=m(t),J(Zt.$$.fragment,t),gl=m(t),xt=b(t,"P",{"data-svelte-h":!0}),T(xt)!=="svelte-puutj5"&&(xt.textContent=fn),Cl=m(t),J(vt.$$.fragment,t),Gl=m(t),nt=b(t,"BLOCKQUOTE",{class:!0,"data-svelte-h":!0}),T(nt)!=="svelte-6j62lc"&&(nt.innerHTML=jn),$l=m(t),gt=b(t,"P",{"data-svelte-h":!0}),T(gt)!=="svelte-1tpr9s"&&(gt.innerHTML=In),Wl=m(t),J(Ct.$$.fragment,t),Rl=m(t),Gt=b(t,"P",{"data-svelte-h":!0}),T(Gt)!=="svelte-1vuhqzj"&&(Gt.textContent=_n),Nl=m(t),J($t.$$.fragment,t),Vl=m(t),J(Wt.$$.fragment,t),Xl=m(t),Rt=b(t,"P",{"data-svelte-h":!0}),T(Rt)!=="svelte-1awnsfs"&&(Rt.textContent=kn),zl=m(t),at=b(t,"BLOCKQUOTE",{class:!0,"data-svelte-h":!0}),T(at)!=="svelte-1m33zu9"&&(at.innerHTML=Bn),Ql=m(t),J(Nt.$$.fragment,t),Hl=m(t),Vt=b(t,"P",{"data-svelte-h":!0}),T(Vt)!=="svelte-14p8ixq"&&(Vt.innerHTML=Zn),El=m(t),J(Xt.$$.fragment,t),Fl=m(t),J(zt.$$.fragment,t),Yl=m(t),Qt=b(t,"P",{"data-svelte-h":!0}),T(Qt)!=="svelte-13ybocv"&&(Qt.innerHTML=xn),Sl=m(t),J(Ht.$$.fragment,t),Al=m(t),J(Et.$$.fragment,t),ql=m(t),Ft=b(t,"P",{"data-svelte-h":!0}),T(Ft)!=="svelte-1gp042a"&&(Ft.innerHTML=vn),Ll=m(t),Yt=b(t,"P",{"data-svelte-h":!0}),T(Yt)!=="svelte-zxg9vy"&&(Yt.innerHTML=gn),Dl=m(t),St=b(t,"P",{"data-svelte-h":!0}),T(St)!=="svelte-bt81y7"&&(St.textContent=Cn),Pl=m(t),J(At.$$.fragment,t),Kl=m(t),J(qt.$$.fragment,t),Ol=m(t),Lt=b(t,"P",{"data-svelte-h":!0}),T(Lt)!=="svelte-1gvxhgv"&&(Lt.textContent=Gn),ts=m(t),Dt=b(t,"P",{"data-svelte-h":!0}),T(Dt)!=="svelte-l0uwqk"&&(Dt.textContent=$n),es=m(t),J(Pt.$$.fragment,t),ls=m(t),J(Kt.$$.fragment,t),ss=m(t),Ot=b(t,"P",{"data-svelte-h":!0}),T(Ot)!=="svelte-k5gtjs"&&(Ot.innerHTML=Wn),ns=m(t),J(te.$$.fragment,t),as=m(t),J(ee.$$.fragment,t),is=m(t),le=b(t,"P",{"data-svelte-h":!0}),T(le)!=="svelte-ivznwp"&&(le.textContent=Rn),rs=m(t),J(se.$$.fragment,t),ms=m(t),ne=b(t,"P",{"data-svelte-h":!0}),T(ne)!=="svelte-16eh5ge"&&(ne.textContent=Nn),os=m(t),J(ae.$$.fragment,t),ps=m(t),ie=b(t,"P",{"data-svelte-h":!0}),T(ie)!=="svelte-mvmwjh"&&(ie.textContent=Vn),cs=m(t),re=b(t,"P",{"data-svelte-h":!0}),T(re)!=="svelte-1knj1si"&&(re.innerHTML=Xn),Ms=m(t),J(me.$$.fragment,t),Js=m(t),oe=b(t,"P",{"data-svelte-h":!0}),T(oe)!=="svelte-5zg0ke"&&(oe.innerHTML=zn),us=m(t),F.l(t),Ke=m(t),pe=b(t,"P",{"data-svelte-h":!0}),T(pe)!=="svelte-3e6ghp"&&(pe.textContent=Qn),ys=m(t),J(ce.$$.fragment,t),ds=m(t),S.l(t),Oe=m(t),Me=b(t,"P",{"data-svelte-h":!0}),T(Me)!=="svelte-mgk1n9"&&(Me.textContent=Hn),bs=m(t),q.l(t),tl=m(t),Je=b(t,"P",{"data-svelte-h":!0}),T(Je)!=="svelte-1rc61wr"&&(Je.textContent=En),ws=m(t),D.l(t),el=m(t),ue=b(t,"P",{"data-svelte-h":!0}),T(ue)!=="svelte-8i7goq"&&(ue.textContent=Fn),Ts=m(t),K.l(t),ll=m(t),J(ye.$$.fragment,t),hs=m(t),de=b(t,"P",{"data-svelte-h":!0}),T(de)!=="svelte-1wvnuzu"&&(de.textContent=Yn),Us=m(t),it=b(t,"BLOCKQUOTE",{class:!0,"data-svelte-h":!0}),T(it)!=="svelte-1q9xwno"&&(it.innerHTML=Sn),fs=m(t),be=b(t,"P",{"data-svelte-h":!0}),T(be)!=="svelte-174er3z"&&(be.innerHTML=An),js=m(t),J(we.$$.fragment,t),Is=m(t),J(Te.$$.fragment,t),_s=m(t),he=b(t,"P",{"data-svelte-h":!0}),T(he)!=="svelte-249oiy"&&(he.textContent=qn),ks=m(t),rt=b(t,"BLOCKQUOTE",{class:!0,"data-svelte-h":!0}),T(rt)!=="svelte-13puzpn"&&(rt.innerHTML=Ln),Bs=m(t),Ue=b(t,"P",{"data-svelte-h":!0}),T(Ue)!=="svelte-1jfx96i"&&(Ue.textContent=Dn),Zs=m(t),J(fe.$$.fragment,t),xs=m(t),sl=b(t,"P",{}),gs(sl).forEach(n),this.h()},h(){We(l,"name","hf:doc:metadata"),We(l,"content",ii),We(st,"class","flex justify-center"),jl.a=null,_l.a=kl,We(nt,"class","tip"),We(at,"class","tip"),We(it,"class","tip"),We(rt,"class","tip")},m(t,s){_(document.head,l),a(t,i,s),a(t,e,s),a(t,c,s),u(w,t,s),a(t,f,s),u(k,t,s),a(t,nl,s),u(mt,t,s),a(t,al,s),je[x].m(t,s),a(t,Re,s),a(t,ot,s),a(t,il,s),Ie[g].m(t,s),a(t,Ne,s),u(pt,t,s),a(t,rl,s),a(t,ct,s),a(t,ml,s),u(Mt,t,s),a(t,ol,s),u(Jt,t,s),a(t,pl,s),a(t,ut,s),a(t,cl,s),u(yt,t,s),a(t,Ml,s),u(dt,t,s),a(t,Jl,s),a(t,bt,s),a(t,ul,s),u(wt,t,s),a(t,yl,s),a(t,Tt,s),a(t,dl,s),_e[G].m(t,s),a(t,Ve,s),a(t,ht,s),a(t,bl,s),a(t,st,s),a(t,wl,s),a(t,Ut,s),a(t,Tl,s),u(ft,t,s),a(t,hl,s),ke[W].m(t,s),a(t,Xe,s),a(t,jt,s),a(t,Ul,s),Be[N].m(t,s),a(t,ze,s),a(t,It,s),a(t,fl,s),Ze[X].m(t,s),a(t,Qe,s),a(t,j,s),_(j,Gs),_(j,He),_(j,$s),_(j,Ee),_(j,Ws),_(j,Fe),_(j,Rs),_(j,Ye),_(j,Ns),_(j,Se),_(j,Vs),_(j,Ae),_(j,Xs),_(j,qe),_(j,zs),_(j,Le),_(j,Qs),jl.m(_a,j),a(t,Il,s),a(t,et,s),_(et,Hs),_l.m(ka,et),_(et,kl),_(et,De),a(t,Bl,s),a(t,_t,s),a(t,Zl,s),u(kt,t,s),a(t,xl,s),xe[Q].m(t,s),a(t,Pe,s),a(t,Bt,s),a(t,vl,s),u(Zt,t,s),a(t,gl,s),a(t,xt,s),a(t,Cl,s),u(vt,t,s),a(t,Gl,s),a(t,nt,s),a(t,$l,s),a(t,gt,s),a(t,Wl,s),u(Ct,t,s),a(t,Rl,s),a(t,Gt,s),a(t,Nl,s),u($t,t,s),a(t,Vl,s),u(Wt,t,s),a(t,Xl,s),a(t,Rt,s),a(t,zl,s),a(t,at,s),a(t,Ql,s),u(Nt,t,s),a(t,Hl,s),a(t,Vt,s),a(t,El,s),u(Xt,t,s),a(t,Fl,s),u(zt,t,s),a(t,Yl,s),a(t,Qt,s),a(t,Sl,s),u(Ht,t,s),a(t,Al,s),u(Et,t,s),a(t,ql,s),a(t,Ft,s),a(t,Ll,s),a(t,Yt,s),a(t,Dl,s),a(t,St,s),a(t,Pl,s),u(At,t,s),a(t,Kl,s),u(qt,t,s),a(t,Ol,s),a(t,Lt,s),a(t,ts,s),a(t,Dt,s),a(t,es,s),u(Pt,t,s),a(t,ls,s),u(Kt,t,s),a(t,ss,s),a(t,Ot,s),a(t,ns,s),u(te,t,s),a(t,as,s),u(ee,t,s),a(t,is,s),a(t,le,s),a(t,rs,s),u(se,t,s),a(t,ms,s),a(t,ne,s),a(t,os,s),u(ae,t,s),a(t,ps,s),a(t,ie,s),a(t,cs,s),a(t,re,s),a(t,Ms,s),u(me,t,s),a(t,Js,s),a(t,oe,s),a(t,us,s),ve[E].m(t,s),a(t,Ke,s),a(t,pe,s),a(t,ys,s),u(ce,t,s),a(t,ds,s),ge[Y].m(t,s),a(t,Oe,s),a(t,Me,s),a(t,bs,s),Ce[A].m(t,s),a(t,tl,s),a(t,Je,s),a(t,ws,s),Ge[L].m(t,s),a(t,el,s),a(t,ue,s),a(t,Ts,s),$e[P].m(t,s),a(t,ll,s),u(ye,t,s),a(t,hs,s),a(t,de,s),a(t,Us,s),a(t,it,s),a(t,fs,s),a(t,be,s),a(t,js,s),u(we,t,s),a(t,Is,s),u(Te,t,s),a(t,_s,s),a(t,he,s),a(t,ks,s),a(t,rt,s),a(t,Bs,s),a(t,Ue,s),a(t,Zs,s),u(fe,t,s),a(t,xs,s),a(t,sl,s),vs=!0},p(t,[s]){const I={};s&1&&(I.fw=t[0]),w.$set(I);let lt=x;x=Kn(t),x!==lt&&(Z(),o(je[lt],1,1,()=>{je[lt]=null}),B(),v=je[x],v||(v=je[x]=Pn[x](t),v.c()),p(v,1),v.m(Re.parentNode,Re));let Es=g;g=ta(t),g!==Es&&(Z(),o(Ie[Es],1,1,()=>{Ie[Es]=null}),B(),C=Ie[g],C||(C=Ie[g]=On[g](t),C.c()),p(C,1),C.m(Ne.parentNode,Ne));let Fs=G;G=la(t),G!==Fs&&(Z(),o(_e[Fs],1,1,()=>{_e[Fs]=null}),B(),$=_e[G],$||($=_e[G]=ea[G](t),$.c()),p($,1),$.m(Ve.parentNode,Ve));let Ys=W;W=na(t),W!==Ys&&(Z(),o(ke[Ys],1,1,()=>{ke[Ys]=null}),B(),R=ke[W],R||(R=ke[W]=sa[W](t),R.c()),p(R,1),R.m(Xe.parentNode,Xe));let Ss=N;N=ia(t),N!==Ss&&(Z(),o(Be[Ss],1,1,()=>{Be[Ss]=null}),B(),V=Be[N],V||(V=Be[N]=aa[N](t),V.c()),p(V,1),V.m(ze.parentNode,ze));let As=X;X=ma(t),X!==As&&(Z(),o(Ze[As],1,1,()=>{Ze[As]=null}),B(),z=Ze[X],z||(z=Ze[X]=ra[X](t),z.c()),p(z,1),z.m(Qe.parentNode,Qe));let qs=Q;Q=pa(t),Q!==qs&&(Z(),o(xe[qs],1,1,()=>{xe[qs]=null}),B(),H=xe[Q],H||(H=xe[Q]=oa[Q](t),H.c()),p(H,1),H.m(Pe.parentNode,Pe));let Ls=E;E=Ma(t),E!==Ls&&(Z(),o(ve[Ls],1,1,()=>{ve[Ls]=null}),B(),F=ve[E],F||(F=ve[E]=ca[E](t),F.c()),p(F,1),F.m(Ke.parentNode,Ke));let Ds=Y;Y=ua(t),Y!==Ds&&(Z(),o(ge[Ds],1,1,()=>{ge[Ds]=null}),B(),S=ge[Y],S||(S=ge[Y]=Ja[Y](t),S.c()),p(S,1),S.m(Oe.parentNode,Oe));let Ps=A;A=da(t),A!==Ps&&(Z(),o(Ce[Ps],1,1,()=>{Ce[Ps]=null}),B(),q=Ce[A],q||(q=Ce[A]=ya[A](t),q.c()),p(q,1),q.m(tl.parentNode,tl));let Ks=L;L=wa(t),L!==Ks&&(Z(),o(Ge[Ks],1,1,()=>{Ge[Ks]=null}),B(),D=Ge[L],D||(D=Ge[L]=ba[L](t),D.c()),p(D,1),D.m(el.parentNode,el));let Os=P;P=ha(t),P!==Os&&(Z(),o($e[Os],1,1,()=>{$e[Os]=null}),B(),K=$e[P],K||(K=$e[P]=Ta[P](t),K.c()),p(K,1),K.m(ll.parentNode,ll))},i(t){vs||(p(w.$$.fragment,t),p(k.$$.fragment,t),p(mt.$$.fragment,t),p(v),p(C),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($),p(ft.$$.fragment,t),p(R),p(V),p(z),p(kt.$$.fragment,t),p(H),p(Zt.$$.fragment,t),p(vt.$$.fragment,t),p(Ct.$$.fragment,t),p($t.$$.fragment,t),p(Wt.$$.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(we.$$.fragment,t),p(Te.$$.fragment,t),p(fe.$$.fragment,t),vs=!0)},o(t){o(w.$$.fragment,t),o(k.$$.fragment,t),o(mt.$$.fragment,t),o(v),o(C),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($),o(ft.$$.fragment,t),o(R),o(V),o(z),o(kt.$$.fragment,t),o(H),o(Zt.$$.fragment,t),o(vt.$$.fragment,t),o(Ct.$$.fragment,t),o($t.$$.fragment,t),o(Wt.$$.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(we.$$.fragment,t),o(Te.$$.fragment,t),o(fe.$$.fragment,t),vs=!1},d(t){t&&(n(i),n(e),n(c),n(f),n(nl),n(al),n(Re),n(ot),n(il),n(Ne),n(rl),n(ct),n(ml),n(ol),n(pl),n(ut),n(cl),n(Ml),n(Jl),n(bt),n(ul),n(yl),n(Tt),n(dl),n(Ve),n(ht),n(bl),n(st),n(wl),n(Ut),n(Tl),n(hl),n(Xe),n(jt),n(Ul),n(ze),n(It),n(fl),n(Qe),n(j),n(Il),n(et),n(Bl),n(_t),n(Zl),n(xl),n(Pe),n(Bt),n(vl),n(gl),n(xt),n(Cl),n(Gl),n(nt),n($l),n(gt),n(Wl),n(Rl),n(Gt),n(Nl),n(Vl),n(Xl),n(Rt),n(zl),n(at),n(Ql),n(Hl),n(Vt),n(El),n(Fl),n(Yl),n(Qt),n(Sl),n(Al),n(ql),n(Ft),n(Ll),n(Yt),n(Dl),n(St),n(Pl),n(Kl),n(Ol),n(Lt),n(ts),n(Dt),n(es),n(ls),n(ss),n(Ot),n(ns),n(as),n(is),n(le),n(rs),n(ms),n(ne),n(os),n(ps),n(ie),n(cs),n(re),n(Ms),n(Js),n(oe),n(us),n(Ke),n(pe),n(ys),n(ds),n(Oe),n(Me),n(bs),n(tl),n(Je),n(ws),n(el),n(ue),n(Ts),n(ll),n(hs),n(de),n(Us),n(it),n(fs),n(be),n(js),n(Is),n(_s),n(he),n(ks),n(rt),n(Bs),n(Ue),n(Zs),n(xs),n(sl)),n(l),y(w,t),y(k,t),y(mt,t),je[x].d(t),Ie[g].d(t),y(pt,t),y(Mt,t),y(Jt,t),y(yt,t),y(dt,t),y(wt,t),_e[G].d(t),y(ft,t),ke[W].d(t),Be[N].d(t),Ze[X].d(t),y(kt,t),xe[Q].d(t),y(Zt,t),y(vt,t),y(Ct,t),y($t,t),y(Wt,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),ve[E].d(t),y(ce,t),ge[Y].d(t),Ce[A].d(t),Ge[L].d(t),$e[P].d(t),y(ye,t),y(we,t),y(Te,t),y(fe,t)}}}const ii='{"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 ri(h,l,i){let e="pt";return Za(()=>{const c=new URLSearchParams(window.location.search);i(0,e=c.get("fw")||"pt")}),[e]}class yi extends xa{constructor(l){super(),va(this,l,ri,ai,Ba,{})}}export{yi as component}; | |
Xet Storage Details
- Size:
- 101 kB
- Xet hash:
- 18ec573988b021416915d109bc3b1299048a9b49889d09f7be4fd576bbfcb580
·
Xet efficiently stores files, intelligently splitting them into unique chunks and accelerating uploads and downloads. More info.