iomgaa 1b652502d5 docs: 新增SubAgent系统完整示例和说明文档
- 添加详细的SubAgent使用指南(README.md)
- 创建完整的Pydantic模型示例(example_models.py)
- 实现基础使用示例,展示核心功能(basic_example.py)
- 构建复杂文本分析应用示例(text_analysis_example.py)
- 提供数字提取实验运行器作为参考示例
- 包含多Agent协作、批量处理、性能监控等高级功能
- 支持交互式演示和完整的错误处理机制
2025-08-25 17:33:20 +08:00
..

SubAgent系统使用指南

📚 概述

SubAgent是基于Agno框架构建的智能代理系统为MedResearcher项目提供强大的AI功能。它支持多种LLM提供商提供动态prompt构建、JSON结构化输出和零容错解析等核心功能。

核心特性

🤖 智能代理核心

  • 多提供商支持: 阿里云(qwen)、DeepSeek、OpenAI等主流LLM服务
  • 动态Prompt: 支持模板变量替换的灵活prompt构建系统
  • 结构化输出: 基于Pydantic模型的JSON格式化响应
  • 零容错解析: 多策略JSON解析确保即使不完美输出也能解析

🔧 配置管理

  • YAML配置: 统一的配置文件管理,支持环境变量
  • 模型工厂: 自动化的模型实例创建和参数管理
  • 灵活配置: 支持运行时参数覆盖和动态配置

🛠 开发便利性

  • 类型安全: 完整的类型提示支持
  • 异常处理: 详细的错误信息和异常层级
  • 调试支持: 内置日志和调试模式

🚀 快速开始

1. 基础设置

首先确保已安装依赖:

uv add agno pydantic pyyaml

2. 配置LLM服务

src/config/llm_config.yaml中配置你的LLM服务

aliyun:
  base_url: "https://dashscope.aliyuncs.com/compatible-mode/v1"
  api_key: "${DASHSCOPE_API_KEY}"
  models:
    qwen-max:
      class: "OpenAILike"
      params:
        id: "qwen-max"
        temperature: 0.3

3. 设置环境变量

创建.env文件或设置环境变量:

export DASHSCOPE_API_KEY="your_api_key_here"

4. 创建你的第一个Agent

from src.agent_system import SubAgent
from pydantic import BaseModel, Field

# 定义响应模型
class TaskResult(BaseModel):
    summary: str = Field(description="任务总结")
    confidence: float = Field(description="置信度", ge=0.0, le=1.0)

# 创建SubAgent
agent = SubAgent(
    provider="aliyun",
    model_name="qwen-max", 
    name="task_agent",
    instructions=["你是一个专业的任务处理专家"],
    prompt_template="请分析以下任务: {task_description}",
    response_model=TaskResult
)

# 执行任务
result = agent.run(template_vars={"task_description": "数据分析项目"})
print(f"总结: {result.summary}")
print(f"置信度: {result.confidence}")

📖 详细使用指南

SubAgent核心类

初始化参数

SubAgent(
    provider: str,              # LLM提供商名称
    model_name: str,            # 模型名称  
    instructions: List[str],    # 指令列表(可选)
    name: str,                  # Agent名称(可选)
    description: str,           # Agent描述(可选)
    prompt_template: str,       # 动态prompt模板(可选)
    response_model: BaseModel,  # Pydantic响应模型(可选)
    config: Dict[str, Any],     # 自定义配置(可选)
    **agent_kwargs              # 传递给Agno Agent的额外参数
)

核心方法

1. build_prompt() - 构建动态Prompt
# 设置带变量的prompt模板
agent.update_prompt_template("""
请分析以下{data_type}数据:

数据内容: {data_content}
分析目标: {analysis_goal}

请提供详细的分析结果。
""")

