Математические и ИИ-обходные пути

Поступили новые предложения от сообщества OpenAI по поводу проблем, с которыми я сталкиваюсь. Планируете ли вы выпустить обновление по этому вопросу? Предложения следующие.

Предложение 1;

def parse_stream_to_katex(stream: Stream):
    """
    Принимает поток OpenAI и заменяет разделители LaTeX от ChatGPT
    на разделители KaTeX.
    Возвращает текст, а не чанки
    """
    last_text = ""
    for chunk in stream:
        text = chunk.choices[0].delta.content
        if text:
            # Иногда разделители, такие как \(, могут быть разбиты между двумя чанками.
            # Если предыдущий чанк заканчивался на \, добавьте его к текущему чанку
            if last_text.endswith("\\"):
                text = last_text + text

            text = (
                text.replace(r"\[", "$$")
                .replace(r"\]", "$$")
                .replace(r"\(", "$")
                .replace(r"\)", "$")
            )
            last_text = text

            # Если текст заканчивается на \, мы не возвращаем его, а включим в следующий чанк
            if not text.endswith("\\"):
                yield text

Предложение 2:

// MarkdownLaTeXRenderer.js
import React from 'react';
import ReactMarkdown from 'react-markdown';
import remarkGfm from 'remark-gfm';
import remarkMath from 'remark-math';
import rehypeRaw from 'rehype-raw';
import rehypeKatex from 'rehype-katex';

const MarkdownLaTeXRenderer = ({ content }) => {
    // Замените \[ на $$ и \] на $$ для обеспечения совместимости
    const processedText = content 
      .replace(/\\\[/g, '$$$')  // Заменить все вхождения \[ на $$
      .replace(/\\\]/g, '$$$') // Заменить все вхождения \] на $$
      .replace(/\\\(/g, '$$$')  // Заменить все вхождения \( на $$
      .replace(/\\\)/g, '$$$'); // Заменить все вхождения \) на $$

    const remarkMathOptions = {
        singleDollarTextMath: false,

};




return (
    <ReactMarkdown
        className="markdown-content"
        children={processedText}
        remarkPlugins={[[remarkMath, remarkMathOptions], remarkGfm]} // Передайте опции как второй элемент массива
        rehypePlugins={[rehypeRaw, rehypeKatex]} // Включите rehypeRaw для HTML, rehypeKatex для LaTeX
    />
);

};

export default MarkdownLaTeXRenderer;

А как конечный пользователь я использую системный промпт для этого (OpenAI).

Когда математика находится на отдельной строке или в отдельной главе, замена \( и \) на $$ на отдельных строках до и после работает довольно надёжно.

Но когда то же самое нужно сделать в строке с использованием одного $… это почти всегда не работает.

Если бы это можно было сделать автоматически… было бы ещё лучше.

Когда я просматриваю математические формулы на мобильном устройстве, я не могу увидеть всю формулу целиком (формула слишком длинная). Знает ли кто-нибудь, как решить эту проблему?
image
Ниже показано правильное отображение на ПК.
image

Поворот телефона горизонтально? Но почему это заключено в кавычки, и может ли это быть проблемой?

В остальном. Я спросил у ИИ моего форума, и он ответил следующее (не знаю, полезно ли это или полный бред).

Решения для выравнивания длинных уравнений с помощью MathJax ИИ

Jagster:

Форум использует MathJax для отображения математики и уравнений. Иногда уравнение настолько длинное, что не помещается на экране мобильного устройства. Есть ли способ разбить уравнение на несколько строк?

Asiavastaaja:

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

  1. Используйте окружение align: Вы можете разбить уравнение на несколько строк с помощью окружения align. Это позволяет выровнять и распределить части уравнения по нескольким строкам. Например:

    $$
    \begin{align}
    a + b + c + d + e + f + g + h + i + j + k + l + m + n + o + p + q + r + s + t + u + v + w + x + y + z = 0
    \end{align}
    $$
    
  2. Используйте окружение split: Это еще один способ разбить уравнение на несколько строк. Оно особенно полезно, когда нужно разделить уравнение на части без необходимости выравнивания. Например:

    $$
    \begin{split}
    a + b + c + d + e + f + g + h + i + j + k + l + m + n + o + p + q + r + s + t + u + v + w + x + y + z = 0
    \end{split}
    $$
    
  3. Используйте окружение multline: Это окружение предназначено для длинных уравнений, которые не помещаются в одну строку. Оно разбивает уравнение на несколько строк без выравнивания. Например:

    $$
    \begin{multline}
    a + b + c + d + e + f + g + h + i + j + k + l + m + n + o + p + q + r + s + t + u + v + w + x + y + z = 0
    \end{multline}
    $$
    

