2025-04-22 16:30:33 +08:00
|
|
|
|
#!/usr/bin/env python3
|
|
|
|
|
|
# -*- coding: utf-8 -*-
|
|
|
|
|
|
|
2025-04-23 16:18:02 +08:00
|
|
|
|
"""
|
|
|
|
|
|
测试AI_Agent的流式处理方法
|
|
|
|
|
|
|
|
|
|
|
|
此脚本演示TravelContentCreator中AI_Agent类的三种流式输出处理方法:
|
|
|
|
|
|
1. 同步流式响应 (generate_text_stream)
|
|
|
|
|
|
2. 回调式流式响应 (generate_text_stream_with_callback)
|
|
|
|
|
|
3. 异步流式响应 (async_generate_text_stream)
|
|
|
|
|
|
"""
|
|
|
|
|
|
|
2025-04-22 16:30:33 +08:00
|
|
|
|
import os
|
|
|
|
|
|
import sys
|
2025-04-23 16:18:02 +08:00
|
|
|
|
import asyncio
|
2025-04-22 17:36:29 +08:00
|
|
|
|
import time
|
2025-04-23 16:18:02 +08:00
|
|
|
|
from pathlib import Path
|
|
|
|
|
|
|
|
|
|
|
|
# 添加项目根目录到Python路径
|
|
|
|
|
|
project_root = str(Path(__file__).parent.parent)
|
|
|
|
|
|
if project_root not in sys.path:
|
|
|
|
|
|
sys.path.insert(0, project_root)
|
|
|
|
|
|
|
|
|
|
|
|
from core.ai_agent import AI_Agent
|
|
|
|
|
|
|
|
|
|
|
|
# 示例提示词
|
|
|
|
|
|
SYSTEM_PROMPT = """你是一个专业的旅游内容创作助手,请根据用户的提示生成相关内容。"""
|
|
|
|
|
|
USER_PROMPT = """请为我生成一篇关于福建泰宁古城的旅游攻略,包括著名景点、美食推荐和最佳游玩季节。字数控制在300字以内。"""
|
|
|
|
|
|
|
|
|
|
|
|
def print_separator(title):
|
|
|
|
|
|
"""打印分隔线和标题"""
|
|
|
|
|
|
print("\n" + "="*50)
|
|
|
|
|
|
print(f" {title} ".center(50, "="))
|
|
|
|
|
|
print("="*50 + "\n")
|
|
|
|
|
|
|
|
|
|
|
|
def demo_sync_stream():
|
|
|
|
|
|
"""演示同步流式响应方法"""
|
|
|
|
|
|
print_separator("同步流式响应 (generate_text_stream)")
|
|
|
|
|
|
|
|
|
|
|
|
# 创建AI_Agent实例
|
|
|
|
|
|
agent = AI_Agent(
|
|
|
|
|
|
base_url="vllm", # 使用本地vLLM服务
|
|
|
|
|
|
model_name="qwen2-7b-instruct", # 或其他您配置的模型名称
|
|
|
|
|
|
api="EMPTY", # vLLM不需要API key
|
|
|
|
|
|
timeout=60, # 整体请求超时时间(秒)
|
|
|
|
|
|
stream_chunk_timeout=10 # 流式块超时时间(秒)
|
2025-04-22 17:36:29 +08:00
|
|
|
|
)
|
2025-04-23 16:18:02 +08:00
|
|
|
|
|
|
|
|
|
|
print("开始生成内容...")
|
|
|
|
|
|
start_time = time.time()
|
|
|
|
|
|
|
|
|
|
|
|
# 使用同步流式方法
|
|
|
|
|
|
result = agent.generate_text_stream(
|
|
|
|
|
|
SYSTEM_PROMPT,
|
|
|
|
|
|
USER_PROMPT,
|
|
|
|
|
|
temperature=0.7,
|
|
|
|
|
|
top_p=0.9,
|
|
|
|
|
|
presence_penalty=0.0
|
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
end_time = time.time()
|
|
|
|
|
|
|
|
|
|
|
|
print(f"\n\n完整生成内容:\n{result}")
|
|
|
|
|
|
print(f"\n生成完成! 耗时: {end_time - start_time:.2f}秒")
|
|
|
|
|
|
|
|
|
|
|
|
# 关闭agent
|
|
|
|
|
|
agent.close()
|
|
|
|
|
|
|
|
|
|
|
|
def demo_callback_stream():
|
|
|
|
|
|
"""演示回调式流式响应方法"""
|
|
|
|
|
|
print_separator("回调式流式响应 (generate_text_stream_with_callback)")
|
|
|
|
|
|
|
|
|
|
|
|
# 创建AI_Agent实例
|
|
|
|
|
|
agent = AI_Agent(
|
|
|
|
|
|
base_url="vllm",
|
|
|
|
|
|
model_name="qwen2-7b-instruct",
|
|
|
|
|
|
api="EMPTY",
|
|
|
|
|
|
timeout=60,
|
|
|
|
|
|
stream_chunk_timeout=10
|
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
# 定义回调函数
|
|
|
|
|
|
def my_callback(content, is_last=False, is_timeout=False, is_error=False, error=None):
|
|
|
|
|
|
"""处理流式响应的回调函数"""
|
|
|
|
|
|
if content:
|
|
|
|
|
|
# 实时打印内容,不换行
|
|
|
|
|
|
print(content, end="", flush=True)
|
2025-04-22 16:30:33 +08:00
|
|
|
|
|
2025-04-23 16:18:02 +08:00
|
|
|
|
if is_last:
|
|
|
|
|
|
print("\n")
|
|
|
|
|
|
if is_timeout:
|
|
|
|
|
|
print("警告: 响应流超时")
|
|
|
|
|
|
if is_error:
|
|
|
|
|
|
print(f"错误: {error}")
|
|
|
|
|
|
|
|
|
|
|
|
print("开始生成内容...")
|
|
|
|
|
|
start_time = time.time()
|
|
|
|
|
|
|
|
|
|
|
|
# 使用回调式流式方法
|
|
|
|
|
|
result = agent.generate_text_stream_with_callback(
|
|
|
|
|
|
SYSTEM_PROMPT,
|
|
|
|
|
|
USER_PROMPT,
|
|
|
|
|
|
my_callback,
|
|
|
|
|
|
temperature=0.7,
|
|
|
|
|
|
top_p=0.9,
|
|
|
|
|
|
presence_penalty=0.0
|
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
end_time = time.time()
|
|
|
|
|
|
print(f"\n生成完成! 耗时: {end_time - start_time:.2f}秒")
|
|
|
|
|
|
|
|
|
|
|
|
# 关闭agent
|
|
|
|
|
|
agent.close()
|
|
|
|
|
|
|
|
|
|
|
|
async def demo_async_stream():
|
|
|
|
|
|
"""演示异步流式响应方法"""
|
|
|
|
|
|
print_separator("异步流式响应 (async_generate_text_stream)")
|
|
|
|
|
|
|
|
|
|
|
|
# 创建AI_Agent实例
|
|
|
|
|
|
agent = AI_Agent(
|
|
|
|
|
|
base_url="vllm",
|
|
|
|
|
|
model_name="qwen2-7b-instruct",
|
|
|
|
|
|
api="EMPTY",
|
|
|
|
|
|
timeout=60,
|
|
|
|
|
|
stream_chunk_timeout=10
|
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
print("开始生成内容...")
|
|
|
|
|
|
start_time = time.time()
|
|
|
|
|
|
full_response = ""
|
|
|
|
|
|
|
|
|
|
|
|
# 使用异步流式方法
|
|
|
|
|
|
try:
|
|
|
|
|
|
async_stream = agent.async_generate_text_stream(
|
|
|
|
|
|
SYSTEM_PROMPT,
|
|
|
|
|
|
USER_PROMPT,
|
|
|
|
|
|
temperature=0.7,
|
|
|
|
|
|
top_p=0.9,
|
|
|
|
|
|
presence_penalty=0.0
|
2025-04-22 16:30:33 +08:00
|
|
|
|
)
|
2025-04-23 16:18:02 +08:00
|
|
|
|
|
|
|
|
|
|
# 异步迭代流
|
|
|
|
|
|
async for content in async_stream:
|
|
|
|
|
|
# 累积完整响应
|
|
|
|
|
|
full_response += content
|
|
|
|
|
|
# 实时打印内容
|
|
|
|
|
|
print(content, end="", flush=True)
|
|
|
|
|
|
|
2025-04-22 16:30:33 +08:00
|
|
|
|
except Exception as e:
|
2025-04-23 16:18:02 +08:00
|
|
|
|
print(f"\n生成过程中出错: {e}")
|
|
|
|
|
|
|
|
|
|
|
|
end_time = time.time()
|
|
|
|
|
|
print(f"\n\n生成完成! 耗时: {end_time - start_time:.2f}秒")
|
|
|
|
|
|
|
|
|
|
|
|
# 关闭agent
|
|
|
|
|
|
agent.close()
|
|
|
|
|
|
|
|
|
|
|
|
async def main():
|
|
|
|
|
|
"""主函数"""
|
|
|
|
|
|
print("Testing AI_Agent streaming methods...")
|
|
|
|
|
|
|
|
|
|
|
|
# 1. 测试同步流式响应
|
|
|
|
|
|
demo_sync_stream()
|
|
|
|
|
|
|
|
|
|
|
|
# 2. 测试回调式流式响应
|
|
|
|
|
|
demo_callback_stream()
|
|
|
|
|
|
|
|
|
|
|
|
# 3. 测试异步流式响应
|
|
|
|
|
|
await demo_async_stream()
|
|
|
|
|
|
|
|
|
|
|
|
print("\n所有测试完成!")
|
2025-04-22 16:30:33 +08:00
|
|
|
|
|
|
|
|
|
|
if __name__ == "__main__":
|
2025-04-23 16:18:02 +08:00
|
|
|
|
# 运行异步主函数
|
|
|
|
|
|
asyncio.run(main())
|