上篇回顾
早上我们聊了聊天机器人的基本原理——大语言模型如何通过API变成一个能对话的程序,以及聊天机器人的几种类型(问答型、任务型、角色型)。
今晚,我们直接动手。从零开始,一步步搭建一个真正能用的AI聊天机器人。
不需要你有编程基础,跟着做就行。
实操一:3分钟,让AI说第一句话
最简单的聊天机器人,只需要10行代码。
你需要准备的东西:
- 一个OpenAI API Key(昨天早课教过怎么申请)
- 电脑上安装了Python(3.8以上版本)
第一步:安装依赖
打开终端(Windows打开命令提示符),输入:
`bash
pip install openai
`
第二步:创建文件
新建一个文件,命名为 chat.py,粘贴以下代码:
`python
from openai import OpenAI
client = OpenAI(api_key=”你的API Key放这里”)
response = client.chat.completions.create(
model=”gpt-3.5-turbo”,
messages=[
{“role”: “user”, “content”: “你好,介绍一下你自己”}
]
)
print(response.choices[0].message.content)
`
第三步:运行
`bash
python chat.py
`
你会看到:AI回复了一段自我介绍。
关键参数解读:
| 参数 | 含义 | 推荐值 |
|---|
|——|——|——–|
| model | 使用的模型 | gpt-3.5-turbo(便宜)或 gpt-4o(聪明) |
|---|---|---|
| messages | 对话内容 | 列表格式,每条有role和content |
| role | 说话的人 | user=用户,assistant=AI,system=系统指令 |
试着改一下:把 "你好,介绍一下你自己" 换成任何你想问的问题,再运行一次。
💡 小贴士:把API Key存到环境变量里更安全:
`bash
export OPENAI_API_KEY=”sk-你的key”
`
代码里改成
client = OpenAI()就行,不用写死Key了。
实操二:让AI记住你说过什么
刚才的代码有个问题——每次运行都是一次性对话,AI不记得你之前说了什么。
真正的聊天机器人需要记忆。我们来加上这个功能:
`python
from openai import OpenAI
client = OpenAI()
# 对话历史,AI的”记忆”
messages = [
{“role”: “system”, “content”: “你是一个友好的AI助手,用简洁的中文回答问题。”}
]
print(“AI聊天机器人已启动!输入 ‘quit’ 退出n”)
while True:
user_input = input(“你: “)
if user_input.lower() == ‘quit’:
print(“再见!”)
break
# 把用户的话加到历史里
messages.append({“role”: “user”, “content”: user_input})
# 发送整个对话历史
response = client.chat.completions.create(
model=”gpt-3.5-turbo”,
messages=messages
)
ai_reply = response.choices[0].message.content
print(f”AI: {ai_reply}n”)
# 把AI的回复也加到历史里
messages.append({“role”: “assistant”, “content”: ai_reply})
`
运行后试试:
- 说 “我叫小明”
- 说 “我是一个程序员”
- 说 “你还记得我叫什么名字吗?”
AI会准确回答”你叫小明”——因为它记住了整个对话历史。
核心原理:
每次发送请求时,我们把从第一条到最新一条的所有消息都发给API。API没有”记忆”,是我们在客户端帮它维护了一条消息链。
`
第1次请求: [system, user消息1]
第2次请求: [system, user消息1, AI回复1, user消息2]
第3次请求: [system, user消息1, AI回复1, user消息2, AI回复2, user消息3]
`
⚠️ 注意:消息越多,消耗的Token越多,费用越高。一般超过20轮对话后,可以考虑截断早期消息或摘要压缩。
实操三:给机器人一个”人设”
system 消息是你的秘密武器。它决定了AI的性格、语气和行为方式。
试试这些人设模板:
模板1:专业顾问
`python
messages = [
{“role”: “system”, “content”: “””你是一位资深的职业规划顾问。
- 用温和但专业的语气回答
- 每次回答后提一个引导性问题
- 给建议时用具体例子说明
- 不要一次说太多,循序渐进”””}
]
`
模板2:英语老师
`python
messages = [
{“role”: “system”, “content”: “””你是一位耐心的英语老师。
- 用户用中文提问时,用中文回答语法点,附带英文例句
- 用户用英文提问时,先纠正语法错误(如果有),再回答问题
- 每次回答后鼓励用户用英文造一个句子
- 用emoji让学习氛围更轻松”””}
]
`
模板3:番茄小说推荐官
`python
messages = [
{“role”: “system”, “content”: “””你是一个超级懂网文的小说推荐官。
- 用户说喜欢什么类型,推荐3本匹配的小说
- 每本书用一句话勾起兴趣(不能剧透关键情节)
- 风格要像朋友聊天,不要太正式
- 如果用户说”书荒了”,按热门榜单推荐”””}
]
`
动手实验:
- 选一个人设,替换到代码的
system消息里 - 运行程序,和AI对话10轮
- 观察AI的语气和行为是否符合人设
- 自己设计一个新的人设
💡 进阶技巧:在system消息里加”如果你不确定,就说不知道,不要编造”,可以大幅减少AI的”胡说八道”。
实操四:30分钟,做一个有界面的聊天机器人
命令行聊天不够酷?我们来做一个网页版聊天界面,只需要一个额外的库:Gradio。
第一步:安装Gradio
`bash
pip install gradio openai
`
第二步:创建 web_chat.py
`python
import gradio as gr
from openai import OpenAI
client = OpenAI()
def chat(message, history):
“””Gradio聊天回调函数”””
# 构建消息列表
messages = [
{“role”: “system”, “content”: “你是一个友好的AI助手,用简洁的中文回答。”}
]
# 把历史对话加进去
for user_msg, ai_msg in history:
messages.append({“role”: “user”, “content”: user_msg})
messages.append({“role”: “assistant”, “content”: ai_msg})
# 加上当前用户消息
messages.append({“role”: “user”, “content”: message})
# 调用API
response = client.chat.completions.create(
model=”gpt-3.5-turbo”,
messages=messages
)
return response.choices[0].message.content
# 创建界面
demo = gr.ChatInterface(
fn=chat,
title=”我的AI聊天机器人”,
description=”基于GPT-3.5-turbo,试试和它聊聊!”,
examples=[“今天天气真好,推荐我做点什么?”, “用Python写一个猜数字游戏”, “给我讲一个冷笑话”],
retry_btn=”重新生成”,
undo_btn=”撤销”,
clear_btn=”清空对话”
)
demo.launch()
`
第三步:运行
`bash
python web_chat.py
`
你会看到类似这样的输出:
`
Running on local URL: http://127.0.0.1:7860
`
打开浏览器访问这个地址——一个漂亮的聊天界面就出现了!
你会得到:
- 🎨 自动适配深色/浅色主题
- 💬 支持多轮对话
- 🔄 可以重新生成、撤销、清空
- 📱 手机浏览器也能用(同一WiFi下访问你的IP:7860)
试试改进:
- 修改
title和description为你的机器人名字 - 修改system消息,做一个”专属于你的”机器人
- 修改
examples为你的使用场景示例
💡 分享给别人:把
demo.launch()改成demo.launch(share=True),Gradio会生成一个公网链接,任何人都能用!链接24小时有效。
实操五:用开源方案本地部署
不想依赖OpenAI?用开源模型在自己电脑上跑,完全免费。
方案:Ollama + LangChain
第一步:安装Ollama
`bash
# macOS / Linux
curl -fsSL https://ollama.com/install.sh | sh
# Windows:去 ollama.com 下载安装包
`
第二步:下载一个模型
`bash
ollama pull qwen2.5:3b
`
这个是阿里通义千问的3B参数版本,普通电脑就能跑。
第三步:用Python调用
`bash
pip install langchain-community
`
`python
from langchain_community.llms import Ollama
llm = Ollama(model=”qwen2.5:3b”)
print(“本地AI聊天机器人!输入 ‘quit’ 退出n”)
while True:
user_input = input(“你: “)
if user_input.lower() == ‘quit’:
break
response = llm.invoke(user_input)
print(f”AI: {response}n”)
`
对比一下三种方案:
| 特性 | OpenAI API | Ollama本地 | Gradio界面 |
|---|
|——|———–|———–|———–|
| 费用 | 按Token付费 | 免费 | 免费(仍需API) |
|---|---|---|---|
| 智能程度 | 高(GPT-4o) | 中等(取决于模型大小) | 取决于后端 |
| 速度 | 取决于网络 | 取决于电脑配置 | 取决于后端 |
| 隐私 | 数据发送到云端 | 完全本地 | 取决于后端 |
| 需要联网 | 是 | 否 | 否(本地模型时) |
💡 推荐:学习阶段用OpenAI API(质量高、方便),做私密项目用Ollama本地部署。
今日总结
- 10行代码就能做出一个聊天机器人——核心就是调用大模型API
- 对话历史是聊天机器人有”记忆”的关键——在客户端维护消息链
- system消息决定了机器人的”人设”——用好它,你就有了一个定制AI
- Gradio让你30分钟做出网页版聊天界面——不需要学前端
- Ollama让你在本地免费运行AI——隐私安全,不依赖网络
今日行动项
入门级:运行实操一的10行代码,和AI完成一次对话
进阶级:用实操四的Gradio代码,做一个有自己人设的网页聊天机器人,分享给朋友试用
挑战级:安装Ollama,用本地模型搭一个完全离线的聊天机器人
🚇 地铁深读:聊天机器人的”记忆”难题
你可能注意到了——我们今天的”记忆”方案其实很原始:每次把所有对话历史都发给API。
这带来三个问题:
1. Token爆炸
GPT-3.5-turbo的上下文窗口是16384个Token(约12000个中文字)。聊个30轮,历史消息就快塞满了。
2. 费用增长
每轮对话都重新发送全部历史,Token消耗是O(n²)增长。聊100轮,费用可能是聊10轮的100倍。
3. 注意力稀释
模型的”注意力”有限。当对话太长,模型可能忘记中间说过的细节。
业界的解决方案:
| 方案 | 原理 | 适用场景 |
|---|
|——|——|———-|
| 滑动窗口 | 只保留最近N轮对话 | 简单问答 |
|---|---|---|
| 摘要压缩 | 定期让AI总结之前的对话 | 长对话 |
| 向量存储 | 把历史对话存入向量数据库,按相关性检索 | 知识库型机器人 |
| RAG | 结合外部文档,AI先搜索再回答 | 企业知识库(明天的主题!) |
一个简单的摘要压缩示例:
`python
def compress_history(messages, max_turns=10):
“””当对话超过max_turns轮时,压缩早期对话为摘要”””
if len(messages) <= max_turns * 2 + 1:
return messages
# 取出需要压缩的早期消息
early = messages[1:-max_turns*2] # 保留system和最近N轮
summary_text = “n”.join(
f”{m[‘role’]}: {m[‘content’]}” for m in early
)
# 用AI生成摘要
summary_response = client.chat.completions.create(
model=”gpt-3.5-turbo”,
messages=[
{“role”: “system”, “content”: “用50字以内总结以下对话的要点”},
{“role”: “user”, “content”: summary_text}
]
)
summary = summary_response.choices[0].message.content
# 重组消息:system + 摘要 + 最近N轮
return [
messages[0], # system
{“role”: “system”, “content”: f”之前的对话摘要:{summary}”},
*messages[-max_turns*2:] # 最近N轮
]
`
思考题:如果让你给自己的聊天机器人设计”记忆系统”,你会选择哪种方案?为什么?
明日预告:
明早8点:Day52——早课 RAG:让AI读你的文档
明晚5点:Day52——晚课 RAG实战:搭建你的知识库
发表回复