Эти окружения позволяют контролировать отображение уравнений и обеспечивают их читаемость даже на небольших экранах. Помните, что окружения MathJax часто требуют пакета amsmath, который обычно включен по умолчанию в MathJax.

@Jagster Это должны быть хорошие решения. Изначально я хотел добавить горизонтальную прокрутку для формулы, но у меня не получилось.

.math-tex {
    overflow-x: auto;
    max-width: 100%;
    padding: 5px 0;
    display: block;
}

У меня возникли проблемы с копированием математических формул из Google Таблиц в Meta Discourse. Разве формулы не отображаются корректно?

NPV = CFt * [1 - 1/(1+r)^T] - CFo = 84 000 * [1 - 1/(1+13%)^7 / 13%] - 385 000 = -13 500 $

PI = 1 + NPV/CFo = 1 + Σ(n=1 до 7) 84 000/(1,13)^n - 385 000 / 385 000 ≈ 0,965

Я думаю, вам нужно экранировать символы $ и % с помощью \.
NPV=CFt * [1-1(1+r)Tr]- CFo= 84,000 * [1-1(1+13\%)713\%]- 385,000 = \$-13,500

Давайте посмотрим:

NPV=CFt * [1-1(1+r)Tr]- CFo= 84,000 * [1-1(1+13\%)713\%]- 385,000 = \$-13,500
PI = 1 + NPVCFo = 1+ n=1784,000(1,13)n - 385,000385,000 ~ 0,965


Это отображается нормально, но нет полосы прокрутки, чтобы увидеть всю формулу. Однако в предпросмотре она есть.
В самом посте вы можете увидеть остальную часть только при увеличении масштаба:

В окне предпросмотра при составлении поста, когда SVG рендерится, окно предпросмотра прокручивается вверх. Есть ли настройка, которую можно изменить, чтобы прокрутка возвращалась к нижнему положению?

Каждый раз прокручивать вниз при редактировании математики раздражает моих лекторов, но я как-то справляюсь.

Я заметил несколько упоминаний «устаревания» в активности.

Если кто-то может, пожалуйста, объясните, что это означает для экземпляра с большой базой данных математики, которая отображается корректно?

После полного обновления/пересборки математика отображается корректно.

Для тех, кто ещё не слышал: этот плагин теперь включён в ядро. Пожалуйста, ознакомьтесь с пересборкой/ревизией 2 из 3 в этом посте, чтобы убедиться в этом.

Сделано! :+1: Извините за беспокойство. Теперь у вас всё должно работать.

:partying_face: Этот плагин теперь включён в состав ядра Discourse как часть Bundling more popular plugins with Discourse core. Если вы размещаете Discourse самостоятельно и используете этот плагин, вам нужно удалить его из вашего файла app.yml перед следующим обновлением.

У меня проблема с отображением математических символов в ответах ИИ. Он выдает ответы в формате LaTeX, хотя я уже указал соответствующий запрос в промпте. Из-за этого появляются изображения, будто символы повреждены. Можете ли вы решить эту проблему? Пример:

A = \begin{pmatrix} x & -1 \\\\ z & 2y \end{pmatrix}

\boxed{ x = 0, \quad y = 4, \quad z = 4 }
\begin{cases} A_{11} = B^T_{11} \Rightarrow x = y - z \\\\ A_{12} = B^T_{12} \Rightarrow -1 = -1 \quad (\text{верно автоматически}) \\\\ A_{21} = B^T_{21} \Rightarrow z = y \\\\ A_{22} = B^T_{22} \Rightarrow 2y = 8 \\\\ \end{cases}

Ранее я уже делился решениями с сообщества OpenAI.

Привет, @ozkn

У меня тоже возникла эта проблема. Я бы порекомендовал следующее:

  • зарегистрируйте аккаунт у поставщика ИИ
  • попросите аккаунт ИИ:

запомнить для будущих ответов, что Discourse совместим с MathJax/Katex: $…$ $$…$$ для форматирования как в строку, так и для многострочных блоков.

  • после входа в свой аккаунт ИИ вы обнаружите, что вывод удобнее копировать и вставлять
возможно, вам потребуется настойчиво напоминать о сохранении памяти

Чтобы дополнить предыдущий пункт: если вы смешиваете математику и валюту, помните:

  • $...$ = математика
  • \$ = знак доллара как текст

Так что:
$x+1$ costs \$5. → отображает математическое выражение x+1 и показывает цену как $5.

Вот и всё, что нужно: математика с $, деньги с \$.

Ещё один хороший совет, чтобы напомнить ChatGPT, — это то, что нельзя отображать математику в заголовках панелей «Подробнее»

Ни один из этих хаков больше не нужен, мы поддерживаем это нативно.