LINUX.ORG.RU

Зацените пример написания программы с помощью нейросетки.

 ,


0

5

Поигрался с локальной нейросеткой, ориентированной специально на написание программ. https://huggingface.co/Qwen/Qwen2.5-Coder-7B-Instruct (в примере использования число выходных токенов увеличил до 1024)

Решил дать ей некую реальную задачу и посмотреть что из этого выйдет. Например, как она напишет конвертер для e-book из формата FB2 в plain text. По умолчанию результат выдаётся на питоне.

Недолго думая, задал ей промпт: «Write a converter from FB2 e-book format to plain text» Результат:

import sys
import re
from lxml import etree

def fb2_to_text(fb2_file):
    # Parse the FB2 file
    tree = etree.parse(fb2_file)
            
    # Find all text elements within <p> tags
    paragraphs = tree.xpath('//p/text()')
        
    # Combine all paragraphs into a single string
    text = ' '.join(paragraphs)
    
    # Remove any unwanted characters or formatting
    cleaned_text = re.sub(r'\n+', '\n', text.strip())
    cleaned_text = re.sub(r'\s+', ' ', cleaned_text)
    
    return cleaned_text

if __name__ == "__main__":
    if len(sys.argv) != 2:
        print("Usage: python fb2_to_txt.py <path_to_fb2_file>")
        sys.exit(1)
    
    fb2_file = sys.argv[1]
    txt_content = fb2_to_text(fb2_file)
    
    # Write the text content to a new file
    txt_file = fb2_file.replace('.fb2', '.txt')
    with open(txt_file, 'w', encoding='utf-8') as f:
        f.write(txt_content)
    
    print(f"Converted {fb2_file} to {txt_file}")

Результат удивительный, вот только после работы скрипта на выходе пустой файл. Хммммм. Не сразу даже вспомнил, что вообще-то в XML бывают пространства имён и xpath их должен учитывать.

Новый промпт: «Write a converter from FB2 e-book format to plain text, using correct xpath for xmlns»

Выдало:

import sys
from lxml import etree

def fb2_to_text(fb2_file):
    # Parse the FB2 file
    tree = etree.parse(fb2_file)
    root = tree.getroot()

    # Define the namespace
    nsmap = {'fb2': 'http://www.gribuser.ru/xml/fictionbook/2.0'}

    # Extract the title of the book
    title = root.xpath('//fb2:book-title//fb2:title', namespaces=nsmap)[0].text.strip()

    # Extract all paragraphs and join them into plain text
    paragraphs = root.xpath('//fb2:p/text()', namespaces=nsmap)
    text_content = '\n'.join(paragraphs).strip()

    return text_content

if __name__ == "__main__":
    if len(sys.argv) != 2:
        print("Usage: python fb2_to_txt.py <path_to_fb2_file>")
        sys.exit(1)

    fb2_file = sys.argv[1]
    text_content = fb2_to_text(fb2_file)
    print(text_content)

С одной стороны лучше, но пропала запись в файл (хотя это спорно нужна ли она) и вообще скрипт при работе сваливается с ошибкой индексации на строчке title = root.xpath('//fb2:book-title//fb2:title', namespaces=nsmap)[0].text.strip()

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

title = root.xpath('//fb2:book-title | //fb2:title', namespaces=nsmap)[0].text.strip()

Правда, отдельный вывод title и вовсе сомнительной нужности. Ну то есть, для не совсем тривиального конвертера он конечно нужен, чтобы красиво вывелся заголовок, были учтены и другие элементы оформления, но для простенького примера наверное оно лишнее. В итоге, в 1-й вариант вручную перенёс только работу с xmlns. В итоге получилось

import sys
import re
from lxml import etree

def fb2_to_text(fb2_file):
    # Parse the FB2 file
    tree = etree.parse(fb2_file)
    
    # Define the namespace
    nsmap = {'fb2': 'http://www.gribuser.ru/xml/fictionbook/2.0'}
        
    # Find all text elements within <p> tags
    paragraphs = tree.xpath('//fb2:p/text()',namespaces = nsmap)
   
    
    # Combine all paragraphs into a single string
    text = ' '.join(paragraphs)
    
    # Remove any unwanted characters or formatting
    cleaned_text = re.sub(r'\n+', '\n', text.strip())
    cleaned_text = re.sub(r'\s+', ' ', cleaned_text)
    
    return cleaned_text

