说明

对AI应用开发所涉及到的流程、工具、技能进行系列介绍,全部文章收录于《AI应用开发》专栏。关注+收藏,不错过后续精彩。

前置文章

AI应用开发01-环境准备

从零构建 AI 聊天机器人:基于 DeepSeek 的实践指南

一、项目目标

构建一个具备以下特性的 Python 命令行聊天机器人:

  • 调用 DeepSeek 大模型 API 进行对话
  • 保持多轮对话的上下文记忆
  • 支持流式/非流式输出切换
  • 每次会话自动保存聊天记录到本地文件

二、开发环境准备

2.1 前提条件

  • 操作系统:Windows 10/11
  • Python 版本:3.9 或更高(推荐 3.10+)
  • 终端:PowerShell

2.2 项目目录结构

F:\ai-dev\               # 项目根目录
├── agent-demo\          # 虚拟环境目录(由 venv 创建)
├── .env                 # 存放 API 密钥(不提交到 Git)
├── chatbot.py           # 主程序脚本
└── chat_logs\           # 自动生成的聊天记录文件夹

2.3 虚拟环境创建与激活

在项目根目录打开终端,执行:

# 创建虚拟环境(用 Python 3.14 示例,实际可用任何版本)
py -3.14 -m venv agent-demo
# 激活虚拟环境
.\agent-demo\Scripts\Activate.ps1

成功后终端提示符前会出现 (agent-demo)

2.4 安装依赖包

激活虚拟环境后安装:

python -m pip install --upgrade pip
python -m pip install openai python-dotenv
  • openai:DeepSeek API 完全兼容 OpenAI 格式,可直接使用该库。
  • python-dotenv:安全地从 .env 文件加载密钥。

2.5 配置 API 密钥

在项目根目录创建 .env 文件,内容:

DEEPSEEK_API_KEY=sk-你的真实API密钥
DEEPSEEK_BASE_URL=https://api.deepseek.com

在代码中通过 load_dotenv() 读取,避免密钥硬编码。

注意:务必在 .gitignore 中添加 .env,防止泄露。

三、核心功能实现步骤

3.1 第一个 API 调用 (hello_deepseek.py)

验证环境是否正常,向 DeepSeek 发送一次请求。

import os
from openai import OpenAI
from dotenv import load_dotenv

load_dotenv()
client = OpenAI(
    api_key=os.getenv("DEEPSEEK_API_KEY"),
    base_url=os.getenv("DEEPSEEK_BASE_URL")
)

response = client.chat.completions.create(
    model="deepseek-chat",
    messages=[{"role": "user", "content": "用一句话介绍你自己"}]
)
print(response.choices[0].message.content)

运行 python hello_deepseek.py,若返回正常回复,说明环境无误。

3.2 多轮对话与记忆(chatbot.py 基础版)

让机器人记住前面的对话内容,关键在于维护一个 messages 列表。

import os
from openai import OpenAI
from dotenv import load_dotenv

load_dotenv()
client = OpenAI(
    api_key=os.getenv("DEEPSEEK_API_KEY"),
    base_url=os.getenv("DEEPSEEK_BASE_URL")
)

system_prompt = "你是一个风趣幽默的助手。"
messages = [{"role": "system", "content": system_prompt}]

while True:
    user_input = input("👤 你:")
    if user_input.lower() in ["quit", "exit"]:
        break
    messages.append({"role": "user", "content": user_input})
    
    response = client.chat.completions.create(
        model="deepseek-v4-flash",
        messages=messages,
        temperature=0.7
    )
    reply = response.choices[0].message.content
    print(f"🤖 助手:{reply}")
    messages.append({"role": "assistant", "content": reply})

3.3 增加流式输出

通过设置 stream=True,让回复像打字一样逐字显示。

核心代码片段:

stream = client.chat.completions.create(
    model="deepseek-v4-flash",
    messages=messages,
    stream=True
)
full_reply = ""
for chunk in stream:
    if chunk.choices[0].delta.content is not None:
        content = chunk.choices[0].delta.content
        print(content, end="", flush=True)
        full_reply += content

我们在脚本中增加一个 STREAM_MODE 变量,可以方便地在流式和非流式间切换。

3.4 对话记录本地保存

每次启动新会话时,自动创建带时间戳的日志文件,保存完整对话。

文件名规则chat_HH_YYYYMMDD_HHMMSS.txt
保存时机:每轮对话结束后立即追加写入。

