MedResearcher/experiment_runner.py

153 lines
4.1 KiB
Python
Raw Normal View History

#!/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()