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()
|