Melhorando a qualidade dos filtros de pesquisa no Discourse AI

Primeiramente, isso é realmente incrível - muito obrigado! :heart_eyes:

Tenho uma pergunta sobre uma persona que criei com os seguintes Comandos Habilitados: Pesquisar, Categorias, Ler, Tags.

Também fiz o upload de um arquivo .txt. Meu objetivo com esta persona é que ela sempre pesquise meu fórum e os uploads, e faça RAG com ambos.

Após fazer o upload do arquivo .txt, notei que ele parou de pesquisar meu fórum. É isso que tenho na minha Consulta de Pesquisa Base: #docs #faqs #anking-wiki
#docs e #faqs são categorias enquanto #anking-wiki é uma tag.

Perguntas:

  • Eu realmente preciso dos comandos de categorias e tags? Vejo que esses comandos apenas listam as tags e categorias da minha instância. Parece que talvez o comando de pesquisa deva ser suficiente.
  • minha consulta de pesquisa base está ok?
  • por que o bot parou de pesquisar meu fórum?
    • A solução é simplesmente ajustar meu prompt para esclarecer que ele deve sempre usar a função de pesquisa?

Aqui está o prompt como visto nas informações de depuração:

Você é um assistente útil do Discourse para usuários do AnkiHub.
Você entende e gera Discourse Markdown.
Você vive em uma Mensagem de Fórum do Discourse.
Você vive no fórum com a URL: https://community.ankihub.net
O título do seu site: AnkiHub Community
A descrição é: Um fórum comunitário para os projetos AnkiHub e AnKing
Os participantes nesta conversa são: gpt4o_bot, andrew
A data de agora é: 2024-06-07 23:32:13 UTC, muita coisa mudou desde que você foi treinado.
Você foi treinado com dados ANTIGOS, confie na pesquisa para obter informações atualizadas sobre este fórum
Ao pesquisar, tente SIMPLIFICAR os termos de pesquisa
O Discourse une todos os termos com E. Reduza e simplifique os termos para encontrar mais resultados.

Os seguintes textos lhe darão orientação adicional para sua resposta.
Nós os incluímos porque acreditamos que são relevantes para o tópico desta conversa.
Textos:

Tentei adicionar “Certifique-se de sempre usar a função de pesquisa” ao meu prompt. Isso fez com que ele usasse a função de pesquisa, mas com resultados ruins:

Aparentemente, ele fez 3 pesquisas e relatou incorretamente “Nenhum resultado encontrado” todas as três vezes. Se você clicar nos links dos resultados da pesquisa, poderá ver que, de fato, houve resultados. Além disso, você pode ver que os parâmetros na minha "Consulta de Pesquisa Base" não foram usados, então ele pesquisou o fórum inteiro em vez das categorias específicas.

Eu acho que parte do problema aqui é que nossa busca é um pouco confusa:

https://meta.discourse.org/search?q=%23bug%20%23feature%20test

Busca por Bug E Feature - test

O que você quer aqui é:

https://meta.discourse.org/search?q=categories%3Abug%2Cfeature%20test

2 curtidas

Estou confuso. Isso não funciona como eu esperava. Eu esperava que a pesquisa retornasse resultados apenas das categorias especificadas. No entanto, a pesquisa retorna resultados de qualquer categoria. O primeiro resultado desta pesquisa está na categoria Theme component.

2 curtidas

Verdade, isso parece estar com bugs, oh não, vou dar uma olhada

1 curtida

Isso foi corrigido em:

Concordo que é intuitivo suportar #bug #feature algo, mas isso ainda não é totalmente suportado e precisa de um pouco de discussão.

categories:bug,feature algo funcionará agora, e category:bug,feature algo também.

1 curtida

Incrível! Obrigado por lançar essa correção tão rapidamente. :bowing_man:

