Организации всё больше инвестируют в ИИ, поскольку эти новые инструменты всё чаще внедряются в повседневные операции. Непрерывная волна инноваций стимулирует спрос на более эффективные и надёжные фреймворки.
Следуя этому тренду, стартап Datapizza (стоящий за технологическим сообществом Италии) только что выпустил фреймворк с открытым исходным кодом для генеративного ИИ на Python под названием Datapizza AI.
Выбор стека ИИ при создании агентов на основе LLM
При создании агентов на основе больших языковых моделей (LLM) необходимо выбрать стек ИИ:
- Языковая модель – «мозг» агента. Первый большой выбор – это открытый исходный код (например, Llama, DeepSeek, Phi) или платный (например, ChatGPT, Claude, Gemini). Затем, исходя из варианта использования, нужно учитывать знания LLM: общие (знает понемногу обо всём, как Википедия) или тематические (например, настроенные для кодирования или финансов).
- LLM Engine – это то, что запускает языковую модель, отвечая на запросы, делая выводы и создавая текст. По сути, он генерирует интеллект. Наиболее популярными являются OpenAI (ChatGPT), Anthropic (Claude), Google (Gemini) и Ollama (запускает модели с открытым исходным кодом локально).
- Фреймворк ИИ – это уровень оркестрации для построения рабочих процессов и управления ими. Проще говоря, фреймворк должен структурировать интеллект, созданный LLM. В настоящее время на рынке доминируют LangChain, LLamaIndex и CrewAI. Новая библиотека Datapizza AI относится к этой категории и хочет стать альтернативой другим основным фреймворкам.
В этой статье я покажу, как использовать новый фреймворк Datapizza для создания агентов ИИ на основе LLM. Я представлю несколько полезных фрагментов кода на Python, которые можно легко применить в других подобных случаях (просто скопируйте, вставьте, запустите) и пройдусь по каждой строке кода с комментариями, чтобы вы могли воспроизвести этот пример.
Настройка
Я буду использовать Ollama в качестве движка LLM, потому что мне нравится размещать модели локально на своём компьютере. Это стандартная практика для всех компаний с конфиденциальными данными. Хранение всего локально даёт полный контроль над конфиденциальностью данных, поведением модели и затратами.
Прежде всего, вам нужно скачать Ollama с веб-сайта. Затем выберите модель и выполните команду, указанную на странице, чтобы загрузить LLM. Я использую Alibaba’s Qwen, так как она одновременно умная и лёгкая (ollama run qwen3).
Datapizza AI поддерживает все основные движки LLM. Мы можем завершить настройку, выполнив следующие команды:
pip install datapizza-ai
pip install datapizza-ai-clients-openai-like
Как указано в официальной документации, мы можем быстро протестировать наш стек ИИ, вызвав модель с помощью простого запроса и задав вопрос. Объект OpenAILikeClient() – это способ подключения к API Ollama, которое обычно размещается на том же URL-адресе localhost.
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)
Чат-бот
Другой способ проверить возможности LLM – создать простого чат-бота и провести беседу. Для этого при каждом взаимодействии нам нужно сохранять историю чата и возвращать её модели, указывая, что было сказано кем. В фреймворке 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:
q = input('🙂 >')
if q == "quit":
break
llm_res = ollama.invoke(q, memory=memory)
res = llm_res.text
print("🍕 >", f"\x1b[1;30m{res}\x1b[0m")
memory.add_turn(TextBlock(content=q), role=ROLE.USER)
memory.add_turn(TextBlock(content=res), role=ROLE.ASSISTANT)
Если вы хотите получить историю чата, вы можете просто получить доступ к памяти. Обычно ИИ-фреймворки используют три роли во взаимодействии с LLM: «system» (основные инструкции), «user» (что сказал человек), «assistant» (что ответил чат-бот).
memory.to_dict()
Очевидно, что одна LLM очень ограничена и может делать немногое, кроме общения. Поэтому нам нужно дать ей возможность действовать, или, другими словами, активировать инструменты.
Инструменты
Инструменты – основное различие между простой LLM и ИИ-агентом. Когда пользователь запрашивает что-то, выходящее за рамки базы знаний LLM (например, «который сейчас час?»), агент должен понять, что не знает ответа, активировать инструмент для получения дополнительной информации (например, проверки часов), обработать результат через LLM и сгенерировать ответ.
Фреймворк 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"
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)
ИИ-агент на основе LLM – это интеллектуальная система, построенная вокруг языковой модели, которая не просто отвечает, но и рассуждает, принимает решения и действует. Помимо общения (что означает общение с базой общих знаний), наиболее распространёнными действиями, которые могут выполнять агенты, являются RAG (общение с вашими документами), Querying (общение с базой данных), Web Search (общение со всем Интернетом).
Многоагентная система
Реальная сила агентов – это способность сотрудничать друг с другом, как это делают люди. Эти команды называются многоагентными системами (MAS), группой ИИ-агентов, которые работают вместе в общей среде для решения сложных задач, которые слишком сложны для решения одним агентом.
На этот раз давайте создадим более продвинутый инструмент: выполнение кода. Обратите внимание, что LLM знают, как кодировать, будучи подвергнутыми воздействию большого корпуса как кода, так и естественно-языкового текста, где они изучают шаблоны, синтаксис и семантику языков программирования. Но поскольку они не могут выполнить никаких реальных действий, создаваемый ими код является просто текстом.
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)
Заключение
Эта статья была учебником по представлению Datapizza AI, нового фреймворка для создания чат-ботов и ИИ-агентов на основе LLM. Библиотека очень гибкая и удобная для пользователя, и может охватывать различные варианты использования GenAI. Я использовал её с Ollama, но её можно связать со всеми известными движками, такими как OpenAI.
Полный код для этой статьи: GitHub
Надеюсь, вам понравилась статья! Не стесняйтесь обращаться ко мне с вопросами и отзывами или просто поделиться своими интересными проектами.
