Организации все чаще вкладывают средства в искусственный интеллект, поскольку эти инструменты все глубже интегрируются в повседневные процессы. Эта непрерывная волна инноваций стимулирует спрос на более эффективные и надежные платформы. В соответствии с этой тенденцией компания Datapizza, стоящая за итальянским сообществом разработчиков, представила открытый фреймворк на Python для генеративного ИИ под названием Datapizza AI.
При разработке агентов на базе больших языковых моделей необходимо выбрать стек ИИ:
- Языковая модель – это основной компонент агента. Первое ключевое решение касается выбора между открытыми моделями (например, Llama, DeepSeek, Phi) и платными (такими как ChatGPT, Claude, Gemini). Далее, в зависимости от сценария применения, следует учитывать специализацию модели: универсальную (знающую немного обо всем, подобно Википедии) или узкоспециализированную (например, дообученную для программирования или финансов).
- Движок языковой модели – это система, которая запускает модель, обрабатывает запросы, выводит выводы и генерирует текст. По сути, она создает интеллект. Самые популярные варианты – OpenAI (ChatGPT), Anthropic (Claude), Google (Gemini) и Ollama (для локального запуска открытых моделей).
- Фреймворк ИИ – это слой оркестрации для создания и управления рабочими процессами. Иными словами, фреймворк организует интеллект, производимый языковыми моделями. Сейчас рынок лидируют LangChain, LLamaIndex и CrewAI. Новая библиотека Datapizza AI относится к этой категории и позиционируется как альтернатива ведущим фреймворкам.
В этой статье демонстрируется применение нового фреймворка Datapizza для разработки агентов ИИ на базе языковых моделей. Приводится полезный код на Python, который можно легко адаптировать для аналогичных задач (скопировать, вставить, запустить), с подробными комментариями к каждой строке для удобства воспроизведения примера.
Настройка
В качестве движка языковой модели используется Ollama, поскольку локальный хостинг моделей на компьютере предпочтителен. Это стандартный подход для компаний, работающих с конфиденциальными данными. Локальное размещение обеспечивает полный контроль над приватностью данных, поведением модели и расходами.
Сначала следует скачать Ollama с официального сайта. Затем выбрать модель и выполнить команду для ее загрузки, указанную на странице. В данном случае применяется модель Qwen от Alibaba, которая сочетает высокую производительность и компактность (ollama run qwen3).
Datapizza AI совместима со всеми основными движками языковых моделей. Завершить настройку можно выполнением следующих команд:
pip install datapizza-ai
pip install datapizza-ai-clients-openai-likeКак указано в официальной документации, стек ИИ можно быстро протестировать, вызвав модель простым запросом и задав вопрос. Объект OpenAILikeClient() обеспечивает подключение к API Ollama, который обычно доступен по локальному URL.
from datapizza.clients.openai_like import OpenAILikeClient
llm = "qwen3"
prompt = '''
You are an intelligent assistant, provide the best possible answer to user's request.
'''
ollama = OpenAILikeClient(api_key="", model=llm, system_prompt=prompt, base_url="http://localhost:11434/v1")
q = '''
what time is it?
'''
llm_res = ollama.invoke(q)
print(llm_res.text)
Чат-бот
Другой способ проверки возможностей языковой модели – создание простого чат-бота для проведения беседы. Для этого на каждом шаге взаимодействия необходимо сохранять историю чата и передавать ее модели, указывая, кто что сказал. Фреймворк Datapizza уже включает встроенную систему памяти.
from datapizza.memory import Memory
from datapizza.type import TextBlock, ROLE
memory = Memory()
memory.add_turn(TextBlock(content=prompt), role=ROLE.SYSTEM)
while True:
## User
q = input('🙂 >')
if q == "quit":
break
## LLM
llm_res = ollama.invoke(q, memory=memory)
res = llm_res.text
print("🍕 >", f"\x1b[1;30m{res}\x1b[0m")
## Update Memory
memory.add_turn(TextBlock(content=q), role=ROLE.USER)
memory.add_turn(TextBlock(content=res), role=ROLE.ASSISTANT)
Для получения истории чата достаточно обратиться к объекту памяти. Обычно фреймворки ИИ используют три роли в взаимодействии с языковой моделью: «system» (основные инструкции), «user» (слова человека) и «assistant» (ответ чат-бота).
memory.to_dict()
Языковая модель сама по себе ограничена и способна лишь на диалог. Чтобы расширить ее возможности, требуется предоставить функцию выполнения действий, то есть активацию инструментов.
Инструменты
Инструменты представляют главное отличие простого языкового ИИ от полноценного агента. Когда запрос пользователя выходит за рамки знаний модели (например, «который сейчас час?»), агент должен осознать отсутствие информации, активировать инструмент для получения данных (например, проверить время), обработать результат через модель и сформулировать ответ.
Фреймворк Datapizza упрощает создание инструментов с нуля. Достаточно импортировать декоратор @tool, и любая функция становится доступной для агента.
from datapizza.tools import tool
@tool
def get_time() -> str:
'''Get the current time.'''
from datetime import datetime
return datetime.now().strftime("%H:%M")
get_time()Затем назначить инструмент соответствующему агенту, и получится ИИ, сочетающий понимание языка, автономное принятие решений и использование инструментов.
from datapizza.agents import Agent
import os
os.environ["DATAPIZZA_AGENT_LOG_LEVEL"] = "DEBUG" #max logging
agent = Agent(name="single-agent", client=ollama, system_prompt=prompt, tools=[get_time], max_steps=2)
q = '''
what time is it?
'''
agent_res = agent.run(q)
Агент ИИ на базе языковой модели – это интеллектуальная система вокруг модели, которая не только отвечает, но и рассуждает, принимает решения и действует. Помимо бесед (общения с базой общих знаний), наиболее распространенные функции агентов – RAG (общение с документами), Запросы (общение с базой данных) и Поиск в сети (общение с интернетом).
Например, рассмотрим инструмент поиска в сети. В Python самый простой вариант – использование приватного браузера DuckDuckGo. Можно применить оригинальную библиотеку или обертку из фреймворка Datapizza (pip install datapizza-ai-tools-duckduckgo).
from datapizza.tools.duckduckgo import DuckDuckGoSearchTool
DuckDuckGoSearchTool().search(query="powell")
Создадим агента, способного искать информацию в сети. Для большей интерактивности можно организовать ИИ аналогично чат-боту.
os.environ["DATAPIZZA_AGENT_LOG_LEVEL"] = "ERROR" #turn off logging
prompt = '''
You are a journalist. You must make assumptions, use your tool to research, make a guess, and formulate a final answer. The final answer must contain facts, dates, evidences to support your guess.
'''
memory = Memory()
agent = Agent(name="single-agent", client=ollama, system_prompt=prompt, tools=[DuckDuckGoSearchTool()], memory=memory, max_steps=2)
while True:
## User
q = input('🙂 >')
if q == "quit":
break
## Agent
agent_res = agent.run(q)
res = agent_res.text
print("🍕 >", f"\x1b[1;30m{res}\x1b[0m")
## Update Memory
memory.add_turn(TextBlock(content=q), role=ROLE.USER)
memory.add_turn(TextBlock(content=res), role=ROLE.ASSISTANT)
Многоагентная система
Настоящая сила агентов – в возможности сотрудничать друг с другом, подобно людям. Такие команды называют многоагентными системами (MAS) – группой ИИ-агентов, работающих совместно в общей среде для решения сложных задач, недоступных одному агенту.
На этот раз создадим продвинутый инструмент: выполнение кода. Языковые модели умеют программировать благодаря обучению на обширных корпусах кода и естественного языка, где они усваивают шаблоны, синтаксис и семантику языков. Однако они не могут выполнять реальные действия, поэтому генерируемый код остается текстом. Кратко: языковые модели создают код на Python, но не запускают его, агенты – могут.
import io
import contextlib
@tool
def code_exec(code:str) -> str:
'''Execute python code. Use always the function print() to get the output'''
output = io.StringIO()
with contextlib.redirect_stdout(output):
try:
exec(code)
except Exception as e:
print(f"Error: {e}")
return output.getvalue()
code_exec("from datetime import datetime; print(datetime.now().strftime('%H:%M'))")Существует два типа MAS: последовательный процесс гарантирует выполнение задач по порядку в линейной последовательности. В то же время иерархическая структура имитирует традиционные организационные иерархии для эффективной делегации и исполнения задач. Последний вариант предпочтительнее из-за большей параллельности и гибкости.
С помощью фреймворка Datapizza можно связывать два или более агентов функцией can_call(). Таким образом, один агент передает текущую задачу другому.
prompt_senior = '''
You are a senior Python coder. You check the code generated by the Junior, and use your tool to execute the code only if it's correct and safe.
'''
agent_senior = Agent(name="agent-senior", client=ollama, system_prompt=prompt_senior, tools=[code_exec])
prompt_junior = '''
You are a junior Python coder. You can generate code but you can't execute it. You receive a request from the Manager, and your final output must be Python code to pass on. If you don't know some specific commands, you can use your tool and search the web for "how to ... with python?".
'''
agent_junior = Agent(name="agent-junior", client=ollama, system_prompt=prompt_junior, tools=[DuckDuckGoSearchTool()])
agent_junior.can_call([agent_senior])
prompt_manager = '''
You know nothing, you're just a manager. After you get a request from the user, first you ask the Junior to generate the code, then you ask the Senior to execute it.
'''
agent_manager = Agent(name="agent-manager", client=ollama, system_prompt=prompt_manager, tools=[])
agent_manager.can_call([agent_junior, agent_senior])
q = '''
Plot the Titanic dataframe. You can find the data here: https://raw.githubusercontent.com/mdipietro09/DataScience_ArtificialIntelligence_Utils/master/machine_learning/data_titanic.csv
'''
agent_res = agent_manager.run(q)
#print(agent_res.text)

Заключение
Эта статья служит руководством по введению в Datapizza AI – новый фреймворк для создания чат-ботов и агентов ИИ на базе языковых моделей. Библиотека отличается гибкостью и удобством, покрывая разнообразные сценарии генеративного ИИ. Хотя в примерах использовался Ollama, фреймворк совместим со всеми популярными движками, включая OpenAI.