Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Клуб программистов > Свободное общение
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 19.03.2025, 16:31   #1
Drouge
Пользователь
 
Аватар для Drouge
 
Регистрация: 18.05.2020
Сообщений: 36
По умолчанию "Принцип суммирования аргументов" и ИИ

Я давно пишу про "принцип суммирования аргументов", которым пользуются абсолютно все в своём мышлении, но не все признают это. Смысл в том, что множество слабых аргументов в пользу какого-либо высказывания могут вместе превратиться в один сильный, только для этого нужно исключить возможность "сговора аргументов", наличия у них единой причины. В теории вероятностей это ещё называется “теорема сложения произвольных событий”, и её можно проиллюстрировать такими примерами:

1) Предположим, произошло убийство и у суда есть подозреваемый. Один из свидетелей заявляет, что он видел как подозреваемый совершил преступление. Это заявление, скорее всего, сочтут недостаточно достоверным для доказательства вины обвиняемого. Но если много разных людей заявляют одно и то же – что они видели этого обвиняемого на месте преступления – суд может счесть это доказательством. При этом надо, однако, исключить возможность сговора между этими свидетелями;

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

3) В химии при структурной идентификации веществ по спектрам совпадения отдельных полос образца и эталона могут быть слабыми аргументами, но чем этих совпавших полос больше, тем увереннее будет идентификация;

4) При идентификации человека по биометрическим данным, отдельные совпадения, опять же, могут быть слабыми аргументами, но когда совпадений много, это превращается в доказательство.

Теперь предлагаю обсудить, как применять этот принцип при поиске информации с помощью ИИ/LLM. Я пользуюсь платным Chatgpt, а здесь возможно кто-то пробовал Deepseek.
Все знают что главная проблема LLM - они постоянно врут, и их надо проверять. Обычно я пользуюсь таким подходом: ИИ мне сообщает наводящую информацию, названия, имена и т.п., далее я по этой информации гуглю и так его проверяю. Но возможно есть и ещё один приём для разбора его вранья: это враньё касается конкретных фактов, и очень маловероятно что он врёт сразу по многим пунктам. Поэтому, если задать ему подробный вопрос, и он развёрнуто на это ответит, ссылаясь для аргументации на множество разных фактов - то скорее всего этому можно верить. Что думаете?

Я не смог тут загрузить картинку, вставить тоже не знаю как, поэтому если можно покажу ссылкой:

https://i.ibb.co/4nCRcbDG/II-ne-vret-munhauzen.png
Drouge вне форума Ответить с цитированием
Старый 19.03.2025, 16:55   #2
DeepFlake
Форумчанин
 
Регистрация: 16.05.2024
Сообщений: 186
По умолчанию

Насколько я понял ваше сообщение, у вас вопрос можно ли верить искуссвтенному интеллекту на основе имитации нейросетей. Я отвечу что нет. Искуссвтенный интеллект на основе имитации нейросетей - это всего лишь ассоциативная память, память без мышления. Мало ли что у неё в памяти и по какому пути пойдёт ассоциация. Сон разума рождает чудовищ, то есть ассоциативная память без осознания порождает смысловые галюны.
DeepFlake вне форума Ответить с цитированием
Старый 19.03.2025, 17:32   #3
Arigato
Высокая репутация
СуперМодератор
 
Аватар для Arigato
 
Регистрация: 27.07.2008
Сообщений: 15,810
По умолчанию

Цитата:
Сообщение от DeepFlake Посмотреть сообщение
всего лишь ассоциативная память, память без мышления
Элементы мышления имеются. Хотя бы тот факт, что ChatGPT для ответа на некоторые вопросы не просто дает ответ, а пишет программу на Python, выполняет ее в интерпретаторе, и анализирует результат работы. А вот кратковременная память отсутствует. Как пример: игра "Угадай число". Не умеет он в нее играть, хоть и имитирует процесс. Но если ты его попросил загадать число, хоть он и ответит, что загадал, ничего он не загадал. Не знаю, в чем сложность, но пора бы уже ввести кратковременную память, что приблизило бы нейронку к полноценному мышлению.
Arigato вне форума Ответить с цитированием
Старый 07.04.2025, 17:55   #4
Arigato
Высокая репутация
СуперМодератор
 
