Python代码调用大模型2
实现多轮对话
封装到类中
from openai import OpenAI
class MultiTurnChat:
def __init__(self, base_url: str, model: str, system_prompt: str = None):
self.client = OpenAI(base_url=base_url)
self.model = model
self.chat_history = []
# 若提供了系统提示词,则将其添加至对话历史起始位置
if system_prompt:
self.chat_history.append({"role": "system", "content": system_prompt})
#语法备注:设置content位str类型,函数没有返回值.
#添加content的内容到实例变量chat_history里
def add_user_message(self, content: str) -> None:
self.chat_history.append({"role": "user", "content": content})
def add_assistant_message(self, content: str) -> None:
self.chat_history.append({"role": "assistant", "content": content})
# 默认返回String
#开始时添加用户消息到历史,结束时添加模型回复到历史
def send(self, user_message: str) -> str:
"""发送消息"""
# 1.添加用户消息到历史
self.add_user_message(user_message)
# 2.调用模型
completion = self.client.chat.completions.create(
model=self.model,
messages=self.chat_history
)
# 3.提取模型的回复结果
reply = completion.choices[0].message.content
# 4.添加模型的回复到历史 {"role": "?"}
self.add_assistant_message(reply)
return reply
if __name__ == '__main__':
# 1.配置参数
BASE_URL = "https://dashscope.aliyuncs.com/compatible-mode/v1"
MODEL = "qwen3-max"
SYSTEM_MESSAGE = "背景设定:你现在是一个AI老师,负责上AI课程。"
# 2.创建多轮对话对象
chat = MultiTurnChat(
base_url=BASE_URL,
model=MODEL,
system_prompt=SYSTEM_MESSAGE
)
print("多轮对话已启动,输入内容后按回车发送。输入 'exit' 或 'quit' 退出程序。\n")
# 3.循环接受用户输入并且回答
while True:
# 获取用户输入
user_input = input("用户:")
# 退出条件判断
if user_input in ["exit", "quit"]:
print("对话结束!拜拜~")
break
# 跳过空的输入
# .strip():字符串方法,去除字符串首尾的空白字符(空格、制表符 \t、换行符 \n 等)
# (隐式布尔转换):在 Python 中,空字符串 "" 被视为 False,非空字符串被视为 True
if not user_input.strip():
print("请勿输入空白字符!")
continue
# 调用模型并且回复
reply = chat.send(user_input)
# 打印模型输出
print(f"AI老师:{reply}")
如何开启流失输出 & 统计token消耗量
import os
from openai import OpenAI
# 1.创建客户端对象
client = OpenAI(
api_key=os.getenv("DASHSCOPE_API_KEY"),
base_url="https://dashscope.aliyuncs.com/compatible-mode/v1",
)
# 2. 和模型交互:开启流失输出
completion = client.chat.completions.create(
model="qwen-plus",
messages=[{'role': 'system', 'content': 'You are a helpful assistant.'},
{'role': 'user', 'content': '你是谁?'}],
stream=True, # 开启流式输出
#计费统计
stream_options={"include_usage": True}
)
# 3. 按照chunk输出内容
for chunk in completion:
#print(f"\nmodel_dump_json : {chunk.model_dump_json()}\n")
if chunk.choices:
content = chunk.choices[0].delta.content
if content:
print(content, end='', flush=True)
elif hasattr(chunk, 'usage') and chunk.usage:
print(f"\n\nToken使用情况: {chunk.usage} \n")
流式输出多轮对话
from openai import OpenAI
class MultiTurnChat:
def __init__(self, base_url: str, model: str, system_prompt: str = None):
self.client = OpenAI(base_url=base_url)
self.model = model
self.chat_history = []
# 若提供了系统提示词,则将其添加至对话历史起始位置
if system_prompt:
self.chat_history.append({"role": "system", "content": system_prompt})
def add_user_message(self, content: str) -> None:
self.chat_history.append({"role": "user", "content": content})
def add_assistant_message(self, content: str) -> None:
self.chat_history.append({"role": "assistant", "content": content})
def send(self, user_message: str):
"""发送消息"""
# 1.添加用户消息到历史
self.add_user_message(user_message)
# 2.调用模型
stream = self.client.chat.completions.create(
model=self.model,
messages=self.chat_history,
stream=True
)
# 3.提取模型的回复结果
# reply = completion.choices[0].message.content 一次性调用
full_reply = ""
for chunk in stream:
if chunk.choices[0].delta.content:
content = chunk.choices[0].delta.content
full_reply += content
#用yield 逐块吐给上层调用者(主循环中的 for chunk in chat.send(...)),直接 遍历 Completion迭代器结果中的chunk时也是基于yield
yield content # 逐块返回给调用方
# 4.添加模型的回复到历史 {"role": "?"}
self.add_assistant_message(full_reply)
if __name__ == '__main__':
# 1.配置参数
BASE_URL = "https://dashscope.aliyuncs.com/compatible-mode/v1"
MODEL = "qwen3-max"
SYSTEM_MESSAGE = "背景设定:你现在是一个AI老师,负责上AI课程。"
# 2.创建多轮对话对象
chat = MultiTurnChat(
base_url=BASE_URL,
model=MODEL,
system_prompt=SYSTEM_MESSAGE
)
print("多轮对话已启动,输入内容后按回车发送。输入 'exit' 或 'quit' 退出程序。\n")
# 3.循环接受用户输入并且回答
while True:
# 获取用户输入
user_intput = input("用户:")
# 退出条件判断
if user_intput in ["exit", "quit"]:
print("对话结束!拜拜~")
break
# 跳过空的输入
if not user_intput.strip():
print("请勿输入空白字符!")
continue
# 调用模型并且回复
print("AI老师:", end="", flush=True)
for chunk in chat.send(user_intput):
print(chunk, end='', flush=True)
print()
posted on 2026-07-23 23:54 passionConstant 阅读(4) 评论(0) 收藏 举报
浙公网安备 33010602011771号