第9章 9.3 AI接入:ChatGPT/通义/文心

上一章我们用 WebSocket 实现了实时通信,现在你手里有了一个「能随时发消息、收消息」的双向通道。问题来了——消息收到了,让谁来回?总不能雇一个人 24 小时盯着屏幕吧。🤖

这一章我们要给这个通道接上一个「超级大脑」,让它自动回复、智能处理。没错,就是把 AI 大模型(ChatGPT、通义、文心)接进来!

🎯 开场:为什么要学 AI 接入?

真实场景引入

你有没有遇到过这种情况:

  • 半夜客户咨询,你困得不行,但错过可能丢单
  • 群里 100 个人问同样的问题,你回答到想吐
  • 手动整理用户反馈,分类归纳做到眼睛花了

这些问题,本质上都是:「重复的事让机器干,脑子留给创意」

痛点问题

  1. 「我想接 AI,但 API 怎么调?密钥从哪来?」
  2. 「ChatGPT、通义、文心……到底用哪个?有啥区别?」

学完本文能解决

  • ✅ 调用任意主流大模型 API 发送对话
  • ✅ 用 Python 写一个「命令行 AI 助手」
    \n\nSimple tech illustration expla\n\nAI comic creation scene, creat\n\n
  • ✅ 读取 CSV/JSON 数据,让 AI 帮你分析
  • ✅ 搭一个「本地小工具」,自动处理重复文本

🧱 基础 25 分钟:核心概念

概念 1:API 是什么?—— 点外卖的比喻

生活类比:你想吃火锅,但不想出门。你打开外卖 App,选好菜,下单 → 骑手取餐 → 送到你家。「外卖 App」就是一个「食物 API」,你不需要知道后厨怎么切菜,只需要「点单-收货」。

AI 大模型的 API 也一样:你发一段文字(提问),大模型返回一个答案(回复)。你不需要训练模型,只需要调用接口。

概念 2:API Key 是什么?—— 会员卡

为什么要用:API Key 就像是会员卡,证明「你有权使用这个服务」。没有卡,人家不给你送餐。

每个大模型平台(OpenAI、阿里、百度)都会给你一个 Key,用它来身份验证。

# 这就是你的「会员卡号」
API_KEY = "sk-xxxxxxxxxxxx"  # 替换成你的真实Key

概念 3:请求结构—— 寄快递的比喻

生活类比:你寄快递需要填写:收件人地址(URL)、物品(messages)、是否加急(model)。AI 请求也一样。

import requests

url = "https://api.openai.com/v1/chat/completions"
headers = {
"Authorization": f"Bearer {API_KEY}",  # 快递单上的「发件人签名」
"Content-Type": "application/json"      # 「物品清单」格式说明
}
data = {
"model": "gpt-3.5-turbo",               # 收件人:选哪个AI
"messages": [                           # 包裹内容:你说的话
    {"role": "user", "content": "你好!"}
]
}
response = requests.post(url, headers=headers, json=data)
print(response.json())

这行在干嘛
- Authorization:带上你的会员卡
- messages:对话历史,「role」分 user(你)和 assistant(AI)

概念 4:通义/文心的区别—— 三家外卖平台

平台 API 地址 模型示例 特点
ChatGPT api.openai.com gpt-3.5-turbo / gpt-4 国际范、贵但强
通义(阿里) dashscope.aliyuncs.com qwen-turbo 中文友好、本土化
文心(百度) qianfan.baidubce.com ernie-bot 百度生态、中文理解强

类比:就像美团、饿了么、抖音外卖,菜差不多,但活动不同、送达速度不同。

概念 5:响应解析—— 拆快递

AI 返回的是一个 JSON,里面嵌套了好几层。新手最容易在这里懵圈。

result = response.json()
# 层层剥开:
reply = result["choices"][0]["message"]["content"]
print(reply)  # 终于看到AI的回复了!

🔥 实战 35 分钟:3 个递进小项目

项目 1(5 分钟):最小可用 AI 对话

目标:输入一句话,AI 回复一句话

完整代码

import requests

def chat_with_gpt(prompt, api_key, model="gpt-3.5-turbo"):
url = "https://api.openai.com/v1/chat/completions"
headers = {
    "Authorization": f"Bearer {api_key}",
    "Content-Type": "application/json"
}
payload = {
    "model": model,
    "messages": [{"role": "user", "content": prompt}]
}
response = requests.post(url, headers=headers, json=payload)
result = response.json()
return result["choices"][0]["message"]["content"]

