AI应用开发02-从零构建AI聊天机器人
本文介绍了如何从零开始构建一个基于 DeepSeek 大模型的 Python 命令行聊天机器人。主要内容包括:1) 开发环境准备,包括 Python 虚拟环境创建和依赖安装;2) API 密钥的安全配置方法;3) 核心功能实现,包括多轮对话记忆、流式/非流式输出切换以及对话记录自动保存;4) 完整代码实现,整合了系统提示设置、会话记录管理等功能模块。该机器人支持与 DeepSeek 模型交互,可保
说明
对AI应用开发所涉及到的流程、工具、技能进行系列介绍,全部文章收录于《AI应用开发》专栏。关注+收藏,不错过后续精彩。
前置文章
从零构建 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)
五、运行与测试
- 激活虚拟环境:
.\agent-demo\Scripts\Activate.ps1或者采用bat/cmd脚本(见前置文章) - 运行脚本:
python chatbot.py - 尝试多轮对话,验证上下文记忆。
- 检查
chat_logs文件夹下的记录文件。
六、常见问题
| 问题 | 解决方法 |
|---|---|
No module named 'openai' |
确保在虚拟环境激活后 pip install openai |
| API 连接失败 | 检查 .env 中的密钥和 Base URL,尝试更换网络 |
| 流式输出时字符显示异常 | 确保使用 print(content, end="", flush=True) |
| 记录文件找不到 | 确认脚本运行目录有 chat_logs 写入权限 |
七、下一步进阶
完成此基础聊天机器人后,下一步继续学习:
- RAG 知识库问答:让机器人基于私有文档回答
- Web 界面化:使用 Streamlit 将应用部署为网页
- 多模态交互:集成图片、语音输入
更多推荐



所有评论(0)