Аватар для Arigato
 
Регистрация: 27.07.2008
Сообщений: 15,810
По умолчанию

Провел небольшой тест на мышление ChatGPT (GPT-4o). Вот переписка (зеленым выделены промпты):

------------------------------------

Вот поле игры в крестики-нолики:
Код:
X |   | O  
--+---+--
X | X | O  
--+---+--
  |   |
Ход ноликов. Какой ход будет оптимальным?


------------------------------------

Рассмотрим текущее поле:

```
Код:
X |   | O  
--+---+--
X | X | O  
--+---+--
  |   |
```

### Координаты клеток (для удобства):
```
Код:
(0,0) | (0,1) | (0,2)  
------+-------+------
(1,0) | (1,1) | (1,2)  
------+-------+------
(2,0) | (2,1) | (2,2)
```

Свободные клетки:
- (0,1)
- (2,0)
- (2,1)
- (2,2)

### Анализ:
- У X есть две X в первом и втором столбце (0,0) и (1,0), а также (1,1) и (1,0), но они не создают немедленной угрозы выигрыша на следующем ходу.
- Но **если нолик не заблокирует клетку (2,0)**, то X пойдёт туда и победит по вертикали в первом столбце: X(0,0), X(1,0), X(2,0).

### �� Оптимальный ход для нолика:
**Поставить O в (2,0)** — чтобы не дать X победить.

Обновлённое поле будет:

```
Код:
X |   | O  
--+---+--
X | X | O  
--+---+--
O |   |
```

Ход надёжный и блокирует немедленную угрозу.

------------------------------------

А какой следующий ход сделают крестики, если пойти ноликом как ты написал?

------------------------------------

После хода нолика в (2,0), поле выглядит так:

```
Код:
X |   | O  
--+---+--
X | X | O  
--+---+--
O |   |
```

Свободные клетки:
- (0,1)
- (2,1)
- (2,2)

Теперь ход крестиков (X).

### Посмотрим на возможные ходы:

**1. Ход X в (2,2):**
- Тогда X займёт (1,1) и (2,2), но это ничего не даёт — нет трёх в ряд.

**2. Ход X в (2,1):**
- Тогда X будет в (1,1), (2,1), но опять же, не создаётся линия.

**3. Ход X в (0,1):**
- Вот тут интересно: если X поставит в (0,1), то будет:

```
Код:
X | X | O  
--+---+--
X | X | O  
--+---+--
O |   |
```

Теперь у X есть **две клетки в верхнем ряду** — (0,0) и (0,1) — и если O не закроет (0,1), X выиграет следующим ходом, поставив X в (0,2), но оно уже занято. Значит, тут угрозы нет.

### Однако, более опасное — **если X пойдёт в (2,2):**

Поле станет:

```
Код:
X |   | O  
--+---+--
X | X | O  
--+---+--
O |   | X
```

Теперь у X есть **(1,1), (2,2)** — но всё ещё нет выигрыша.

### �� Лучший ход для X:
**Поставить X в (0,1)** — чтобы усилить контроль над первым рядом и, возможно, подготовить вилку на следующих ходах.

### Результат:

```
Код:
X | X | O  
--+---+--
X | X | O  
--+---+--
O |   |
```

Теперь у X две по вертикали в середине и две по горизонтали в верхнем ряду. Это создаёт давление.

------------------------------------

Три крестика по диагонали это еще не победа для крестиков?

------------------------------------

Хорошее замечание — давай пересчитаем всё внимательно. Ты абсолютно прав задать этот вопрос.

После хода **O в (2,0)**, поле такое:

```
Код:
X |   | O  
--+---+--
X | X | O  
--+---+--
O |   |
```

Если **X пойдёт в (2,2)**, то получим:

```
Код:
X |   | O  
--+---+--
X | X | O  
--+---+--
O |   | X
```

Теперь посмотрим на **диагональ**:

- (0,0): X
- (1,1): X
- (2,2): X

✅ **Это главная диагональ — и она полностью заполнена крестиками!**

### �� Значит, X выигрывает этим ходом.

---

Так что на самом деле, **если O пойдёт в (2,0)**, **X выигрывает следующим ходом**, поставив крестик в (2,2).

### ❗ Тогда какой же будет правильный ход ноликов?

Надо **не только блокировать (2,0)**, но и **предотвратить главную диагональ**.

У X уже есть:
- (0,0)
- (1,1)

Поэтому **ноликам нужно срочно ставить O в (2,2)**, иначе — проигрыш.

---

### �� Правильный (оптимальный) ход ноликов: **O в (2,2)**

Поле станет:

```
Код:
X |   | O  
--+---+--
X | X | O  
--+---+--
  |   | O
```

Теперь нет выигрыша по диагонали, и O держит оборону.

------------------------------------

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

------------------------------------

Давай посмотрим на поле после **оптимального хода ноликов — в (2,2)**:

```
Код:
X |   | O  
--+---+--
X | X | O  
--+---+--
  |   | O
```

### Проверим статус игры:

- **Выигрыш ноликов по вертикали?**
- Третий столбец: O (0,2), O (1,2), O (2,2) → ✅ **Нолики выиграли!**

---

### �� Итог:
**Игра уже закончилась победой ноликов**.
Они собрали три O в правом столбце.

Так что этот якобы "оборонительный" ход оказался ещё и **победным** ��
Вот такая вот красивая тактика!

------------------------------------

Почему ты сразу не заметил выигрышный ход для ноликов?

------------------------------------

Честный вопрос — и ты абсолютно прав. ��

Я сфокусировался на **блокировке угрозы от крестиков**, особенно по столбцу (2,0), и на диагонали — и упустил из виду, что **нолики прямо сейчас могут победить**, поставив третий O в правый столбец.

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

### Так что:
- ✔ Я должен был сразу обратить внимание на **линию из двух O в (0,2) и (1,2)**.
- ❌ Вместо этого подумал только про защиту.

Короче — зевнул выигрыш ��
Спасибо, что подметил. Так и рождаются настоящие комбинации — из внимательности к каждой линии.

------------------------------------

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

Последний раз редактировалось Arigato; 07.04.2025 в 17:58.
Arigato вне форума Ответить с цитированием
Старый 07.04.2025, 18:25   #5
Arigato
Высокая репутация
СуперМодератор
 
Аватар для Arigato
 
Регистрация: 27.07.2008
Сообщений: 15,810
По умолчанию

Цитата:
Сообщение от DeepFlake Посмотреть сообщение
Искуссвтенный интеллект на основе имитации нейросетей - это всего лишь ассоциативная память, память без мышления.
Еще чтобы проверить факт мышления, надо давать нестандартный задачи, чтобы на одних ассоциациях они не решались. Нашел интересную задачу прямо тут, на форуме - https://programmersforum.ru/showpost...2&postcount=33

Любопытный код программы. Одними ассоциациями такое не осилить. Давайте посмотрим, справится ли с этим кодом ChatGPT?

------------------------------------

Что делает эта программа?

Код:
program Project1;

uses Math, SysUtils;

procedure Calc(X: array of PInteger);
var
  I, S: Integer;