# 使用时只需要:
API_KEY = "sk-your-key-here"  # 换成你的Key
reply = chat_with_gpt("用一句话夸夸Python", API_KEY)
print("AI:", reply)

预期输出

AI: Python就像编程世界的瑞士军刀——简洁、强大、处处能用!

一句话解释:把用户输入包装成 JSON 发给 API,解析返回的 content 字段。


项目 2(15 分钟):批量处理 CSV,让 AI 帮忙分类

场景:你是一个客服主管,手里有 100 条用户反馈,需要分类成「投诉/建议/咨询」。

数据文件 feedback.csv

内容
东西坏了很生气
希望增加深色模式
怎么退款的
快递太慢了差评
功能很好用点赞

完整代码

import requests
import csv

def chat_with_gpt(prompt, api_key):
url = "https://api.openai.com/v1/chat/completions"
headers = {
    "Authorization": f"Bearer {api_key}",
    "Content-Type": "application/json"
}
payload = {
    "model": "gpt-3.5-turbo",
    "messages": [{"role": "user", "content": prompt}]
}
response = requests.post(url, headers=headers, json=payload)
return response.json()["choices"][0]["message"]["content"]

def classify_feedback(text, api_key):
prompt = f"""请把下面这条用户反馈分类,只能返回「投诉」「建议」「咨询」中的一个:
反馈:{text}"""
return chat_with_gpt(prompt, api_key).strip()

def process_csv(input_file, api_key):
results = []
with open(input_file, "r", encoding="utf-8") as f:
    reader = csv.DictReader(f)
    for row in reader:
        content = row["内容"]
        category = classify_feedback(content, api_key)
        results.append({"原始内容": content, "分类": category})
        print(f"「{content}」 → {category}")
return results

# 运行
API_KEY = "sk-your-key-here"
processed = process_csv("feedback.csv", API_KEY)

# 保存结果
with open("feedback_classified.csv", "w", encoding="utf-8", newline="") as f:
writer = csv.DictWriter(f, fieldnames=["原始内容", "分类"])
writer.writeheader()
writer.writerows(processed)
print("\n已保存到 feedback_classified.csv")

预期输出

「东西坏了很生气」 → 投诉
「希望增加深色模式」 → 建议
「怎么退款的」 → 咨询
「快递太慢了差评」 → 投诉
「功能很好用点赞」 → 建议

已保存到 feedback_classified.csv

一句话解释:读取 CSV 每一行,单独发给 AI 分类,再写回新 CSV。


项目 3(15 分钟):本地 AI 待办整理工具

场景:你有一堆杂乱的待办事项,让 AI 帮你归类、整理成清晰清单。

完整代码

import requests

def chat_with_gpt(messages, api_key):
url = "https://api.openai.com/v1/chat/completions"
headers = {
    "Authorization": f"Bearer {api_key}",
    "Content-Type": "application/json"
}
payload = {
    "model": "gpt-3.5-turbo",
    "messages": messages
}
response = requests.post(url, headers=headers, json=payload)
return response.json()["choices"][0]["message"]["content"]

def organize_todos(todos_text, api_key):
system_prompt = """你是一个待办事项整理助手。
收到用户的待办列表后,请:
1. 按「工作」「生活」「学习」分类
2. 每个分类下用编号列出
3. 最后给一个完成建议(哪件先做)"""

user_prompt = f"我的待办事项:\n{todos_text}"

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

return chat_with_gpt(messages, api_key)

# 使用
API_KEY = "sk-your-key-here"
todos = """
1. 写项目方案
2. 买菜做饭
3. 复习考试
4. 约客户开会
5. 健身30分钟
6. 给妈妈打电话
"""

result = organize_todos(todos, API_KEY)
print("=== AI 整理结果 ===")
print(result)

预期输出

=== AI 整理结果 ===
## 工作
1. 写项目方案
2. 约客户开会

## 生活
3. 买菜做饭
4. 给妈妈打电话
5. 健身30分钟

## 学习
6. 复习考试

💡 建议:先「约客户开会」再「写项目方案」,因为会议结论会影响方案方向。

一句话解释:用 system 角色给 AI 定义身份,用 user 角色发任务,组合成完整对话。


💪 进阶 20 分钟:常见坑 + 性能小贴士

坑 1:Key 暴露了!—— 删掉 Git 提交记录