关键代码:

from datetime import datetime
log_dir = "chat_logs"
os.makedirs(log_dir, exist_ok=True)
now = datetime.now()
filename = f"chat_{now.hour:02d}_{now.strftime('%Y%m%d_%H%M%S')}.txt"
filepath = os.path.join(log_dir, filename)

# 每轮对话后追加:
with open(filepath, "a", encoding="utf-8") as f:
    f.write(f"👤 你:{user_input}\n")
    f.write(f"🤖 助手:{full_reply}\n")
    f.write("-" * 40 + "\n")

四、完整版 chatbot.py

整合以上所有功能后的最终代码:

import os
from datetime import datetime
from openai import OpenAI
from dotenv import load_dotenv

load_dotenv()

client = OpenAI(
    api_key=os.getenv("DEEPSEEK_API_KEY"),
    base_url=os.getenv("DEEPSEEK_BASE_URL")
)

# ========== 配置 ==========
STREAM_MODE = True              # True=流式,False=非流式
system_prompt = "你是我的编程导师,回答要简洁、有代码示例。"
# ==========================

# 创建日志目录和文件
log_dir = "chat_logs"
os.makedirs(log_dir, exist_ok=True)
now = datetime.now()
filename = f"chat_{now.hour:02d}_{now.strftime('%Y%m%d_%H%M%S')}.txt"
filepath = os.path.join(log_dir, filename)

with open(filepath, "w", encoding="utf-8") as f:
    f.write(f"会话开始:{now.strftime('%Y-%m-%d %H:%M:%S')}\n")
    f.write(f"系统设定:{system_prompt}\n")
    f.write("=" * 50 + "\n\n")

print(f"📝 记录保存至:{filepath}")
print(f"🤖 聊天机器人已启动(流式:{STREAM_MODE})")

messages = [{"role": "system", "content": system_prompt}]

while True:
    user_input = input("👤 你:")
    if user_input.lower() in ["quit", "exit"]:
        print("👋 再见!")
        with open(filepath, "a", encoding="utf-8") as f:
            f.write(f"\n会话结束:{datetime.now().strftime('%Y-%m-%d %H:%M:%S')}\n")
        break

    messages.append({"role": "user", "content": user_input})

    if STREAM_MODE:
        stream = client.chat.completions.create(
            model="deepseek-v4-flash",
            messages=messages,
            temperature=0.7,
            max_tokens=1000,
            stream=True
        )
        print("🤖 助手:", end="", flush=True)
        full_reply = ""
        for chunk in stream:
            if chunk.choices[0].delta.content is not None:
                content = chunk.choices[0].delta.content
                print(content, end="", flush=True)
                full_reply += content
        print()
    else:
        response = client.chat.completions.create(
            model="deepseek-v4-flash",
            messages=messages,
            temperature=0.7,
            max_tokens=1000
        )
        full_reply = response.choices[0].message.content
        print(f"🤖 助手:{full_reply}")

    messages.append({"role": "assistant", "content": full_reply})

    with open(filepath, "a", encoding="utf-8") as f:
        f.write(f"👤 你:{user_input}\n")
        f.write(f"🤖 助手:{full_reply}\n")
        f.write("-" * 40 + "\n")

    print("-" * 40)

五、运行与测试

  1. 激活虚拟环境:.\agent-demo\Scripts\Activate.ps1 或者采用bat/cmd脚本(见前置文章)
  2. 运行脚本:python chatbot.py
  3. 尝试多轮对话,验证上下文记忆。
  4. 检查 chat_logs 文件夹下的记录文件。

六、常见问题

问题 解决方法
No module named 'openai' 确保在虚拟环境激活后 pip install openai
API 连接失败 检查 .env 中的密钥和 Base URL,尝试更换网络
流式输出时字符显示异常 确保使用 print(content, end="", flush=True)
记录文件找不到 确认脚本运行目录有 chat_logs 写入权限

七、下一步进阶

完成此基础聊天机器人后,下一步继续学习:

  • RAG 知识库问答:让机器人基于私有文档回答
  • Web 界面化:使用 Streamlit 将应用部署为网页
  • 多模态交互:集成图片、语音输入

Logo

欢迎加入DeepSeek 技术社区。在这里,你可以找到志同道合的朋友,共同探索AI技术的奥秘。

更多推荐