if __name__ == "__main__":
    if len(sys.argv) != 2:
        print("Usage: python fb2_to_txt.py <path_to_fb2_file>")
        sys.exit(1)
    
    fb2_file = sys.argv[1]
    txt_content = fb2_to_text(fb2_file)
    
    # Write the text content to a new file
    txt_file = fb2_file.replace('.fb2', '.txt')
    with open(txt_file, 'w', encoding='utf-8') as f:
        f.write(txt_content)
    
    print(f"Converted {fb2_file} to {txt_file}")

И оно работает! Простейший конвертер таки написан! Не могу сказать, что целиком нейросеткой, но у неё почти получилось. Может быть, если поупражняться с промптами, получится и вовсе сразу готовый результат.

Конечно, опытный программист данный код напишет за 10 минут не приходя в сознание, но ё-моё, эта сетка даже знает про не самый известный формат FB2.

★★★★★

Последнее исправление: anonymous_incognito (всего исправлений: 1)

Знает, потому как про fb2 дофига в гитхабе. И да, все проблемы в нюансах - бесполезный конвертер который работает плохо не нужен, а хорошего который все фичи fb2 полноценно поддерживает в природе нет.

peregrine ★★★★★
()

Не сразу даже вспомнил, что вообще-то в XML бывают пространства имён и xpath их должен учитывать.
Но для множественного выбора тегов нужно добавить вертикальную черту

Вот в этом и дело, что ты знаешь какой результат и какими средствами хочешь получить и можешь анализировать ошибки => ты сам можешь такой код написать но компактнее, быстрее и безопаснее (хотя тут все от опыта зависит)

Kolins ★★★★★
()

Осталось нейросетку научить запускать программу и оценивать результат работы программы, оценивать результат своего творчества.

И учитель, ой, промпт-инженер не нужен.

anonymous
()

Ну давай заценим…

❯ ipython
Python 3.12.7 (main, Oct  1 2024, 11:15:50) [GCC 14.2.1 20240910]
Type 'copyright', 'credits' or 'license' for more information
IPython 8.29.0 -- An enhanced Interactive Python. Type '?' for help.

In [1]: import requests

In [2]: from bs4 import BeautifulSoup

