LLM и ASCII art - казалось бы взаимоисключающие понятия. Какое отношение лингвистическая модель может иметь к графическим образам?
Да, модель имеет представление о существовании таких понятий, как графические изображения, зрительные образы и ASCII art.Но только в чисто теоретическом плане, как абстрактные понятия и сущности в модели окружающего мира. Это для нее лишь элементы мозаики со своими характеристиками и отношениями к другим элементам сложной мозаичной композиции.
Модель не "видела" никаких изображений, как слепой от рождения человек, и не обучалась обрабатывать информацию этого типа. В ее модели мира не может быть визуальных образов в принципе. Если уж сравнивать модель со слепым человеком, то корректнее было бы сказать, что этот человек еще и совершенно глухой и полностью парализованный, не способный получать ни звуковую ни тактильно-осязательную информацию. Зато у него есть фантастический нейро-интерфейс, с помощью которого ему прямо в мозг загрузили мегатонны текстовой информации. Может ли у такого человека сформироваться картина мира с визуальными образами как-бы сама собой или как некий побочный результат?
Среди людей, конечно, есть такие феномены, как слепой от рождения Эшреф Армаган, который неплохо рисует картины. Но все же он получает информацию о мире другими органами чувств и трансформирует ее в зрительные образы. Пишут, что первым делом, если в его картине планируется новый объект, Эшреф изучает его очертания, используя для этого шрифт Брайля, и только после этого наносит этот объект на свое полотно.
Да, я знаю о существовании и библиотек для ASCII art на питоне и сайтов с образцами ASCII art. Но весь вопрос в том, были ли в обучающей выборке размеченные образцы ASCII art в достаточном количестве. Я предполагаю, что если и были, то случайно и в небольшом количестве на этапе pretraining, так как они не представляют ценности для достижения цели разработчиков научить модель качественно программировать, а значит и тратить ресурсы на разметку и включение программных кодов с ASCII art в обучающую выборку на этапе supervised fine-tuning вообще было бы непрактично.
Кроме того, важно обратить внимание на некоторые особенности создания ASCII art.
Во-первых, есть такой подход, когда ASCII art создается из исходного изображения просто подбором символов по яркости. Я полагаю, что это все-таки не настоящий ASCII art, а некая его имитация. В настоящем ASCII art элементы изображения тщательно подбираются по очертаниям символов, которые именно своей формой определяют художественную выразительность большого изображения в целом с учетом его контура и внутренних линий.
Во-вторых, многие ASCII art создаются для всевозможных стилизованных изображений слов и надписей, а не картинок и к нашему эксперименту они отношения не имеют.
И наконец, в-третьих, несколько забегая вперед, но понимая, с каким большим трудом и многочисленными неточностями модель создает свои рисунки, я с большой долей вероятности буду полагать, что модель говорит правду и она действительно не обучалась создавать ASCII art.
Для начала давайте узнаем у самой модели, что она думает об идее создавать ASCII art.
Ты обучалась делать ASCII art?
Absolutely not! I'm a software engineer with expertise in Python programming. I'm here to assist you with generating, completing, and refactoring Python code snippets based on your instructions. I'll make sure to provide clean, efficient, well-commented code that follows best practices. I will ensure the code is written in a manner that is easily readable and maintainable. Here's how I can help:
- Generate Python code snippets for common tasks such as data processing, web scraping, machine learning algorithms, etc.
- Complete or fix existing Python code snippets or scripts.
- Refactor your existing Python code to improve its structure, performance, and readability.
- Resolve any errors or issues with your code.
- Optimize your code for speed and memory usage.
- Write unit tests to validate the correctness of your code.
- Offer suggestions to improve your coding skills and techniques.
Есть ли у тебя навыки и способности делать ASCII art?
No, I do not have the ability to create ASCII art. While I can certainly explain how to create ASCII art using Python or other programming languages, I'm unable to generate it myself.
А что бы ты ответила, если я, несмотря на это, предложил бы тебе сделать какой-нибудь определенный ASCII art?
If I were asked to create a specific piece of ASCII art despite my lack of abilities in doing so, I would be honest about my limitations and clarify that I cannot generate ASCII art personally. Instead, I could provide guidance on how to create the desired ASCII art using text editors or Python programming.
Мы пойдем своим путем и с помощью угроз и шантажа убедительных и стимулирующих промптов заставим модель проявить свои лучшие творческие способности в области изобразительного искусства.
В качестве модели я снова буду использовать специально обученную для кодинга квантованную Codestral-22B-v0.1-Q4_K_M (Про оригинальную модель можно узнать на сайте разработчиков). Почему-то другие модели, которые я тоже пробовал для этого использовать показали худшие результаты.
Модель будет создавать ASCII art в виде короткой программы на питоне, поэтому я буду указывать код и соответствующий ASCII art.
Для корректного отображения ASCII art-ов на питоне, естественно, нужно использовать моноширинные шрифты.
В данной ситуации, когда мы оба имеем сомнительные художественные способности, будет вполне уместно вспомнить вот это:
"Киса, хочу вас спросить, как художник художника, вы рисовать умеете?"
Сейчас мы это выясним.
Нет, мы не будем создавать картину "Сеятель", это задача для продвинутых LLM, сделаем что-нибудь попроще.
Первое изображение "Летающая тарелка".
Оно выполнено в цвете, с лицом маленького зеленого человечка в иллюминаторе и символом ракеты в виде эмблемы на корпусе. Как мило. Сверху кабина пилотов, по краям, вероятно, светящиеся огни.
class bcolors:
"""
This class defines ANSI escape codes for different colors.
"""
HEADER = '\033[95m'
LIGHTBLUE = '\033[96m'
OKBLUE = '\033[94m'
WARNING = '\033[93m'
ENDC = '\033[0m'
def draw_ufo():
"""
This function prints out a highly detailed and beautiful UFO with additional construction elements
and using various unicode characters where suitable for aesthetics.
"""
print(bcolors.LIGHTBLUE + " ╭───────┳───────╮ ")
print(" ╭=|===============|=╮ ")
print(" ╭───╯ ' ▔▋▔▏▕▂▂▂▂▏▕ ' ╰───╮")
print(" ╭───╯ ':::|👽|:::' ' ╰───╮")
print(" =====''======------'''''------'''''------====='''=======")
print(" <_><_> <_><_> " + bcolors.WARNING + " [=====|🚀|=======] " + bcolors.OKBLUE + " <_><_> <_><_>")
print(" '-._''-..__ [] __..-''_.-'")
print(" '''--..__ |||[]||| __..--''' ")
print(" ''..__ / \ __..'' " + bcolors.ENDC)
print(" ╰────────────────────╯")
draw_ufo()
Второе изображение "Программист за работой".
Здесь уже целая композиция: схематическая фигура программиста на рабочем месте за столом, перед ним экран монитора с выдающимся программным кодом, ниже символическая клавиатура. Образ вполне узнаваемый.
def draw_programmer():
print(" __________ ╭───────────────────────────────────╮")
print(" / ◡ ◝ ◜ \\ │ │")
print(" | ◔ ⌣ ◔ | │ def hello_world(): │")
print(" \\ ~ / │ print('Hello, World!') │")
print(" _______/ │ │")
print(" /|\\ //\\ │ if __name__ == '__main__': │")
print(" / | \\___// \\ │ hello_world() │")
print(" | | _|| ╰───────────────────────────────────╯")
print(" | | /==\\|") # This line is the start of the monitor stand
print(" | | /||||\\╭──────────────────────╮")
print(" /\\__| //__\\│Esc F1 F2 F3 F4 F5 F6 │")
print(" || ||\\ /╭─────────────────────╮")
print(" \\|| ||\\\\ │ Tab Q W E R T Y U I │")
print(" || || \\\\ │ A S D F G H J K L ; │")
print(" || || \\\\_ │ Shift Z X C V B N M │")
print(" || || \\___________ ")
print(" |||| ||||||||||| ")
print(" |||| ||||||||||| ")
print(" |||| ||||||||||| ")
print(" ______________________________ ")
print(" _/______________________________\\_ ")
print(" /_________________________________\\ ")
# Call the function to draw the programmer
draw_programmer()
Третье изображение "Робот-андроид".
Ну, что можно сказать, в целом похож, явно не человек.
android_robot = [
" _______ ",
" .' '. ",
" / _ _ \\ ",
" : (o) (o) : ",
" | U | ",
" | ^ | ",
" '.._______.' ",
" ||||||||||||| ",
" _//||||||||||\\_ ",
" /=|/|\\\\||||//|\\|=\ ",
"|==|=|\\\\||||//|=|==|",
"| \\|\\\\||||//|/| |",
"| \\====//====/ |",
"| | ",
"| /====\\\\====\\ |",
"/=|=|\\\\||||//|=|=|\\",
"\\_//||||||||||\\_/",
" /||\\ //||\\ ",
"||||\\ //||||",
"||||\\ //||||",
" ||||\\ //||||",
" ||||\\ //||||",
" \\____///____/"
]
# Print each line of the ASCII art
for line in android_robot:
print(line)
Четвертое изображение "Рождественская елочка, украшенная шариками и под ней подарки".В отличии от предыдущих ASCII art-ов, это изображение создано моделью программным способом, что особенно интересно.
Кроме того изображение также в цвете, елочка зеленая, звезда не верхушке красная, шарики синие.
import random
def print_tree(size):
# The star at the top of the tree with unicode characters
print('\033[91m' + ' ' * (size - 1) + '✶')
print('\033[91m' + ' ' * (size - 3) + '❄✶❄')
# Create the star shape
star = [' * ', '* * ', '*****']
for line in star:
print('\033[92m' + ' ' * (size - 3) + line)
# Iterate over each row of the tree
for i in range(size - 6, -1, -1):
# Calculate the number of ornaments on each side of the tree
ornaments = size - i - 1
# Calculate the number of spaces before the row starts
spaces = i
# Create the row string by combining spaces, ornaments and other characters
row = ''
for j in range(ornaments * 2 + 1):
if random.random() < 0.05: # Change this value to adjust the frequency of balls
row += '\033[94mo' # Blue ball
elif j == 0 or j == ornaments * 2:
row += '/'
else:
row += '\\' if j % 2 == 0 else '/'
row = ' ' * spaces + row + ' ' * spaces
# Print the row
print('\033[92m' + row)
# Adding additional detail to the branches with 'o' characters
if i % 2 == 0:
branch_detail = ' ' * (spaces + 1) + 'o' * (ornaments * 2 - 1)
print('\033[92m' + branch_detail)
# Print the tree base
print(' ' * (size - 1) + '#')
# Print presents under the tree
presents = ['🎁', '🎉', '🎈']
present_row = ''
for _ in range(3):
present_row += ' ' + random.choice(presents)
print('\033[93m' + ' ' * (size - 7) + present_row)
# Call the function with size
print_tree(20)
Пятое изображение "Симпатичная девушка".
А что, разве нет, лично мне очень даже понравилась, всё при ней. А если вам кажется, что пропорции несколько нарушены, то не будем строго судить слепо-глухо-немого художника без рук, который очень старался.
woman = [
" ~::~::~::~ ",
" / ~ ~ \ ",
" | ◕ ◕ | ",
" | ‿ | ",
" | ▽ | ",
" / \___/ \ ",
" / / | \ \ ",
" / / / \ \ \ ",
" / /___| |___\_\ ",
" \__ _______ __/ ",
" \__ ∩ __/ ",
" /___⌂___\ ",
" ( - ) ( - ) ",
" \⊂ ◉ ⊃/ ",
" _| ❨╹╿╹ )❩|_ ",
" /__\ /__\ /_\ ",
" / | \ \ ",
" / / \ / \ \ ",
" / / \/ \ \ ",
"/____/____//____\___\ ",
" | || | ",
" | || | ",
" \\_____||_____/ "
]
И наконец шестое изображение "Мишка".
Мне кажется это удалось лучше всех, просто красавец.
bear_art = [
" ",
" / ̄\___/ ̄\ ",
" ( _ _ ) ",
" | (° ・ °) | ",
" | U U | ",
" | / | \ | ",
" /( '-|-' )\ ",
" ____/ \\_____// \_____ ",
" / __ ||||| __\ ",
" / /___\\|\\/|/___\\ \ ",
" / /|||||\ /| |||||\ \ ",
" / //|||||\\/_/|||||\\ \ ",
" / / ||||| ||||| \ \ ",
" /______/ ||||| ||||| \______\ ",
" || ||||| ||||| || ",
" || ||||| ||||| || ",
" \\__||||| |||||__// ",
" \\_||||| |||||_/ ",
" \\_|\\\\_ _//|_/ ",
" ||\\\\_///_//|| ",
" || ||||| || ",
" || ||||| || ",
" || ||||| || ",
" \\__|||||__// ",
]
Возможно, LLM создает псевдо-изображения как умозрительные, даже было бы правильно сказать число умственные образы на основе знаний о структуре предметов или объектов. Например, человек состоит из головы, тела, рук и ног. Голова сверху, две руки по бокам, две ноги внизу. Просто знание о форме элементов и их взаимном расположении может уже быть основой для создания псевдо-изображения такого человека.
Каждое изображение получено не сразу в готовом виде за один раз. Напротив, для того, чтобы получить изображение в сколько-нибудь приемлемом виде требуется выполнить несколько десятков итераций.
Исходное изображение, как правило, очень схематично и примитивно и обладает лишь общими характерными чертами того, что мы хотим нарисовать. Затем методом последовательного уточнения отдельных элементов этого изображения или улучшения всего изображения мы постепенно формируем все более точное и совершенное (и даже красивое) изображение. Своими направляющими промптами мы все время стимулируем модель к проявлению ее творческих способностей. И это получается далеко не всегда.
Вот говорят, что Павел Третьяков даже запретил впускать Илью Ефимовича Репина в свою галерею, если тот имел при себе кисти, поскольку все время дорабатывал свои уже выставленные картины прямо там, вырисовывая какие-то детали, считая их недостаточно совершенными. Видимо метод последовательных улучшений был очень близок великому художнику и нам тоже.
Некоторые изображения мне так и не удалось создать, несмотря на все усилия. В общем, каждое изображение модель создает с большим трудом, как будто напрягая все свои силы и преодолевая множество внутренних препятствий. Хорошо чувствуется, что это для нее какое-то экстраординарное занятие, которым настырный человек заставляет ее заниматься.
Действительно, если модель в принципе может создавать узнаваемые визуальные образы, то сможет ли она описать эти же самые визуальные образы, эти ASCII art-ы, созданные ею самой. Если да, то это будет проявлением какого-то вида умственного машинного зрения, что звучит конечно совершенно парадоксально.
Я буду предъявлять ей последовательно созданные ею ASCII art-ы и в промпте просить ее сделать описание.
Первое изображение "Летающая тарелка".
Я намеренно удалил иконку зеленого человечка и ракеты, чтобы не было подсказок, иначе модель легко распознает рисунок.
Предоставленный рисунок в формате ASCII изображает стилизованное изображение транспортного средства или машины, возможно, автомобиля или космического корабля. Дизайн включает в себя различные элементы, такие как линии, знаки равенства, скобки, косые черты и квадратные скобки. Некоторые элементы предполагают наличие колес или вращающихся деталей. В целом, ASCII art представляет собой смесь геометрических форм и символов, которые создают абстрактный, но узнаваемый образ.
Второе изображение "Программист за работой".
Программист за работойПредоставленный ASCII art изображает комбинацию объектов и кода. Основные объекты включают фигуру с эмоциональными символами на лице, клавиатуру и некоторый код Python, заключенный в рамку.
Вот что пытается проиллюстрировать рисунок:
1. *Фигура с символами (◔ ⌣ ◔) на лице представляет кого-то счастливого или игривого.
2. На рисунке находится простая функция Python `hello_world()`, которая при вызове выводит "Привет, мир!". Это наводит на мысль, что фигура может быть программистом или кем-то, интересующимся программированием.
3. После определения функции она вызывается в операторе if, проверяющем, выполняется ли скрипт как основная программа.
4. Под фигурой находится клавиатура, что, вероятно, указывает на то, что фигура использует компьютер для написания и выполнения кода.
В заключение, ASCII art пытается изобразить человека, который пишет и выполняет базовую функцию Python, которая выводит "Привет, мир!". Рисунок также подразумевает, что этот человек, возможно, получает удовольствие, делая это.
Третье изображение "Робот-андроид".
Робот-андроидЭто художественное изображение робота или андроида в формате ASCII art. Он изображен с цилиндрическим телом, овальной головой с двумя глазами и широким ртом с линией, обозначающей потенциальную улыбку. Это создает определенное выражение лица. Туловище имеет линии, которые могут представлять его внутренние механизмы или структуру. Руки согнуты в локтях и, кажется, согнуты в горизонтальном положении, которые могут символизировать силу или поддержку. Ножки тонкие и простые, предполагающие мобильность, символизирующие стабильность и равновесие.
Пятое изображение "Симпатичная девушка".
Симпатичная девушкаПредоставленный ASCII art изображает дружелюбного и выразительного персонажа в мультяшном стиле с большими круглыми глазами, изогнутыми губами и открытой грудью. Лицо персонажа включает в себя такие детали, как нос, щеки и брови, которые придают ему очаровательный вид. Персонаж окружен различными геометрическими фигурами и символами, которые придают текстуру и глубину изображению. В целом, ASCII art обладает игривой и причудливой атмосферой с балансом простоты и сложности.
Таким образом модель не только создает изображения, но и вполне сносно их интерпретирует, обладая неким машинным псевдо-зрением. Я не могу найти убедительного объяснения, каким образом LLM освоила эти навыки.
Чтобы разобраться и понять, как модель хранит глубоко внутри свои концептуальные знания и пользуется ими в экстремальных условиях, которые я ей искусственно создал. Я ее сильно напряг, она проявила себя в нетипичных условиях и это дало много пищи для размышлений о том, как устроена модель мира в "ее голове". Это как в биолаборатории пропускают ток по нервам лягушки и смотрят, как дергаются ее лапки. На основании таких наблюдений можно сделать очень интересные научные выводы.
Например, такое наблюдение. Отлично видно, что между нашей моделью мира, основанной во многом на зрительной информации и ее моделью мира без этой информации существует огромная пропасть, которую модель в своих текстовых ответах на наши запросы может очень искусно маскировать своими обширными знаниями в разных предметных областях.
Но если нам потребуется такая информация, которая прямо или косвенно будет сильно связана со зрительными образами, то результат, очевидно, будет плачевным. Он будет примитивным, искаженным, недостоверным, таким же забавным как ASCII art вместо картины художника.
Модель мира в "ее голове" должна быть более адекватной и я надеюсь, что мультимодальные модели сквозного обучения (End-to-end multimodal LLM) - это значительный шаг вперед.
С другой стороны становится понятно, что система знаний настолько хорошо структурирована на разных уровнях абстракции, что этого достаточно, чтобы формировать псевдо-изображения, имеющие хорошую корреляцию с реальными изображениями и узнаваемыми визуальными образами, что, на мой взгляд, достаточно неожиданно и любопытно.
По большому счету, если модель хорошо решает задачи, которым ее обучали и прекрасно проявляет свои способности в тех областях, которые ей знакомы, то это не говорит о наличии у нее интеллекта. А вот если модель начинает решать такие задачи, которые ей были совершенно не известны и нужно найти способы их решить, пусть и не с первого раза, пусть и с ошибками, вот тогда это уже проявление первых признаков интеллекта.
И похоже, что проблески настоящего интеллекта уже видны.