В этом руководстве мы воссоздаём дух модели иерархического мышления (HRM) с помощью бесплатной модели Hugging Face, которая работает локально. Мы рассмотрим проектирование лёгкого, но структурированного агента для рассуждений, где мы выступаем одновременно в роли архитекторов и экспериментаторов.
Установка необходимых библиотек
Мы начинаем с установки необходимых библиотек и загрузки модели Qwen2.5-1.5B-Instruct от Hugging Face. Мы устанавливаем тип данных в зависимости от доступности GPU, чтобы обеспечить эффективное выполнение модели в Colab.
“`python
!pip -q install -U transformers accelerate bitsandbytes rich
import os, re, json, textwrap, traceback
from typing import Dict, Any, List
from rich import print as rprint
import torch
from transformers import AutoTokenizer, AutoModelForCausalLM, pipeline
MODEL_NAME = “Qwen/Qwen2.5-1.5B-Instruct”
DTYPE = torch.bfloat16 if torch.cuda.is_available() else torch.float32
“`
Загрузка токенизатора и модели
“`python
tok = AutoTokenizer.frompretrained(MODELNAME, use_fast=True)
model = AutoModelForCausalLM.from_pretrained(
MODEL_NAME,
device_map=”auto”,
torch_dtype=DTYPE,
loadin4bit=True
)
gen = pipeline(
“text-generation”,
model=model,
tokenizer=tok,
returnfulltext=False
)
“`
Определение вспомогательных функций
Мы определяем вспомогательные функции: функция chat позволяет нам отправлять запросы модели с дополнительными системными инструкциями и элементами управления выборкой, а функция extract_json помогает нам надёжно анализировать структурированные выходные данные JSON из модели, даже если ответ включает ограждения кода или дополнительный текст.
“`python
def chat(prompt: str, system: str = “”, maxnewtokens: int = 512, temperature: float = 0.3) -> str:
msgs = []
if system:
msgs.append({“role”:”system”,”content”:system})
msgs.append({“role”:”user”,”content”:prompt})
inputs = tok.applychattemplate(msgs, tokenize=False, addgenerationprompt=True)
out = gen(inputs, maxnewtokens=maxnewtokens, dosample=(temperature>0), temperature=temperature, topp=0.9)
return out[0][“generated_text”].strip()
def extract_json(txt: str) -> Dict[str, Any]:
m = re.search(r”\{[\s\S]*\}$”, txt.strip())
if not m:
m = re.search(r”\{[\s\S]*?\}”, txt)
try:
return json.loads(m.group(0)) if m else {}
except Exception:
# fallback: strip code fences
s = re.sub(r”^“`.*?\n|\n“`$”, “”, txt, flags=re.S)
try:
return json.loads(s)
except Exception:
return {}
“`
Запуск Python
“`python
def run_python(code: str, env: Dict[str, Any] | None = None) -> Dict[str, Any]:
import io, contextlib
g = {“name“: “main“}; l = {}
if env: g.update(env)
buf = io.StringIO()
try:
with contextlib.redirect_stdout(buf):
exec(code, g, l)
out = l.get(“RESULT”, g.get(“RESULT”))
return {“ok”: True, “result”: out, “stdout”: buf.getvalue()}
except Exception as e:
return {“ok”: False, “error”: str(e), “trace”: traceback.format_exc(), “stdout”: buf.getvalue()}
“`
Создание планировщика, решателя, критика и синтезатора
Мы добавляем две важные части: служебные функции и системные подсказки. Функция extractcode извлекает фрагменты кода из выходных данных модели, а runpython безопасно выполняет эти фрагменты и фиксирует их результаты. Наряду с этим мы определяем четыре системных подсказки, которые направляют модель на разбиение задач на подцели, решение их с помощью кода, проверку правильности и, наконец, получение чистого ответа.
Реализация полного цикла HRM
Мы реализуем полный цикл HRM: планируем подцели, решаем каждую, генерируя и запуская Python (захватывая RESULT), затем критикуем, при необходимости уточняем план и синтезируем чистый окончательный ответ. Мы организуем эти раунды в hrm_agent, перенося промежуточные результаты в контекст, чтобы мы могли постепенно улучшать и останавливаться, как только критик скажет «отправить».
Демо
Мы запускаем два демо для проверки агента: задачу в стиле ARC, где мы выводим правило преобразования из обучающих примеров и применяем его к тесту, и задачу по математике со словами, которая проверяет числовые рассуждения. Мы вызываем hrm_agent с каждой задачей, выводим окончательные ответы, а также отображаем количество раундов рассуждений, которые выполняет запуск ARC.
В заключение мы признаём, что то, что мы создали, — это больше, чем просто демонстрация; это окно в то, как иерархическое мышление может сделать меньшие модели более эффективными. Наслоив планирование, решение и критику, мы даём бесплатной модели Hugging Face возможность выполнять задачи с удивительной надёжностью. Мы уходим с более глубоким пониманием того, как структуры, вдохновлённые мозгом, в сочетании с практическими инструментами с открытым исходным кодом, позволяют нам исследовать тесты на рассуждения и творчески экспериментировать без больших затрат. Это практическое путешествие показывает нам, что передовые когнитивные рабочие процессы доступны каждому, кто готов возиться, повторять и учиться.
Проверьте [статью](https://www.marktechpost.com/2023/08/15/a-coding-guide-to-building-a-brain-inspired-hierarchical-reasoning-ai-agent-with-hugging-face-models/) и [полный код](https://github.com/your-github-page).
1. Какие инструменты и библиотеки используются для создания ИИ-агента с иерархическим мышлением на основе моделей Hugging Face?
В статье описывается использование следующих инструментов и библиотек:
* `pip` для установки библиотек;
* `transformers`, `accelerate`, `bitsandbytes`, `rich` для работы с моделями Hugging Face;
* `torch` для работы с тензорами;
* `AutoTokenizer` и `AutoModelForCausalLM` из библиотеки `transformers` для загрузки токенизатора и модели;
* `re`, `json`, `textwrap`, `traceback` для работы со строками, JSON и обработки исключений;
* `io`, `contextlib` для работы с файлами и перенаправления вывода.
2. Какие функции определены для работы с моделью Hugging Face?
В статье определены следующие функции:
* `chat` для отправки запросов модели с дополнительными системными инструкциями и элементами управления выборкой;
* `extract_json` для анализа структурированных выходных данных JSON из модели;
* `run_python` для безопасного выполнения фрагментов кода и фиксации их результатов.
3. Какие системные подсказки используются для направления модели на разбиение задач на подцели?
В статье определяются четыре системные подсказки, которые направляют модель на разбиение задач на подцели, решение их с помощью кода, проверку правильности и получение чистого ответа. Однако конкретные примеры этих подсказок в тексте не приводятся.
4. Какие задачи используются для проверки агента?
Для проверки агента используются две задачи:
* задача в стиле ARC, где выводится правило преобразования из обучающих примеров и применяется оно к тесту;
* задача по математике со словами, которая проверяет числовые рассуждения.
5. Какие преимущества даёт использование иерархического мышления при работе с моделями Hugging Face?
Иерархическое мышление позволяет сделать меньшие модели более эффективными. Наслоив планирование, решение и критику, можно дать бесплатной модели Hugging Face возможность выполнять задачи с удивительной надёжностью. Это позволяет исследовать тесты на рассуждения и творчески экспериментировать без больших затрат.