Transmitir uma resposta
Tradução automática
Esta página foi traduzida automaticamente do inglês e ainda não foi revisada por um falante nativo; correções são bem-vindas no GitHub. Se algo não bater, vale o original em inglês. O código e os resultados são os mesmos do original, importados dos arquivos testados.
Tarefa: um modelo pode levar segundos para responder; mostrar a página na hora e a resposta conforme ela chega.
# Recipe: the page renders at once and the answer appears as it is written.
paths:
components: ./components
llm:
model: phi3Com stream="true", o q:llm não espera: a recuperação já foi feita, então as fontes estão na página, e <ui:stream for="answer"> preenche a resposta enquanto o modelo a escreve — pelo script do próprio framework, sem JavaScript a escrever. Sem JavaScript ele é um link, e o quantum console também mostra a resposta chegando.
<q:component name="Ask">
<q:knowledge name="docs" persist="false" chunkSize="300" chunkOverlap="30">
<q:source type="directory" path="knowledge" pattern="*.md" />
</q:knowledge>
<q:set name="question" value="{query.q}" default="" />
<q:if condition="question">
<!-- stream="true": the page does not wait for the model. The sources are
known at once; the answer is read from /_stream/… as it is written. -->
<q:llm name="answer" knowledge="docs" top="2" stream="true">
<q:message role="user">{question}</q:message>
</q:llm>
</q:if>
<ui:window title="Ask the store">
<ui:form>
<ui:input bind="q" value="{question}" placeholder="Your question" />
<ui:button variant="primary">Ask</ui:button>
</ui:form>
<q:if condition="question">
<!-- The framework's own script fills it in; without JavaScript, a link
opens the answer. -->
<ui:stream for="answer" />
<q:loop items="{answer_result.sources}" var="s">
<ui:text>[{s.n}] {s.name}</ui:text>
</q:loop>
</q:if>
</ui:window>
</q:component><!-- Structural checks, never the model's exact words: the same tests run
against a real model before every release. -->
<q:test name="the page renders with its sources before the answer" page="/">
<test:visit q="How many days do I have to return an order?" />
<test:expect text="[1] returns.md" />
<test:expect text="Read the answer" />
</q:test>tests/stream.test.q
PASS the page renders with its sources before the answer
1 passed, 0 failedA transmissão pertence ao visitante que perguntou, é lida uma vez e expira em dez minutos.
Testado: no CI estes testes rodam contra um servidor de modelos substituto, que responde a partir da primeira fonte que recebe; antes de cada versão eles rodam contra um modelo de verdade (tests/live_ai/test_cookbook_ai.py). Por isso eles conferem a estrutura — qual fonte, qual ferramenta, o que a página mostra quando algo falha — e nunca as palavras do modelo.
Veja IA-7.