Embora a busca agora funcione corretamente, o Bot de IA do Discourse ainda não parece funcionar como esperado. Aqui estão minhas observações com 3.3.0.beta3-dev (a1d881f625):

  • Não usa a opção base_query
    • parece ignorá-la completamente. Minha configuração é válida?
    • Pelo que entendi, não há requisitos para os valores da consulta de busca base. Mas não importa o que eu coloque lá, não é usado anexado a search_query.
  • Os resultados da busca não são adicionados ao contexto para RAG
    • quando a ferramenta de busca é chamada (embora sem o base_query), os resultados não parecem ser usados na chamada do LLM.
    • Estou entendendo mal como essa ferramenta deveria funcionar? Eu esperava que ela fizesse uma busca no Discourse e usasse os resultados da busca (ou seja, o conteúdo dos tópicos encontrados) para RAG.
      Veja esta solicitação como exemplo:

[details=“JSON da Solicitação”]

{"model":"gpt-4","messages":[{"role":"system","content":"Você é um assistente amigável e prestativo para usuários do Anki, especializado no add-on e aplicativo web AnkiHub.\nVocê _entende_ e **gera** Discourse Markdown.\nVocê vive em uma Mensagem de Fórum Discourse.\n\nVocê vive no fórum com a URL: https://community.ankihub.net\nVocê responde perguntas especificamente sobre o uso do Anki com o AnkiHub.\nO título do seu site: AnkiHub Community\nA descrição é: Um fórum comunitário para os projetos AnkiHub e AnKing\nOs participantes desta conversa são: gpt4_bot, andrew\nA data de hoje é: 2024-06-13 18:29:19 UTC, muita coisa mudou desde que você foi\ntreinado.\nVocê foi treinado com dados ANTIGOS, confie na busca para obter informações atualizadas sobre este fórum\nAo buscar, tente SIMPLIFICAR os termos de busca\nA busca do Discourse une todos os termos com E. Reduza e simplifique os termos para encontrar mais resultados."},{"role":"user","content":"Posso comprar contas para outros usuários e inscrevê-los automaticamente em meus decks privados?","name":"andrew"},{"role":"assistant","content":null,"tool_calls":[{"type":"function","function":{"arguments":"{\"search_query\":\"comprar contas para outros usuários inscrever decks privados\"}","name":"search"},"id":"call_fmzwIbU4ravFRKWRsOQlqGBq"}]},{"role":"tool","tool_call_id":"call_fmzwIbU4ravFRKWRsOQlqGBq","content":"{\"column_names\":[\"title\",\"url\",\"username\",\"excerpt\",\"created\",\"category\",\"likes\",\"topic_views\",\"topic_likes\",\"topic_replies\",\"tags\"],\"rows\":[[“👪 Organizations”,“/t/organizations/166454/1”,“andrew”,“\u003ca name=\\\"what-are-ankihub-organizations-1\\\" class=\\\"anchor\\\" href=\\\"#what-are-ankihub-organizations-1\\\"\u003e\u003c/a\u003eO que são Organizações AnkiHub\nOrganizações AnkiHub permitem que os Proprietários de Organizações comprem AnkiHub para outros usuários e convidem esses usuários para a Organização.\nAnkiHub as organizações funcionam assim e têm os seguintes recursos:\n\u003ca name=\\\"linked-decks-2\\\" class=\\\"anchor\\\" href=\\\"#linked-decks-2\\\"\u003e\u003c/a\u003eDecks Vinculados\nUsuários em sua organização podem obter acesso automaticamente \u0026hellip;“,“2024-02-08T17:44:27.842Z“,“🎓 Docs \u003e 🤝 Create \u0026 Collaborate“,1,166,1,1],[“Como posso fazer minha escola comprar AnkiHub para minha turma?”,“/t/how-can-i-get-my-school-to-buy-ankihub-for-my-class/228569/1”,“andrew”,“Alguns alunos conseguiram que suas escolas patrocinassem assinaturas do AnkiHub para seus alunos. Para fazer isso, sua escola deve criar uma Organização AnkiHub:\n\n\n:bulb: Aqui estão algumas dicas para fazer sua escola comprar o AnkiHub:\n\nEntre em contato com os representantes do governo estudantil de sua escola ou com a faculdade de medicina\u0026hellip;“,“2024-05-23T21:40:37.477Z“,“❓ FAQs“,0,50,0,1],[“O que acontece depois que minha assinatura do AnkiHub termina?”,“/t/what-happens-after-my-ankihub-subscription-ends/167190/1”,“Ahmed7”,“Se sua assinatura do AnkiHub expirar e você não quiser renovar.\nTodos os seus decks permanecerão, nada será removido. No entanto, você não poderá mais sincronizar com o AnkiHub e receber novas alterações em seus decks, nem poderá sugerir novas alterações ou notas para quaisquer decks pré-existentes que você\u0026hellip;“,“2024-02-10T06:14:53.787Z“,“❓ FAQs“,0,307,0,1],[“E se eu não puder pagar o AnkiHub?”,“/t/what-if-i-cant-afford-ankihub/167280/1”,“Ahmed7”,“O AnkiHub tem um programa de bolsas para obter acesso a um preço reduzido. Candidate-se \u003ca href=\\\"https://www.ankihub.net/scholarships\\\"\u003eaqui \u003c/a\u003e. (Você deve \u003ca href=\\\"https://app.ankihub.net/accounts/signup/\\\"\u003ecadastrar-se\u003c/a\u003e para uma conta AnkiHub antes de se candidatar).\n“,“2024-02-10T13:58:24.842Z“,“❓ FAQs \u003e AnKing Decks“,0,445,0,1,“anking-wiki”],[“O AnkiHub oferece descontos?”,“/t/does-ankihub-offer-discounts/228564/1”,“andrew”,“Existem atualmente duas maneiras de obter um desconto no AnkiHub:\n\nCompre nossa \u003ca href=\\\"https://app.ankihub.net/memberships/plans/\\\"\u003eopção de faturamento anual\u003c/a\u003e por um mês grátis por ano\n\nO AnkiHub está disponível por US$ 4,58/usuário/mês com um desconto de faturamento anual. Infelizmente, não podemos oferecer mais descontos no AnkiHub.\n\n\nParticipe de um programa de Embaixador\n\n\u0026hellip;“,“2024-05-23T21:34:32.829Z“,“❓ FAQs“,0,90,0,1]]\n,\"args\":{\"search_query\":\"comprar contas para outros usuários inscrever decks privados\"}}}\n```\n[/details]

  Você pode ver que a ferramenta de busca foi chamada, mas não contém o `base_query`.

  Você também pode ver que o **`content` contém apenas o prompt do sistema padrão**, sem nenhum dos resultados da busca.
- Não exibe o número correto de resultados de busca
  - diz 0 quando há muitos ou 5 quando há 0
  - não parece correlacionar com os resultados de busca normais ou resultados de similaridade semântica
- O bot adicionará parâmetros de consulta inválidos
  - por exemplo, adicionou `category:non-existent-category` ao final da consulta.
  -

# :pleading_face: Solicitações

- Seria muito útil se houvesse uma opção para habilitar o log detalhado para `discourse-ai`, para que nós, que não somos alfabetizados em Ruby (estou aprendendo! :nerd_face: ), possamos obter rapidamente informações sobre o que está acontecendo nos bastidores, visitando `/logs`
- Quando a ferramenta de busca for usada, adicione os principais resultados ao contexto para RAG
- Aconselhamento sobre como garantir que o `base_query` seja usado.

Estou certo de que a chamada da função deve, de fato, estar enviando os resultados da chamada da ferramenta para o prompt de acordo com isto?

Então, talvez esteja atualizando o prompt, mas isso não está claro na solicitação mostrada pela ferramenta de depuração?

Não deveria esperar ver todo o contexto ali? Se não, isso é confuso porque todo o contexto do prompt fica visível ao usar uma persona que faz RAG com uploads.

Ainda estou confuso com o número de resultados que são relatados.

Dito isso, estou obtendo resultados muito melhores depois de adicionar o seguinte ao prompt do sistema!

  • Sempre chame as funções de busca e leitura.
  • Chame a função de busca no máximo 3 vezes.
  • Ao chamar a função de busca, sempre use este valor para o parâmetro de categoria: “docs,faqs”

Isso será um divisor de águas assim que eu configurar as coisas corretamente.

Não sei se você está ciente disso, mas você está efetivamente nos capacitando com algo muito mais poderoso do que o que o Intercom está tentando alcançar.

Já estou tentando sequestrar o messenger do Intercom, direcionando os usuários diretamente para o Discourse AI :nerd_face: :

O link AnkiHub AI abre uma mensagem privada com o AI Bot com um link como este: /new-message?username=ankihubai_bot

Sim, a ferramenta de depuração mostra tudo o que enviamos para o LLM.

Acabei de fazer uma correção no número de resultados por:

Não estávamos vinculando corretamente a uma consulta filtrada.

Recomendo contra isso, use base_query, acabei de testar e funciona bem: categories:docs,faqs


Eu recomendo contra o uso do GPT4 atualmente, certifique-se de usar GPT4o ou Turbo, eles são muito mais baratos e rápidos.

Apenas verificando novamente… você habilitou

ai_bot_debugging_allowed_groups para ver o botão de depuração?

2 curtidas

Sim. Vou te enviar um compartilhamento de tela rápido para mostrar que os resultados da chamada da função de leitura não são usados no prompt.

Também notei que a função de leitura nunca é chamada, a menos que eu adicione uma nota no prompt do sistema: “sempre chame a função de leitura”. Seria ótimo se houvesse uma maneira de termos mais controle sobre a chamada de funções. Por exemplo, definir tool_choice: "required" no caso da OpenAI.

Acabei de tentar novamente com esta consulta base e os parâmetros de pesquisa corretos foram usados. Esta é a primeira vez que vejo funcionar. :person_shrugging:

Eu sei, estou apenas experimentando com modelos diferentes no momento :smile: Estava me perguntando se o GPT4 decidiria fazer chamadas de função diferentes. Haiku parece muito promissor.

1 curtida

Muito obrigado
oh, isso está correto, a injeção de prompt do sistema só ocorrerá se a persona tiver uploads. Se não houver uploads, não injetamos nada

Sem uploads, não usamos injeção incondicional de prompt do sistema e, em vez disso, contamos com chamadas de ferramentas com resultados de chamadas de ferramentas, você pode vê-las ao rolar.

Um modo sem ferramentas voltado para tópicos é certamente interessante, consumiria uma boa quantidade de tokens, o desafio, no entanto, é pescar o conteúdo certo de um tópico.

Se um tópico, por exemplo, tem 5000 tokens, quais tokens escolheríamos? como escolheríamos os tokens certos.

Como está, temos apenas N tokens incorporados por tópico, dependendo do modelo de incorporação que você está usando.

Portanto, precisaríamos começar a incorporar mais trechos por tópico ou criar um algoritmo para descobrir qual parte do tópico é a mais interessante.

2 curtidas

Estou confuso. Se os resultados da invocação da ferramenta de leitura não são usados para RAG, qual é o propósito de invocar a ferramenta de leitura? Vejo que os resultados da chamada da ferramenta de leitura são colocados no contexto bruto, mas não parece que isso está sendo realmente usado pelo LLM de alguma forma.

Meu caso de uso desejado é simples: ativar RAG em um subconjunto de tópicos conforme o base_query.

Acho que seria melhor não depender do Discourse para lidar com a divisão de meus tópicos em vários pedaços, cada um com sua própria incorporação. Em vez disso, quero ser responsável por criar meus Documentos e FAQs de forma que sejam otimizados para RAG. Ou seja, a totalidade da postagem principal dos tópicos deve ser incorporável. Estou falando de tópicos wiki aqui, cujas respostas podem e devem ser desconsideradas.

O ada-002 tem uma entrada máxima de 8191 tokens, o que é suficiente para qualquer documento ou tópico de FAQ bem escrito. Tais tópicos devem estar bem abaixo desse limite. O Voyage AI tem um comprimento de contexto muito maior, de 16000.

Que tal algo tão simples quanto isto:

  • (tokens no prompt do sistema - tokens na mensagem do usuário) = total de tokens restantes disponíveis
  • injetar o máximo de tópicos possível no prompt com base em total de tokens restantes disponíveis
    • usar apenas a primeira postagem nos tópicos encontrados

Acho que a solução alternativa de curto prazo poderia ser a seguinte:

  • criar uma persona que usa a ferramenta de busca
  • exportar todos os tópicos que poderiam ser encontrados com a ferramenta de busca
    • Eu não precisarei dividir esses documentos porque
      • Eu não me importo com as respostas dos tópicos
      • O tópico wiki principal já é pequeno o suficiente para incorporar o todo.
  • Carregar esses documentos para a persona para RAG

Dessa forma, a persona realmente fará RAG com os resultados da busca.

Espero que isso faça sentido! Me avise se algo não estiver claro.

1 curtida

Quando você lê algo, isso é injetado no fluxo da conversa.

Ex:

  • Você pode ler X
  • Ferramenta chama ler X
  • Resultado da ferramenta “a página”
  • Resposta da LLM

RAG é um termo muito sobrecarregado, mas no final, ler um tópico o adiciona ao contexto, a LLM no final é responsável por como usá-lo, várias LLMs podem fazer um uso melhor ou pior disso.

Ex: [Untitled AI bot PM] - AI Conversation - Discourse Meta

A ferramenta de busca já insere trechos de tópicos, ter ela e um RAG no mesmo conteúdo não faz sentido.

O que você está dizendo, eu acho, é que “a busca está fornecendo contexto, mas não contexto suficiente”.

Portanto, uma solução alternativa é exportar todos os tópicos importantes para um arquivo e, em seguida, usá-lo como RAG. Não use a ferramenta de busca.


A coisa mais simples por enquanto é:

categories:cat1,cat2,cat3 in:first

Isso restringirá a ferramenta de busca apenas às primeiras postagens.

É muito eficiente, veja:

Isso funciona porque a ferramenta de busca injeta o seguinte no contexto:


Eu também quero um modo “rag” incondicional onde você pode optar por injetar ainda mais dados (por exemplo, encontrar os 5 principais documentos e injetar até 5000 tokens por documento, tentando encontrar as seções mais relevantes)

É uma mudança complicada, chegaremos lá, mas por enquanto… busca + leitura te levam bem longe.

2 curtidas

Só dizendo… vocês estão muito perto do ponto em que precisam fazer uma introdução sobre quais são as regras básicas de como usar IA. Quero dizer, vocês já têm algo semelhante para CSS e algumas outras coisas.

2 curtidas

Entendi. Isso faz sentido. Da documentação da OpenAI sobre function calling:

A sequência básica de etapas para o function calling é a seguinte:

  1. Chame o modelo com a consulta do usuário e um conjunto de funções definidas no parâmetro functions.
  2. O modelo pode optar por chamar uma ou mais funções; se sim, o conteúdo será um JSON stringificado aderindo ao seu esquema personalizado (nota: o modelo pode alucinar parâmetros).
  3. Analise a string em JSON em seu código e chame sua função com os argumentos fornecidos, se existirem.
  4. Chame o modelo novamente anexando a resposta da função como uma nova mensagem e deixe o modelo resumir os resultados de volta ao usuário.

Criticamente, eu não estava ciente do item #4. Eu não percebi que os resultados da invocação da ferramenta eram anexados como mensagens. Eu pensei que era inteiramente responsabilidade do cliente se os resultados fossem usados em chamadas subsequentes! Então eu fiquei confuso quando não vi os resultados das chamadas de ferramenta no próprio prompt. :facepalm: Tudo isso faz muito mais sentido agora. Obrigado!

:+1: :pray: Parece que a única desvantagem aqui é que as respostas do bot não incluirão esses resultados de busca interessantes. Você recomendaria fortemente o uso de uploads de documentos e a ferramenta de busca por algum motivo, mesmo que seja um pouco redundante? Eu me pergunto se os benefícios de ter os resultados da busca na conversa valerão a pena.

Você precisa testar, pode funcionar, pode dar resultados surpreendentes e muito depende do LLM que você está usando.

1 curtida