import{s as Ul,f as fl,n as Il,o as gl}from"../chunks/scheduler.37c15a92.js";import{S as Rl,i as Al,g as i,s as a,r as E,A as kl,h as o,f as t,c as n,j as pl,u as Q,x as M,k as p,y as Cl,a as s,v as B,d as D,t as G,w as Z}from"../chunks/index.2bf4358c.js";import{C as bl}from"../chunks/CodeBlock.4e987730.js";import{C as El}from"../chunks/CourseFloatingBanner.9ff4c771.js";import{H as il,E as Ql}from"../chunks/getInferenceSnippets.ebf8be91.js";function Bl(ol){let m,$,v,W,u,z,j,_,w,rl="Теперь, когда мы можем создать базовый интерфейс и поделиться им, давайте изучим некоторые более продвинутые возможности, такие как состояние и интерпретации.",N,J,q,y,cl=`Gradio поддерживает <em>состояние сеанса</em>, когда данные сохраняются при нескольких отправках в рамках
загруженной страницы. Состояние сессии полезно для создания демо, например, чат-ботов, где необходимо
сохранять данные по мере того, как пользователь взаимодействует с моделью. Обратите внимание, что состояние сессии не позволяет обмениваться данными между разными пользователями вашей модели.`,X,h,Ml="Чтобы хранить данные о состоянии сеанса, необходимо выполнить три действия:",S,d,ml="<li>Передайте в вашу функцию <em>дополнительный параметр</em>, который представляет собой состояние интерфейса.</li> <li>В завершении работы функции верните обновленное значение состояния в качестве <em>дополнительного возвращаемого значения</em>.</li> <li>Добавьте входной компонент ‘state’ и выходной компонент ‘state’ при создании вашего <code>Interface</code>.</li>",Y,T,ul="Посмотрите пример чатбота ниже:",F,f,V,r,jl,H,b,wl=`Обратите внимание, что состояние выходного компонента сохраняется при всех отправках данных.
Примечание: в параметр state можно передать значение по умолчанию,
которое используется в качестве начального значения состояния.`,L,U,K,I,Jl="Большинство моделей машинного обучения представляют собой “черные ящики”, и внутренняя логика функции скрыта от конечного пользователя. Чтобы стимулировать прозрачность, мы упростили добавление интерпретации в вашу модель, просто задав ключевое слово interpretation в классе Interface по умолчанию. Это позволит вашим пользователям понять, какие части входных данных отвечают за вывод. Взгляните на простой интерфейс ниже, который показывает классификатор изображений, также включающий интерпретацию:",O,g,P,R,yl="Проверьте функцию интерпретации, отправив входные данные и нажав кнопку Интерпретировать (Interpret) под компонентом вывода.",ll,c,hl,el,A,dl='Помимо метода интерпретации, предоставляемого Gradio по умолчанию, вы также можете задать <code>shap</code> для параметра <code>interpretation</code> и установить параметр <code>num_shap</code>. При этом используется интерпретация на основе Шэпли, о которой вы можете подробнее прочитать <a href="https://christophm.github.io/interpretable-ml-book/shap.html" rel="nofollow">здесь</a>. Наконец, в параметр <code>interpretation</code> можно передать собственную функцию интерпретации. Пример можно посмотреть на странице Gradio, посвященной началу работы <a href="https://gradio.app/getting_started/" rel="nofollow">здесь</a>.',tl,k,Tl="На этом мы завершаем наше глубокое погружение в класс <code>Interface</code> в Gradio. Как мы уже видели, этот класс позволяет создавать демо машинного обучения в несколько строк кода на Python. Однако иногда возникает необходимость доработать демо, изменив его макет или соединив несколько функций предсказания в цепочку. Было бы здорово, если бы мы могли как-то разделить <code>Interface</code> на настраиваемые “блоки”? К счастью, такая возможность есть! Этой теме посвящен последний раздел.",sl,C,al,x,nl;return u=new il({props:{title:"Расширенные возможности Interface",local:"advanced-interface-features",headingTag:"h1"}}),j=new El({props:{chapter:9,classNames:"absolute z-10 right-0 top-0",notebooks:[{label:"Google Colab",value:"https://colab.research.google.com/github/huggingface/notebooks/blob/master/course/en/chapter9/section6.ipynb"},{label:"Aws Studio",value:"https://studiolab.sagemaker.aws/import/github/huggingface/notebooks/blob/master/course/en/chapter9/section6.ipynb"}]}}),J=new il({props:{title:"Использование состояния для сохранения данных",local:"using-state-to-persist-data",headingTag:"h3"}}),f=new bl({props:{code:"aW1wb3J0JTIwcmFuZG9tJTBBJTBBaW1wb3J0JTIwZ3JhZGlvJTIwYXMlMjBnciUwQSUwQSUwQWRlZiUyMGNoYXQobWVzc2FnZSUyQyUyMGhpc3RvcnkpJTNBJTBBJTIwJTIwJTIwJTIwaGlzdG9yeSUyMCUzRCUyMGhpc3RvcnklMjBvciUyMCU1QiU1RCUwQSUyMCUyMCUyMCUyMGlmJTIwbWVzc2FnZS5zdGFydHN3aXRoKCUyMkhvdyUyMG1hbnklMjIpJTNBJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwcmVzcG9uc2UlMjAlM0QlMjByYW5kb20ucmFuZGludCgxJTJDJTIwMTApJTBBJTIwJTIwJTIwJTIwZWxpZiUyMG1lc3NhZ2Uuc3RhcnRzd2l0aCglMjJIb3clMjIpJTNBJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwcmVzcG9uc2UlMjAlM0QlMjByYW5kb20uY2hvaWNlKCU1QiUyMkdyZWF0JTIyJTJDJTIwJTIyR29vZCUyMiUyQyUyMCUyMk9rYXklMjIlMkMlMjAlMjJCYWQlMjIlNUQpJTBBJTIwJTIwJTIwJTIwZWxpZiUyMG1lc3NhZ2Uuc3RhcnRzd2l0aCglMjJXaGVyZSUyMiklM0ElMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjByZXNwb25zZSUyMCUzRCUyMHJhbmRvbS5jaG9pY2UoJTVCJTIySGVyZSUyMiUyQyUyMCUyMlRoZXJlJTIyJTJDJTIwJTIyU29tZXdoZXJlJTIyJTVEKSUwQSUyMCUyMCUyMCUyMGVsc2UlM0ElMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjByZXNwb25zZSUyMCUzRCUyMCUyMkklMjBkb24ndCUyMGtub3clMjIlMEElMjAlMjAlMjAlMjBoaXN0b3J5LmFwcGVuZCgobWVzc2FnZSUyQyUyMHJlc3BvbnNlKSklMEElMjAlMjAlMjAlMjByZXR1cm4lMjBoaXN0b3J5JTJDJTIwaGlzdG9yeSUwQSUwQSUwQWlmYWNlJTIwJTNEJTIwZ3IuSW50ZXJmYWNlKCUwQSUyMCUyMCUyMCUyMGNoYXQlMkMlMEElMjAlMjAlMjAlMjAlNUIlMjJ0ZXh0JTIyJTJDJTIwJTIyc3RhdGUlMjIlNUQlMkMlMEElMjAlMjAlMjAlMjAlNUIlMjJjaGF0Ym90JTIyJTJDJTIwJTIyc3RhdGUlMjIlNUQlMkMlMEElMjAlMjAlMjAlMjBhbGxvd19zY3JlZW5zaG90JTNERmFsc2UlMkMlMEElMjAlMjAlMjAlMjBhbGxvd19mbGFnZ2luZyUzRCUyMm5ldmVyJTIyJTJDJTBBKSUwQWlmYWNlLmxhdW5jaCgp",highlighted:`<span class="hljs-keyword">import</span> random

<span class="hljs-keyword">import</span> gradio <span class="hljs-keyword">as</span> gr


<span class="hljs-keyword">def</span> <span class="hljs-title function_">chat</span>(<span class="hljs-params">message, history</span>):
    history = history <span class="hljs-keyword">or</span> []
    <span class="hljs-keyword">if</span> message.startswith(<span class="hljs-string">&quot;How many&quot;</span>):
        response = random.randint(<span class="hljs-number">1</span>, <span class="hljs-number">10</span>)
    <span class="hljs-keyword">elif</span> message.startswith(<span class="hljs-string">&quot;How&quot;</span>):
        response = random.choice([<span class="hljs-string">&quot;Great&quot;</span>, <span class="hljs-string">&quot;Good&quot;</span>, <span class="hljs-string">&quot;Okay&quot;</span>, <span class="hljs-string">&quot;Bad&quot;</span>])
    <span class="hljs-keyword">elif</span> message.startswith(<span class="hljs-string">&quot;Where&quot;</span>):
        response = random.choice([<span class="hljs-string">&quot;Here&quot;</span>, <span class="hljs-string">&quot;There&quot;</span>, <span class="hljs-string">&quot;Somewhere&quot;</span>])
    <span class="hljs-keyword">else</span>:
        response = <span class="hljs-string">&quot;I don&#x27;t know&quot;</span>
    history.append((message, response))
    <span class="hljs-keyword">return</span> history, history


iface = gr.Interface(
    chat,
    [<span class="hljs-string">&quot;text&quot;</span>, <span class="hljs-string">&quot;state&quot;</span>],
    [<span class="hljs-string">&quot;chatbot&quot;</span>, <span class="hljs-string">&quot;state&quot;</span>],
    allow_screenshot=<span class="hljs-literal">False</span>,
    allow_flagging=<span class="hljs-string">&quot;never&quot;</span>,
)
iface.launch()`,wrap:!1}}),U=new il({props:{title:"Использование интерпретации для понимания прогнозов",local:"using-interpretation-to-understand-predictions",headingTag:"h3"}}),g=new bl({props:{code:"aW1wb3J0JTIwcmVxdWVzdHMlMEFpbXBvcnQlMjB0ZW5zb3JmbG93JTIwYXMlMjB0ZiUwQSUwQWltcG9ydCUyMGdyYWRpbyUyMGFzJTIwZ3IlMEElMEFpbmNlcHRpb25fbmV0JTIwJTNEJTIwdGYua2VyYXMuYXBwbGljYXRpb25zLk1vYmlsZU5ldFYyKCklMjAlMjAlMjMlMjAlRDAlQjclRDAlQjAlRDAlQjMlRDElODAlRDElODMlRDAlQjclRDAlQjglRDAlQkMlMjAlRDAlQkMlRDAlQkUlRDAlQjQlRDAlQjUlRDAlQkIlRDElOEMlMEElMEElMjMlMjAlRDAlOTclRDAlQjAlRDAlQjMlRDElODAlRDElODMlRDAlQjclRDAlQjglRDAlQkMlMjAlRDElODclRDAlQjUlRDAlQkIlRDAlQkUlRDAlQjIlRDAlQjUlRDAlQkElRDAlQkUlRDElODclRDAlQjglRDElODIlRDAlQjAlRDAlQjUlRDAlQkMlRDElOEIlRDAlQjUlMjAlRDAlQkMlRDAlQjUlRDElODIlRDAlQkElRDAlQjglMjAlRDAlQjQlRDAlQkIlRDElOEYlMjBJbWFnZU5ldC4lMEFyZXNwb25zZSUyMCUzRCUyMHJlcXVlc3RzLmdldCglMjJodHRwcyUzQSUyRiUyRmdpdC5pbyUyRkpKa1lOJTIyKSUwQWxhYmVscyUyMCUzRCUyMHJlc3BvbnNlLnRleHQuc3BsaXQoJTIyJTVDbiUyMiklMEElMEElMEFkZWYlMjBjbGFzc2lmeV9pbWFnZShpbnApJTNBJTBBJTIwJTIwJTIwJTIwaW5wJTIwJTNEJTIwaW5wLnJlc2hhcGUoKC0xJTJDJTIwMjI0JTJDJTIwMjI0JTJDJTIwMykpJTBBJTIwJTIwJTIwJTIwaW5wJTIwJTNEJTIwdGYua2VyYXMuYXBwbGljYXRpb25zLm1vYmlsZW5ldF92Mi5wcmVwcm9jZXNzX2lucHV0KGlucCklMEElMjAlMjAlMjAlMjBwcmVkaWN0aW9uJTIwJTNEJTIwaW5jZXB0aW9uX25ldC5wcmVkaWN0KGlucCkuZmxhdHRlbigpJTBBJTIwJTIwJTIwJTIwcmV0dXJuJTIwJTdCbGFiZWxzJTVCaSU1RCUzQSUyMGZsb2F0KHByZWRpY3Rpb24lNUJpJTVEKSUyMGZvciUyMGklMjBpbiUyMHJhbmdlKDEwMDApJTdEJTBBJTBBJTBBaW1hZ2UlMjAlM0QlMjBnci5JbWFnZShzaGFwZSUzRCgyMjQlMkMlMjAyMjQpKSUwQWxhYmVsJTIwJTNEJTIwZ3IuTGFiZWwobnVtX3RvcF9jbGFzc2VzJTNEMyklMEElMEF0aXRsZSUyMCUzRCUyMCUyMkdyYWRpbyUyMEltYWdlJTIwQ2xhc3NpZmljdGlvbiUyMCUyQiUyMEludGVycHJldGF0aW9uJTIwRXhhbXBsZSUyMiUwQWdyLkludGVyZmFjZSglMEElMjAlMjAlMjAlMjBmbiUzRGNsYXNzaWZ5X2ltYWdlJTJDJTIwaW5wdXRzJTNEaW1hZ2UlMkMlMjBvdXRwdXRzJTNEbGFiZWwlMkMlMjBpbnRlcnByZXRhdGlvbiUzRCUyMmRlZmF1bHQlMjIlMkMlMjB0aXRsZSUzRHRpdGxlJTBBKS5sYXVuY2goKQ==",highlighted:`<span class="hljs-keyword">import</span> requests
<span class="hljs-keyword">import</span> tensorflow <span class="hljs-keyword">as</span> tf

<span class="hljs-keyword">import</span> gradio <span class="hljs-keyword">as</span> gr

inception_net = tf.keras.applications.MobileNetV2()  <span class="hljs-comment"># загрузим модель</span>

<span class="hljs-comment"># Загрузим человекочитаемые метки для ImageNet.</span>
response = requests.get(<span class="hljs-string">&quot;https://git.io/JJkYN&quot;</span>)
labels = response.text.split(<span class="hljs-string">&quot;\\n&quot;</span>)


<span class="hljs-keyword">def</span> <span class="hljs-title function_">classify_image</span>(<span class="hljs-params">inp</span>):
    inp = inp.reshape((-<span class="hljs-number">1</span>, <span class="hljs-number">224</span>, <span class="hljs-number">224</span>, <span class="hljs-number">3</span>))
    inp = tf.keras.applications.mobilenet_v2.preprocess_input(inp)
    prediction = inception_net.predict(inp).flatten()
    <span class="hljs-keyword">return</span> {labels[i]: <span class="hljs-built_in">float</span>(prediction[i]) <span class="hljs-keyword">for</span> i <span class="hljs-keyword">in</span> <span class="hljs-built_in">range</span>(<span class="hljs-number">1000</span>)}


image = gr.Image(shape=(<span class="hljs-number">224</span>, <span class="hljs-number">224</span>))
label = gr.Label(num_top_classes=<span class="hljs-number">3</span>)

title = <span class="hljs-string">&quot;Gradio Image Classifiction + Interpretation Example&quot;</span>
gr.Interface(
    fn=classify_image, inputs=image, outputs=label, interpretation=<span class="hljs-string">&quot;default&quot;</span>, title=title
).launch()`,wrap:!1}}),C=new Ql({props:{source:"https://github.com/huggingface/course/blob/main/chapters/ru/chapter9/6.mdx"}}),{c(){m=i("meta"),$=a(),v=i("p"),W=a(),E(u.$$.fragment),z=a(),E(j.$$.fragment),_=a(),w=i("p"),w.textContent=rl,N=a(),E(J.$$.fragment),q=a(),y=i("p"),y.innerHTML=cl,X=a(),h=i("p"),h.textContent=Ml,S=a(),d=i("ol"),d.innerHTML=ml,Y=a(),T=i("p"),T.textContent=ul,F=a(),E(f.$$.fragment),V=a(),r=i("iframe"),H=a(),b=i("p"),b.textContent=wl,L=a(),E(U.$$.fragment),K=a(),I=i("p"),I.textContent=Jl,O=a(),E(g.$$.fragment),P=a(),R=i("p"),R.textContent=yl,ll=a(),c=i("iframe"),el=a(),A=i("p"),A.innerHTML=dl,tl=a(),k=i("p"),k.innerHTML=Tl,sl=a(),E(C.$$.fragment),al=a(),x=i("p"),this.h()},l(l){const e=kl("svelte-u9bgzb",document.head);m=o(e,"META",{name:!0,content:!0}),e.forEach(t),$=n(l),v=o(l,"P",{}),pl(v).forEach(t),W=n(l),Q(u.$$.fragment,l),z=n(l),Q(j.$$.fragment,l),_=n(l),w=o(l,"P",{"data-svelte-h":!0}),M(w)!=="svelte-2ua2mn"&&(w.textContent=rl),N=n(l),Q(J.$$.fragment,l),q=n(l),y=o(l,"P",{"data-svelte-h":!0}),M(y)!=="svelte-uhvo1l"&&(y.innerHTML=cl),X=n(l),h=o(l,"P",{"data-svelte-h":!0}),M(h)!=="svelte-191syp1"&&(h.textContent=Ml),S=n(l),d=o(l,"OL",{"data-svelte-h":!0}),M(d)!=="svelte-1l66zjj"&&(d.innerHTML=ml),Y=n(l),T=o(l,"P",{"data-svelte-h":!0}),M(T)!=="svelte-p704vx"&&(T.textContent=ul),F=n(l),Q(f.$$.fragment,l),V=n(l),r=o(l,"IFRAME",{src:!0,frameborder:!0,height:!0,title:!0,class:!0,allow:!0,sandbox:!0}),pl(r).forEach(t),H=n(l),b=o(l,"P",{"data-svelte-h":!0}),M(b)!=="svelte-uhgvnk"&&(b.textContent=wl),L=n(l),Q(U.$$.fragment,l),K=n(l),I=o(l,"P",{"data-svelte-h":!0}),M(I)!=="svelte-1nvvviw"&&(I.textContent=Jl),O=n(l),Q(g.$$.fragment,l),P=n(l),R=o(l,"P",{"data-svelte-h":!0}),M(R)!=="svelte-hgd0jk"&&(R.textContent=yl),ll=n(l),c=o(l,"IFRAME",{src:!0,frameborder:!0,height:!0,title:!0,class:!0,allow:!0,sandbox:!0}),pl(c).forEach(t),el=n(l),A=o(l,"P",{"data-svelte-h":!0}),M(A)!=="svelte-n2izi1"&&(A.innerHTML=dl),tl=n(l),k=o(l,"P",{"data-svelte-h":!0}),M(k)!=="svelte-17mu0rx"&&(k.innerHTML=Tl),sl=n(l),Q(C.$$.fragment,l),al=n(l),x=o(l,"P",{}),pl(x).forEach(t),this.h()},h(){p(m,"name","hf:doc:metadata"),p(m,"content",Dl),fl(r.src,jl="https://course-demos-Chatbot-Demo.hf.space")||p(r,"src",jl),p(r,"frameborder","0"),p(r,"height","350"),p(r,"title","Gradio app"),p(r,"class","container p-0 flex-grow space-iframe"),p(r,"allow","accelerometer; ambient-light-sensor; autoplay; battery; camera; document-domain; encrypted-media; fullscreen; geolocation; gyroscope; layout-animations; legacy-image-formats; magnetometer; microphone; midi; oversized-images; payment; picture-in-picture; publickey-credentials-get; sync-xhr; usb; vr ; wake-lock; xr-spatial-tracking"),p(r,"sandbox","allow-forms allow-modals allow-popups allow-popups-to-escape-sandbox allow-same-origin allow-scripts allow-downloads"),fl(c.src,hl="https://course-demos-gradio-image-interpretation.hf.space")||p(c,"src",hl),p(c,"frameborder","0"),p(c,"height","570"),p(c,"title","Gradio app"),p(c,"class","container p-0 flex-grow space-iframe"),p(c,"allow","accelerometer; ambient-light-sensor; autoplay; battery; camera; document-domain; encrypted-media; fullscreen; geolocation; gyroscope; layout-animations; legacy-image-formats; magnetometer; microphone; midi; oversized-images; payment; picture-in-picture; publickey-credentials-get; sync-xhr; usb; vr ; wake-lock; xr-spatial-tracking"),p(c,"sandbox","allow-forms allow-modals allow-popups allow-popups-to-escape-sandbox allow-same-origin allow-scripts allow-downloads")},m(l,e){Cl(document.head,m),s(l,$,e),s(l,v,e),s(l,W,e),B(u,l,e),s(l,z,e),B(j,l,e),s(l,_,e),s(l,w,e),s(l,N,e),B(J,l,e),s(l,q,e),s(l,y,e),s(l,X,e),s(l,h,e),s(l,S,e),s(l,d,e),s(l,Y,e),s(l,T,e),s(l,F,e),B(f,l,e),s(l,V,e),s(l,r,e),s(l,H,e),s(l,b,e),s(l,L,e),B(U,l,e),s(l,K,e),s(l,I,e),s(l,O,e),B(g,l,e),s(l,P,e),s(l,R,e),s(l,ll,e),s(l,c,e),s(l,el,e),s(l,A,e),s(l,tl,e),s(l,k,e),s(l,sl,e),B(C,l,e),s(l,al,e),s(l,x,e),nl=!0},p:Il,i(l){nl||(D(u.$$.fragment,l),D(j.$$.fragment,l),D(J.$$.fragment,l),D(f.$$.fragment,l),D(U.$$.fragment,l),D(g.$$.fragment,l),D(C.$$.fragment,l),nl=!0)},o(l){G(u.$$.fragment,l),G(j.$$.fragment,l),G(J.$$.fragment,l),G(f.$$.fragment,l),G(U.$$.fragment,l),G(g.$$.fragment,l),G(C.$$.fragment,l),nl=!1},d(l){l&&(t($),t(v),t(W),t(z),t(_),t(w),t(N),t(q),t(y),t(X),t(h),t(S),t(d),t(Y),t(T),t(F),t(V),t(r),t(H),t(b),t(L),t(K),t(I),t(O),t(P),t(R),t(ll),t(c),t(el),t(A),t(tl),t(k),t(sl),t(al),t(x)),t(m),Z(u,l),Z(j,l),Z(J,l),Z(f,l),Z(U,l),Z(g,l),Z(C,l)}}}const Dl='{"title":"Расширенные возможности Interface","local":"advanced-interface-features","sections":[{"title":"Использование состояния для сохранения данных","local":"using-state-to-persist-data","sections":[],"depth":3},{"title":"Использование интерпретации для понимания прогнозов","local":"using-interpretation-to-understand-predictions","sections":[],"depth":3}],"depth":1}';function Gl(ol){return gl(()=>{new URLSearchParams(window.location.search).get("fw")}),[]}class zl extends Rl{constructor(m){super(),Al(this,m,Gl,Bl,Ul,{})}}export{zl as component};