# ❌ 错误:直接写死在代码里
API_KEY = "sk-abc123xxxxx"
# ✅ 正确:从环境变量读取
import os
API_KEY = os.getenv("OPENAI_API_KEY")
# 终端运行:export OPENAI_API_KEY="sk-abc123xxxxx"

坑来了:一旦提交到 GitHub,你的 Key 就公开了,别人能用你的额度!立即去平台重新生成一个新 Key。


坑 2:网络超时 —— 设置超时时间

# ❌ 错误:不设超时,可能永远卡住
response = requests.post(url, headers=headers, json=data)
# ✅ 正确:10秒超时
response = requests.post(url, headers=headers, json=data, timeout=10)

坑 3:JSON 解析报错 —— 检查返回状态

# ❌ 错误:直接解析,没检查错误
result = response.json()

# ✅ 正确:先检查状态码
if response.status_code != 200:
print(f"出错了:{response.text}")
else:
result = response.json()

坑 4:Token 超出限制 —— 控制对话长度

# ❌ 错误:历史消息无限累积
messages.append(new_message)  # 只加不减,越积越多
# ✅ 正确:只保留最近 N 条,或者定期清理
messages = messages[-10:]  # 只保留最近10条

坑 5:模型名字写错 —— 查清楚再用

# ❌ 错误:模型名拼写错误
"model": "gpt-3.5-turboo"  # 多了一个o
# ✅ 正确:确认你用的模型名(不同平台格式不同)
"model": "gpt-3.5-turbo"        # OpenAI
"model": "qwen-turbo"           # 通义
"model": "ernie-bot"            # 文心

调试技巧:打印完整响应

# 当你不知道返回什么结构时,打印全部
result = response.json()
print(json.dumps(result, indent=2, ensure_ascii=False))

这样能看到所有字段,找到你需要的那个。


✏️ 练习题

练习 1(1 分钟):换一个问题

  • 输入:把 chat_with_gpt("用一句话夸夸Python", API_KEY) 改成问你自己的问题
  • 预期输出:AI 回答你的新问题
  • 提示:只改引号里的文字,其他不动

练习 2(2 分钟):加一个条件判断

  • 输入:在项目 1 里,如果 API 返回错误,打印「出错了」,否则打印回复
  • 预期输出出错了 或 AI 回复
  • 提示:用 if response.status_code == 200 判断

练习 3(2 分钟):处理新的 CSV

  • 输入:创建一个 products.csv,内容是商品名称,让 AI 给每个商品写一句营销文案
  • 预期输出:CSV 输出两列(商品名称、营销文案)
  • 提示:参考项目 2 的结构,改 prompt 即可

练习 4(3 分钟):串起两个项目

  • 输入:把项目 2(分类)和项目 3(整理)串联起来——先分类,再整理成清单
  • 预期输出:先输出分类结果,再输出整理后的待办清单
  • 提示:项目2输出是CSV,项目3输入是文本列表,转换一下格式

练习 5(2 分钟):读懂报错信息

  • 输入:以下报错是什么意思?
KeyError: 'choices'
  • 预期输出:解释原因 + 修复方法
  • 提示:检查 response 的 status_code 和实际返回内容

作业:做一个「AI 新闻摘要工具」

需求描述
把一堆新闻标题/摘要扔进去,让 AI 帮你总结要点、判读情感、挑出最重要的 3 条。

功能点
1. 从 CSV 读取新闻数据
2. 调用 AI 进行情感分析(正面/负面/中性)
3. 生成 200 字以内的摘要
4. 输出到新 CSV

加分项
1. 支持 JSON 输入
2. 添加「关键词标签」

验收标准
- 能跑起来
- 输出符合预期格式
- 代码有中文注释

提交方式:评论区贴代码或 GitHub 链接


📚 总结 + 资源

一句话总结

本章学了 3 件事:① AI API 的调用方式 ② 批量处理数据的技巧 ③ 用 AI 帮你做分类、总结等脏活累活。

延伸资源

互动钩子

你有没有想过「让 AI 帮你写代码」?下一章我们要做一件更底层的事——看看 uniapp 框架本身是怎么写的。学会了源码解析,你就不只是「用框架的人」,而是「能改框架的人」了。🚀


上期复习:上一章我们用 WebSocket 实现了实时双向通信,给 AI 接入打好了「管道」基础。

下期预告:第 10 章 10.1 uniapp 源码解析——从用户变成「能改框架」的人!

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。