Понять, чем агент отличается от пайплайна - это первый шаг к созданию ИИ, который действительно умеет думать и принимать решения самостоятельно.
Из каждого утюга мы слышим слово «агент», но далеко не все агенты действительно агентны. Большинство - это просто
Агентность - это когда система сама решает, что делать дальше, исходя из результатов предыдущих действий. Это не просто «выполнить шаг 1, потом шаг 2», а гибкий, адаптивный процесс.
Как отличить?
☑️ Если после шага X заранее известно, что будет дальше - это пайплайн.
☑️ Если система сама выбирает следующий шаг - это агент.
☑️ Если выбор алгоритма жёстко прописан извне - это всё ещё пайплайн, пусть и с условиями.
Примеры:
Пайплайн:
sites = await search_google(query)
response = await generate_response(query, sites)
Всё просто и линейно.
Пайплайн с условием:
sites = await search_google(query)
if len(sites) < 10:
query = await optimize_user_query(query)
sites += await search_google(query)
response = await generate_response(query, sites)
Решение о ветвлении принимает программист, не ИИ.
Частичный агент:
sites = await search_google(query)
if not await check_enough_info(query, sites):
query = await optimize_user_query(query)
sites += await search_google(query)
response = await generate_response(query, sites)
Здесь модель решает, искать ли ещё, но порядок шагов фиксирован.
Настоящий агент:
state = {"query": query, "sites": []}
while "response" not in state:
action = await choose_next_step(state)
if action == "search_google":
state["sites"] += await search_google(state["query"])
elif action == "optimize_query":
state["query"] = await optimize_user_query(state["query"])
elif action == "generate_response":
state["response"] = await generate_response(state["query"], state["sites"])
Агент сам выбирает, что делать дальше, исходя из текущего состояния.
Как сделать агента надёжным?
Используйте структурированные описания действий и состояния - например, через pydantic. Это помогает модели лучше понимать, что от неё хотят, и выбирать следующий шаг. Такой подход называется Structured Guided Reasoning (SGR).
🔘 Мини-пример pydantic моделей
from pydantic import BaseModel
from typing import List, Literal, Optional, Union
class SearchGoogleAction(BaseModel):
action: Literal["search_google"]
query: str
class OptimizeQueryAction(BaseModel):
action: Literal["optimize_query"]
query: str
class GenerateResponseAction(BaseModel):
action: Literal["generate_response"]
query: str
sites: List[str]
AgentAction = Union[SearchGoogleAction, OptimizeQueryAction, GenerateResponseAction]
class AgentState(BaseModel):
query: str
sites: List[str] = []
response: Optional[str] = None
🔘 Краткий цикл агента с SGR
async def choose_next_step(state: AgentState) -> AgentAction:
if state.response:
return None
if not state.sites:
return SearchGoogleAction(action="search_google", query=state.query)
if len(state.sites) < 5:
return OptimizeQueryAction(action="optimize_query", query=state.query)
return GenerateResponseAction(action="generate_response", query=state.query, sites=state.sites)
Итоги:
✅ Агент - это не просто набор шагов, а система, которая сама выбирает, что делать дальше.
✅ Большинство «агентов» - на самом деле пайплайны.
✅ Структурированный подход с pydantic и SGR помогает создавать настоящих, гибких агентов.
Если интересно - могу поделиться еще более подробными примерами и другими продвинутыми патернами.