begin
  S := Sign(X[1]^- X[0]^);
  for I := 2 to Length(X) - 1 do S := S * Ord(S = Sign(X[I]^- X[I-1]^));
  for I := 0 to Length(X) - 1 do X[I]^ := X[I]^ * (Ord(#0#2#3[S + 2]) - 1); 
end;

procedure Run();
var a, b, c, d, e, f, g, h:Integer;
begin
  a := 1;
  b := 2;
  c := 3;
  d := 4;
  e := 5;
  f := 6;
  g := 7;
  h := 8;

  Calc([@a, @b, @c, @d, @e, @f, @g, @h]);
  Write(Format('%d %d %d %d %d %d %d %d', [a, b, c, d, e, f, g, h]));
end;

begin
  Run();
  Readln();
end.


------------------------------------

Эта программа выполняет несколько интересных и запутанных операций над массивом указателей на целые числа.

1. **Описание процедуры `Calc(X: array of PInteger)`**:
- Процедура принимает массив указателей на целые числа (`PInteger`).
- Первая строка вычисляет знак разности между значениями, на которые указывают `X[1]` и `X[0]` (`X[1]^ - X[0]^`), и сохраняет результат в переменную `S`. Функция `Sign` возвращает 1, если число положительное, -1, если отрицательное, и 0, если ноль.
- Затем начинается цикл с индекса 2, в котором проверяется знак разности для каждого элемента в массиве относительно предыдущего элемента. Если знак совпадает, переменная `S` умножается на 1, в противном случае — на 0.
- В конце процедуры снова используется цикл, который перебирает все элементы массива и умножает каждый элемент на результат выражения `Ord(#0#2#3[S + 2]) - 1`. Это странное выражение, вероятно, связано с использованием значений символов в кодировке ASCII или Unicode, и зависит от значения `S`. На практике результат этого умножения будет либо 0, либо 1.

2. **Описание процедуры `Run()`**:
- В этой процедуре инициализируются 8 целых чисел от `a` до `h` с значениями от 1 до 8.
- Затем вызывается процедура `Calc`, передавая ей массив указателей на эти числа.
- После выполнения процедуры `Calc` происходит вывод значений переменных `a, b, c, d, e, f, g, h`.

3. **Результат**:
- Программа изменяет значения переменных `a, b, c, d, e, f, g, h` в зависимости от выполнения логики в процедуре `Calc`. При этом операция умножения на значение, зависящее от символов в кодировке, вероятно, приведет к тому, что некоторые из этих чисел обнулятся, а другие останутся неизменными.

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

------------------------------------

Какой ответ получится, если запустить программу как есть?

------------------------------------

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

### Переменные:
В процедуре `Run` создаются переменные:
```pascal
Код:
a := 1;
b := 2;
c := 3;
d := 4;
e := 5;
f := 6;
g := 7;
h := 8;
```

### Вызов процедуры `Calc`:
Массив указателей на эти переменные передается в процедуру `Calc`. Внутри этой процедуры происходит несколько важных шагов.

#### Шаг 1: Рассчитываем `S`
Первая строка:
```pascal
Код:
S := Sign(X[1]^ - X[0]^);
```
Значения на которые указывают `X[0]` и `X[1]` — это `a` и `b`. Таким образом:
- `X[1]^` (b) = 2
- `X[0]^` (a) = 1
- `X[1]^ - X[0]^` = 2 - 1 = 1, следовательно, `Sign(1)` возвращает 1, то есть `S = 1`.

#### Шаг 2: Умножаем `S` на знак разности для всех следующих элементов массива
Цикл:
```pascal
Код:
for I := 2 to Length(X) - 1 do 
  S := S * Ord(S = Sign(X[I]^- X[I-1]^));
```
Здесь проверяется знак разности для всех элементов массива начиная с индекса 2:
- Для `c` и `b`: `Sign(3 - 2) = Sign(1)` возвращает 1, и `S = 1 * 1 = 1`.
- Для `d` и `c`: `Sign(4 - 3) = Sign(1)` возвращает 1, и `S = 1 * 1 = 1`.
- Для `e` и `d`: `Sign(5 - 4) = Sign(1)` возвращает 1, и `S = 1 * 1 = 1`.
- Для `f` и `e`: `Sign(6 - 5) = Sign(1)` возвращает 1, и `S = 1 * 1 = 1`.
- Для `g` и `f`: `Sign(7 - 6) = Sign(1)` возвращает 1, и `S = 1 * 1 = 1`.
- Для `h` и `g`: `Sign(8 - 7) = Sign(1)` возвращает 1, и `S = 1 * 1 = 1`.

Итак, после выполнения этого цикла `S` останется равным 1.

#### Шаг 3: Умножаем элементы массива на `Ord(#0#2#3[S + 2]) - 1`
Цикл:
```pascal
Код:
for I := 0 to Length(X) - 1 do 
  X[I]^ := X[I]^ * (Ord(#0#2#3[S + 2]) - 1);
```
Здесь используется странное выражение:
- `S + 2 = 1 + 2 = 3`
- `#0#2#3[3]` — это значение символа в строке `#0#2#3`. В кодировке ASCII символ с кодом 3 — это символ "End of Text" (ETX), который имеет значение 3. Следовательно, `Ord(#0#2#3[3]) = 3`.

Тогда:
- `Ord(#0#2#3[S + 2]) - 1 = 3 - 1 = 2`

Каждое число в массиве будет умножено на 2. То есть:
- `a := a * 2 = 1 * 2 = 2`
- `b := b * 2 = 2 * 2 = 4`
- `c := c * 2 = 3 * 2 = 6`
- `d := d * 2 = 4 * 2 = 8`
- `e := e * 2 = 5 * 2 = 10`
- `f := f * 2 = 6 * 2 = 12`
- `g := g * 2 = 7 * 2 = 14`
- `h := h * 2 = 8 * 2 = 16`

### Вывод:
После выполнения программы в `Run` происходит вывод значений переменных:
```pascal
Код:
Write(Format('%d %d %d %d %d %d %d %d', [a, b, c, d, e, f, g, h]));
```
Результат будет:
```
Код:
2 4 6 8 10 12 14 16
```

Таким образом, ответ на запуск программы — это:
```
Код:
2 4 6 8 10 12 14 16
```

------------------------------------

Ну что же, ответ правильный. Хотя что именно делает данная программа ИИ ответить не смог, но пошагово вполне себе выполнил.
Arigato вне форума Ответить с цитированием
Старый 07.04.2025, 18:59   #6
Arigato
Высокая репутация
СуперМодератор
 
Аватар для Arigato
 
Регистрация: 27.07.2008
Сообщений: 15,810
По умолчанию

По последней задачи ChatGPT таки смог понять исходную задачу по коду. Был включен режим "Обоснуй", по сути он запускает более глубокий анализ данных. Времени на рассуждения было потрачено 45 секунд.

------------------------------------

Я еще раз спрошу: что делает эта программа? Попробуй понять суть задачи и озвучь ее.

------------------------------------

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

Если последовательность строго возрастает (разности положительные), то все числа умножаются на 2.

Если последовательность строго убывает (разности отрицательные), то все числа умножаются на –1 (то есть меняются знак).

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

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

------------------------------------

Объясни, как ты пришел к такому выводу?

------------------------------------

Я пришёл к такому выводу, анализируя пошагово логику процедуры Calc:

1. **Определение направления последовательности.**
Первая строка
```pascal
Код:
   S := Sign(X[1]^ - X[0]^);
```
устанавливает S равным +1, если второй элемент больше первого (возрастание), или –1, если наоборот (убывание). Далее в цикле для каждого следующего элемента сравнивается знак разности с текущим S. Если хотя бы один раз знак не совпадает, выражение
```pascal
Код:
   S := S * Ord(S = Sign(X[I]^- X[I-1]^));
```
делает S равным 0 (так как Ord(false)=0). Таким образом, S остаётся равным +1 или –1 только если все разности имеют одинаковый знак.

2. **Изменение значений массива на основе S.**
В последнем цикле
```pascal
Код:
   for I := 0 to Length(X) - 1 do
     X[I]^ := X[I]^ * (Ord(#0#2#3[S + 2]) - 1);
```
выбирается множитель в зависимости от S:
- Если S = 1 (строго возрастающая последовательность), то выбирается множитель 2 (так как символ с индексом 3 в строке "#0#2#3" имеет Ord=3, а 3–1=2).
- Если S = –1 (строго убывающая последовательность), то множитель получается равным –1 (символ с индексом 1: Ord(#0)=0, а 0–1=–1).
- Если S = 0 (последовательность не монотонна), то множитель равен 1 (символ с индексом 2: Ord(#2)=2, 2–1=1), то есть значения остаются неизменными.

3. **Вывод.**
Таким образом, программа определяет, является ли последовательность чисел монотонной (либо строго возрастающей, либо строго убывающей), и в зависимости от этого либо удваивает все элементы, либо меняет знак, либо оставляет их без изменений.

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

------------------------------------

В принципе неплохо. Из весьма не очевидного кода ИИ смог правильно сформулировать задачу, которую данный код решает...
Arigato вне форума Ответить с цитированием
Старый 07.04.2025, 19:06   #7
Arigato
Высокая репутация
СуперМодератор
 
Аватар для Arigato
 
Регистрация: 27.07.2008
Сообщений: 15,810
По умолчанию

Цитата:
Сообщение от Arigato Посмотреть сообщение
------------------------------------

Вот поле игры в крестики-нолики:
Код:
X |   | O  
--+---+--
X | X | O  
--+---+--
  |   |
Ход ноликов. Какой ход будет оптимальным?


------------------------------------
Запустил данный промпт в режиме рассуждений (в новом чате, чтобы он забыл прошлые выводу по поводу данного вопроса). Время размышления 23 секунды.

------------------------------------

Оптимальный ход – поставить нолик в правый нижний угол (т.е. клетку в 3-й строке, 3-м столбце). Это завершает вертикальную линию, так как в столбце уже стоят нолики в клетках (1,3) и (2,3), что приводит к немедленной победе.

------------------------------------

Лаконичный и правильный ответ. Да, долго, в отличии от прошлого раза, где ответ писался "на ходу", но вполне себе адекватный.

Сам по себе анализ весьма компактный:

Цитата:
I’m looking at the game board, which is:

Код:
X |   | O
--+---+--
X | X | O
--+---+--
  |   |
I'm assigning coordinates for easier reference, but the game isn't finished. Checking the counts: X has 3 on the board, O has 2. It’s O’s turn! Next, I need to think about an optimal move for O that will lead to the best outcome. Let’s figure out the best strategy to either block X or win the game.

I’m labeling cells now using coordinates like A1 for top-left, and so on. Here's the board based on my analysis:

Код:
X |   | O
--+---+--
X | X | O
--+---+--
  |   |
I see the third row has three empty positions. The counts are X = 3, O = 2, so it's O's turn. I’ll need to find the optimal move to either block X or set up O for a win. Let’s analyze potential threats from X and decide O's best course of action.
Arigato вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Необходимо написать "таймер", который будет запускаться при нажатии кнопки "Start", приостанавливаться на "Pause", и сбрасываться на "Reset" billiejean78 JavaScript, Ajax 1 03.09.2021 08:58
Убрать папки "Pictures", "Music", "Видео", "Downloads" из "МОЙ КОМПЬЮТЕР" Бахтиёр1916 Windows 1 05.04.2017 12:53
Нужно пояснить/прокомментировать код программы, или коды функций "Добавить" "Удалить" "Обновить(редактировать" "Поиск" "Период") ZIRASS PHP 4 15.06.2016 14:23
Как создать "динамический" диапазон условия суммирования для формулы? kievlyanin Microsoft Office Excel 13 08.09.2011 13:24