_CORE
AI & Agentic Systems Core Information Systems Cloud & Platform Engineering Data Platform & Integration Security & Compliance QA, Testing & Observability IoT, Automation & Robotics Mobile & Digital Banking & Finance Insurance Public Administration Defense & Security Healthcare Energy & Utilities Telco & Media Manufacturing Logistics & E-commerce Retail & Loyalty
References Technologies Blog Know-how Tools
About Collaboration Careers
CS EN
Let's talk

AI agenti — architektura a design

22. 12. 2025 4 min read intermediate

AI agents represent a new generation of intelligent systems capable of autonomous decision-making and action. This article explores their architecture, design principles, and practical implementations based on large language models.

Basic Principles of AI Agent Architecture

AI agents represent the next evolutionary step from static chatbots to autonomous systems capable of complex decision-making and action. A properly designed agent combines several key components: reasoning engine, memory system, tool integration, and execution layer.

The basic architecture of a modern AI agent is based on the ReAct (Reasoning + Acting) pattern, where the agent progressively analyzes the situation, plans steps, and executes actions. This cycle repeats until the goal is achieved or resources are exhausted.

class AIAgent:
    def __init__(self, llm_client, tools, memory):
        self.llm = llm_client
        self.tools = tools
        self.memory = memory
        self.max_iterations = 10

    async def execute(self, task):
        for iteration in range(self.max_iterations):
            # Reasoning phase
            context = self.memory.get_context()
            response = await self.llm.generate(
                prompt=f"Task: {task}\nContext: {context}\n"
                       f"Available tools: {list(self.tools.keys())}"
            )

            # Acting phase
            if self.should_use_tool(response):
                result = await self.execute_tool(response)
                self.memory.add_step(response, result)
            else:
                return response

Memory Management

A critical element is the agent’s memory management. We distinguish three types of memory: working memory for current context, episodic memory for specific events, and semantic memory for general knowledge.

class AgentMemory:
    def __init__(self, vector_store, max_working_memory=4096):
        self.vector_store = vector_store
        self.working_memory = []
        self.max_tokens = max_working_memory

    def add_step(self, thought, action, result):
        step = {
            "timestamp": datetime.now(),
            "thought": thought,
            "action": action,
            "result": result,
            "embedding": self.get_embedding(f"{thought} {result}")
        }

        # Store in long-term memory
        self.vector_store.store(step)

        # Add to working memory with size management
        self.working_memory.append(step)
        self.manage_working_memory_size()

    def retrieve_relevant_memories(self, query, top_k=3):
        query_embedding = self.get_embedding(query)
        return self.vector_store.similarity_search(
            query_embedding, top_k
        )

Tool Integration and Function Calling

Modern AI agents use function calling to interact with external systems. The key is to define clear interfaces and error handling for each tool.

class ToolRegistry:
    def __init__(self):
        self.tools = {}

    def register_tool(self, name, func, schema):
        self.tools[name] = {
            "function": func,
            "schema": schema,
            "retry_config": {"max_retries": 3, "backoff": 2}
        }

    async def execute_tool(self, tool_name, parameters):
        if tool_name not in self.tools:
            raise ValueError(f"Tool {tool_name} not found")

        tool = self.tools[tool_name]

        try:
            # Validate parameters against schema
            self.validate_parameters(parameters, tool["schema"])

            # Execute with retry logic
            return await self.execute_with_retry(
                tool["function"], 
                parameters,
                tool["retry_config"]
            )
        except Exception as e:
            return {"error": str(e), "tool": tool_name}

# Example tool registration
@tools.register("web_search", {
    "type": "function",
    "parameters": {
        "query": {"type": "string"},
        "max_results": {"type": "integer", "default": 5}
    }
})
async def web_search(query, max_results=5):
    # Implementation
    pass

Planning and Multi-step Execution

For more complex tasks, the agent needs planning capabilities. We implement hierarchical planning with the ability to adapt during execution.

class TaskPlanner:
    def __init__(self, llm_client):
        self.llm = llm_client

    async def create_plan(self, goal, available_tools):
        planning_prompt = f"""
        Goal: {goal}
        Available tools: {list(available_tools.keys())}

        Create a step-by-step plan. Each step should:
        1. Be atomic and executable
        2. Specify required tool if needed
        3. Include success criteria

        Format as JSON array of steps.
        """

        response = await self.llm.generate(planning_prompt)
        return self.parse_plan(response)

    async def adapt_plan(self, current_plan, executed_steps, error_info):
        adaptation_prompt = f"""
        Original plan: {current_plan}
        Executed steps: {executed_steps}
        Error encountered: {error_info}

        Adapt the remaining plan to handle the error and achieve the goal.
        """

        response = await self.llm.generate(adaptation_prompt)
        return self.parse_plan(response)

