本文代码基于下文大佬代码进行小小修改

DeepSeek-V3 API 调用+代码(流式输出切换+持续交互chat)_deepseek源代码-CSDN博客

由于deepseek r1在返回时候,会有context 和reasoning_context两个参数,所以直接套用v3的话会出现下面的问题:能用,但不美观,所以进行了个小小的补丁,实现推理过程的流式输出,主要修改部分是chat()部分的流式输出,代码如下:

from openai import OpenAI
 
# 初始化 OpenAI 客户端
client = OpenAI(
    api_key="api_key",  # 替换自己的 API 密钥
    base_url="https://api.siliconflow.cn/v1",
)
messages = [{"role": "system", "content": "You are a helpful assistant."}]
stream_mode = True  #True:启用流式输出,False:非流式输出
 

def get_response(client, messages, stream=False):
    """获取助手回复"""
    try:
        response = client.chat.completions.create(
            model="deepseek-ai/DeepSeek-R1",
            messages=messages,
            # max_tokens=1024,  #默认4096
            # response_format={
            #     'type': 'text'
            # },
            # temperature=0.7,
            stream=stream,  # 根据传入的参数控制流式输出,默认false
        )
        return response
    except Exception as e:
        print(f"API 请求失败: {str(e)}")
        return None

# 流式拼接(保存对话历史)
def get_stream_response(response):
    """提取并拼接流式返回的内容"""
    return ''.join(
        chunk['choices'][0]['delta']['content']
        for chunk in response
        if chunk.get('choices') and chunk['choices'][0].get('delta') and chunk['choices'][0]['delta'].get('content')
    )
 
def chat():
    print("欢迎使用 DeepSeek 聊天助手!输入 '退出' 来结束对话。")
 
    while True:
        user_input = input("你: ")
        if user_input.lower() in ["退出", "exit", "quit"]:
            print("聊天结束。再见!")
            break
 
        # 添加用户消息到对话历史
        messages.append({"role": "user", "content": user_input})
 
        # 获取助手回复
        response = get_response(client, messages, stream=stream_mode)
 
        if response:
            if stream_mode:
                print("助手: ", end='', flush=True)  # 不换行,实时输出
                # 逐步接收并输出助手的回复
                for chunk in response:
                    if chunk.choices[0].delta.content == None :
                        chunk_reasoning_content_message = chunk.choices[0].delta.reasoning_content

                        print(chunk_reasoning_content_message, end='', flush=True)  # 逐步输出
                    else:
                        chunk_content_message = chunk.choices[0].delta.content
                        print(chunk_content_message, end='', flush=True)  # 逐步输出
                print()  # 输出完毕后换行
            else:
                assistant_response = response.choices[0].message.content
                print(f"助手: {assistant_response}")
 
            assistant_response = get_stream_response(response) if stream_mode else response.choices[0].message.content
            messages.append({"role": "assistant", "content": assistant_response})
        else:
            print("未能获取回复,请查找原因。")
 
 
if __name__ == "__main__":
    chat()

即可实现reasoning_context的流式输出,然后再输出context。

下图是效果:

具体介绍可见好兄弟的公众号文章:通过API调用Deepseek R1模型,实现流式对话

如果有大佬能够优化或者做个ui界面就更好了。

Logo

火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。

更多推荐