209 lines
6.3 KiB
Markdown
209 lines
6.3 KiB
Markdown
|
|
# 流式输出处理功能
|
|||
|
|
|
|||
|
|
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` 类并按照上述示例使用相应的方法即可。所有流式处理方法都内置了完善的错误处理和重试机制,提高了生产环境中的稳定性。
|