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

Я решила дать два задания. Начнём с первого: нужно написать игру "Змейка", вот мой промпт:

Напиши полностью с нуля приложение на SwiftUI. В приложении должен быть один экран. Сделай простейший вариант игры змейка. Изначально зеленая змея из 3-х кваратиков, по мере съедания квадратика она увеличивается на 1 квадрат (квадратики которые она съедает - разных цветов)

Если лень читать - в конце ссылка на короткое видео сравнения (в телеграм канале).

Посмотрим, что нам выдал ChatGPT:

Ответ ChatGPT

Вот готовый код для простейшей игры «Змейка» на SwiftUI. Змея стартует с длиной в 3 квадрата и растёт при поедании еды разного цвета. Управление происходит свайпами.

import SwiftUI

struct SnakeGameView: View {
    @State private var snake: [CGPoint] = [CGPoint(x: 100, y: 100), CGPoint(x: 80, y: 100), CGPoint(x: 60, y: 100)]
    @State private var food: CGPoint = CGPoint(x: 200, y: 200)
    @State private var direction: CGPoint = CGPoint(x: 20, y: 0)
    @State private var timer = Timer.publish(every: 0.2, on: .main, in: .common).autoconnect()
    
    let gridSize: CGFloat = 20
    let colors: [Color] = [.red, .blue, .yellow, .purple, .orange]
    
    var body: some View {
        ZStack {
            Color.black.ignoresSafeArea()
            
            ForEach(snake.indices, id: \..self) { index in
                Rectangle()
                    .fill(Color.green)
                    .frame(width: gridSize, height: gridSize)
                    .position(snake[index])
            }
            
            Rectangle()
                .fill(colors.randomElement()!)
                .frame(width: gridSize, height: gridSize)
                .position(food)
        }
        .gesture(DragGesture()
            .onEnded { gesture in
                let xMove = gesture.translation.width
                let yMove = gesture.translation.height
                
                if abs(xMove) > abs(yMove) {
                    direction = xMove > 0 ? CGPoint(x: gridSize, y: 0) : CGPoint(x: -gridSize, y: 0)
                } else {
                    direction = yMove > 0 ? CGPoint(x: 0, y: gridSize) : CGPoint(x: 0, y: -gridSize)
                }
            }
        )
        .onReceive(timer) { _ in
            moveSnake()
        }
    }
    
    private func moveSnake() {
        var newHead = snake.first!
        newHead.x += direction.x
        newHead.y += direction.y
        
        if newHead == food {
            snake.insert(newHead, at: 0)
            food = generateNewFood()
        } else {
            snake.insert(newHead, at: 0)
            snake.removeLast()
        }
    }
    
    private func generateNewFood() -> CGPoint {
        let x = CGFloat(Int.random(in: 0..<Int(UIScreen.main.bounds.width / gridSize))) * gridSize
        let y = CGFloat(Int.random(in: 0..<Int(UIScreen.main.bounds.height / gridSize))) * gridSize
        return CGPoint(x: x, y: y)
    }
}

struct ContentView: View {
    var body: some View {
        SnakeGameView()
    }
}

@main
struct SnakeGameApp: App {
    var body: some Scene {
        WindowGroup {
            ContentView()
        }
    }
}

Этот код создаёт простейшую змейку, которая управляется свайпами. Когда змея съедает еду, она увеличивается в длине, а еда появляется в новом случайном месте и меняет цвет. Игра бесконечна, но можно добавить столкновение с границами или самой собой для усложнения. ?

И вот что мы получили:

ChatGPT змейка
ChatGPT змейка

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

Дальше такой же промпт вставляем в DeepSeek, вот что получаем:

Ответ DeepSeek

Создадим простейшую версию игры "Змейка" на SwiftUI. В этом приложении будет один экран, на котором змейка будет двигаться по экрану и "съедать" квадратики, увеличиваясь в длину.

Шаги для создания приложения:

  1. Создадим структуру для змейки и еды.

  2. Реализуем логику движения змейки.

  3. Добавим обработку касаний для управления змейкой.

  4. Отрисуем змейку и еду на экране.

Полный код приложения:

import SwiftUI

struct ContentView: View {
    @State private var snake: [CGPoint] = [
        CGPoint(x: 100, y: 100),
        CGPoint(x: 90, y: 100),
        CGPoint(x: 80, y: 100)
    ]
    @State private var food: CGPoint = CGPoint(x: 200, y: 200)
    @State private var direction: CGPoint = CGPoint(x: 10, y: 0)
    @State private var foodColor: Color = .red
    @State private var score: Int = 0
    
