You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

158 lines
6.0 KiB
Markdown

# Human-in-the-Loop: Deep Agents Pattern with Follow-up
This example demonstrates the **Deep Agents** multi-agent pattern combined with the **Follow-up** human-in-the-loop pattern.
It showcases how to build a deep reasoning agent system that proactively asks clarifying questions when user requirements are ambiguous, ensuring accurate and personalized analysis results.
## How It Works
1. **Deep Agent Architecture**: The system uses a deep agent that coordinates specialized sub-agents:
- **ResearchAgent**: Searches for market, technology, and finance information
- **AnalysisAgent**: Performs trend, comparison, and statistical analysis
- **FollowUpTool**: Asks clarifying questions to gather missing information
2. **Follow-up Tool**: The `FollowUpTool` triggers an interrupt to ask the user questions when:
- The analysis requirements are unclear
- Specific parameters are needed (time period, sectors, risk tolerance)
- The agent needs to confirm user preferences
3. **Workflow**:
- User requests analysis (e.g., "Analyze market trends and provide recommendations")
- Deep agent recognizes ambiguity → uses `FollowUpTool`**interrupt**
- User answers clarifying questions → resume
- Agent proceeds with research and analysis using clarified requirements
- Final comprehensive report is generated
4. **Instruction-Driven**: The deep agent is explicitly instructed to use `FollowUpTool` FIRST before any analysis to ensure all necessary information is gathered.
## Practical Example
Here's what the follow-up flow looks like:
```
========================================
User Query: Analyze the market trends and provide investment recommendations.
========================================
name: DataAnalysisAgent
path: [{DataAnalysisAgent}]
tool name: FollowUpTool
arguments: {"questions":["What specific market sectors are you interested in?","What time period should the analysis cover?","What is your risk tolerance?"]}
========================================
CLARIFICATION NEEDED
========================================
The agent needs more information to proceed:
1. What specific market sectors are you interested in (e.g., technology, finance, healthcare)?
2. What time period should the analysis cover (e.g., last quarter, year-to-date)?
3. What type of analysis do you need (e.g., trend, comparison, statistical)?
4. What is your risk tolerance for investment recommendations (e.g., conservative, moderate, aggressive)?
----------------------------------------
Answer for Q1 (What specific market sectors...): technology and finance
Answer for Q2 (What time period...): last quarter
Answer for Q3 (What type of analysis...): trend analysis
Answer for Q4 (What is your risk tolerance...): moderate
========================================
Resuming with your answers...
========================================
name: DataAnalysisAgent
path: [{DataAnalysisAgent}]
action: transfer to ResearchAgent
name: ResearchAgent
path: [{DataAnalysisAgent} {ResearchAgent}]
tool name: search
arguments: {"query":"technology market trends Q3 2025","category":"technology"}
name: ResearchAgent
path: [{DataAnalysisAgent} {ResearchAgent}]
tool response: {"results":[{"title":"AI Industry Report 2025",...}]}
name: DataAnalysisAgent
path: [{DataAnalysisAgent}]
action: transfer to AnalysisAgent
name: AnalysisAgent
path: [{DataAnalysisAgent} {AnalysisAgent}]
tool name: analyze
arguments: {"data":"...","analysis_type":"trend"}
name: DataAnalysisAgent
path: [{DataAnalysisAgent}]
answer: Based on your preferences for technology and finance sectors with moderate risk tolerance...
```
This trace demonstrates:
- **Proactive Clarification**: Agent asks questions before starting analysis
- **Structured Questions**: Multiple questions gathered in a single interrupt
- **User Answers**: All answers collected and used to guide the analysis
- **Targeted Analysis**: Research and analysis tailored to user's specific requirements
## How to Configure Environment Variables
Before running the example, you need to set up the required environment variables for the LLM API. You have two options:
### Option 1: OpenAI-Compatible Configuration
```bash
export OPENAI_API_KEY="{your api key}"
export OPENAI_BASE_URL="{your model base url}"
# Only configure this if you are using Azure-like LLM providers
export OPENAI_BY_AZURE=true
# 'gpt-4o' is just an example, configure the model name provided by your LLM provider
export OPENAI_MODEL="gpt-4o-2024-05-13"
```
### Option 2: ARK Configuration
```bash
export MODEL_TYPE="ark"
export ARK_API_KEY="{your ark api key}"
export ARK_MODEL="{your ark model name}"
```
Alternatively, you can create a `.env` file in the project root with these variables.
## How to Run
Ensure you have your environment variables set (e.g., for the LLM API key). Then, run the following command from the root of the `eino-examples` repository:
```sh
go run ./adk/human-in-the-loop/7_deep-agents
```
You will see the deep agent asking clarifying questions about your analysis requirements, and after you provide answers, it will proceed with a tailored market analysis.
## Workflow Diagram
```mermaid
graph TD
A[User Request] --> B{Deep Agent};
B --> C[Recognize Ambiguity];
C --> D[FollowUpTool];
D --> E[Interrupt: Questions];
E --> F{User Answers};
F --> G[Resume with Answers];
G --> H[Delegate to ResearchAgent];
H --> I[Search Market Data];
I --> J[Return Research Results];
J --> B;
B --> K[Delegate to AnalysisAgent];
K --> L[Analyze Data];
L --> M[Return Analysis];
M --> B;
B --> N[Generate Final Report];
N --> O[Final Response];
```
## Key Differences from Other Patterns
| Aspect | Approval | Review-Edit | Follow-up |
|--------|----------|-------------|-----------|
| **Trigger** | Sensitive action | Booking/modification | Ambiguous requirements |
| **User Action** | Yes/No | Approve/Edit/Reject | Answer questions |
| **Purpose** | Authorization | Parameter validation | Information gathering |
| **Timing** | Before execution | Before execution | Before planning |