44 · Respostas fundamentadas nas suas fontes¶
Idiomas
O seletor lê turnos escritos em inglês e em português do Brasil (pt-BR). O idioma é escolhido, nunca adivinhado a partir do turno: na página Settings do console (Language the selector reads), em language numa requisição de plano, ou no settings.language do seu arquivo de vocabulário; sem nenhum deles, inglês. Um turno em português pode ser digitado com os acentos ou sem eles. O português europeu não é uma gramática que o seletor tenha, e um turno em qualquer outra língua não é lido.
Alguns turnos só pedem informação -- how long does a refund take? -- e nenhuma ferramenta os responde. Com
on_unread: answer, uma pergunta assim é respondida a partir dos seus próprios documentos: as passagens que
casam com ela são encontradas na sua máquina, a resposta é feita do que elas dizem, e cada frase carrega a
passagem de onde veio. Uma frase que nenhuma passagem sustenta é removida, e quando nada sobra o agente diz que
não tem resposta.
Os seus documentos, indexados na sua máquina¶
stalwart sources build lê os seus documentos e escreve um índice, aqui, com o runtime licenciado:
$ stalwart sources build docs/delivery.md docs/refunds.md --out sources.json
Indexed 2 document(s), 3 passage(s), into sources.json (9c26747cc5c5).
$ echo $?
0
$ stalwart sources ask "Quanto tempo leva um estorno?" --index sources.json
Um estorno chega ao cartão com que o pedido foi pago em três a cinco dias úteis. [refunds.md > Quanto tempo leva um estorno]
$ echo $?
0
- Markdown (
.md) e HTML (.html,.htm) são divididos nos seus títulos e depois nas linhas em branco: cada parágrafo é uma passagem, sob o título acima dele. Texto simples é dividido nas linhas em branco. O texto de um PDF é lido quando opypdfestá instalado. - Cada passagem é indexada pelas suas palavras e pelas palavras do seu título; um arquivo de vocabulário
(
--vocabulary) acrescenta os termos e parentescos que o seu vocabulário declara, para que uma pergunta nas palavras dos seus clientes encontre uma passagem nas suas. - Reindexar é construir de novo: o índice é um arquivo, com o seu digest impresso, e o agente lê o arquivo que recebe.
- Um arquivo que não pode ser lido -- ausente, vazio, fora de UTF-8, um PDF sem
pypdf-- para a construção com o seu nome e status de saída 2.
stalwart sources ask responde a uma pergunta a partir do índice como o agente responderia com o compositor
extract, cada frase com o documento e o título de onde veio, para que você veja o que os seus usuários vão
ouvir.
Os documentos e o índice ficam na sua máquina. Os servidores da Stalwart nunca os recebem.
Respondendo no agente¶
Um agente responde a partir do índice quando o seu on_unread é answer -- a terceira escolha ao lado de
refuse e de repassar o turno (capítulo 45) -- e answers: nomeia o índice:
desk = Agent("desk", tools=[get_order, charge_card], model="anthropic:claude-sonnet-5-5",
on_unread="answer", answers={"index": "sources.json", "composer": "extract"})
for text in ("Quanto tempo leva um estorno?",
"Um vale-presente pode ser estornado?",
"cobre 40,00 do pedido 4411"):
reply = desk.chat(text, user="u-17")
shown = reply.waiting[0].wording if reply.waiting else reply.text
print(f"{text}\n -> {shown}")
Quanto tempo leva um estorno?
-> Um estorno chega ao cartão com que o pedido foi pago em três a cinco dias úteis.
Um vale-presente pode ser estornado?
-> Um pedido pode ser estornado em até 30 dias após a entrega. Um vale-presente não pode ser estornado.
cobre 40,00 do pedido 4411
-> Executar charge_card?
As duas perguntas foram respondidas a partir das passagens; cobre 40,00 do pedido 4411 pede que algo seja feito, então foi para a cobrança e a sua confirmação, e nunca para os documentos. Uma ação nunca é respondida com documentação: uma passagem que descreve como funciona um reembolso não é um reembolso. Uma pergunta feita ao lado de uma ação -- estorne o pedido 4411 e me diga quanto tempo leva -- é respondida depois que a ação rodou.
answers: aceita index, k (no máximo essa quantidade de passagens, 3 por padrão), floor (nenhuma passagem
com pontuação abaixo dele, 0,3 por padrão, numa escala de 0 a 1) e composer. Os que um agente não informa vêm
da página Configurações do seu console, no primeiro turno da conversa.
Os compositores¶
extract: a resposta são as próprias frases das passagens que compartilham um termo com a pergunta, na ordem de classificação. Nenhum modelo é chamado, e cada frase é sustentada por construção.compose: o próprio modelo do seu agente escreve a resposta a partir das passagens numeradas, com a sua chave, marcando cada frase com as passagens de que depende. Cada chamada ao modelo conta como umanswer_calls. Uma resposta que fica sem nenhuma frase depois da verificação ganha uma segunda tentativa.
Quais planos incluem cada um, gerado a partir das linhas dos planos:
| Compositor | Gratuito | Pago | Enterprise |
|---|---|---|---|
extract |
✓ | ✓ | ✓ |
compose |
— | incluído, 20.000 answer_calls por mês |
incluído, answer_calls sem limite |
De qualquer forma, o runtime confere cada frase com as passagens que ela cita: cada número, data, valor, nome e
negação nela precisa estar numa delas. Uma frase que falha é removida. A recuperação e a verificação rodam no
runtime, sem nenhuma chamada de rede; compose chama o seu modelo, e nada mais.
Citações¶
Cada frase de uma resposta fica ligada às suas passagens: o documento, o título e, quando o documento deu um, o
seu link. stalwart sources ask as imprime, como acima, e a interface do stalwart serve as mostra abaixo da
resposta (capítulo 35). Uma regra do capítulo 43 pode
acrescentar uma frase sempre que uma passagem com uma dada etiqueta for citada.
Sem resposta fundamentada¶
Quando nenhuma passagem tem pontuação acima do piso, ou nenhuma frase sobrevive à verificação, o resultado é
no_grounded_answer, e o agente segue como se on_unread fosse refuse: a pessoa é convidada uma vez a dizer
de novo, e depois ouve que aquilo não pode ser feito. Aqui o documento de reembolsos é apagado e o índice é
construído de novo:
$ rm docs/refunds.md
$ stalwart sources build docs/delivery.md --out sources.json
Indexed 1 document(s), 1 passage(s), into sources.json (360ee6cde035).
$ echo $?
0
$ stalwart sources ask "Quanto tempo leva um estorno?" --index sources.json
No grounded answer: no passage scores above the floor. The agent would refuse or hand the turn off.
$ echo $?
1
O comando sai com 1 quando não há resposta fundamentada.
O que é guardado, e onde¶
Nada disso é guardado por nós. Os documentos, o índice, as perguntas e as respostas ficam na sua máquina e no
seu armazenamento. Só a contagem de answer_calls é relatada, com os outros medidores da sua licença.
Os limites¶
- Uma frase sustentada concorda com a sua passagem. Isso não torna a passagem verdadeira, nem atual: um documento desatualizado dá respostas desatualizadas.
- A recuperação casa palavras, pesadas por quão raras elas são nos seus documentos. Uma passagem que
compartilha palavras suficientes de uma pergunta para ficar acima do piso é usada, seja ou não sobre a
pergunta; o piso e o
ksão o quanto ela é exigente. - A verificação confere números, datas, valores, nomes e negações com as passagens. Uma frase que reescreve uma passagem e muda o seu sentido com outras palavras pode passar por ela.