    let timer = Timer.publish(every: 0.1, on: .main, in: .common).autoconnect()
    
    var body: some View {
        ZStack {
            Color.black.edgesIgnoringSafeArea(.all)
            
            // Рисуем змейку
            ForEach(snake, id: \.self) { segment in
                Rectangle()
                    .fill(Color.green)
                    .frame(width: 10, height: 10)
                    .position(segment)
            }
            
            // Рисуем еду
            Rectangle()
                .fill(foodColor)
                .frame(width: 10, height: 10)
                .position(food)
            
            // Отображаем счет
            Text("Score: \(score)")
                .foregroundColor(.white)
                .font(.largeTitle)
                .padding()
        }
        .onReceive(timer) { _ in
            moveSnake()
        }
        .gesture(
            DragGesture()
                .onEnded { gesture in
                    let delta = gesture.translation
                    if abs(delta.width) > abs(delta.height) {
                        // Горизонтальный свайп
                        if delta.width > 0 {
                            direction = CGPoint(x: 10, y: 0) // Вправо
                        } else {
                            direction = CGPoint(x: -10, y: 0) // Влево
                        }
                    } else {
                        // Вертикальный свайп
                        if delta.height > 0 {
                            direction = CGPoint(x: 0, y: 10) // Вниз
                        } else {
                            direction = CGPoint(x: 0, y: -10) // Вверх
                        }
                    }
                }
        )
    }
    
    func moveSnake() {
        var newSnake = snake
        let head = newSnake[0]
        
        // Новое положение головы
        let newHead = CGPoint(x: head.x + direction.x, y: head.y + direction.y)
        
        // Проверяем, съела ли змейка еду
        if abs(newHead.x - food.x) < 10 && abs(newHead.y - food.y) < 10 {
            score += 1
            generateFood()
        } else {
            newSnake.removeLast()
        }
        
        newSnake.insert(newHead, at: 0)
        snake = newSnake
    }
    
    func generateFood() {
        let maxX = UIScreen.main.bounds.width - 10
        let maxY = UIScreen.main.bounds.height - 10
        
        food = CGPoint(
            x: CGFloat.random(in: 0...maxX),
            y: CGFloat.random(in: 0...maxY)
        )
        
        foodColor = Color(
            red: Double.random(in: 0...1),
            green: Double.random(in: 0...1),
            blue: Double.random(in: 0...1)
        )
    }
}

@main
struct SnakeApp: App {
    var body: some Scene {
        WindowGroup {
            ContentView()
        }
    }
}

Описание кода:

  1. Змейка и еда:

    • Змейка представлена массивом CGPoint, где каждый элемент — это координата одного сегмента змейки.

    • Еда — это случайная точка на экране, которая меняет цвет при каждом появлении.

  2. Движение змейки:

    • Змейка движется с постоянной скоростью, обновляя свое положение каждые 0.1 секунды.

    • Если змейка "съедает" еду, ее длина увеличивается на один сегмент, и генерируется новая еда.

  3. Управление:

    • Если пользователь свайпает вправо, змейка поворачивает вправо.

    • Если пользователь свайпает влево, змейка поворачивает влево.

    • Аналогично для свайпов вверх и вниз.

  4. Отрисовка:

    • Змейка и еда отрисовываются с помощью Rectangle в SwiftUI.

Как запустить:

  1. Создайте новый проект в Xcode с использованием SwiftUI.

  2. Замените содержимое файла ContentView.swift на приведенный выше код.

  3. Запустите приложение на симуляторе или устройстве.

Теперь у вас есть простая версия игры "Змейка" на SwiftUI!

DeepSeek змейка
DeepSeek змейка

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

И кстати, я нигде не указывала, каким должно быть управление и по умолчанию обе модели сделали управление по свайпу (это логично, но с другой стороны, вариантов много: стрелочки, гироскоп и пр.)

Считаю что с первым заданием обе модели справились. Счёт 1:1.

Далее в преддверии 14 февраля в голову ударили сердечки, поэтому попросила сделать обе модели простенькую анимацию. Вот такой был промпт:

Напиши полностью с нуля приложение на SwiftUI. В приложении должен быть один экран. На нём на тёмном фоне должна быть такая анимация:

