Day51——晚课 搭建你的AI聊天机器人

作者:

上篇回顾

早上我们聊了聊天机器人的基本原理——大语言模型如何通过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})

`

运行后试试:

  1. 说 “我叫小明”
  2. 说 “我是一个程序员”
  3. 说 “你还记得我叫什么名字吗?”

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本匹配的小说
  • 每本书用一句话勾起兴趣(不能剧透关键情节)
  • 风格要像朋友聊天,不要太正式
  • 如果用户说”书荒了”,按热门榜单推荐”””}

]

`

动手实验:

  1. 选一个人设,替换到代码的 system 消息里
  2. 运行程序,和AI对话10轮
  3. 观察AI的语气和行为是否符合人设
  4. 自己设计一个新的人设

💡 进阶技巧:在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)

试试改进:

  1. 修改 titledescription 为你的机器人名字
  2. 修改system消息,做一个”专属于你的”机器人
  3. 修改 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本地部署。

今日总结

  1. 10行代码就能做出一个聊天机器人——核心就是调用大模型API
  2. 对话历史是聊天机器人有”记忆”的关键——在客户端维护消息链
  3. system消息决定了机器人的”人设”——用好它,你就有了一个定制AI
  4. Gradio让你30分钟做出网页版聊天界面——不需要学前端
  5. 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实战:搭建你的知识库

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注