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)    收藏  举报