Ask.discourse.com — Не могу найти здесь объявление

На другом сайте Discourse я проверил раздел «Что нового» и увидел

Поскольку я хорошо знаком с множеством AI-ботов от Discourse, решил проверить, не является ли это чем-то новым и отличным, и так оно и есть.

Была ли создана отдельная тема в категории «Объявления» по этому поводу? Я не припоминаю, чтобы видел такую.

Я думаю, что это всё ещё своего рода бета-версия.

Объявление о тихом запуске было сделано в lounge https://meta.discourse.org/t/help-us-test-ask-discourse-com/324441?u=pfaffman

Мы сообщили об этом клиентам через раздел «Что нового», но пока не всем сайтам. Это ещё ранний этап, и сейчас решение больше ориентировано на клиентов с хостингом, хотя, разумеется, для большинства вопросов есть значительное пересечение.

У меня нет доступа к lounge на этом форуме, но я понимаю, что вы имеете в виду.

Это интересное развитие событий. Я планировал открыть тему #feature о предоставлении персоне доступа для публичных/гостевых пользователей, чтобы любой посетитель мог её использовать. Это то, что Discourse будет исследовать, или, возможно, это связано с этим недавно выпущенным тестовым экземпляром?

У каждой персоны есть настройка разрешённых групп, поэтому теперь любой пользователь может использовать любую персону.

Извините, я должен был быть понятнее. Я имел в виду любых гостей/анонимных пользователей — это будет полезно для таких случаев, как doc-categories, где я не ожидаю, что все читатели зарегистрируются, но всё же хочу позволить им общаться в чате по документации.

Кажется, очень опасно позволять людям, которые даже не вошли в систему и могут вообще не быть людьми, тратить ваши деньги.

Конечно, необходимы ограничения на основе IP/cookies. Или даже глобальный предельный лимит безопасности.

Не вижу, почему улучшение опыта поддержки могло бы стать проблемой. Если вы размещаете документацию с помощью Gitbook, вы платите минимум 1200 долларов в год, и этот тариф включает возможность для ваших посетителей общаться с вашей документацией. Если спросите меня, здесь для CDCK открывается отличная возможность :face_savoring_food:

Во-вторых, существует несколько отчетов о том, что чат-боты позволяют экономить расходы (на поддержку клиентов).

Это всё верно. Моя мысль в том, что вы не знаете, что они ваши клиенты, если они не вошли в систему.

Использует ли Discourse Ask уже существующие AI-персоны или вы создали свои собственные специально для этого?

Ask использует кастомный персонаж и опирается на два кастомных инструмента, которые выполняют API-запросы к meta.discourse.org.

Есть ли планы выпустить это для публики?

Здесь нет ничего «строго секретного» :slight_smile:

Есть тема, очень похожая на эту:

И инструмент, который мы используем, содержит следующий скрипт:

let terms;
let API_KEY = "...";

const categories = {
  61: "тема",
  6: "поддержка",
  148: "данные и отчетность",
  164: "Документация > Хостинг для клиентов",
  177: "Вики-сообщество",
  31: "установка",
  10: "Документация",
  22: "плагин",
  1: "баг",
  106: "миграция",
  120: "компонент темы",
  105: "программа поддержки сообщества",
  124: "Общее",
  157: "обратная связь по сайту > сводки форума",
  152: "обратная связь по сайту > обратная связь по теме",
  168: "Документация > Вклад",
  30: "релизы",
  126: "Документация > Использование Discourse",
  2: "функция",
  63: "похвала > сравнение",
  9: "UX",
  27: "разработка > переводы",
  24: "SSO",
  3: "обратная связь по сайту",
  17: "Без категории",
  14: "маркетплейс",
  21: "поддержка > WordPress",
  13: "объявления > блог",
  53: "Документация > Управление сайтом",
  5: "плагин > дополнения",
  65: "сообщество",
  8: "установка > хостинг",
  35: "похвала",
  67: "объявления",
  178: "Вики-сообщество > Администраторы",
  167: "Документация > Интеграции",
  55: "Документация > Самостоятельный хостинг",
  169: "Документация > Переход на Discourse",
  56: "Документация > Руководства для разработчиков",
  7: "разработка",
  179: "Вики-сообщество > Разработчики",
  181: "Вики-сообщество > Пользователи",
  180: "Вики-сообщество > Системные администраторы"
};


function search(terms) {
   const encoded = encodeURIComponent(terms);
   const searchUrl = "https://meta.discourse.org/discourse-ai/embeddings/semantic-search.json?hyde=false&q=";
   result = http.get(`${searchUrl}${encoded}`, {'Api-Key': API_KEY });
   return processResults(JSON.parse(result.body)); 
}

function invoke(p) {
  if (!p.question) {
      terms = "Поиск не выполнен!"
      return "Необходимо предоставить параметр вопроса";
  }
  terms = p.question;
  let results = search(terms + " #documentation");
  let otherResults = search(terms);
  
  let topicIds = {};
  results.forEach(topic => { topicIds[topic.topic_id] = topic });
  otherResults.forEach(topic => {
      if (topicIds[topic.topic_id]) {
          return;
      }
      if (results.length > 15) {
          return;
      }
      
      results.push(topic);
  });
  
  if (results.length === 0) {
      return "Результаты не найдены!"
  } else {
      return results;
  }
}

function processResults(json) {
    
    if (!json.topics) {
        return [];
    }
    
    const postData = {};
    json.posts.forEach( p => {
       postData[p.topic_id] = p;
    });
    
    // todo маппинг категории meta
    return json.topics.map(t => {
        let result = {};
        let post = postData[t.id];
        result.url = `/t/${t.slug}/${t.id}`;
        result.title = t.title;
        result.blurb = post.blurb;
        result.tags = t.tags;
        result.topic_id = t.id;
        result.category = categories[t.category_id];
        return result;
    });
}

function details() {
  return "Поиск по запросу: " + terms
}

Инструмент чтения использует:

let topicId;
let url = "https://meta.discourse.org";
const API_KEY = "...";
let title = "Неизвестная тема";

function invoke(p) {
    topicId = p.topicId;
    let jsonUrl = `https://meta.discourse.org/t/${p.topic_id}.json?include_raw=true`;
    result = http.get(jsonUrl, { 'Api-Key' : API_KEY });

    try {
       const parsed = JSON.parse(result.body);
       url = `https://meta.discourse.org/t/${parsed.slug}/${parsed.id}`;
       title = parsed.title;
       let raw = parsed.post_stream.posts.map( post => {
          let solution = "";
          if (post.is_solution) {
              solution = "(решение)";
          }
          return `пост #${post.post_number}:${solution}\n${post.raw}`;    
       }).join("\n\n");
       return llm.truncate(raw, 10000);
    } catch {
        return "Что-то пошло не так, тема не найдена!"
    }
}
function details() {
  return `Чтение: <a href='${url}'>${title}</a>`;
}