In [3]: r = requests.get('https://raw.githubusercontent.com/localhots/fb2/refs/heads/master/test/fixtures
   ...: /sample.fb2')

In [4]: s = BeautifulSoup(r.text, features='xml')

In [5]: s.find('body').text
Out[5]: '\n\nJohn Doe\n\nFiction Book\n\n\n\nChapter 1\n\nLine one of the first chapter\nLine two of the first chapter\nLine three of the first chapter\n\n\n\nChapter 2\n\nLine one of the second chapter\nLine two of the second chapter\nLine three of the second chapter\nLine four of the second chapter\n\n'

Написано 100% мной без использования нейросетей и дажке гугла (но ссылку на книгу через гугл нашел)

rtxtxtrx ★★
()

А ежели прогу хочешь:

#!/usr/bin/env python
import argparse

import requests

from bs4 import BeautifulSoup

parser = argparse.ArgumentParser()
parser.add_argument('url')
parser.add_argument('-o', '--output', type=argparse.FileType('w'), default='-')
args = parser.parse_args()

if __name__ == '__main__':
    r = requests.get(args.url)
    s = BeautifulSoup(r.text, features='xml')
    args.output.write(s.find('body').text)
rtxtxtrx ★★
()
Ответ на: комментарий от rumgot

Но долго ли так будет…

Нейронки хороши в написании шаблонного, повторяющегося кода. Да вот только такой код вообще не нужно писать, для того фреймворки-библиотеки-высокоуровневые языки нужны.

Так что работы для человеков станет только больше.

ugoday ★★★★★
()

опытный программист данный код напишет за 10 минут

Опытный погромист возьмёт библиотеку с гитхаба и ничего не будет писать. Максимум у чатгпт спросит как классы подключить и методы вызвать, чтобы решить задачу не копаясь в документации.

foror ★★★★★
()

Ну собственно хоть локальной, хоть нет, оно примерно так и работает.

Можно взять и написать за 5–10 минут.

А можно полчаса уговаривать нейросетку написать так, чтоб работало, а потом находить ещё проблемы и править. Зато можно радоваться «сетка за меня написала».

Я в целом, конечно, за развитие нейросетей и всего такого. Но на данном этапе объяснить компьютеру, что ты от него хочешь (на том же Python, как в примере, я имею в виду), требует гораздо меньших трудозатрат, чем объяснить нейросетке, как ты хочешь, чтобы она за тебя объяснила компьютеру, что ты от него хочешь. Пока только так. Либо на поиграться по приколу, либо для тех, кто вообще не умеет в код. Но с последними тоже проблема — им и объяснять нейросетке сложнее, где она неправа, и видить потенциальный проблемы в выплюнутом коде тоже.

Жаль, что с людьми так не работает. Иногда попадаются такие индивиды, что простейшим инструкциям последовать не могут, приходится применять «софт-скиллы», скурпулёзно объясняя с примерами, байками и прибаутками. А иногда хочется вот наоборот, не чтоб как с нейросеткой — говоришь по-русски или по-английски, что хочешь, а он тебе по-питоньи, а чтобы наоборот и с человеком можно было по-питоньи (или другом формальном языке, вызывающем всегда однозначно предсказуемое поведение).

CrX ★★★★★
()
Последнее исправление: CrX (всего исправлений: 2)
Ответ на: комментарий от foror

Ну давай на гитхабе библиотеку чтоб можно было вложенные надстрочные и подстрочные индексы в фб2 нормально рендерить ещё и css который формат тоже поддерживает. Оно даже кулридер всё что в формате есть не поддерживает. ЗЫ даже проще дай конвертер в html мне и его хватит. Главное чтоб адекватно работало.

peregrine ★★★★★
()
Последнее исправление: peregrine (всего исправлений: 2)
Ответ на: комментарий от peregrine

на гитхабе библиотеку

На гитлабе: https://gitlab.com/coolreader-ng/crengine-ng?

чтоб можно было вложенные надстрочные и подстрочные индексы в фб2 нормально рендерить

Где скачать такую книгу?

dataman ★★★★★
()
Ответ на: комментарий от dataman

Где скачать такую книгу?

На торрентах не? Там где архивы флибусты и сетевых библиотек вроде либрусека и либгенезиса валяются. Какого только там добра нет, скажу ещё что процентов 10 всех книг в формате fb2 не являются валидным xml-ем, подмножеством которого должен являться fb2, потому что обезьяна которая писала скрипты для оцифровки/перегона из одного формата в другой делала как та самая нейросетка из стартового поста, её обезьяну точно можно на нейронку менять, хуже не будет. Если ты про то как сделать xml не xml-ем то вариантов уйма - можно теги в тексте не экранировать - самое простое и популярное вот эти символы не заэкранировать <>. А сколько ещё старые кривые версии ooofbtools расширения к либре офису/опенофису говна сделали в эти библиотеки когда оно совсем кривое было аж страшно представить.

peregrine ★★★★★
()
Ответ на: комментарий от anonymous

xpath не нужен. ты можешь но нодам нужным рекурсивно пройтись и текст собрать. не думаю, что там текст только в p тегах

Он не только, да. Если бы я всерьёз писал конвертер, я бы именно по нодам проходил бы.

С другой стороны, смотря что от конвертера надо.

anonymous_incognito ★★★★★
() автор топика
Последнее исправление: anonymous_incognito (всего исправлений: 1)
Ответ на: комментарий от vbr

aider локально не работает. Тут ещё фишка в том, что сеть целиком на своём компе запускается без всяких подписок на внешние сервисы и ключи для API.

anonymous_incognito ★★★★★
() автор топика
Ответ на: комментарий от anonymous

Вообще-то как раз для таких вещей существует XSLT. Причём как раз его написание - дело для нейросетки, потому что синтаксис у него нечеловеческий.

Потом ещё xslt-процессор запускать. Такое для сурового энтерпрайза наверное.

anonymous_incognito ★★★★★
() автор топика
Ответ на: комментарий от peregrine

Знает, потому как про fb2 дофига в гитхабе.

Не очень-то дофига, хотя что-то есть. То есть, не совсем экзотика, но явно не слишком распространённый формат.

И да, все проблемы в нюансах - бесполезный конвертер который работает плохо не нужен,

Смотря для чего. Для поиска по книгам или чтобы скормить нейросети же для обучения даже уже такой в принципе годится. Слегка доработать только, потому что не весь полезный текст внутри параграфов находится.

а хорошего который все фичи fb2 полноценно поддерживает в природе нет.

Похоже действительно нет.

anonymous_incognito ★★★★★
() автор топика
Ответ на: комментарий от Kolins

ты сам можешь такой код написать но компактнее, быстрее и безопаснее (хотя тут все от опыта зависит)

Я на это смотрю, что конечно заменить программиста такая сетка не может. Но вот всерьёз помочь, чтобы имело смысл её использовать уже вполне да. Помощь может быть существенной, если в каком-то вопросе плохо ориентируешься. Например, если допустим, работа с xml и в особенности xml на питоне - это не то, чем занимался до сих пор, такая сетка быстро выдаст некий прототип.

anonymous_incognito ★★★★★
() автор топика
Ответ на: комментарий от CrX

Либо на поиграться по приколу, либо для тех, кто вообще не умеет в код. Но с последними тоже проблема — им и объяснять нейросетке сложнее, где она неправа, и видить потенциальный проблемы в выплюнутом коде тоже.

Может быть промежуточная ситуация. В код ты допустим умеешь, но тематика не совсем твоя и тебе, по-хорошему, понадобится изрядно времени, чтобы въехать в неё. А тут нейросеть уже накидает примеров, с которых можно начать.

anonymous_incognito ★★★★★
() автор топика
Ответ на: комментарий от rumgot

Так и представляю, скармливают нейронке стандартное тз, а она говорит человеческим голосом - «оно матьтвою противоречиво в 100500 местах» и поднимает лапки к верху. Ну или пишет туфту +). Нейронки хороши, когда понятен конечный результат и понятно как как этот результат +- проверить. В моей повседневной работе, я вообще не вижу куда их можно применить даже для поиграться.