# 构建具体prompt
prompt = agent.build_prompt({
    "data_type": "销售",
    "data_content": "Q1销售数据...",
    "analysis_goal": "找出增长趋势"
})
2. run() - 执行推理
# 方式1: 使用模板变量
result = agent.run(template_vars={
    "input_text": "待分析的文本内容"
})

# 方式2: 直接提供prompt
result = agent.run(prompt="请分析这段文本的情感倾向")

# 方式3: 带额外参数
result = agent.run(
    template_vars={"data": "测试数据"},
    temperature=0.7,
    max_tokens=1000
)
3. get_model_info() - 获取模型信息
info = agent.get_model_info()
print(f"Agent名称: {info['name']}")
print(f"提供商: {info['provider']}")
print(f"模型: {info['model_name']}")
print(f"是否有prompt模板: {info['has_prompt_template']}")

Pydantic响应模型

基础模型定义

from pydantic import BaseModel, Field
from typing import List, Optional

class AnalysisResult(BaseModel):
    """分析结果模型"""
    
    summary: str = Field(description="分析总结")
    key_points: List[str] = Field(description="关键要点列表")  
    confidence: float = Field(description="置信度", ge=0.0, le=1.0)
    recommendations: Optional[List[str]] = Field(default=None, description="建议列表")
    
    class Config:
        json_encoders = {
            float: lambda v: round(v, 3) if v is not None else None
        }

复杂嵌套模型

class DetailedItem(BaseModel):
    name: str = Field(description="项目名称")
    value: float = Field(description="数值")
    category: str = Field(description="分类")

class ComprehensiveResult(BaseModel):
    items: List[DetailedItem] = Field(description="详细项目列表")
    total_count: int = Field(description="总数量", ge=0)
    summary: str = Field(description="整体总结")

配置管理详解

LLM配置文件结构 (llm_config.yaml)

# 阿里云配置
aliyun:
  base_url: "https://dashscope.aliyuncs.com/compatible-mode/v1"
  api_key: "${DASHSCOPE_API_KEY}"
  models:
    qwen-max:
      class: "OpenAILike"
      params:
        id: "qwen-max"
        temperature: 0.3
        max_tokens: 4000
    qwen-plus:
      class: "OpenAILike"  
      params:
        id: "qwen-plus"
        temperature: 0.5

# DeepSeek配置
deepseek:
  base_url: "https://api.deepseek.com/v1"
  api_key: "${DEEPSEEK_API_KEY}"
  models:
    deepseek-v3:
      class: "OpenAILike"
      params:
        id: "deepseek-chat"
        temperature: 0.3

# OpenAI配置  
openai:
  api_key: "${OPENAI_API_KEY}"
  models:
    gpt-4o:
      class: "OpenAIChat"
      params:
        model: "gpt-4o"
        temperature: 0.3

环境变量配置 (.env)

# 阿里云API密钥
DASHSCOPE_API_KEY=sk-your-dashscope-key

# DeepSeek API密钥  
DEEPSEEK_API_KEY=sk-your-deepseek-key

# OpenAI API密钥
OPENAI_API_KEY=sk-your-openai-key

便捷函数使用

create_json_agent() - 快速创建JSON Agent

from src.agent_system import create_json_agent

# 快速创建支持JSON输出的Agent
agent = create_json_agent(
    provider="aliyun",
    model_name="qwen-max",
    name="json_extractor",
    prompt_template="从以下文本提取信息: {text}",
    response_model="MyModel",  # 可以是字符串或类
    instructions=["你是信息提取专家"]
)

🎯 实际应用示例

示例1: 情感分析Agent

from pydantic import BaseModel, Field
from typing import Literal
from src.agent_system import SubAgent

class SentimentResult(BaseModel):
    sentiment: Literal["positive", "negative", "neutral"] = Field(description="情感倾向")
    confidence: float = Field(description="置信度", ge=0.0, le=1.0)  
    explanation: str = Field(description="分析说明")

