Skip to main content

Agents

Agents enable autonomous behavior by allowing language models to dynamically choose which tools to use based on user input. Unlike predetermined chains, agents make real-time decisions about their actions.

Core Concepts

An agent system consists of several key components:

  • Agent: The decision-making component that chooses which tools to use
  • Tools: The available functions/APIs the agent can invoke
  • Executor: Manages the agent's execution loop and tool invocation
  • Memory: Maintains conversation context across agent interactions

How Agents Work

  1. Receive Input: Agent receives a user query or task
  2. Plan Action: Agent analyzes the input and decides which tool(s) to use
  3. Execute Tool: Agent invokes the selected tool with appropriate parameters
  4. Process Result: Agent evaluates the tool's output
  5. Decide Next Step: Agent determines if more actions are needed or if the task is complete
  6. Respond: Agent provides a final response to the user

Agent Types

MRKL Agent (ReAct)

Uses a Reasoning and Acting pattern where the agent alternates between thinking about what to do and taking actions.

OpenAI Functions Agent

Leverages OpenAI's function calling capabilities for more structured tool usage and parameter passing.

Conversational Agent

Designed for multi-turn conversations, maintaining context while using tools to assist with tasks.

Plan-and-Execute Agent

Creates a plan of actions first, then executes each step systematically.

Available Tools

LangChainGo provides several built-in tools:

  • Calculator: Perform mathematical calculations
  • Web Search: Search the internet for information
  • File Operations: Read, write, and manipulate files
  • Database Query: Execute database operations
  • API Calls: Make HTTP requests to external services
  • Custom Tools: Create your own tools for specific use cases

Building Agents

Basic Agent Setup

// Create tools
tools := []tools.Tool{
tools.Calculator{},
tools.WebSearch{APIKey: "your-api-key"},
}

// Create agent
agent := agents.NewOneShotAgent(llm, tools)

// Create executor
executor := agents.NewExecutor(agent)

// Execute
result, err := executor.Call(ctx, map[string]any{
"input": "What is 25 * 4 and what's the weather like today?",
})

Custom Tools

type CustomTool struct{}

func (c CustomTool) Name() string {
return "custom_tool"
}

func (c CustomTool) Description() string {
return "Performs custom operations"
}

func (c CustomTool) Call(ctx context.Context, input string) (string, error) {
// Your custom logic here
return "Tool result", nil
}

Best Practices

  1. Tool Selection: Choose tools that complement each other and cover your use case
  2. Prompt Engineering: Design clear tool descriptions and agent prompts
  3. Error Recovery: Implement fallback strategies for tool failures
  4. Resource Management: Set timeouts and limits on tool execution
  5. Security: Validate tool inputs and sanitize outputs
  6. Monitoring: Track agent performance and decision quality

Agent Components