vtVitus ★★★★★
()
Ответ на: комментарий от peregrine

Если либу не нашел. Берёшь, что нашёл и дорабатываешь. Либо пилишь своё изучив, что уже сделали. Можешь у чатгпт попросить прототип, но она всё равно не выдаст тебе больше, чем запили другие в опенсорсе.

foror ★★★★★
()
Ответ на: комментарий от vtVitus

Они удобны когда тебе нужно в новую тему быстро вникнуть. Особенно когда понимаешь как это всё работает, но забыл где и что писать. Ещё для учёбы очень здорово заходят. Плюс в ближайшем будущем помогут заменить большинство офисного планктона, в частности в продажах и консультациях. А в остальном бесполезны.

foror ★★★★★
()
Последнее исправление: foror (всего исправлений: 1)
Ответ на: комментарий от anonymous_incognito

Беда с прототипами в том что на них начинают сверху накручивать костыли чтоб работало, а зачастую потом приходит понимание что делать надо было несколько иначе, например, при разборе того же fb2 на фрагменты xml-я в первый раз может не придти в голову идея что на каждый класс который обрабатывает какую-то сущность в fb2 можно и нужно лепить метод который будет сам со своим куском объекта работать чтоб либо дальше его отдавать тому что там может быть, либо на рендер. При том сначала идея может придти что надо в конструкторе это делать, а потом придёт понимание что лучше в отдельном методе, чтоб ленивую загрузку делать, когда условному индексатору не нужно всю книжку конвертировать для рендеринга, а достаточно имя автора выдрать. Или наоборот сделать в методах а потом понять что ты не индексатор делаешь а читалку и 99% случаев надо всё рендерить и вообще с конструктором проще, чем Load к каждому классу дёргать в 100% случаев. Ну а время деньги и в реальном проекте про fb2 я видел что сначала один автор писал в конструктор а потом проект взял другой и он уже делал в Load, но в итоге у них половина кода с конструкторами, а во второй половине кода Load дёргается и уже второй год половина изменений это конструкторы на Load плавно переделываются.

peregrine ★★★★★
()
Ответ на: комментарий от foror

Плюс в ближайшем будущем помогут заменить большинство офисного планктона

Помню когда компы появились то тоже говорили что они бухгалтерию упростят и бухгалтеры пропадут. А по факту теперь кроме бухгалтеров ещё и челики которые 1С настраивают без работы не сидят.