Сердечки плавно падают сверху экрана, но при клике по экрану они разлетаются в стороны. Выглядит ярко и визуально привлекательно.

Сердечки должны быть разных оттенков розового и разного размера.

Начнём с ChatGPT. Вот результат:

Ответ ChatGPT

Вот полный код приложения на SwiftUI, которое реализует эффект падающих сердечек с разлетом при клике.

Что делает этот код?

• Сердечки падают сверху экрана с разной скоростью и размером.

• Клик по экрану заставляет сердечки разлететься в стороны.

• Разные оттенки розового и размеры сердечек делают анимацию визуально привлекательной.

import SwiftUI

struct Heart: Identifiable {
    let id = UUID()
    var position: CGPoint
    var size: CGFloat
    var color: Color
    var velocity: CGFloat
}

struct ContentView: View {
    @State private var hearts: [Heart] = []
    @State private var explode = false
    let screenWidth = UIScreen.main.bounds.width
    let screenHeight = UIScreen.main.bounds.height

    var body: some View {
        ZStack {
            Color.black.ignoresSafeArea()

            ForEach(hearts) { heart in
                HeartShape()
                    .fill(heart.color)
                    .frame(width: heart.size, height: heart.size)
                    .position(heart.position)
                    .opacity(explode ? 0.5 : 1)
                    .animation(.easeInOut(duration: 1.5), value: explode)
            }
        }
        .onAppear {
            startDroppingHearts()
        }
        .onTapGesture {
            explodeHearts()
        }
    }

    func startDroppingHearts() {
        Timer.scheduledTimer(withTimeInterval: 0.3, repeats: true) { timer in
            let newHeart = Heart(
                position: CGPoint(x: CGFloat.random(in: 0...screenWidth), y: -50),
                size: CGFloat.random(in: 20...50),
                color: Color(red: Double.random(in: 0.8...1), green: Double.random(in: 0...0.3), blue: Double.random(in: 0.5...0.7)),
                velocity: CGFloat.random(in: 2...5)
            )

            hearts.append(newHeart)

            withAnimation(.linear(duration: 3)) {
                for index in hearts.indices {
                    hearts[index].position.y += screenHeight + 50
                }
            }

            hearts.removeAll { $0.position.y > screenHeight + 50 }
        }
    }

    func explodeHearts() {
        explode = true
        withAnimation(.easeOut(duration: 0.5)) {
            for index in hearts.indices {
                hearts[index].position.x += CGFloat.random(in: -100...100)
                hearts[index].position.y += CGFloat.random(in: -100...100)
            }
        }

        DispatchQueue.main.asyncAfter(deadline: .now() + 0.7) {
            explode = false
        }
    }
}

struct HeartShape: Shape {
    func path(in rect: CGRect) -> Path {
        var path = Path()

        let width = rect.width
        let height = rect.height

        path.move(to: CGPoint(x: width / 2, y: height))
        path.addCurve(to: CGPoint(x: 0, y: height / 3),
                      control1: CGPoint(x: width * 0.3, y: height * 1.1),
                      control2: CGPoint(x: 0, y: height * 0.6))

        path.addArc(center: CGPoint(x: width * 0.25, y: height / 3),
                    radius: width * 0.25,
                    startAngle: .degrees(180),
                    endAngle: .degrees(0),
                    clockwise: false)

        path.addArc(center: CGPoint(x: width * 0.75, y: height / 3),
                    radius: width * 0.25,
                    startAngle: .degrees(180),
                    endAngle: .degrees(0),
                    clockwise: false)

        path.addCurve(to: CGPoint(x: width / 2, y: height),
                      control1: CGPoint(x: width, y: height * 0.6),
                      control2: CGPoint(x: width * 0.7, y: height * 1.1))

        return path
    }
}

@main
struct HeartsApp: App {
    var body: some Scene {
        WindowGroup {
            ContentView()
        }
    }
}

Как это работает?

• Падающие сердечки создаются каждые 0.3 секунды и плавно движутся вниз.

• Сердечки разного размера и оттенка розового.

• При клике по экрану сердечки разлетаются в случайном направлении.

• Анимации делают разлет плавным и красивым.

Попробуй запустить этот код в Xcode, и ты увидишь магию ?✨!

ChatCPT попытка 1
ChatCPT попытка 1

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

Со второго раза:

ChatCPT попытка 2
ChatCPT попытка 2

