Skip to content

kuk/rulm-sbs2

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

rulm-sbs2

Бенчмарк сравнивает русские аналоги 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


Результаты 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


Результаты saiga2_* по категориям:

  • У saiga2_* и vicuna_13b похожие диаграммы по категориям, у всех базовая модель Llama 2. Базовая модель важнее, чем файнтюн на инструкциях.
  • Для saiga2_70b пока мало ответов, большая вариация.
image

Принцип работы

Рассмотрим одно из заданий, сравним ответы turbo_2 и gigachat на него:

#coding
Напиши функцию на Python которая находит самую длинную общую подпоследовательность двух строк с помощью динамического программирования.
turbo_2gigachat
Вот реализация функции, которая находит самую длинную общую подпоследовательность двух строк с помощью динамического программирования:

```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

Складывам дельты, делим на число заданий, для gigachat получаем ~-3.5. Доверительный интервал [0.5, 0.95] считаем бутстрэпом, у saiga2_* меньше ответов, шире доверительные интревалы.

image

Больше примеров заданий, больше ответов моделей и оценок GPT4.

GPT4 vs Толока

В проекте 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
Толокеры не объясняют решение Объясняет решение

Почему именно такие задания

Для английского есть готовые открытые датасеты с заданиями:

500 заданий из этого бенчмарка = переведенные на русский Alpaca + Vicuna + часть Arena.

В ShareGPT попадают задания, где ChatGPT хорошо сработала, сравниваться на них с ChatGPT нечестно. Плюс англоязычные модели типа Vicuna учились на ShareGPT.

Open Assistant — тоже риск, что задания есть в трейне англоязычных моделей.

HH, Dolly — однообразные синтетические задания.

Vicuna 2, Koala — может быть добавим в будущем.

Другие бенчмарки для русскоязычных LLM

Разработка

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

About

Бенчмарк сравнивает русские аналоги ChatGPT: Saiga, YandexGPT, Gigachat

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published