基于阿里百炼大模型多伦对话流式输出代码
·
import os
from http import HTTPStatus
from dashscope import Application
class StreamingMultiTurnChat:
“”“流式多轮对话封装类,自动管理 session_id,保持对话上下文,支持流式输出”“”
def __init__(self, api_key=None, app_id=None):
"""
初始化对话实例
:param api_key: 百炼 API Key
:param app_id: 百炼应用 ID
"""
self.api_key = api_key or os.getenv("DASHSCOPE_API_KEY", "sk-xxxxxxxxxxxx")
self.app_id = app_id or "xxooooxxxxooooxxxxooooxx"
self.session_id = None # 会话ID,首次调用为 None,之后自动更新
def ask(self, prompt):
"""
发送用户问题,返回一个生成器,每次 yield 一个文本块(流式输出)
:param prompt: 用户输入的问题
:return: 生成器,迭代得到模型回答的文本片段;若请求失败则 yield 错误信息
"""
responses = Application.call(
api_key=self.api_key,
app_id=self.app_id,
prompt=prompt,
session_id=self.session_id,
stream=True, # 开启流式输出
incremental_output=True # 增量输出,每次只返回新增的文本
)
# 遍历流式响应
for response in responses:
if response.status_code != HTTPStatus.OK:
# 发生错误,yield 错误信息并停止迭代
error_msg = (f"请求失败,request_id={response.request_id},"
f"错误码={response.status_code},信息={response.message}")
yield error_msg
break
# 更新会话ID(流式响应中每个包都包含相同的 session_id,取第一次即可)
if self.session_id is None and hasattr(response.output, 'session_id'):
self.session_id = response.output.session_id
# 提取当前文本块并返回
text_chunk = response.output.text
yield text_chunk
def reset(self):
"""重置会话,开始全新的对话"""
self.session_id = None
---------- 使用示例:控制台交互(流式输出) ----------
if name == “main”:
chat = StreamingMultiTurnChat() #第一个接口,初始化
# 第一轮:流式打印回答
for chunk in chat.ask("你是谁?"): #第二个接口,输入问题,解析回答
print(chunk, end="", flush=True)
print("\n**************************************\n")
# 第二轮:基于上下文继续对话
for chunk in chat.ask("你擅长最什么?"):
print(chunk, end="", flush=True)
print("\n**************************************\n")
# 第三轮:基于上下文继续对话
for chunk in chat.ask("刚才问了什么问题?"):
print(chunk, end="", flush=True)
print("\n**************************************\n")
# 重置会话,清除历史记忆
chat.reset() #第三个接口,重置会话
for chunk in chat.ask("刚才问了什么问题?"):
print(chunk, end="", flush=True)
print("\n**************************************\n")
更多推荐


所有评论(0)