Нуууу, почти. Сердечки падают, они разного цвета и размера. При нажатии происходит "улёт" вниз и дальше опять глюк, что они только в первой четверти экрана появляются.

В целом ок, с учётом того, что код я не смотрела вообще.

Теперь посмотрим ответ от DeepSeek

Ответ DeepSeek

Создадим приложение на SwiftUI с анимацией падающих сердечек, которые разлетаются при нажатии на экран. Вот полный код:

import SwiftUI

struct Heart: Identifiable {
    let id = UUID()
    var position: CGPoint
    var color: Color
    var size: CGFloat
    var isFlying: Bool = false
}

struct ContentView: View {
    @State private var hearts: [Heart] = []
    @State private var timer: Timer?
    
    var body: some View {
        ZStack {
            Color.black
                .edgesIgnoringSafeArea(.all)
            
            ForEach(hearts) { heart in
                Image(systemName: "heart.fill")
                    .font(.system(size: heart.size))
                    .foregroundColor(heart.color)
                    .position(heart.position)
                    .animation(.linear(duration: heart.isFlying ? 0.5 : 10), value: heart.position)
            }
        }
        .onAppear {
            startHeartsAnimation()
        }
        .onDisappear {
            timer?.invalidate()
        }
        .onTapGesture {
            explodeHearts()
        }
    }
    
    private func startHeartsAnimation() {
        timer = Timer.scheduledTimer(withTimeInterval: 0.5, repeats: true) { _ in
            let size = CGFloat.random(in: 20...50)
            let heart = Heart(
                position: CGPoint(x: CGFloat.random(in: 0...UIScreen.main.bounds.width), y: -size),
                color: Color(red: Double.random(in: 0.7...1), green: Double.random(in: 0.2...0.5), blue: Double.random(in: 0.4...0.7)),
                size: size
            )
            hearts.append(heart)
            
            DispatchQueue.main.asyncAfter(deadline: .now() + 10) {
                if let index = hearts.firstIndex(where: { $0.id == heart.id }) {
                    hearts.remove(at: index)
                }
            }
            
            withAnimation(.linear(duration: 10)) {
                if let index = hearts.firstIndex(where: { $0.id == heart.id }) {
                    hearts[index].position.y = UIScreen.main.bounds.height + size
                }
            }
        }
    }
    
    private func explodeHearts() {
        for index in hearts.indices {
            let angle = Double.random(in: 0..<2 * .pi)
            let distance = CGFloat.random(in: 100...300)
            let newX = hearts[index].position.x + cos(angle) * distance
            let newY = hearts[index].position.y + sin(angle) * distance
            
            withAnimation(.easeOut(duration: 0.5)) {
                hearts[index].position = CGPoint(x: newX, y: newY)
                hearts[index].isFlying = true
            }
            
            DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) {
                if let index = hearts.firstIndex(where: { $0.id == hearts[index].id }) {
                    hearts.remove(at: index)
                }
            }
        }
    }
}

@main
struct HeartAnimationApp: App {
    var body: some Scene {
        WindowGroup {
            ContentView()
        }
    }
}

DeepSeek сердечки
DeepSeek сердечки

DeepSeek с первого раза выдал довольно пристойную реализацию. Максимально соответствует запросу.

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

Я считаю, что во второй задаче победил DeepSeek. К моему удивлению, я была скептически настроена, но посмотрев и сравнив их на практике - кажется, что DeepSeek вообще ничем не уступает ChatGPT, по крайней мере в написании кода. И ещё надо учитывать то, что DeepSeek работает бесплатно и без ВПН и для регистрации мне не потребовалось ничего, кроме почты.

Кто ещё тестировал на других языках, пишите как вам?

Ссылка на телеграм канал с видео.

