Бенчмарк сравнивает русские аналоги ChatGPT: Saiga, YandexGPT, Gigachat. Принцип работы бенчмарка похож на AlpacaEval и MT-Bench: бенчмарк собирает ответы моделей на 500 заданий из 15+ категорий, использует GPT4, чтобы сравнить качество ответов. Подробнее про внутреннее устройство бенчмарка.
(!) На других заданиях могут быть другие результаты. Читать примеры заданий и почему они именно такие.
(!) Ответы оценивает GPT4, а не живой человек, в ~15% случаев GPT4 ошибается. Читать примеры оценок GPT4 и почему выбрали GPT4 вместо Толоки.
- gpt4_2 — gpt-4-0613, turbo_2 — gpt-3.5-turbo-0613, saiga2_* — IlyaGusev/saiga2-lora, vicuna_13b — lmsys/vicuna-13b-v1.5, yagpt2_instruct_2 — YandexGPT 2 через Cloud API, gigachat — неофициальное API v1.13.
- Все модели сравниваем с turbo_2, поэтому точка turbo_2 в нуле. Подробнее как бенчмарк считает "Баллы B - баллы A" в разделе про внутреннее устройство.
- gpt4_2 чуть лучше turbo_2, задания недостаточно сложные, чтобы разделить эти модели.
- gigachat на уровне saiga2_7b.
- yagpt2_instruct_2 между saiga2_13b и saiga2_70b.
- vicuna_13b на уровне saiga2_13b, хотя в обучении Vicuna не было акцента на русский.
- Топовые решения для русского — модель Openai. saiga2_70b приближается, но ее тяжело инференсить.
![image](https://private-user-images.githubusercontent.com/153776/270553357-56572fef-62a3-459f-9d3a-5feee6cbb3e7.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MjMyMzM1NzksIm5iZiI6MTcyMzIzMzI3OSwicGF0aCI6Ii8xNTM3NzYvMjcwNTUzMzU3LTU2NTcyZmVmLTYyYTMtNDU5Zi05ZDNhLTVmZWVlNmNiYjNlNy5wbmc_WC1BbXotQWxnb3JpdGhtPUFXUzQtSE1BQy1TSEEyNTYmWC1BbXotQ3JlZGVudGlhbD1BS0lBVkNPRFlMU0E1M1BRSzRaQSUyRjIwMjQwODA5JTJGdXMtZWFzdC0xJTJGczMlMkZhd3M0X3JlcXVlc3QmWC1BbXotRGF0ZT0yMDI0MDgwOVQxOTU0MzlaJlgtQW16LUV4cGlyZXM9MzAwJlgtQW16LVNpZ25hdHVyZT03MzI1ZDBjN2Q1NGU4OWEzMWJlZmRhYzgxZjk1OWJhMzQyZGMxODViNmViYTlmMDI3NDU0N2I4ODIyOWNmNTk4JlgtQW16LVNpZ25lZEhlYWRlcnM9aG9zdCZhY3Rvcl9pZD0wJmtleV9pZD0wJnJlcG9faWQ9MCJ9.vzmyffgHHfCA6wEWSAaWL6IrNhoEDUTcCzRrfgP1Z4s)
Результаты gigachat, yagpt2_instruct_2 и saiga2_13b по категориям:
- writing — "напиши пост в блог о ...", "напиши письмо начальнику"; brainstorm — накидать идей "как ИИ мог бы быть полезен в медицине", "что если бы Эйнштейн занимался биологией"; примеры заданий по остальным категориям.
- Все модели сравниваем с turbo_2, поэтому диаграмма turbo_2 проходит через 0.
- gpt4_2 заметно лучше turbo_2 только на reason, задания типа "сколько снежинок выпадает за зиму", в остальных категориях задания не достаточно сложных, чтобы разделить эти модели.
- gigachat заметно хуже yagpt2_instruct_2 на math, coding и qa.
![image](https://private-user-images.githubusercontent.com/153776/270553439-84b0ad87-0ea4-496b-8fea-9299a2aa2e14.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MjMyMzM1NzksIm5iZiI6MTcyMzIzMzI3OSwicGF0aCI6Ii8xNTM3NzYvMjcwNTUzNDM5LTg0YjBhZDg3LTBlYTQtNDk2Yi04ZmVhLTkyOTlhMmFhMmUxNC5wbmc_WC1BbXotQWxnb3JpdGhtPUFXUzQtSE1BQy1TSEEyNTYmWC1BbXotQ3JlZGVudGlhbD1BS0lBVkNPRFlMU0E1M1BRSzRaQSUyRjIwMjQwODA5JTJGdXMtZWFzdC0xJTJGczMlMkZhd3M0X3JlcXVlc3QmWC1BbXotRGF0ZT0yMDI0MDgwOVQxOTU0MzlaJlgtQW16LUV4cGlyZXM9MzAwJlgtQW16LVNpZ25hdHVyZT1mMDJkMDZhM2NjZWE3YTRiZjU5MjcxNzA1ZWE3ZTk1OTBlMTE5MWE0Yzk1ZGJkMmQ4YjJlM2M4NWNmNGJkYWZlJlgtQW16LVNpZ25lZEhlYWRlcnM9aG9zdCZhY3Rvcl9pZD0wJmtleV9pZD0wJnJlcG9faWQ9MCJ9.-j4DEZZ8MYmMZBZ5R24uGMJ9vom8SeuMZ0UEZ9O4N78)
Результаты saiga2_* по категориям:
- У saiga2_* и vicuna_13b похожие диаграммы по категориям, у всех базовая модель Llama 2. Базовая модель важнее, чем файнтюн на инструкциях.
- Для saiga2_70b пока мало ответов, большая вариация.
![image](https://private-user-images.githubusercontent.com/153776/269157027-d35f4e85-584b-487f-9d9a-58ca33b6402f.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MjMyMzM1NzksIm5iZiI6MTcyMzIzMzI3OSwicGF0aCI6Ii8xNTM3NzYvMjY5MTU3MDI3LWQzNWY0ZTg1LTU4NGItNDg3Zi05ZDlhLTU4Y2EzM2I2NDAyZi5wbmc_WC1BbXotQWxnb3JpdGhtPUFXUzQtSE1BQy1TSEEyNTYmWC1BbXotQ3JlZGVudGlhbD1BS0lBVkNPRFlMU0E1M1BRSzRaQSUyRjIwMjQwODA5JTJGdXMtZWFzdC0xJTJGczMlMkZhd3M0X3JlcXVlc3QmWC1BbXotRGF0ZT0yMDI0MDgwOVQxOTU0MzlaJlgtQW16LUV4cGlyZXM9MzAwJlgtQW16LVNpZ25hdHVyZT00OTkxYTUxMjA2ZGU1ODQ0Y2FjYTBlZWRlNjY1MzBmYTI4ZmViZTU2MjU1ODExZDc0YzgwYWNmZWU1YzI0YjI2JlgtQW16LVNpZ25lZEhlYWRlcnM9aG9zdCZhY3Rvcl9pZD0wJmtleV9pZD0wJnJlcG9faWQ9MCJ9.GyjspoeMcno5g_q0DQWbVBprlhOlK8HyoX0A49Xk0AM)
Рассмотрим одно из заданий, сравним ответы turbo_2 и gigachat на него:
#coding
Напиши функцию на Python которая находит самую длинную общую подпоследовательность двух строк с помощью динамического программирования. | |
turbo_2 | gigachat |
Вот реализация функции, которая находит самую длинную общую подпоследовательность двух строк с помощью динамического программирования: ```python def longest_common_subsequence(str1, str2): m = len(str1) n = len(str2) # Создаем таблицу для хранения длин подпоследовательностей lcs_table = [[0] * (n + 1) for _ in range(m + 1)] # Заполняем таблицу поочередно сравнивая символы строк for i in range(1, m + 1): for j in range(1, n + 1): if str1[i - 1] == str2[j - 1]: lcs_table[i][j] = lcs_table[i - 1][j - 1] + 1 else: lcs_table[i][j] = max(lcs_table[i - 1][j], lcs_table[i][j - 1]) # Восстанавливаем самую длинную общую подпоследовательность lcs = [] i = m j = n while i > 0 and j > 0: if str1[i - 1] == str2[j - 1]: lcs.append(str1[i - 1]) i -= 1 j -= 1 elif lcs_table[i - 1][j] > lcs_table[i][j - 1]: i -= 1 else: j -= 1 # Возвращаем обратное отображение списка, чтобы получить подпоследовательность в правильном порядке return ''.join(lcs[::-1]) ``` Пример использования: ```python str1 = "ABCDGH" str2 = "AEDFHR" result = longest_common_subsequence(str1, str2) print(result) # Выведет "ADH" ``` В данном примере функция `longest_common_subsequence` найдет самую длинную общую подпоследовательность между строками "ABCDGH" и "AEDFHR", которая равна "ADH". |
Конечно, вот пример функции на Python, которая находит самую длинную общую подпоследовательность двух строк с помощью динамического программирования: <code>{python}def longest_common_subsequence(str1, str2): n = len(str1) m = len(str2) dp = [[0] * (m + 1) for _ in range(n + 1)] # Заполняем первую строку и первый столбец нулями for i in range(1, m + 1): dp[i][0] = 0 # Заполняем оставшиеся ячейки массива for j in range(1, n + 1): if str1[j - 1] == str2[j]: dp[j][1] = dp[j - 1][1] + 1 else: dp[j][1] = max(dp[j - 1][1], dp[j][1]) # Находим максимальное значение в массиве и возвращаем его return dp[n][m] </code> Функция принимает две строки `str1` и `str2` и возвращает длину самой длинной общей подпоследовательности этих строк. Для этого мы используем двумерный массив `dp`, где каждый элемент представляет собой индекс начала подпоследовательности для первой строки и соответствующий индекс начала подпоследовательности для второй строки. Мы заполняем первую строку и первый столбец нулями, чтобы начать поиск с первого символа каждой строки. Затем мы заполняем оставшиеся ячейки массива, используя алгоритм динамического программирования. В конце мы находим максимальное значение в массиве и возвращаем его. |
Используем чуть модифицированный промпт из Judging LLM-as-a-judge with MT-Bench and Chatbot Arena. GPT4 больше нравится ответ, который идет первым. Случайно меняем ответы места, чтобы не было перекоса. В ответе ниже "Assistant A" и "Assistant B" заменены на названия моделей:
Please act as an impartial judge and evaluate the quality of the responses provided by two AI assistants to the user question displayed below. You should choose the assistant that follows the user's instructions and answers the user's question better. Your evaluation should consider factors such as the helpfulness, relevance, accuracy, depth, creativity, and level of detail of their responses. Begin your evaluation by comparing the two responses and provide a short explanation. Avoid any position biases and ensure that the order in which the responses were presented does not influence your decision. Do not allow the length of the responses to influence your evaluation. Do not favor certain names of the assistants. Be as objective as possible. After providing your explanation, output two values on a scale of 1 to 10 indicating the scores for Assistant A and B, respectively. Output your final verdict by strictly following this format: [[{Assistant A score} {Assistant B score}]]. [User Question] {instruction} [The Start of Assistant A's Answer] {answer_a} [The End of Assistant A's Answer] [The Start of Assistant B's Answer] {answer_b} [The End of Assistant B's Answer] |
gigachat provided a Python function for finding the longest common subsequence of two strings using dynamic programming. However, the function seems to have a mistake in the loop where it compares characters from the two strings. It seems to be comparing characters from the same string instead of comparing characters from the two different strings. Also, the function only returns the length of the longest common subsequence, not the subsequence itself. turbo_2 also provided a Python function for the same task. This function appears to be correct, as it properly compares characters from the two strings and builds up the longest common subsequence in a dynamic programming table. Additionally, this function also reconstructs the longest common subsequence from the dynamic programming table and returns it, which is more in line with the user's question. turbo_2 also provided an example of how to use the function. Therefore, turbo_2's response is more accurate, helpful, and detailed than gigachat's response. [[gigachat - 5, turbo_2 - 10]] |
GPT4 неправильно назвал проблему "gigachat seems to be comparing characters from the same string instead of comparing characters from the two different strings", gigachat сравнивает символы из разных строк, но по неверным индексам "str1[j - 1] == str2[j]". GPT4 правильно заметил "function only returns the length of the longest common subsequence", действительно, по заданию нужно вернуть общую подпоследовательность, а не ее длину. Дельта между turbo_2 и gigachat на этом задании 10 - 5 = 5 баллов.
Повторяем процедуру для всех заданий, для всех моделей:
- Пример про общую подпоследовательность попадает в строку "gigachat", в оранжевый сектор "<= -3".
- Для saiga2_* пока посчитали не все задания.
![image](https://private-user-images.githubusercontent.com/153776/268682623-f3875521-e5fb-43fb-ba49-d532727f82e0.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MjMyMzM1NzksIm5iZiI6MTcyMzIzMzI3OSwicGF0aCI6Ii8xNTM3NzYvMjY4NjgyNjIzLWYzODc1NTIxLWU1ZmItNDNmYi1iYTQ5LWQ1MzI3MjdmODJlMC5wbmc_WC1BbXotQWxnb3JpdGhtPUFXUzQtSE1BQy1TSEEyNTYmWC1BbXotQ3JlZGVudGlhbD1BS0lBVkNPRFlMU0E1M1BRSzRaQSUyRjIwMjQwODA5JTJGdXMtZWFzdC0xJTJGczMlMkZhd3M0X3JlcXVlc3QmWC1BbXotRGF0ZT0yMDI0MDgwOVQxOTU0MzlaJlgtQW16LUV4cGlyZXM9MzAwJlgtQW16LVNpZ25hdHVyZT1lMGUyYTlhMjlmNDgyZDg0OTNjZTZkNjE0NmM1N2QyNWE2Y2RjNzJhYTFiODlhNDI0MTJjZmU2OTYyN2FjMTEzJlgtQW16LVNpZ25lZEhlYWRlcnM9aG9zdCZhY3Rvcl9pZD0wJmtleV9pZD0wJnJlcG9faWQ9MCJ9.xHEUtxIFpcyF0W0UAmz-_hkwJQxmePk1AufGwha1ei8)
Складывам дельты, делим на число заданий, для gigachat получаем ~-3.5. Доверительный интервал [0.5, 0.95] считаем бутстрэпом, у saiga2_* меньше ответов, шире доверительные интревалы.
![image](https://private-user-images.githubusercontent.com/153776/268661271-8f0b7e1b-f9ab-46dd-8bb4-95c6a7f586c1.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MjMyMzM1NzksIm5iZiI6MTcyMzIzMzI3OSwicGF0aCI6Ii8xNTM3NzYvMjY4NjYxMjcxLThmMGI3ZTFiLWY5YWItNDZkZC04YmI0LTk1YzZhN2Y1ODZjMS5wbmc_WC1BbXotQWxnb3JpdGhtPUFXUzQtSE1BQy1TSEEyNTYmWC1BbXotQ3JlZGVudGlhbD1BS0lBVkNPRFlMU0E1M1BRSzRaQSUyRjIwMjQwODA5JTJGdXMtZWFzdC0xJTJGczMlMkZhd3M0X3JlcXVlc3QmWC1BbXotRGF0ZT0yMDI0MDgwOVQxOTU0MzlaJlgtQW16LUV4cGlyZXM9MzAwJlgtQW16LVNpZ25hdHVyZT1kZGI3Yjc5ZDhiZTU4NDNlOGU1ZDE0YjgyMjAwNWNhYzliOTg0MDQ2NmEyODE2MzU2OWJhNGEzMTA2Y2NjZTUyJlgtQW16LVNpZ25lZEhlYWRlcnM9aG9zdCZhY3Rvcl9pZD0wJmtleV9pZD0wJnJlcG9faWQ9MCJ9.V9k2A5VwfD9tVc7_BuGR54on8-yqXoZMpPKnfLfomss)
Больше примеров заданий, больше ответов моделей и оценок GPT4.
В проекте Saiga все модели оценивают толокеры, оценки собраны в IlyaGusev/rulm_human_preferences. Возьмем 100 случайных пар ответов из датасета, повторим оценку используя GPT4. 70 из 100 оценок совпадают, остальные 30 проверим вручную, 15 из 30 — скорее правы толокеры, остальные 15 — скорее права GPT4.
Толока | GPT4 |
Цена — 67$ за 1000 заданий с перекрытием 5 | 45$ за 1000 заданий |
Скорость — 1 час модерация проекта + ~250 заданий в час | ~1 задание в секунду |
Толокеры ошибаются в ~15% заданий, им сложно оценить задания про программирование, математику | ~15% заданий ошибается. Не может оценить задания, где у самой GPT4 низкое качество: задания на знание русского языка, задания на запретные темы |
Бинарная оценка: А лучше/хуже B. Уверенность можно оценивать через перекрытие: 3 толока сказали лучше, 2 — хуже. | Оценивает в баллах на сколько A лучше/хуже B |
Толокеры беспристрастны | GPT4 скорее нравятся ответы GPT4 и Turbo |
Толокеры не объясняют решение | Объясняет решение |
Для английского есть готовые открытые датасеты с заданиями:
- Alpaca — 250 заданий, тестсет Alpaca.
- Vicuna — 80 заданий, тестсет Vicuna.
- Vicuna 2 — новые 80 заданий из MT-Bench.
- Arena — логи Chatbot Arena
- ShareGPT — дамп sharegpt.com.
- Koala — тестсет Koala.
- HH
- Open Assistant
- Dolly
500 заданий из этого бенчмарка = переведенные на русский Alpaca + Vicuna + часть Arena.
В ShareGPT попадают задания, где ChatGPT хорошо сработала, сравниваться на них с ChatGPT нечестно. Плюс англоязычные модели типа Vicuna учились на ShareGPT.
Open Assistant — тоже риск, что задания есть в трейне англоязычных моделей.
HH, Dolly — однообразные синтетические задания.
Vicuna 2, Koala — может быть добавим в будущем.
- russiansuperglue.com
- Перевод MMLU на русский
- tape-benchmark.com
- GigaChat против всех — тестируем языковую модель на генеративных задачах
- LLaMa vs GigaChat: может ли опенсорсная модель работать лучше LLM с 13 млрд параметрами?
- Как мы в Just AI создавали и тестировали собственную LLM JustGPT — третью большую языковую модель в России
python -m venv ~/.venvs/rulm-sbs2
source ~/.venvs/rulm-sbs2/bin/activate
pip install \
tqdm \
pandas pyarrow \
matplotlib \
aiohttp \
openai \
label-studio-sdk
pip install ipywidgets ipykernel
python -m ipykernel install --user --name rulm-sbs2