44 · Respostas fundamentadas nas suas fontes¶
Idiomas
O seletor entende turnos escritos em inglês. O português é a sua próxima gramática e ainda não foi lançado; até lá, um turno escrito em português não é lido como português.
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 (ba9e751e249e).
$ echo $?
0
$ stalwart sources ask "How long does a refund take?" --index sources.json
A refund reaches the card the order was paid with in three to five working days. [refunds.md > How long a refund takes]
$ 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. As
perguntas ficam em inglês, a língua que o seletor lê:
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 ("How long does a refund take?",
"Can a gift card be refunded?",
"charge order 4411 40.00"):
reply = desk.chat(text, user="u-17")
shown = reply.waiting[0].wording if reply.waiting else reply.text
print(f"{text}\n -> {shown}")
How long does a refund take?
-> A refund reaches the card the order was paid with in three to five working days.
Can a gift card be refunded?
-> An order can be refunded within 30 days of delivery. A gift card cannot be refunded.
charge order 4411 40.00
-> Run charge_card?
As duas perguntas foram respondidas a partir das passagens; charge order 4411 40.00 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 -- refund order 4411 and tell me how long it takes -- é 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 (1e1f014fea6f).
$ echo $?
0
$ stalwart sources ask "How long does a refund take?" --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.