TravelContentCreator/docs/streaming.md

209 lines
6.3 KiB
Markdown
Raw 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.

# 流式输出处理功能
TravelContentCreator 现在支持三种不同的流式输出处理方法,让您能够更灵活地处理 AI 模型生成的文本内容。这些方法都在 `AI_Agent` 类中实现,可以根据不同的使用场景进行选择。
## 为什么需要流式处理?
流式处理Streaming相比于传统的一次性返回完整响应的方式有以下优势
1. **实时性**:内容生成的同时即可开始处理,无需等待完整响应
2. **用户体验更好**:可以实现"打字机效果",让用户看到文本逐步生成的过程
3. **更早检测错误**:可以在响应生成过程中及早发现问题
4. **长文本处理更高效**:特别适合生成较长的内容,避免长时间等待
## 流式处理方法
`AI_Agent` 类提供了三种不同模式的流式处理方法:
### 1. 同步流式响应 (generate_text_stream)
这种方法虽然使用了流式 API 连接,但会将所有的输出整合后一次性返回,适合简单的 API 调用。
```python
def generate_text_stream(self, system_prompt, user_prompt, temperature, top_p, presence_penalty):
"""
生成文本内容使用流式API但返回完整响应
Args:
system_prompt: 系统提示词
user_prompt: 用户提示词
temperature: 温度参数
top_p: 核采样参数
presence_penalty: 存在惩罚参数
Returns:
str: 完整的生成文本
"""
```
使用示例:
```python
agent = AI_Agent(base_url, model_name, api_key, timeout=30, stream_chunk_timeout=10)
result = agent.generate_text_stream(system_prompt, user_prompt, 0.7, 0.9, 0.0)
print(result) # 输出完整的生成结果
```
### 2. 回调式流式响应 (generate_text_stream_with_callback)
这种方法使用回调函数来处理流中的每个文本块,非常适合实时显示、分析或保存过程数据,更加灵活。
```python
def generate_text_stream_with_callback(self, system_prompt, user_prompt,
callback_fn, temperature=0.7, top_p=0.9,
presence_penalty=0.0):
"""
生成文本流并通过回调函数处理每个块
Args:
system_prompt: 系统提示词
user_prompt: 用户提示词
callback_fn: 处理每个文本块的回调函数,接收(content, is_last, is_timeout, is_error, error)参数
temperature: 温度参数
top_p: 核采样参数
presence_penalty: 存在惩罚参数
Returns:
str: 完整的响应文本
"""
```
回调函数应符合以下格式:
```python
def my_callback(content, is_last=False, is_timeout=False, is_error=False, error=None):
"""
处理流式响应的回调函数
Args:
content: 文本块内容
is_last: 是否为最后一个块
is_timeout: 是否发生超时
is_error: 是否发生错误
error: 错误信息
"""
if content:
print(content, end="", flush=True) # 实时打印
# 处理特殊情况
if is_last:
print("\n完成生成")
if is_timeout:
print("警告: 响应流超时")
if is_error:
print(f"错误: {error}")
```
使用示例:
```python
agent = AI_Agent(base_url, model_name, api_key, timeout=30, stream_chunk_timeout=10)
result = agent.generate_text_stream_with_callback(
system_prompt,
user_prompt,
my_callback, # 传入回调函数
temperature=0.7,
top_p=0.9,
presence_penalty=0.0
)
```
### 3. 异步流式响应 (async_generate_text_stream)
这种方法基于 `asyncio`,返回一个异步生成器,非常适合与其他异步操作集成,例如在异步网络应用中使用。
```python
async def async_generate_text_stream(self, system_prompt, user_prompt, temperature=0.7, top_p=0.9, presence_penalty=0.0):
"""
异步生成文本流
Args:
system_prompt: 系统提示词
user_prompt: 用户提示词
temperature: 温度参数
top_p: 核采样参数
presence_penalty: 存在惩罚参数
Yields:
str: 生成的文本块
Raises:
Exception: 如果API调用在所有重试后失败
"""
```
使用示例:
```python
async def demo_async_stream():
agent = AI_Agent(base_url, model_name, api_key, timeout=30, stream_chunk_timeout=10)
full_response = ""
try:
# 使用异步生成器
async for chunk in agent.async_generate_text_stream(
system_prompt,
user_prompt,
temperature=0.7,
top_p=0.9,
presence_penalty=0.0
):
print(chunk, end="", flush=True) # 实时显示
full_response += chunk
# 这里可以同时执行其他异步操作
# await some_other_async_operation()
except Exception as e:
print(f"错误: {e}")
finally:
agent.close()
# 在异步环境中运行
asyncio.run(demo_async_stream())
```
## 超时处理
所有流式处理方法都支持两种超时设置:
1. **全局请求超时**控制整个API请求的最大持续时间
2. **流块超时**:控制接收连续两个数据块之间的最大等待时间
在创建 `AI_Agent` 实例时设置:
```python
agent = AI_Agent(
base_url="your_api_base_url",
model_name="your_model_name",
api="your_api_key",
timeout=60, # 整体请求超时(秒)
max_retries=3, # 最大重试次数
stream_chunk_timeout=10 # 流块超时(秒)
)
```
## 完整示例
我们提供了一个完整的示例脚本,演示所有三种流式处理方法的使用:
```
examples/test_stream.py
```
运行方式:
```bash
cd TravelContentCreator
python examples/test_stream.py
```
这将依次演示三种流式处理方法,并展示它们的输出和性能差异。
## 在WebUI中的应用
TravelContentCreator的WebUI已经集成了基于回调的流式处理实现了生成内容的实时显示大大提升了用户体验特别是在生成长篇内容时。
## 在自定义项目中使用
如果您想在自己的项目中使用这些流式处理功能,只需导入 `AI_Agent` 类并按照上述示例使用相应的方法即可。所有流式处理方法都内置了完善的错误处理和重试机制,提高了生产环境中的稳定性。