Ir para o conteúdo

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 o pypdf está 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 um answer_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 k sã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.