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

428 lines
11 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# SubAgent系统使用指南
## 📚 概述
SubAgent是基于Agno框架构建的智能代理系统为MedResearcher项目提供强大的AI功能。它支持多种LLM提供商提供动态prompt构建、JSON结构化输出和零容错解析等核心功能。
## ✨ 核心特性
### 🤖 智能代理核心
- **多提供商支持**: 阿里云(qwen)、DeepSeek、OpenAI等主流LLM服务
- **动态Prompt**: 支持模板变量替换的灵活prompt构建系统
- **结构化输出**: 基于Pydantic模型的JSON格式化响应
- **零容错解析**: 多策略JSON解析确保即使不完美输出也能解析
### 🔧 配置管理
- **YAML配置**: 统一的配置文件管理,支持环境变量
- **模型工厂**: 自动化的模型实例创建和参数管理
- **灵活配置**: 支持运行时参数覆盖和动态配置
### 🛠 开发便利性
- **类型安全**: 完整的类型提示支持
- **异常处理**: 详细的错误信息和异常层级
- **调试支持**: 内置日志和调试模式
## 🚀 快速开始
### 1. 基础设置
首先确保已安装依赖:
```bash
uv add agno pydantic pyyaml
```
### 2. 配置LLM服务
`src/config/llm_config.yaml`中配置你的LLM服务
```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
```
### 3. 设置环境变量
创建`.env`文件或设置环境变量:
```bash
export DASHSCOPE_API_KEY="your_api_key_here"
```
### 4. 创建你的第一个Agent
```python
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核心类
#### 初始化参数
```python
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
```python
# 设置带变量的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() - 执行推理
```python
# 方式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() - 获取模型信息
```python
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响应模型
#### 基础模型定义
```python
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
}
```
#### 复杂嵌套模型
```python
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)
```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)
```bash
# 阿里云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
```python
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
```python
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
```python
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模型验证失败
解决: 检查响应模型定义与实际输出是否匹配
```
### 调试技巧
#### 启用调试模式
```python
agent = SubAgent(
provider="aliyun",
model_name="qwen-max",
debug_mode=True, # 启用调试输出
# ... 其他参数
)
```
#### 查看生成的Prompt
```python
# 构建并查看最终的prompt
prompt = agent.build_prompt({"key": "value"})
print(f"生成的prompt: {prompt}")
```
#### 捕获详细错误信息
```python
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更智能让开发更简单* 🎉