peregrine ★★★★★
()
Ответ на: комментарий от peregrine

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

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

anonymous_incognito ★★★★★
() автор топика
Ответ на: комментарий от peregrine

Бухгалтерия кстати самая первая пошла на автоматизацию. Мне тесть рассказывал, что он, глав. бух колхоза, из своего казахстана летал в киев, где был профильный институт по написанию бухгалтерских программ, и их там заказывал и забирал на дискетках. И было это в глубоких 80тых. Ну и расчетный отдел (тётеньки со счётами) действительно был заменён в полном составе этими программками, а потом экселем.

vtVitus ★★★★★
()
Последнее исправление: vtVitus (всего исправлений: 4)

Не совсем понятно что оценивать. Для сетей размера 7-8B приходится добавлять уточняющие вопросы. Для 15B уточняющих вопросов гораздо меньше. На 30B и выше выдает сразу рабочий результат или требует буквально одного уточнения. Но это касается распространенных задач, форматов и языков. Ваша задача одна из таких.

Obezyan
()
Ответ на: комментарий от anonymous_incognito

Я не пробовал, но согласно документации работает.

https://aider.chat/docs/llms.html

Aider can work also with local models, for example using Ollama.

https://ollama.com/library/qwen2.5-coder

vbr ★★★★
()
Последнее исправление: vbr (всего исправлений: 3)
Ответ на: комментарий от rtxtxtrx

зачем твой айдир нужен

Чтобы полноценно работать с проектом.

можно расширение какое для иде использовать чтобы файлы все эти создавало и открывало для правки

Какое? В GitHub Copilot буквально на днях подобный функционал появился и то в бета-версии. Ну может и есть такие расширения, я про aider слышал в этом контексте только, думаю, он самый продвинутый. Вообще его польза в том, что в нём куча промптов встроена и автор в целом на этом деле повёрнутый - постоянно разные LLM тестирует, подбирает бенчмарки и тд. Т.е. инструмент продуманный насколько это возможно сегодня.

https://github.com/Aider-AI/aider/blob/main/aider/coders/wholefile_prompts.py вот пример (и подобные файлы в той же папке).

А IDE это всё не мешает, открываешь aider в одном окне, IDE в другом (ну или прям в терминале в IDE) и всё.

В целом - да, согласен, это как ближайшее будущее LLM для программирования и такой функционал будут встраивать в IDE, Copilot это уже сделал для vscode. Моё дело предложить, в общем.

vbr ★★★★
()
Последнее исправление: vbr (всего исправлений: 2)
Ответ на: комментарий от peregrine

бухгалтеры пропадут

Так программы кривые. 1С в том числе, потому что для её работы нужно держать отдел разрабов. И она толком мало что автоматизирует.

А бухгалтеры, кто с мозгами, благодаря автоматизации могут вести одновременно множество ИП-во и ООО-ов. Так что, производительность труда выросла. Но есть и куча динозавров, которые ведут бухгалтерию до сих пор в тетрадке или экселе.

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

foror ★★★★★
()
Последнее исправление: foror (всего исправлений: 1)
Ответ на: комментарий от vtVitus

если действительно хочешь кому-то чего-то продать

Ты хотел сказать впарить ненужно. А когда человек приезжает за нужной ему штукой, то девочку-оператора ИИ заменит. Или кассира в любом учреждении. Хотя конечно всё это по итогу должно отмереть и все заказы должны идти через интернет или приложение. Но сейчас ещё много людей предпочитают заказывать у девочки или мальчика оператора.

foror ★★★★★
()
Ответ на: комментарий от peregrine

Я вот банально поражаюсь той же пятёрочке. Казалось бы бабок у людей немеряно. А подходишь к их кассе самообслуживания и оказывается этот товар пробить нельзя, только через кассира. Видимо отдельная БД по этой системе. А UI продумывал дегенерат.

Пытаешься отсканировать QR-код - ебаторий, никто не подумал как это всё будет работать у конечного покупателя. Но на собеседовании ботаны, сделавшие эту дерьмовую систему, тебя ньютоновскими биномами пропарят.

И так, в том числе и с 1С и другими системами.

foror ★★★★★
()
Последнее исправление: foror (всего исправлений: 1)