sentiment_agent = SubAgent(
    provider="aliyun",
    model_name="qwen-max",
    name="sentiment_analyzer", 
    instructions=[
        "你是专业的文本情感分析专家",
        "请准确识别文本的情感倾向",  
        "提供详细的分析依据"
    ],
    prompt_template="""
请分析以下文本的情感倾向:

文本内容: {text}

请识别情感倾向(positive/negative/neutral)、置信度(0-1)和分析说明。
""",
    response_model=SentimentResult
)

# 使用示例
result = sentiment_agent.run(template_vars={
    "text": "这个产品质量很好,我非常满意!"
})

print(f"情感: {result.sentiment}")
print(f"置信度: {result.confidence}")
print(f"说明: {result.explanation}")

示例2: 数据提取Agent

class DataExtraction(BaseModel):
    extracted_data: Dict[str, Any] = Field(description="提取的数据")
    extraction_count: int = Field(description="提取项目数量") 
    data_quality: Literal["high", "medium", "low"] = Field(description="数据质量评估")

extractor_agent = SubAgent(
    provider="aliyun",
    model_name="qwen-plus",
    name="data_extractor",
    instructions=[
        "你是数据提取专家",
        "从非结构化文本中提取结构化数据",
        "确保提取的数据准确完整"
    ],
    prompt_template="""
从以下{data_type}文档中提取关键数据:

文档内容:
{document}

提取要求:
{requirements}

请提取所有相关数据并评估数据质量。
""",
    response_model=DataExtraction
)

⚠️ 注意事项与最佳实践

1. 配置管理

  • API密钥安全: 始终使用环境变量存储API密钥切勿在代码中硬编码
  • 配置验证: 程序启动时验证配置文件完整性
  • 环境隔离: 开发、测试、生产环境使用不同的配置文件

2. Prompt设计

  • 明确指令: 提供清晰、具体的任务指令
  • 示例驱动: 在prompt中包含输入输出示例
  • 结构化模板: 使用结构化的prompt模板提高一致性

3. 错误处理

  • 异常捕获: 对Agent调用进行适当的异常处理
  • 重试机制: 对网络错误实现重试逻辑
  • 降级策略: 准备备用模型或简化输出格式

4. 性能优化

  • 缓存机制: 对相同输入实现结果缓存
  • 批处理: 将多个小任务合并为大任务处理
  • 模型选择: 根据任务复杂度选择合适的模型

🔧 故障排除

常见问题

1. 配置文件不存在

错误: FileNotFoundError: LLM配置文件不存在
解决: 确保 src/config/llm_config.yaml 文件存在且格式正确

2. API密钥未设置

错误: 环境变量 DASHSCOPE_API_KEY 未定义
解决: 设置相应的环境变量或在.env文件中配置

3. JSON解析失败

错误: JSONParseError: 所有解析策略都失败了
解决: 检查prompt设计确保要求明确的JSON格式输出

4. 模型验证失败

错误: Pydantic模型验证失败  
解决: 检查响应模型定义与实际输出是否匹配

调试技巧

启用调试模式

agent = SubAgent(
    provider="aliyun",
    model_name="qwen-max",
    debug_mode=True,  # 启用调试输出
    # ... 其他参数
)

查看生成的Prompt

# 构建并查看最终的prompt
prompt = agent.build_prompt({"key": "value"})
print(f"生成的prompt: {prompt}")

捕获详细错误信息

try:
    result = agent.run(template_vars={"text": "测试"})
except Exception as e:
    print(f"错误类型: {type(e)}")
    print(f"错误信息: {e}")
    import traceback
    traceback.print_exc()

🚦 版本信息

  • 当前版本: 0.1.0
  • 依赖要求:
    • Python >= 3.8
    • agno >= 0.1.0
    • pydantic >= 2.0.0
    • pyyaml >= 6.0.0

📞 支持与反馈

如遇到问题或有功能建议请联系开发团队或提交issue。


MedResearcher SubAgent系统 - 让AI更智能让开发更简单 🎉