- 添加详细的SubAgent使用指南(README.md) - 创建完整的Pydantic模型示例(example_models.py) - 实现基础使用示例,展示核心功能(basic_example.py) - 构建复杂文本分析应用示例(text_analysis_example.py) - 提供数字提取实验运行器作为参考示例 - 包含多Agent协作、批量处理、性能监控等高级功能 - 支持交互式演示和完整的错误处理机制
153 lines
4.1 KiB
Python
153 lines
4.1 KiB
Python
#!/usr/bin/env python3
|
||
"""
|
||
数字提取实验运行器
|
||
|
||
基于Agno框架的SubAgent系统,从文本中提取数字并进行解释
|
||
展示SubAgent系统的核心功能:配置读取、模型创建、动态prompt构建、JSON解析
|
||
"""
|
||
|
||
import sys
|
||
import os
|
||
from typing import List
|
||
|
||
# 添加src路径到Python路径
|
||
sys.path.append(os.path.join(os.path.dirname(__file__), 'src'))
|
||
|
||
from src.agent_system import SubAgent, create_json_agent
|
||
from number_extraction_models import NumberExtractionResult
|
||
|
||
|
||
def create_number_extraction_agent() -> SubAgent:
|
||
"""创建数字提取专用SubAgent"""
|
||
|
||
instructions = [
|
||
"你是一个专业的数字提取专家",
|
||
"你的任务是从给定文本中识别和提取所有的数字",
|
||
"重点关注:整数、小数、百分比、比率、统计数据等",
|
||
"对每个数字提供准确的上下文和清晰的解释"
|
||
]
|
||
|
||
prompt_template = """
|
||
请仔细分析以下文本,提取其中的所有数字:
|
||
|
||
【输入文本】
|
||
{input_text}
|
||
|
||
【提取要求】
|
||
1. 识别文本中的所有数字(整数、小数、百分比、比率等)
|
||
2. 对每个数字进行分类和解释
|
||
3. 记录数字出现的完整上下文
|
||
4. 识别数字的单位(如果有)
|
||
5. 提供对整个文本中数字的总体摘要
|
||
"""
|
||
|
||
try:
|
||
agent = SubAgent(
|
||
provider="aliyun",
|
||
model_name="qwen-max",
|
||
name="number_extractor",
|
||
description="专业的文本数字提取和解释系统",
|
||
instructions=instructions,
|
||
prompt_template=prompt_template,
|
||
response_model=NumberExtractionResult
|
||
)
|
||
|
||
print("✅ 数字提取Agent初始化成功")
|
||
return agent
|
||
|
||
except Exception as e:
|
||
print(f"❌ Agent初始化失败: {e}")
|
||
raise
|
||
|
||
|
||
def display_results(result: NumberExtractionResult):
|
||
"""展示提取结果"""
|
||
print("\n" + "="*50)
|
||
print("🔍 数字提取结果")
|
||
print("="*50)
|
||
|
||
print(f"摘要: {result.summary}")
|
||
print(f"总数: {result.total_count}")
|
||
|
||
if result.extractions:
|
||
for i, item in enumerate(result.extractions, 1):
|
||
print(f"\n数字{i}: {item.number}")
|
||
if item.unit:
|
||
print(f" 单位: {item.unit}")
|
||
print(f" 上下文: {item.context}")
|
||
print(f" 解释: {item.explanation}")
|
||
|
||
print("="*50)
|
||
|
||
|
||
def get_user_input() -> str:
|
||
"""获取用户输入"""
|
||
print("\n请输入要分析的文本:")
|
||
print("(输入'quit'退出,输入'END'结束输入)")
|
||
|
||
lines = []
|
||
while True:
|
||
try:
|
||
line = input(">>> ").strip()
|
||
if line.lower() == 'quit':
|
||
return 'quit'
|
||
elif line.upper() == 'END':
|
||
break
|
||
else:
|
||
lines.append(line)
|
||
break
|
||
except (KeyboardInterrupt, EOFError):
|
||
return 'quit'
|
||
|
||
return '\n'.join(lines).strip()
|
||
|
||
|
||
def main():
|
||
"""主函数"""
|
||
print("🎉 数字提取工具启动!")
|
||
|
||
try:
|
||
agent = create_number_extraction_agent()
|
||
except Exception as e:
|
||
print(f"初始化失败: {e}")
|
||
return
|
||
|
||
print("✅ 系统就绪")
|
||
|
||
while True:
|
||
user_input = get_user_input()
|
||
|
||
if user_input == 'quit':
|
||
print("再见!")
|
||
break
|
||
|
||
if not user_input:
|
||
continue
|
||
|
||
try:
|
||
print(f"分析中... (文本长度: {len(user_input)}字符)")
|
||
result = agent.run(template_vars={'input_text': user_input})
|
||
display_results(result)
|
||
|
||
except Exception as e:
|
||
print(f"提取失败: {e}")
|
||
print("请尝试重新输入")
|
||
|
||
|
||
def test_basic():
|
||
"""基础测试"""
|
||
try:
|
||
agent = create_number_extraction_agent()
|
||
|
||
# 测试prompt构建
|
||
prompt = agent.build_prompt({'input_text': '测试数字95.2%'})
|
||
print(f"✅ 测试通过,prompt长度: {len(prompt)}")
|
||
return True
|
||
|
||
except Exception as e:
|
||
print(f"❌ 测试失败: {e}")
|
||
return False
|
||
|
||
|
||
if __name__ == "__main__":
|
||
main() |