Monitoring and Observability

In production deployment, monitoring agent performance and behavior is crucial. We implement comprehensive logging and metrics for debugging and optimization.

class AgentObserver:
    def __init__(self, logger, metrics_client):
        self.logger = logger
        self.metrics = metrics_client

    def log_agent_step(self, agent_id, step_type, details, duration):
        log_entry = {
            "agent_id": agent_id,
            "step_type": step_type,
            "details": details,
            "duration_ms": duration,
            "timestamp": datetime.now().isoformat()
        }

        self.logger.info("agent_step", extra=log_entry)

        # Track metrics
        self.metrics.histogram("agent.step.duration", 
                              duration, tags={"type": step_type})
        self.metrics.increment("agent.steps.total", 
                              tags={"type": step_type})

    def track_tool_usage(self, tool_name, success, error_type=None):
        tags = {"tool": tool_name, "success": success}
        if error_type:
            tags["error_type"] = error_type

        self.metrics.increment("agent.tool.calls", tags=tags)

    def track_token_usage(self, prompt_tokens, completion_tokens):
        self.metrics.gauge("agent.tokens.prompt", prompt_tokens)
        self.metrics.gauge("agent.tokens.completion", completion_tokens)

Error Handling and Recovery

Robust agents must handle failures gracefully. We implement multi-level error recovery with fallback strategies.

class ErrorRecoveryManager:
    def __init__(self, max_recovery_attempts=3):
        self.max_attempts = max_recovery_attempts
        self.recovery_strategies = {
            "tool_error": self.handle_tool_error,
            "llm_error": self.handle_llm_error,
            "timeout_error": self.handle_timeout_error
        }

    async def handle_error(self, error, context):
        error_type = self.classify_error(error)

        if error_type in self.recovery_strategies:
            return await self.recovery_strategies[error_type](
                error, context
            )
        else:
            # Generic fallback
            return await self.generic_recovery(error, context)

    async def handle_tool_error(self, error, context):
        # Try alternative tool or simplified approach
        if hasattr(error, 'tool_name'):
            alternative_tools = self.find_alternative_tools(
                error.tool_name, context
            )
            if alternative_tools:
                return {"strategy": "retry_with_alternative",
                       "tools": alternative_tools}

        return {"strategy": "simplify_task"}

Security and Rate Limiting

AI agent security requires a multi-layered approach including input sanitization, output validation, and resource management.

class AgentSecurityManager:
    def __init__(self, rate_limiter, content_filter):
        self.rate_limiter = rate_limiter
        self.content_filter = content_filter
        self.dangerous_patterns = [
            r'rm\s+-rf',
            r'DROP\s+TABLE',
            r'eval\s*\(',
        ]

    async def validate_input(self, user_input, user_id):
        # Rate limiting
        if not await self.rate_limiter.allow(user_id):
            raise SecurityError("Rate limit exceeded")

        # Content filtering
        if self.content_filter.is_malicious(user_input):
            raise SecurityError("Malicious content detected")

        # Pattern matching for dangerous commands
        for pattern in self.dangerous_patterns:
            if re.search(pattern, user_input, re.IGNORECASE):
                raise SecurityError(f"Dangerous pattern detected: {pattern}")

    def sanitize_tool_parameters(self, tool_name, parameters):
        # Tool-specific sanitization
        if tool_name == "file_system":
            parameters = self.sanitize_file_paths(parameters)
        elif tool_name == "database":
            parameters = self.sanitize_sql_inputs(parameters)

        return parameters

Summary

Successful AI agent architecture combines modular design with robust mechanisms for memory management, tool integration, and error recovery. The key is finding the balance between agent autonomy and security measures. When implementing, focus on observability and gradual testing of individual components. Modern agents are not just chatbots with tools - they are sophisticated systems requiring careful architectural decisions and continuous monitoring in production.

ai agentiarchitekturadesign
Share:

CORE SYSTEMS tým

Stavíme core systémy a AI agenty, které drží provoz. 15 let zkušeností s enterprise IT.