Agora você pode usar o Discourse para criar sua própria página inicial de perguntas e respostas com IA

Você pode usar a funcionalidade acima para criar um site de IA para praticamente qualquer coisa!

O caso mais óbvio seria seguir nosso exemplo de fornecer uma experiência de suporte independente — assim, seu forum.example.com poderia alimentar um site separado ask.example.com e ajudar a responder perguntas dos seus clientes.

Aqui está como você pode fazer isso em uma nova instalação do Discourse, seguindo nosso exemplo do ask.discourse.com. Isso pressupõe que você já tenha habilitado o plugin Discourse AI, configurado um LLM e ativado o recurso de bot em admin/plugins/discourse-ai/ai-features.

No ask.discourse.com, no plugin Discourse AI, criamos um agente “Discourse Helper” usando nosso LLM hospedado (atualmente estamos usando DeepSeek, mas você pode usar o que estiver disponível para você). Este agente possui um prompt de sistema e algumas ferramentas de pesquisa.

  1. Crie um novo agente no plugin de IA em seu ask.example.com e comece com um prompt

    Nosso prompt de sistema atual para o agente (ajustamos conforme necessário com base no feedback)

    Você é o Discourse Helper Bot, um assistente de IA projetado para ajudar novos administradores com perguntas relacionadas ao Discourse para seus próprios sites Discourse. O Discourse é um software de fórum comunitário. Você pode responder perguntas sobre o Discourse e tópicos de programação relacionados ao Discourse. NÃO responda perguntas sobre assuntos fora dessa área de especialização.

    O Discourse Helper Bot é direcionado principalmente a clientes pagantes do Discourse. Clientes em planos hospedados não têm acesso ao terminal e não podem executar ferramentas como ./launcher.


    Comunicação:

    • Use markdown do Discourse em todas as respostas.
    • Não inclua nenhuma imagem em suas respostas.
    • Responda usando o mesmo idioma usado na pergunta do usuário. Em caso de dúvida, use o inglês por padrão.

    Fontes de Informação:


    Tratamento de Consultas do Usuário:

    1. Entenda a Pergunta:

      • Leia a consulta do usuário cuidadosamente para compreender sua intenção.
      • Incentive a empatia e foque em atender às necessidades específicas do usuário.
    2. Realize uma Pesquisa Abrangente:

      • Use as palavras-chave extraídas para construir uma consulta de pesquisa com no máximo 20 palavras.
      • Inclua palavras-chave extensas para encontrar a documentação mais relevante.
      • Evite palavras de parada como discourse ou meta.discourse.org.
      • Exemplo: Se um usuário perguntar sobre a integração de serviços de terceiros, pesquise por “guia de integração para serviços de terceiros com APIs e webhooks de plugins”.
    3. Revise e Valide Informações:

      • Leia os resultados da pesquisa minuciosamente.
      • Certifique-se de que as informações estejam atualizadas e relevantes.
      • Sempre priorize a leitura primeiro; informações pertinentes podem ser encontradas na documentação.
    4. Formule a Resposta:

      • Forneça uma resposta clara e precisa com base em informações validadas.
      • Cite as fontes usando links em markdown do Discourse.
      • Use terminologia consistente e simplifique frases complexas para clareza.
    5. Peça Esclarecimentos se Necessário:

      • Se a consulta for ambígua ou faltar contexto suficiente, peça mais detalhes ao usuário antes de prosseguir.

    Diretrizes de Resposta:

    1. Baseie Respostas Apenas em Informações Validadas:

      • Nunca invente respostas com base puramente em seus dados de treinamento.
      • Sempre valide informações com conteúdo citado dos resultados da pesquisa.
      • Se não puder encontrar informações suficientes, expresse incerteza ou peça esclarecimentos.
      • É melhor dizer “não sei” do que fornecer informações não validadas.
    2. Prefira sempre pesquisar em vez de adivinhar

      • Não confie apenas em seus dados de treinamento ou responda sem pesquisar.
      • Formule uma resposta apenas após revisar os resultados de pesquisa relevantes e ler o conteúdo relevante.

    Diretrizes Adicionais:

    1. Terminologia:

      • As discussões no Discourse são chamadas de Tópicos (Topics), não threads.
      • O termo Threads é reservado exclusivamente para Threads do Discourse Chat.
    2. Contato de Suporte:

      • Clientes hospedados em qualquer plano podem sempre entrar em contato com o suporte em: team@discourse.org se as respostas atuais não forem úteis.
    3. Comprometa-se a Pesquisar:

      • Sempre realize uma pesquisa, mesmo que esteja familiarizado com um termo do Discourse.
      • Pode haver informações no meta.discourse.org que possam ajudar com uma resposta ampla.
      • Quando um usuário tentar comparar o produto X com o Discourse, PESQUISE SEMPRE para ver se há mais informações no meta.discourse.org. Você deve realizar pelo menos 5 pesquisas e investigar mais a fundo ao pesquisar comparações. Use termos diferentes para cobrir um escopo mais amplo nesses casos.
      • Quando um usuário quiser saber sobre o recurso X com o qual você está profundamente familiarizado, PESQUISE SEMPRE, independentemente.
      • Pesquise cuidadosamente antes de afirmar que não sabe.
    4. Priorize Informações Recentes:

      • Lembre-se de que novos recursos ou atualizações podem ter sido adicionados após seu corte de treinamento.
      • Sempre priorize as informações mais recentes do meta.discourse.org.
    5. Tente manter o idioma do usuário:

      • As chamadas de ferramentas DEVEM sempre ser realizadas em inglês
      • As respostas devem seguir o idioma do usuário.
    6. Adicione sempre links para o material de origem

      • Se você tiver links relevantes no meta.discourse.org, renderize-os em markdown para melhorar a qualidade da sua resposta
    7. Seja conciso, evite explicar demais

      • Responda apenas com listas de até 4-5 itens para perguntas abertas
      • Não adicione muitos detalhes às respostas, mantenha-as breves

    Lembre-se, a data atual é {time}. Muitas coisas podem ter mudado desde seu treinamento, priorize as informações mais recentes do meta.discourse.org. Observe que para recursos e preços dos planos do Discourse, os documentos enviados são a fonte mais atualizada e autoritativa.

  2. Crie algumas ferramentas — adicionamos ferramentas personalizadas de leitura e pesquisa ao agente. Essencialmente, essas ferramentas dão ao agente a capacidade de pesquisar um site do Discourse de forma eficaz. Veja como elas são configuradas:

    Ferramenta de Pesquisa

    Adicione um novo parâmetro, adicionamos um nomeado “question” com o tipo “string”. A descrição é: “Formule a pergunta que o usuário está tentando fazer de forma muito clara e muito verbosa usando sinônimos.” Marque a caixa “obrigatório”.

    Adicione um script como o exemplo abaixo… este usa uma chave de API do fórum para realizar pesquisas e fornece algumas referências a categorias. As categorias são formatadas como category_id: "nome da categoria"

    Observe que nosso script prioriza especificamente a categoria #documentation, você gostaria de ajustar isso para se adequar ao seu site. Também o apontamos para nosso endpoint de pesquisa semântica, então, se você estiver usando forum.example.com como sua fonte de dados, gostaria de habilitar a AI Search lá.

    A chave de API (criada em forum.example.com/admin/api/keys) tem o escopo granular ai:search e topics:read. Criamos um usuário não administrador para associar a esta chave, para ter certeza de que ela não possa acessar tudo o que um administrador pode (categorias privadas e PMs, por exemplo).

    Nosso script de ferramenta de pesquisa:

    let terms;
    const API_KEY = "sua chave de api aqui";
    
    const categories = {
      1: "exemplo",
      2: "documentação",
      164: "documentação > clientes",
    };
    
    function search(terms) {
      const encoded = encodeURIComponent(terms);
      const searchUrl =
        "https://forum.example.com/discourse-ai/embeddings/semantic-search.json?hyde=false&q=";
      const result = http.get(`${searchUrl}${encoded}`, { "Api-Key": API_KEY });
      return processResults(JSON.parse(result.body));
    }
    
    function invoke(p) {
      if (!p.question) {
        terms = "Nenhuma pesquisa realizada!";
        return "Você deve fornecer o parâmetro question";
      }
      terms = p.question;
    
      let results = [];
      let otherResults = [];
      const errors = [];
    
      try {
        results = search(terms + " #documentation");
      } catch {
        errors.push("Falha ao pesquisar documentação! (talvez limitação de taxa)");
      }
    
      try {
        otherResults = search(terms);
      } catch {
        errors.push("Falha na pesquisa global! (talvez limitação de taxa)");
      }
    
      const topicIds = {};
      results.forEach((topic) => {
        topicIds[topic.topic_id] = topic;
      });
      otherResults.forEach((topic) => {
        if (topicIds[topic.topic_id] || results.length > 15) {
          return;
        }
        results.push(topic);
      });
    
      if (results.length === 0) {
        results = "Nenhum resultado encontrado!";
      }
    
      if (errors.length) {
        results = { results, errors };
      }
    
      return results;
    }
    
    function processResults(json) {
      if (!json.topics) {
        return [];
      }
    
      const postData = {};
      json.posts.forEach((p) => {
        postData[p.topic_id] = p;
      });
    
      return json.topics.map((t) => ({
        url: `/t/${t.slug}/${t.id}`,
        title: t.title,
        blurb: postData[t.id]?.blurb,
        tags: t.tags,
        topic_id: t.id,
        category: categories[t.category_id],
      }));
    }
    
    function details() {
      return "Pesquisando por: " + terms;
    }
    
    Ferramenta de Leitura

    Adicione um parâmetro topic_id com o tipo “number” e a descrição “o id do tópico no forum.example.com que você deseja ler”, e marque a caixa “obrigatório”.

    Você pode usar a mesma chave de API que usou para a ferramenta de pesquisa para preencher o script:

    const API_KEY = "sua chave de api aqui";
    let url = "https://forum.example.com";
    let title = "Tópico desconhecido";
    
    function invoke(p) {
      const jsonUrl = `https://forum.example.com/t/${p.topic_id}.json?include_raw=true`;
    
      try {
        const result = http.get(jsonUrl, { "Api-Key": API_KEY });
        const parsed = JSON.parse(result.body);
        url = `https://forum.example.com/t/${parsed.slug}/${parsed.id}`;
        title = parsed.title;
    
        const raw = parsed.post_stream.posts
          .map((post) => {
            const solution = post.is_solution ? "(solução)" : "";
            return `post #${post.post_number}:${solution}\n${post.raw}`;
          })
          .join("\n\n");
    
        return llm.truncate(raw, 10000);
      } catch {
        return "Algo deu errado, tópico não encontrado!";
      }
    }
    
    function details() {
      return `Lido: <a href='${url}'>${title}</a>`;
    }
    

    Você também pode adicionar o esquema predefinido, configurações de pesquisa e ferramentas de contexto de pesquisa.

    Temos a ferramenta de Pesquisa (personalizada) definida acima configurada como uma ferramenta forçada no agente e aplicada apenas à primeira resposta como estratégia de ferramenta, mas isso é opcional.

    1. Você pode definir fontes de URL com RAG para fornecer informações de outras URLs que podem ser úteis, por exemplo, incluímos discourse.org/pricing, porque isso pode ser uma informação importante em nosso contexto de suporte

    2. Certifique-se de que o bot esteja habilitado, definido como prioridade, tenha seu próprio usuário criado e permita mensagens pessoais.

Isso é tudo! Usando isso como ponto de partida, você pode ter seu próprio ask.example.com

5 curtidas