Proofread вставляет текст дважды

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


3 лайка

Хм, я могу воспроизвести это на сообщении, на которое вы ссылаетесь, но пока не смог найти это в других местах. Очень странно :face_with_monocle: :thinking:

Я даже попробовал с этим:

Но с другим вариантом я смог воспроизвести проблему с разным текстом ответа и даже с полем даты вне цитаты. Я заметил, что если в тексте ответа нет опечатки, система пытается исправить цитату.


2 лайка

Это так странно. :smile:

Когда вы не выделяете текст, в цитате что-то нужно исправить, и вы не являетесь сотрудником, она дублируется. :thinking:


Когда содержимое цитаты выглядит нормально, дублирования не происходит:

2 лайка

Это ошибка, вызываемая Qwen @Falco

{
  "model": "meta-llama/Llama-3.2-11B-Vision-Instruct",
  "temperature": 0,
  "stop": [
    "\n<output>"
  ],
  "messages": [
    {
      "role": "system",
      "content": "Вы — корректор markdown. Вы исправляете грубые опечатки и стилистические недочеты, но сохраняете оригинальный стиль автора.\nВы не трогаете блоки кода. Я предоставлю вам текст для коррекции. Если исправлять нечего, вы вернете текст как есть.\nТекст будет находиться между XML-тегами <input> и </input>.\nВы ВСЕГДА будете возвращать исправленный текст между XML-тегами <output> и </output>.\n\n"
    },
    {
      "role": "user",
      "content": "<input>[quote=\"Arkshine, post:1, topic:339163\"]\n:information_source: Этот компонент требует, чтобы Discourse был актуален по состоянию на [date=2024-11-27 timezone=\"Europe/Paris\"]. \n[/quote]\nВы обновили Discourse? Уведомление об обновлении приходит только при выпуске новой бета-версии, но новые коммиты добавляются каждый день.</input>"
    }
  ]
}
{
  "id": "chatcmpl-752c6aacdc7f496b951592e88d485eb3",
  "object": "chat.completion",
  "created": 1733196730,
  "model": "Qwen/Qwen2.5-32B-Instruct-AWQ",
  "choices": [
    {
      "index": 0,
      "message": {
        "role": "assistant",
        "content": "<input>[quote=\"Arkshine, post:1, topic:339163\"]\n:information_source: Этот компонент требует, чтобы Discourse был актуален по состоянию на [date=2024-11-27 timezone=\"Europe/Paris\"]. \n[/quote]\nВы обновили Discourse? Уведомление об обновлении приходит только при выпуске новой бета-версии, но новые коммиты добавляются ежедневно.</input>\n\n<output>[quote=\"Arkshine, post:1, topic:339163\"]\n:information_source: Этот компонент требует, чтобы Discourse был актуален по состоянию на [date=2024-11-27 timezone=\"Europe/Paris\"]. \n[/quote]\nВы обновили Discourse? Уведомление об обновлении приходит только при выпуске новой бета-версии, но новые коммиты добавляются ежедневно.</output>",
        "tool_calls": []
      },
      "logprobs": null,
      "finish_reason": "stop",
      "stop_reason": null
    }
  ],
  "usage": {
    "prompt_tokens": 184,
    "total_tokens": 358,
    "completion_tokens": 174,
    "prompt_tokens_details": null
  },
  "prompt_logprobs": null
}

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

Регулярное выражение для санитизации сохраняет и input, и output.

Думаю, нам следует быть более внимательными к нашему API: если задача — только корректура, запрашивать только output или провести более качественную работу с промптом.

Также интересно, что мы перестали отправлять примеры, хотя они у нас есть @Roman

6 лайков

Это исправит основную причину регрессии:

При этом, как побочный эффект, @Jagster, мы некоторое время не отправляли примеры на английском языке, но теперь начнем отправлять их снова. Дайте знать, если это повлияет на вас.

Тем не менее, @Roman, для меня это не имеет смысла:

SANITIZE_REGEX_STR =
            %w[term context topic replyTo input output result]
              .map { |tag| "<#{tag}>\n?|\n?</#{tag}>" }
              .join("|")
          

Разве это не должно быть:

(элемент предназначен для предложений заголовков, но, возможно, используется другой путь)

SANITIZE_REGEX_STR =
            %w[output item]
              .map { |tag| "<#{tag}>\n?|\n?</#{tag}>" }
              .join("|")
3 лайка

Некоторые подсказки для помощников используют эти теги для предоставления контекста. Например:

Некоторые модели могут включать их в ответ, поэтому мы их удаляем.

2 лайка

Не совсем понятно, не могли бы вы привести полный пример?

Зачем нам нужно сохранять текст в тегах input в выводе, когда мы очищаем данные, которые предоставляет модель?

(Кстати, у оператора всё должно работать уже сейчас).

1 лайк

Слово «sanitize» здесь немного вводит в заблуждение. Мы хотим решить две разные задачи:

  1. Убедиться, что получаем только вывод и ничего больше.
  2. Удалить любые теги, из-за которых результат выглядит неестественно.

Проблема в том, что мы слишком расслаблены в пункте (1). Нам нужно гарантировать, что релевантная часть всегда будет заключена в и, и больше ничего. Как только мы получим эту релевантную часть, удалим все остальные теги, чтобы результат выглядел чистым (2).


Чтобы расширить приведённый выше пример и объяснить, почему мы сейчас удаляем все эти теги, вот как выглядит заготовленный промпт «explain»:

https://github.com/discourse/discourse-ai/blob/main/db/fixtures/ai_helper/603_completion_prompts.rb#L157

<term>, <replyTo> используются для предоставления контекста модели, а <input> указывает, что мы хотим, чтобы она сосредоточилась на конкретном фрагменте текста.

Проблема заключалась в том, что некоторые модели использовали те же теги в своих ответах, из-за чего текст выглядел неестественно и странно для пользователей. Конечная цель здесь — удалить эти теги и получить «чистый» текст в качестве результата.

Например, когда я хочу получить объяснение того, что означает «Not following», я не хочу видеть что-то вроде этого:

<term>Not following</tem> в данном контексте означает, что пользователь испытывает трудности с пониманием объяснения или сути высказываемой мысли. (…)

2 лайка