Комментарии (46)


  1. Viktor9354
    30.01.2025 17:11

    Интересный результат. Пробовал такие тесты устраивать по вопросам Frontend разработки и хочу сказать, что в большинстве кейсов ChatGPT побеждает. В редких случаях, по отдельным темам наоборот, DeepSeek выдаёт более удовлетворительный ответ. Но и у вас и у меня всё-таки несистемный подход и по-хорошему необходимо тестировать на большем количестве запросов разных форматов. Чисто по ощущениям после недели пользования, DeepSeek по IQ больше походит на Gemini, нежели на ChatGPT.


  1. Alex-Freeman
    30.01.2025 17:11

    Какой ChatGPT использовали? GPT-4o, о1 или o1 pro? А то, если сравнивать с GPT-4o то можно и не сравнивать, уровень совершенно разный


    1. 413x
      30.01.2025 17:11

      В чью пользу?


    1. kosyakus Автор
      30.01.2025 17:11

      Действительно, даже не подумала, что по-хорошему надо было написать это в статье. Чат GPT-4o и Deepseek-V3.


      1. griha_shershen
        30.01.2025 17:11

        жду сравнения o1 и r1, если к первому нет доступа, могу от своего имени закинуть


        1. Ahulinet
          30.01.2025 17:11

          Я сравнивал о1 и r1. Но не совсем в правильных условиях. Начал писать с о1 скрипт для экселя на vба который будет отрезать от модельки в SolidWorks по миллиметру и замерять оставшийся объём на каком-то этапе gpt не справился с запросами к API SolidWorks и Я обратился за исправление ошибок к модели r1 так вот она начала нести вообще лютейшую дичь в то время как gpt хотя бы что-то старался исправить в итоге после небольшого допиливания ручками кот от gpt прекрасно работает.


          1. Ahulinet
            30.01.2025 17:11

            Сейчас начал писать квиз по своей профессии на Java в ChatGPT. Код получается, но со скрипом: всё валится в один класс, данные не вынесены, всё загромождено в main. Приходится самому раскладывать структуру.

            Переключился на DeepSeek — и сразу заметил разницу. Он сам предложил улучшения, грамотно разбил код на классы, вынес данные в JSON. Работа пошла заметно легче. Но в какой-то момент DeepSeek начал люто зависать, и пришлось снова вернуться к ChatGPT, несмотря на его склонность к менее структурированному коду.

            В итоге DeepSeek по организации кода понравился больше, но из-за зависаний продолжить работу с ним не получилось.

            Вот это сообщение например написано путём распознавания речи и оформления в приличный текст на чат gpt 4о))


            1. kabashin
              30.01.2025 17:11

              насколько я понял DeepSeek сейчас находится под постоянными хакерскими атаками


              1. LanskoyGames
                30.01.2025 17:11

                От OpenAI)))


              1. RocketRatchet
                30.01.2025 17:11

                Или под наплывом пользователей, которые увидели громкие заголовки, бесплатность и отсутствие потребности в впн


  1. kujoro
    30.01.2025 17:11

    у меня наоборот получилось, пользоваться им невозможно, пишет вообще какую-то ерунду, ну только если супер простенькое что-то спрашивать

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

    мой вопрос

    Мне нужна таблица с навигацией по ячейкам написанная на go, bubble tea и таблицей из пакета "github.com/evertras/bubble-table/table"


    1. Killan50
      30.01.2025 17:11

      Доступ к внешним ресурсам это сложная тема, и её выполняет не модель а фронтэнд, сама модель не имеет к этому никакого отношения. Если фронт не нашёл ничего по вашей ссылке и не передал в контекст, то эта часть строки будет только путать модель, прося делать непонятно что.
      Для чистоты эксперимента скачайте все нужные файлы по ссылке вручную и положите в контекст модели.


    1. LanskoyGames
      30.01.2025 17:11

      А Вы нажимали использовать нейросеть?


    1. rPman
      30.01.2025 17:11

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

      А вы хотите что то от ИИ, которому три года от роду и который хуже человека по всем параметрам кроме стоимости?


  1. SinsI
    30.01.2025 17:11

     с первым заданием обе модели справились. 

    ChatGPT провалил часть задания

    квадратики которые она съедает - разных цветов

    сделав вместо этого квадратики постоянно меняющегося цвета.

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


    1. vanxant
      30.01.2025 17:11

      не стоит в промте упоминать устоявшееся название этой игры

      А кстати очень интересный кейс. Что будет, если заменить слово "змейка" ну допустим на "многоножку" и скормить тому же боту в другой сессии.


  1. Sergeygs
    30.01.2025 17:11

    Более полугода очень активно использую оба инструмента ежедневно в своей работе (DS с июня прошлого года). Стек в основном python, java, plsql, html, js, css.

    По моим наблюдениям на текущий момент ни один из двух не заменяет программиста. На сколько-нибудь комплексной задаче ничего хорошего не будет. Более-менее сносные результаты получаешь на типовых запросах (миллионы реализаций той же змейки уже изучены ИИ - конечно он выдаст достойный вариант). На НЕ типовых задачах повышенной сложности в моем личном рейтинге DeepSeek значительно превосходит ChatGPT (ну или лучше меня понимает :))

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

    Ну и, конечно же, чем популярнее кодовая база (больше было материалов для изучения), тем лучше ответы. По python и java - отлично. Простые sql напишет и тот и другой. Сложные запросы (на 100+строк с агрегациями, партицированиями и прочей ерундой) лучше даже не просить без четкого понимания что должно быть на выходе: очень часто выдается код, который вроде даже работает, но на самом деле работает некорректно. Требуется тщательная проверка и исправление.

    Итого по моим наблюдениям. v3 однозначно выигрывает в моем личном рейтинге у 4о. о1 и r1 забавны (видно рассуждения и иногда видя что он там пропустил или какие сделал допущения можно скорректировать запрос дальше), но избыточны. Работают существенно дольше и помнят меньше контекста диалога. Китайская модель со временем выдает результаты лучше, а ChatGPT сильно деградирует: порой переключение на 3.5 позволяет получить значительно более корректный результат.

    Прошу прощения за многобукв.

    P.S. все вышенаписанное про веб и десктопную разработку. К мобильным приложениям касательств не имел никогда.


    1. Filex
      30.01.2025 17:11

      А как вы используете DS, через web-интерфейс?


      1. Sergeygs
        30.01.2025 17:11

        Да, через веб.

        Я однозначно против подключения ассистентов в IDE хотя бы потому, что в коде в разработке могут быть чувствительные приватные данные. Я не хочу, что весь мой код улетал непонятно куда на анализ. Лучше я буду спрашивать интересующее меня давая только нужную информацию и пользоваться ответами.


        1. develmax
          30.01.2025 17:11

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


  1. gfiopl8
    30.01.2025 17:11

    У них у всех пока серьезные проблемы с алгоритмами, с кодом который неочевидно как делать. Например надо нарезать аудиофайл на части до 60 секунд размером, по заранее полученным точкам в которых можно делать разрез(пауза в речи). То есть на входе список возможных точек и желаемый размер сегмента, на выходе новый список точек.

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

    Ллм бегают по кругу, приходится их тащить за рога в нужном направлении.


    1. Manson
      30.01.2025 17:11

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


      1. gfiopl8
        30.01.2025 17:11

        Точки уже есть, надо просто выбрать оптимальные.


  1. gmtd
    30.01.2025 17:11

    Вчера как раз написал тут релевантный пост - Полезные советы при разработке с AI IDE агентами

    Задавать подобные промпты чатботам для поиска IDE AI помощника - бессмысленно. Они ничего полезного не меряют. Это как сравнивать двух бойцов на число отжиманий, хотя потом вы их будете использовать на полноценном поле боя.

    Важен контекст кодовой базы, более грамотные промпты, определенный тип задач, тактика промптов, при выполнении определенных задач - и тогда AI может сделать жизнь сказкой. Какая именно AI - надо пробовать. Но не так, как в этой статье.


    1. Indemsys
      30.01.2025 17:11

      Довольно наивно выглядит вот этот совет писать понятные промпты или там уметь писать промпты. И вообще делать из промптов какую то науку. Типа только умные умеют писать промпты.
      Нет, эти ИИ могут понять что спрашивают даже если делать ошибки в каждом слове.
      Так при чем тут промпты?
      Уточнение задачи в начальном промпте только снизит количество итераций вопросов. Но не факт. Я предпочитаю цепочку уточнений, чем сразу все писать в одном запросе.
      В любом случае сессия вопросов-ответов с ИИ длится значительно короче последующей отладки. Поэтому запариваться над промптами нет никакой необходимости.

      Ясно что ChatGPT и DeepSeek - в понимании текста одно и тоже. Но ChatGPT умеет читать с картинок. Это огромное преимущество. Он может переписать код выданный ему в виде скриншота. Или, например, сгенерить массив на C выданный ему в виде картинки таблицы.
      И в этом ChatGPT гораздо сильнее DeepSeek .


      1. rPman
        30.01.2025 17:11

        Нет, речь о полноте информации в промпте, а не ошибках.

        Когда ты обращаешься к человеку-специалисту, большую часть необходимых знаний он додумывает за тебя,.. почти то же самое делает ИИ но он больше выдумывает чем догадывается (по уму это должны вытягивать рассуждающие модели, но там других проблем хватает).

        Не забываем что речь идет о трансформере, это основа технологии gpt (general pretrained transformer), который не просто так назван, он лучше всего умеет преобразовывать из одного вида информацию в другой... из одного языка в другой, из текста ТЗ в программу... чем полнее и точнее ты опишешь задание, тем лучше.

        А так как в обучающих данных полно другого бреда, который почти наверняка будет мешать в данном конкретном случае, используют лайфхаки, вида - придание эмоциональности запросу (повышает качество), просьбы по рассуждать или перепроверить себя (неуверенность в своих же ответах повышает качество) и главный лайфхак, про который все забывают - давайте сети примеры, multishot один из первых методов (и наверное самый лучший) для улучшения качества... но нет, все хотят коротки oneshot и ждут от неполноценных галлюцинирующих моделей шедевры.

        все это должно быть в промпте.

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

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


        1. Indemsys
          30.01.2025 17:11

          Да, да. Взорвите свой мозг чтобы создать промт и только потом спрашивайте у ИИ.
          Нет, люди так не делают, кто хоть мало мальски имел дело с ИИ. Сам ИИ научит вас экономичности вопросов.
          ChatGPT в одной сессии помнит весь контекст. Подозреваю что он вообще помнит весь контекст с одного аккаунта. Поэтому начинает очень быстро понимать с полуслова.

          Знание на чем сделан ИИ ничем не помогут и нечего их притягивать. Все равно это комерческая тайна, а что там сплетничают о их архитектуре не надо принимать слишком серьезно. У этих парней с дезинформацией конкурентов все отлично налажено. И как пишется в этой статье https://situational-awareness.ai/ ИИ - это прежде всего оружие, а они пока хватают низковисящие плоды буквально каждый день. Т.е. трансформеры это не самое важное в их архитектуре.

          Их бенчмарки это тоже способ всех запутать. Мне как юзеру не интересна их средняя температура по больнице. А вот как они генерят код змейки важно.


    1. kosyakus Автор
      30.01.2025 17:11

      Почитала комментарии, полностью согласна, теперь хочется сделать сравнение на более узких фичах, на каких-то конкретных рабочих задачах.
      По поводу промптов - у меня по-разному выходит. Иногда мне нужно расписать на 40 предложений целое ТЗ, чтобы получить максимально релевантный результат. А иногда как верно заметил @indemsysбывают и абстрактные задачи чтобы просто задать вектор направления решения и далее уже конкретизировать запросы.
      В статье получились как раз скорее абстрактные задачи, и мне было интересно посмотреть логику работы. А ещё проверить теорию заговора, что якобы DeepSeek - это просто "переадресация с ChatGPT" и миллион китайцев просто копипастят запрос оттуда в свою сеть)


      1. butsan
        30.01.2025 17:11

        Добавьте ещё qwen-coder, имхо она лучше deepseek’а кодит


  1. almaz1c
    30.01.2025 17:11

    Несколько нубских вопросов,- прошу не ругаться:

    1. Подскажите плиз, - это локальная версия DeepSeek выдает такое волшебство или облачная?

    2. На каких языках умеет писать программы DeepSeek?

    3. Он понимает русский язык? Вроде заявлялась поддержка только английского и китайского?


    1. Antas
      30.01.2025 17:11

      1. Замечательно понимает русский и на нём же отвечает.

        Заметил, что русского интерфейса в браузере нет, а вот в приложении русский интерфейс есть.


    1. kosyakus Автор
      30.01.2025 17:11

      Хорошие вопросы
      1) Это облачная версию DeepSeek-V3
      2) Насколько я понимаю, так как в распоряжении ии весь интернет - то практически на любом.
      Но я уточнила у него же, вот ответ от самого DeepSeek:
      "Я могу работать с любым языком программирования, который широко используется и документирован в интернете. Моя база знаний включает синтаксис, стандартные библиотеки, фреймворки и лучшие практики для большинства популярных языков. Однако есть некоторые нюансы
      Ограничения:

      1. Экзотические или устаревшие языки: Если язык очень редкий или устаревший (например, COBOL или Fortran), моя помощь может быть ограничена из-за недостатка актуальной информации в моей базе данных.

      2. Сверхновые технологии: Если язык или фреймворк появился совсем недавно (после октября 2023 года), я могу не знать о нём или знать недостаточно.

      3. Контекст и специфика: Я могу писать код, но для его корректной работы в вашем проекте мне нужно понимать контекст (например, версии языка, используемые библиотеки, окружение).

      "
      3) Да, понимает, я все запросы делала на русском, ответы он тоже давал на русском.


    1. kabashin
      30.01.2025 17:11

      По первому вопросу, на этой неделе была статья на хабре - стоимость локальной машины для работы с DeepSeek - от 6.000 дол.


      1. gfiopl8
        30.01.2025 17:11

        Там в итоге получается скорость работы - пара токенов в секунду.

        У меня 2 * Xeon Gold 5218.

        Каждый из этих процессоров поддерживает 6 каналов памяти. Я поставил 12 * 64GB DDR4-2666. Получилось 768GB RAM.

        Запустил DeepSeek V3 q4_K_M. Это 404GB модель + контекст.

        Получил около 2 токенов в секунду:

        - response_token/s: 1.9

        - prompt_token/s: 3.8 - 5

        Работает. Но с такой скоростью оно не надо.

        У меня есть Nvidia RTX 3090. Я её добавил, на неё сгрузилось 2 слоя. Быстрее не стало. Всего в модели - 62 слоя.


        1. almaz1c
          30.01.2025 17:11

          2 x NVIDIA A100 рекомендуется для шустрой работы, как я понял?


          1. rPman
            30.01.2025 17:11

            По чуть чуть не получится добавлять, прирост скорости от добавления очередной gpu будет на грани погрешности измерений

            Смело умножайте количество a100 на 10.. суммарный объем vram должен вмещать и веса и kv-cache для контекстного окна (это еще десяток другой gb на каждый batching процессе). Каждая A100 это 'всего' 40gb, для 4бит квантизации с горем пополам хватит 12штук (скорее 16 нужно)

            batching - это одновременный запуск нескольких запросов, увеличивает скорость исполнения на порядок или даже больше (на маленьких моделях можно 16-кратный прирост получить на десктопных видеокартах), т.е. время на каждый запрос не уменьшится, но суммарное количество обработанных и сгенерированных токенов увеличивается.

            upd. https://apxml.com/posts/gpu-requirements-deepseek-r1


  1. rocket
    30.01.2025 17:11

    Подскажите, какие промпты нужно писать, чтобы создавать android-приложения?


    1. rPman
      30.01.2025 17:11

      <на правах шутки>

      открываете какой-нибудь freelance.habr.com, на таких сайтах есть сразу много продвинутых нейронок, и пишете как заказчик ТЗ так, как его понимаете, выбираете исполнителя, в беседе, вам зададут необходимые вопросы... и оплата удобная

      p.s. рановато для даже топовых ИИ давать сразу все задание... делите задачу на этапы, проектируйте, просите помощи, изучайте и анализируйте ответы. Это пока то знание, которое не передать курсами и учебниками, они устареют быстрее чем выйдут в печать.


      1. Alexey2005
        30.01.2025 17:11

        Мало того, это при сравнимом качестве кода может оказаться даже дешевле тех $200, которые вы потратите на ChatGPT Pro*

        *если приложение нужно всего одно и не потребуется его поддерживать.


    1. Wesha
      30.01.2025 17:11

      какие промпты нужно писать, чтобы создавать android-приложения?

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


      1. Alexey2005
        30.01.2025 17:11

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


        1. Wesha
          30.01.2025 17:11

          что все заказчики, способные составить нормальное ТЗ, уйдут к нейронкам

          Дык

          техзадания вида "ну вот мне нужно сделать какую-то такую штуку... я вообще не знаю какую, но очень надо

          Вы знакомы с моей женой?


  1. mikeinside
    30.01.2025 17:11

    Занятное сравнение конечно, но из таких сравнений нельзя делать выводы. Есть 2 задания. У вас выборка всего 2.
    Может в сотне других задач окажется лучше одна или другая модель. Поэтому, первое на что стоит обращать внимание - это результаты бенчмарков. Тем более, в них есть раздел касательно программирования.


  1. djacode
    30.01.2025 17:11

    Только женский пол может привнести сердечки в тему AI и кодинга)

    Тронут.


  1. k1merpwnz
    30.01.2025 17:11

    Просил оформить пару приколов для интерфейса на ts с интеграцией в lua, дс справился лучше, хотя и немного бесят его рассуждения, порой по паре минут пишет, больше, чем сам код