import{s as Kl,n as lt,o as tt}from"../chunks/scheduler.37c15a92.js";import{S as st,i as et,g as a,s as n,r as T,A as nt,h as J,f as s,c as M,j as Pl,u as p,x as U,k as gl,y as Mt,a as e,v as i,d as o,t as r,w as c}from"../chunks/index.2bf4358c.js";import{C as Ol}from"../chunks/CodeBlock.4e987730.js";import{C as at}from"../chunks/CourseFloatingBanner.6add7356.js";import{H as $}from"../chunks/Heading.8ada512a.js";import{E as Jt}from"../chunks/getInferenceSnippets.0aa3753f.js";function Ut(Gl){let y,D,H,L,j,P,w,O,u,fl='<p>您可以通过 <a href="https://huggingface.co/agents-course/notebooks/blob/main/unit2/smolagents/retrieval_agents.ipynb" target="_blank">此 Notebook</a> 跟随代码实践，该文件支持在 Google Colab 中运行。</p>',K,I,kl="检索增强生成（Retrieval-Augmented Generation，RAG）系统结合了数据检索和生成模型的能力，以提供上下文感知的响应。例如，用户的查询会被传递给搜索引擎，检索结果与查询一起提供给模型，模型随后根据查询和检索到的信息生成响应。",ll,C,Rl="智能驱动的 RAG（Retrieval-Augmented Generation）通过<strong>将自主智能体与动态知识检索相结合</strong>，扩展了传统 RAG 系统。",tl,m,vl="传统 RAG 系统使用 LLM 根据检索数据回答查询，而智能驱动的 RAG <strong>实现了对检索和生成流程的智能控制</strong>，从而提高了效率和准确性。",sl,d,Ql="传统 RAG 系统面临关键限制，例如<strong>依赖单次检索步骤</strong>，以及过度关注与用户查询的直接语义相似性，这可能会忽略相关信息。",el,h,Wl="智能驱动的 RAG 通过允许智能体自主制定搜索查询、评估检索结果并进行多次检索步骤，以生成更定制化和全面的输出，从而解决这些问题。",nl,B,Ml,b,Nl="让我们构建一个能够使用 DuckDuckGo 进行网页搜索的简单智能体。该智能体将检索信息并综合响应来回答查询。通过智能驱动的 RAG，Alfred 的智能体可以：",al,Z,El="<li>搜索最新的超级英雄派对趋势</li> <li>优化结果以包含奢侈元素</li> <li>将信息综合成完整方案</li>",Jl,V,Al="以下是 Alfred 的智能体实现此功能的代码示例：",Ul,g,yl,G,Xl="智能体遵循以下流程：",Tl,f,ql="<li><strong>请求分析：</strong> Alfred 的智能体识别查询的关键要素——重点关注装饰、娱乐和餐饮的豪华超级英雄主题派对规划</li> <li><strong>执行检索：</strong> 智能体利用 DuckDuckGo 搜索最新相关信息，确保符合 Alfred 对奢侈活动的精细要求</li> <li><strong>信息综合：</strong> 收集结果后，智能体将其处理为覆盖派对所有方面的可执行方案</li> <li><strong>未来参考存储：</strong> 智能体存储检索信息以便后续活动规划时快速访问，优化后续任务效率</li>",pl,k,il,R,xl="对于专业任务，自定义知识库非常宝贵。让我们创建可以查询技术文档或专业知识的向量数据库工具。通过语义搜索，智能体可以找到与 Alfred 需求最相关的信息。",ol,v,_l="向量数据库（vector database）是通过专业 ML 模型实现丰富文档表示的集合，能够快速搜索和检索文档。",rl,Q,Sl="该方法将预定义知识与语义搜索相结合，为活动规划提供上下文感知解决方案。通过专业知识访问，Alfred 可以完善派对的每个细节。",cl,W,zl="在此示例中，我们将创建从自定义知识库检索派对策划创意的工具。使用 BM25 检索器搜索知识库并返回最佳结果，同时使用 <code>RecursiveCharacterTextSplitter</code> 将文档分割为更小的块以提高搜索效率：",ul,N,jl,E,Yl="增强后的智能体能够：",wl,A,Hl="<li>首先检查文档中的相关信息</li> <li>结合知识库的洞察</li> <li>在内存中维护对话上下文</li>",Il,X,Cl,q,Fl="构建智能驱动的 RAG 系统时，智能体可以采用以下高级策略：",ml,x,$l="<li><strong>查询重构：</strong> 智能体可以优化原始查询，生成更匹配目标文档的搜索词</li> <li><strong>多步检索：</strong> 智能体可以进行多次搜索，利用初步结果优化后续查询</li> <li><strong>多源整合：</strong> 结合来自网页搜索和本地文档等多个来源的信息</li> <li><strong>结果验证：</strong> 在将检索内容纳入响应前分析其相关性和准确性</li>",dl,_,Dl="有效的智能驱动 RAG 系统需要仔细考虑几个关键方面。智能体<strong>应根据查询类型和上下文选择可用工具</strong>，记忆系统帮助维护对话历史避免重复检索，后备策略确保在主要检索方法失败时系统仍能提供价值，验证步骤则帮助确保检索信息的准确性和相关性。",hl,S,Bl,z,Ll='<li><a href="https://huggingface.co/learn/cookbook/zh-CN/agent_rag" rel="nofollow">Agentic RAG: 使用查询重构和自查询加速您的 RAG 系统！🚀</a> - 使用 smolagents 开发智能驱动 RAG 系统的实践指南</li>',bl,Y,Zl,F,Vl;return j=new at({props:{chapter:2,classNames:"absolute z-10 right-0 top-0",notebooks:[{label:"Google Colab",value:"https://colab.research.google.com/#fileId=https://huggingface.co/agents-course/notebooks/blob/main/unit2/smolagents/retrieval_agents.ipynb"}]}}),w=new $({props:{title:"构建智能驱动的 RAG 系统",local:"构建智能驱动的-rag-系统",headingTag:"h1"}}),B=new $({props:{title:"基于 DuckDuckGo 的基础检索",local:"基于-duckduckgo-的基础检索",headingTag:"h2"}}),g=new Ol({props:{code:"ZnJvbSUyMHNtb2xhZ2VudHMlMjBpbXBvcnQlMjBDb2RlQWdlbnQlMkMlMjBEdWNrRHVja0dvU2VhcmNoVG9vbCUyQyUyMEluZmVyZW5jZUNsaWVudE1vZGVsJTBBJTBBJTIzJTIwJUU1JTg4JTlEJUU1JUE3JThCJUU1JThDJTk2JUU2JTkwJTlDJUU3JUI0JUEyJUU1JUI3JUE1JUU1JTg1JUI3JTBBc2VhcmNoX3Rvb2wlMjAlM0QlMjBEdWNrRHVja0dvU2VhcmNoVG9vbCgpJTBBJTBBJTIzJTIwJUU1JTg4JTlEJUU1JUE3JThCJUU1JThDJTk2JUU2JUE4JUExJUU1JTlFJThCJTBBbW9kZWwlMjAlM0QlMjBJbmZlcmVuY2VDbGllbnRNb2RlbCgpJTBBJTBBYWdlbnQlMjAlM0QlMjBDb2RlQWdlbnQoJTBBJTIwJTIwJTIwJTIwbW9kZWwlM0Rtb2RlbCUyQyUwQSUyMCUyMCUyMCUyMHRvb2xzJTNEJTVCc2VhcmNoX3Rvb2wlNUQlMEEpJTBBJTBBJTIzJTIwJUU0JUJEJUJGJUU3JTk0JUE4JUU3JUE0JUJBJUU0JUJFJThCJTBBcmVzcG9uc2UlMjAlM0QlMjBhZ2VudC5ydW4oJTBBJTIwJTIwJTIwJTIwJTIyU2VhcmNoJTIwZm9yJTIwbHV4dXJ5JTIwc3VwZXJoZXJvLXRoZW1lZCUyMHBhcnR5JTIwaWRlYXMlMkMlMjBpbmNsdWRpbmclMjBkZWNvcmF0aW9ucyUyQyUyMGVudGVydGFpbm1lbnQlMkMlMjBhbmQlMjBjYXRlcmluZy4lMjIlMEEpJTBBcHJpbnQocmVzcG9uc2Up",highlighted:`<span class="hljs-keyword">from</span> smolagents <span class="hljs-keyword">import</span> CodeAgent, DuckDuckGoSearchTool, InferenceClientModel

<span class="hljs-comment"># 初始化搜索工具</span>
search_tool = DuckDuckGoSearchTool()

<span class="hljs-comment"># 初始化模型</span>
model = InferenceClientModel()

agent = CodeAgent(
    model=model,
    tools=[search_tool]
)

<span class="hljs-comment"># 使用示例</span>
response = agent.run(
    <span class="hljs-string">&quot;Search for luxury superhero-themed party ideas, including decorations, entertainment, and catering.&quot;</span>
)
<span class="hljs-built_in">print</span>(response)`,wrap:!1}}),k=new $({props:{title:"自定义知识库工具",local:"自定义知识库工具",headingTag:"h2"}}),N=new Ol({props:{code:" ",highlighted:`<span class="hljs-keyword">from</span> langchain.docstore.document <span class="hljs-keyword">import</span> Document
<span class="hljs-keyword">from</span> langchain.text_splitter <span class="hljs-keyword">import</span> RecursiveCharacterTextSplitter
<span class="hljs-keyword">from</span> smolagents <span class="hljs-keyword">import</span> Tool
<span class="hljs-keyword">from</span> langchain_community.retrievers <span class="hljs-keyword">import</span> BM25Retriever
<span class="hljs-keyword">from</span> smolagents <span class="hljs-keyword">import</span> CodeAgent, InferenceClientModel

<span class="hljs-keyword">class</span> <span class="hljs-title class_">PartyPlanningRetrieverTool</span>(<span class="hljs-title class_ inherited__">Tool</span>):
    name = <span class="hljs-string">&quot;party_planning_retriever&quot;</span>
    description = <span class="hljs-string">&quot;Uses semantic search to retrieve relevant party planning ideas for Alfred’s superhero-themed party at Wayne Manor.&quot;</span>
    inputs = {
        <span class="hljs-string">&quot;query&quot;</span>: {
            <span class="hljs-string">&quot;type&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
            <span class="hljs-string">&quot;description&quot;</span>: <span class="hljs-string">&quot;The query to perform. This should be a query related to party planning or superhero themes.&quot;</span>,
        }
    }
    output_type = <span class="hljs-string">&quot;string&quot;</span>

    <span class="hljs-keyword">def</span> <span class="hljs-title function_">__init__</span>(<span class="hljs-params">self, docs, **kwargs</span>):
        <span class="hljs-built_in">super</span>().__init__(**kwargs)
        self.retriever = BM25Retriever.from_documents(
            docs, k=<span class="hljs-number">5</span>  <span class="hljs-comment"># 检索前 5 个文档</span>
        )

    <span class="hljs-keyword">def</span> <span class="hljs-title function_">forward</span>(<span class="hljs-params">self, query: <span class="hljs-built_in">str</span></span>) -&gt; <span class="hljs-built_in">str</span>:
        <span class="hljs-keyword">assert</span> <span class="hljs-built_in">isinstance</span>(query, <span class="hljs-built_in">str</span>), <span class="hljs-string">&quot;Your search query must be a string&quot;</span>

        docs = self.retriever.invoke(
            query,
        )
        <span class="hljs-keyword">return</span> <span class="hljs-string">&quot;\\nRetrieved ideas:\\n&quot;</span> + <span class="hljs-string">&quot;&quot;</span>.join(
            [
                <span class="hljs-string">f&quot;\\n\\n===== Idea <span class="hljs-subst">{<span class="hljs-built_in">str</span>(i)}</span> =====\\n&quot;</span> + doc.page_content
                <span class="hljs-keyword">for</span> i, doc <span class="hljs-keyword">in</span> <span class="hljs-built_in">enumerate</span>(docs)
            ]
        )

<span class="hljs-comment"># 模拟派对策划知识库</span>
party_ideas = [
    {<span class="hljs-string">&quot;text&quot;</span>: <span class="hljs-string">&quot;A superhero-themed masquerade ball with luxury decor, including gold accents and velvet curtains.&quot;</span>, <span class="hljs-string">&quot;source&quot;</span>: <span class="hljs-string">&quot;Party Ideas 1&quot;</span>},
    {<span class="hljs-string">&quot;text&quot;</span>: <span class="hljs-string">&quot;Hire a professional DJ who can play themed music for superheroes like Batman and Wonder Woman.&quot;</span>, <span class="hljs-string">&quot;source&quot;</span>: <span class="hljs-string">&quot;Entertainment Ideas&quot;</span>},
    {<span class="hljs-string">&quot;text&quot;</span>: <span class="hljs-string">&quot;For catering, serve dishes named after superheroes, like &#x27;The Hulk&#x27;s Green Smoothie&#x27; and &#x27;Iron Man&#x27;s Power Steak.&#x27;&quot;</span>, <span class="hljs-string">&quot;source&quot;</span>: <span class="hljs-string">&quot;Catering Ideas&quot;</span>},
    {<span class="hljs-string">&quot;text&quot;</span>: <span class="hljs-string">&quot;Decorate with iconic superhero logos and projections of Gotham and other superhero cities around the venue.&quot;</span>, <span class="hljs-string">&quot;source&quot;</span>: <span class="hljs-string">&quot;Decoration Ideas&quot;</span>},
    {<span class="hljs-string">&quot;text&quot;</span>: <span class="hljs-string">&quot;Interactive experiences with VR where guests can engage in superhero simulations or compete in themed games.&quot;</span>, <span class="hljs-string">&quot;source&quot;</span>: <span class="hljs-string">&quot;Entertainment Ideas&quot;</span>}
]

source_docs = [
    Document(page_content=doc[<span class="hljs-string">&quot;text&quot;</span>], metadata={<span class="hljs-string">&quot;source&quot;</span>: doc[<span class="hljs-string">&quot;source&quot;</span>]})
    <span class="hljs-keyword">for</span> doc <span class="hljs-keyword">in</span> party_ideas
]

<span class="hljs-comment"># 分割文档以提高搜索效率</span>
    text_splitter = RecursiveCharacterTextSplitter(
    chunk_size=<span class="hljs-number">500</span>,
    chunk_overlap=<span class="hljs-number">50</span>,
    add_start_index=<span class="hljs-literal">True</span>,
    strip_whitespace=<span class="hljs-literal">True</span>,
    separators=[<span class="hljs-string">&quot;\\n\\n&quot;</span>, <span class="hljs-string">&quot;\\n&quot;</span>, <span class="hljs-string">&quot;.&quot;</span>, <span class="hljs-string">&quot; &quot;</span>, <span class="hljs-string">&quot;&quot;</span>],
)
docs_processed = text_splitter.split_documents(source_docs)

<span class="hljs-comment"># 创建检索工具</span>
party_planning_retriever = PartyPlanningRetrieverTool(docs_processed)

<span class="hljs-comment"># 初始化智能体</span>
agent = CodeAgent(tools=[party_planning_retriever], model=InferenceClientModel())

<span class="hljs-comment"># 使用示例</span>
response = agent.run(
    <span class="hljs-string">&quot;Find ideas for a luxury superhero-themed party, including entertainment, catering, and decoration options.&quot;</span>
)

<span class="hljs-built_in">print</span>(response)`,wrap:!1}}),X=new $({props:{title:"增强的检索能力",local:"增强的检索能力",headingTag:"h2"}}),S=new $({props:{title:"资源",local:"资源",headingTag:"h2"}}),Y=new Jt({props:{source:"https://github.com/huggingface/agents-course/blob/main/units/zh-CN/unit2/smolagents/retrieval_agents.mdx"}}),{c(){y=a("meta"),D=n(),H=a("p"),L=n(),T(j.$$.fragment),P=n(),T(w.$$.fragment),O=n(),u=a("blockquote"),u.innerHTML=fl,K=n(),I=a("p"),I.textContent=kl,ll=n(),C=a("p"),C.innerHTML=Rl,tl=n(),m=a("p"),m.innerHTML=vl,sl=n(),d=a("p"),d.innerHTML=Ql,el=n(),h=a("p"),h.textContent=Wl,nl=n(),T(B.$$.fragment),Ml=n(),b=a("p"),b.textContent=Nl,al=n(),Z=a("ul"),Z.innerHTML=El,Jl=n(),V=a("p"),V.textContent=Al,Ul=n(),T(g.$$.fragment),yl=n(),G=a("p"),G.textContent=Xl,Tl=n(),f=a("ol"),f.innerHTML=ql,pl=n(),T(k.$$.fragment),il=n(),R=a("p"),R.textContent=xl,ol=n(),v=a("p"),v.textContent=_l,rl=n(),Q=a("p"),Q.textContent=Sl,cl=n(),W=a("p"),W.innerHTML=zl,ul=n(),T(N.$$.fragment),jl=n(),E=a("p"),E.textContent=Yl,wl=n(),A=a("ol"),A.innerHTML=Hl,Il=n(),T(X.$$.fragment),Cl=n(),q=a("p"),q.textContent=Fl,ml=n(),x=a("ol"),x.innerHTML=$l,dl=n(),_=a("p"),_.innerHTML=Dl,hl=n(),T(S.$$.fragment),Bl=n(),z=a("ul"),z.innerHTML=Ll,bl=n(),T(Y.$$.fragment),Zl=n(),F=a("p"),this.h()},l(l){const t=nt("svelte-u9bgzb",document.head);y=J(t,"META",{name:!0,content:!0}),t.forEach(s),D=M(l),H=J(l,"P",{}),Pl(H).forEach(s),L=M(l),p(j.$$.fragment,l),P=M(l),p(w.$$.fragment,l),O=M(l),u=J(l,"BLOCKQUOTE",{class:!0,"data-svelte-h":!0}),U(u)!=="svelte-oljz3b"&&(u.innerHTML=fl),K=M(l),I=J(l,"P",{"data-svelte-h":!0}),U(I)!=="svelte-131e5hc"&&(I.textContent=kl),ll=M(l),C=J(l,"P",{"data-svelte-h":!0}),U(C)!=="svelte-12eh443"&&(C.innerHTML=Rl),tl=M(l),m=J(l,"P",{"data-svelte-h":!0}),U(m)!=="svelte-z9ik08"&&(m.innerHTML=vl),sl=M(l),d=J(l,"P",{"data-svelte-h":!0}),U(d)!=="svelte-n4cl59"&&(d.innerHTML=Ql),el=M(l),h=J(l,"P",{"data-svelte-h":!0}),U(h)!=="svelte-1tq1z84"&&(h.textContent=Wl),nl=M(l),p(B.$$.fragment,l),Ml=M(l),b=J(l,"P",{"data-svelte-h":!0}),U(b)!=="svelte-19wnieu"&&(b.textContent=Nl),al=M(l),Z=J(l,"UL",{"data-svelte-h":!0}),U(Z)!=="svelte-6o8aq3"&&(Z.innerHTML=El),Jl=M(l),V=J(l,"P",{"data-svelte-h":!0}),U(V)!=="svelte-xjmoq0"&&(V.textContent=Al),Ul=M(l),p(g.$$.fragment,l),yl=M(l),G=J(l,"P",{"data-svelte-h":!0}),U(G)!=="svelte-91zclj"&&(G.textContent=Xl),Tl=M(l),f=J(l,"OL",{"data-svelte-h":!0}),U(f)!=="svelte-dluhf9"&&(f.innerHTML=ql),pl=M(l),p(k.$$.fragment,l),il=M(l),R=J(l,"P",{"data-svelte-h":!0}),U(R)!=="svelte-yr8tw1"&&(R.textContent=xl),ol=M(l),v=J(l,"P",{"data-svelte-h":!0}),U(v)!=="svelte-78a1w"&&(v.textContent=_l),rl=M(l),Q=J(l,"P",{"data-svelte-h":!0}),U(Q)!=="svelte-zibh65"&&(Q.textContent=Sl),cl=M(l),W=J(l,"P",{"data-svelte-h":!0}),U(W)!=="svelte-zbqlw2"&&(W.innerHTML=zl),ul=M(l),p(N.$$.fragment,l),jl=M(l),E=J(l,"P",{"data-svelte-h":!0}),U(E)!=="svelte-17pjt2a"&&(E.textContent=Yl),wl=M(l),A=J(l,"OL",{"data-svelte-h":!0}),U(A)!=="svelte-jgex8e"&&(A.innerHTML=Hl),Il=M(l),p(X.$$.fragment,l),Cl=M(l),q=J(l,"P",{"data-svelte-h":!0}),U(q)!=="svelte-funwgv"&&(q.textContent=Fl),ml=M(l),x=J(l,"OL",{"data-svelte-h":!0}),U(x)!=="svelte-1mxzz72"&&(x.innerHTML=$l),dl=M(l),_=J(l,"P",{"data-svelte-h":!0}),U(_)!=="svelte-qsht60"&&(_.innerHTML=Dl),hl=M(l),p(S.$$.fragment,l),Bl=M(l),z=J(l,"UL",{"data-svelte-h":!0}),U(z)!=="svelte-276u6l"&&(z.innerHTML=Ll),bl=M(l),p(Y.$$.fragment,l),Zl=M(l),F=J(l,"P",{}),Pl(F).forEach(s),this.h()},h(){gl(y,"name","hf:doc:metadata"),gl(y,"content",yt),gl(u,"class","tip")},m(l,t){Mt(document.head,y),e(l,D,t),e(l,H,t),e(l,L,t),i(j,l,t),e(l,P,t),i(w,l,t),e(l,O,t),e(l,u,t),e(l,K,t),e(l,I,t),e(l,ll,t),e(l,C,t),e(l,tl,t),e(l,m,t),e(l,sl,t),e(l,d,t),e(l,el,t),e(l,h,t),e(l,nl,t),i(B,l,t),e(l,Ml,t),e(l,b,t),e(l,al,t),e(l,Z,t),e(l,Jl,t),e(l,V,t),e(l,Ul,t),i(g,l,t),e(l,yl,t),e(l,G,t),e(l,Tl,t),e(l,f,t),e(l,pl,t),i(k,l,t),e(l,il,t),e(l,R,t),e(l,ol,t),e(l,v,t),e(l,rl,t),e(l,Q,t),e(l,cl,t),e(l,W,t),e(l,ul,t),i(N,l,t),e(l,jl,t),e(l,E,t),e(l,wl,t),e(l,A,t),e(l,Il,t),i(X,l,t),e(l,Cl,t),e(l,q,t),e(l,ml,t),e(l,x,t),e(l,dl,t),e(l,_,t),e(l,hl,t),i(S,l,t),e(l,Bl,t),e(l,z,t),e(l,bl,t),i(Y,l,t),e(l,Zl,t),e(l,F,t),Vl=!0},p:lt,i(l){Vl||(o(j.$$.fragment,l),o(w.$$.fragment,l),o(B.$$.fragment,l),o(g.$$.fragment,l),o(k.$$.fragment,l),o(N.$$.fragment,l),o(X.$$.fragment,l),o(S.$$.fragment,l),o(Y.$$.fragment,l),Vl=!0)},o(l){r(j.$$.fragment,l),r(w.$$.fragment,l),r(B.$$.fragment,l),r(g.$$.fragment,l),r(k.$$.fragment,l),r(N.$$.fragment,l),r(X.$$.fragment,l),r(S.$$.fragment,l),r(Y.$$.fragment,l),Vl=!1},d(l){l&&(s(D),s(H),s(L),s(P),s(O),s(u),s(K),s(I),s(ll),s(C),s(tl),s(m),s(sl),s(d),s(el),s(h),s(nl),s(Ml),s(b),s(al),s(Z),s(Jl),s(V),s(Ul),s(yl),s(G),s(Tl),s(f),s(pl),s(il),s(R),s(ol),s(v),s(rl),s(Q),s(cl),s(W),s(ul),s(jl),s(E),s(wl),s(A),s(Il),s(Cl),s(q),s(ml),s(x),s(dl),s(_),s(hl),s(Bl),s(z),s(bl),s(Zl),s(F)),s(y),c(j,l),c(w,l),c(B,l),c(g,l),c(k,l),c(N,l),c(X,l),c(S,l),c(Y,l)}}}const yt='{"title":"构建智能驱动的 RAG 系统","local":"构建智能驱动的-rag-系统","sections":[{"title":"基于 DuckDuckGo 的基础检索","local":"基于-duckduckgo-的基础检索","sections":[],"depth":2},{"title":"自定义知识库工具","local":"自定义知识库工具","sections":[],"depth":2},{"title":"增强的检索能力","local":"增强的检索能力","sections":[],"depth":2},{"title":"资源","local":"资源","sections":[],"depth":2}],"depth":1}';function Tt(Gl){return tt(()=>{new URLSearchParams(window.location.search).get("fw")}),[]}class jt extends st{constructor(y){super(),et(this,y,Tt,Ut,Kl,{})}}export{jt as component};
