从零搭建你的第一个AI应用
AI 导读
从零搭建你的第一个AI应用 从环境搭建到部署上线,手把手带你完成第一个 AI 聊天应用 Maurice | 灵阙学院 前置准备 Python 3.10+ 一个 OpenAI 或 Anthropic API Key 基本的命令行操作能力 一、搭建 Python 开发环境 创建一个独立的虚拟环境,避免依赖冲突。 # 创建项目目录 mkdir my-first-ai-app && cd...
从零搭建你的第一个AI应用
从环境搭建到部署上线,手把手带你完成第一个 AI 聊天应用 Maurice | 灵阙学院
前置准备
- Python 3.10+
- 一个 OpenAI 或 Anthropic API Key
- 基本的命令行操作能力
一、搭建 Python 开发环境
创建一个独立的虚拟环境,避免依赖冲突。
# 创建项目目录
mkdir my-first-ai-app && cd my-first-ai-app
# 创建虚拟环境
python3 -m venv .venv
# 激活虚拟环境
source .venv/bin/activate # macOS/Linux
# .venv\Scripts\activate # Windows
# 确认 Python 版本
python --version
预期输出:
Python 3.11.x
安装核心依赖:
pip install openai anthropic python-dotenv
创建环境变量文件,存放 API Key(不要提交到 Git):
echo "OPENAI_API_KEY=sk-your-key-here" > .env
echo "ANTHROPIC_API_KEY=sk-ant-your-key-here" >> .env
echo ".env" >> .gitignore
二、第一次调用 AI 模型
创建 chat_basic.py:
import os
from dotenv import load_dotenv
from openai import OpenAI
load_dotenv()
client = OpenAI(api_key=os.getenv("OPENAI_API_KEY"))
response = client.chat.completions.create(
model="gpt-4o-mini",
messages=[
{"role": "system", "content": "你是一个友好的中文助手。"},
{"role": "user", "content": "用一句话解释什么是大语言模型。"}
]
)
print(response.choices[0].message.content)
运行:
python chat_basic.py
预期输出:
大语言模型是一种通过海量文本数据训练的深度学习模型,能够理解和生成自然语言。
如果你使用 Anthropic Claude,替换为:
import os
from dotenv import load_dotenv
from anthropic import Anthropic
load_dotenv()
client = Anthropic(api_key=os.getenv("ANTHROPIC_API_KEY"))
message = client.messages.create(
model="claude-sonnet-4-20250514",
max_tokens=1024,
messages=[
{"role": "user", "content": "用一句话解释什么是大语言模型。"}
]
)
print(message.content[0].text)
三、添加流式输出
流式输出让用户看到"逐字生成"的效果,体验更好。创建 chat_stream.py:
import os
from dotenv import load_dotenv
from openai import OpenAI
load_dotenv()
client = OpenAI(api_key=os.getenv("OPENAI_API_KEY"))
stream = client.chat.completions.create(
model="gpt-4o-mini",
messages=[
{"role": "system", "content": "你是一个友好的中文助手。"},
{"role": "user", "content": "简要介绍 Python 的三大特点。"}
],
stream=True # 关键参数
)
for chunk in stream:
content = chunk.choices[0].delta.content
if content:
print(content, end="", flush=True)
print() # 结尾换行
预期输出(逐字显示):
Python 的三大特点:
1. **简洁易读**:语法接近自然语言,学习曲线平缓。
2. **生态丰富**:拥有超过 40 万个第三方包,覆盖几乎所有领域。
3. **跨平台**:同一份代码可在 Windows、macOS、Linux 上运行。
四、添加多轮对话历史
AI 模型本身无状态,需要我们手动维护对话历史。创建 chat_history.py:
import os
from dotenv import load_dotenv
from openai import OpenAI
load_dotenv()
client = OpenAI(api_key=os.getenv("OPENAI_API_KEY"))
# 对话历史列表
history = [
{"role": "system", "content": "你是一个友好的中文助手,名叫小灵。"}
]
def chat(user_input: str) -> str:
history.append({"role": "user", "content": user_input})
response = client.chat.completions.create(
model="gpt-4o-mini",
messages=history
)
assistant_msg = response.choices[0].message.content
history.append({"role": "assistant", "content": assistant_msg})
return assistant_msg
# 交互式对话循环
print("小灵已上线!输入 'quit' 退出。\n")
while True:
user_input = input("你: ")
if user_input.lower() in ("quit", "exit", "q"):
print("再见!")
break
reply = chat(user_input)
print(f"小灵: {reply}\n")
运行后的交互示例:
小灵已上线!输入 'quit' 退出。
你: 我叫张三
小灵: 你好张三!很高兴认识你,有什么我可以帮你的吗?
你: 你还记得我叫什么吗?
小灵: 当然记得,你叫张三!
你: quit
再见!
五、用 FastAPI 构建 API 服务
安装 FastAPI:
pip install fastapi uvicorn
创建 server.py:
import os
from dotenv import load_dotenv
from fastapi import FastAPI
from fastapi.responses import StreamingResponse
from fastapi.middleware.cors import CORSMiddleware
from pydantic import BaseModel
from openai import OpenAI
load_dotenv()
app = FastAPI(title="My First AI App")
app.add_middleware(
CORSMiddleware,
allow_origins=["*"],
allow_methods=["*"],
allow_headers=["*"],
)
client = OpenAI(api_key=os.getenv("OPENAI_API_KEY"))
class ChatRequest(BaseModel):
messages: list[dict]
stream: bool = False
@app.post("/chat")
async def chat(req: ChatRequest):
if req.stream:
return StreamingResponse(
stream_response(req.messages),
media_type="text/event-stream"
)
response = client.chat.completions.create(
model="gpt-4o-mini",
messages=req.messages
)
return {"content": response.choices[0].message.content}
async def stream_response(messages: list[dict]):
stream = client.chat.completions.create(
model="gpt-4o-mini",
messages=messages,
stream=True
)
for chunk in stream:
content = chunk.choices[0].delta.content
if content:
yield f"data: {content}\n\n"
yield "data: [DONE]\n\n"
if __name__ == "__main__":
import uvicorn
uvicorn.run(app, host="0.0.0.0", port=8000)
启动服务:
python server.py
测试 API:
curl -X POST http://localhost:8000/chat \
-H "Content-Type: application/json" \
-d '{"messages": [{"role": "user", "content": "你好"}]}'
预期输出:
{"content": "你好!有什么我可以帮你的吗?"}
六、添加简单 Web 前端
创建 index.html,放在项目根目录:
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<title>我的第一个 AI 应用</title>
<style>
* { margin: 0; padding: 0; box-sizing: border-box; }
body { font-family: system-ui, sans-serif; background: #f5f5f5; }
.container { max-width: 640px; margin: 40px auto; padding: 20px; }
h1 { text-align: center; margin-bottom: 24px; color: #333; }
#chat-box {
background: #fff; border-radius: 12px; padding: 20px;
height: 400px; overflow-y: auto; margin-bottom: 16px;
box-shadow: 0 2px 8px rgba(0,0,0,0.08);
}
.msg { margin-bottom: 12px; line-height: 1.6; }
.msg.user { text-align: right; }
.msg.user span { background: #007aff; color: #fff; }
.msg.ai span { background: #e9e9eb; color: #333; }
.msg span {
display: inline-block; padding: 8px 14px;
border-radius: 16px; max-width: 80%;
}
.input-row { display: flex; gap: 8px; }
input {
flex: 1; padding: 12px 16px; border-radius: 24px;
border: 1px solid #ddd; font-size: 15px; outline: none;
}
button {
padding: 12px 24px; border-radius: 24px; border: none;
background: #007aff; color: #fff; font-size: 15px; cursor: pointer;
}
button:hover { background: #005ecb; }
</style>
</head>
<body>
<div class="container">
<h1>AI 对话助手</h1>
<div id="chat-box"></div>
<div class="input-row">
<input id="input" placeholder="输入消息..."
onkeydown="if(event.key==='Enter') send()" />
<button onclick="send()">发送</button>
</div>
</div>
<script>
const chatBox = document.getElementById('chat-box');
const input = document.getElementById('input');
const messages = [
{ role: 'system', content: '你是一个友好的中文助手。' }
];
function addMessage(role, text) {
const div = document.createElement('div');
div.className = `msg ${role === 'user' ? 'user' : 'ai'}`;
div.innerHTML = `<span>${text}</span>`;
chatBox.appendChild(div);
chatBox.scrollTop = chatBox.scrollHeight;
}
async function send() {
const text = input.value.trim();
if (!text) return;
input.value = '';
addMessage('user', text);
messages.push({ role: 'user', content: text });
const res = await fetch('http://localhost:8000/chat', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ messages })
});
const data = await res.json();
addMessage('ai', data.content);
messages.push({ role: 'assistant', content: data.content });
}
</script>
</body>
</html>
让 FastAPI 同时提供静态文件。在 server.py 中加入:
from fastapi.staticfiles import StaticFiles
from fastapi.responses import FileResponse
# 在 app 定义之后添加
@app.get("/")
async def root():
return FileResponse("index.html")
重启服务后,打开浏览器访问 http://localhost:8000,即可看到聊天界面。
七、项目结构总览
my-first-ai-app/
.env # API Key(不要提交)
.gitignore
.venv/ # 虚拟环境
chat_basic.py # 第一次调用
chat_stream.py # 流式输出
chat_history.py # 多轮对话
server.py # FastAPI 后端
index.html # 前端页面
requirements.txt # pip freeze > requirements.txt
生成依赖文件:
pip freeze > requirements.txt
常见问题
Q1: 报错 openai.AuthenticationError?
检查 .env 中的 API Key 是否正确,确认 load_dotenv() 在 OpenAI() 之前调用。
Q2: 流式输出在浏览器中不生效?
确保 server.py 的 StreamingResponse 使用了 text/event-stream 类型,前端使用 EventSource 或 fetch 的 reader 来读取。
Q3: 对话越来越慢、越来越贵?
对话历史 messages 列表会不断增长。实际项目中需要做截断或摘要压缩,只保留最近 N 轮或用摘要替代早期对话。
Q4: 如何切换到 Claude 模型?
安装 anthropic SDK,使用 Anthropic 客户端替换 OpenAI 客户端,API 参数略有不同(max_tokens 为必填)。
Q5: 如何部署到服务器?
推荐使用 gunicorn + uvicorn worker 部署到 VPS,或者使用 Railway/Render/Fly.io 等 PaaS 平台一键部署。
Maurice | [email protected]
深度加工(NotebookLM 生成)
基于本文内容生成的 PPT 大纲、博客摘要、短视频脚本与 Deep Dive 播客,用于多场景复用
PPT 大纲(5-8 张幻灯片) 点击展开
从零搭建你的第一个AI应用 — ppt
这是一份基于您上传的文章为您生成的 7 张 PPT 大纲,已按照要求使用 Markdown 格式输出:
幻灯片 1:项目简介与前置准备
- 项目目标:从环境搭建到部署上线,手把手从零带你完成并搭建第一个 AI 聊天应用 [1]。
- 核心前置要求:需要具备 Python 3.10+ 环境、基本的命令行操作能力,以及一个 OpenAI 或 Anthropic 的 API Key [1]。
- 安全的环境搭建:建议创建并激活独立的 Python 虚拟环境(如
.venv),以避免与其他项目的依赖产生冲突 [1]。 - 依赖与配置管理:安装核心依赖
openai、anthropic、python-dotenv,并通过.env文件结合.gitignore安全存放 API Key [1]。
幻灯片 2:首次调用 AI 模型
- 客户端初始化:通过
load_dotenv()加载本地环境变量,并实例化 OpenAI 或 Anthropic 客户端 [1]。 - 构建请求参数:使用字典列表传入
messages,包含system(定义 AI 角色如“友好的中文助手”)和user(用户提问内容) [1]。 - 发起调用与解析:调用大模型的对话生成接口(如
chat.completions.create),并提取返回消息体中的文本内容 [1]。 - 多模型支持:代码也可轻松切换至 Anthropic Claude 模型,只需更换 SDK 客户端并注意
max_tokens变为必填参数 [1, 2]。
幻灯片 3:提升用户体验:添加流式输出
- 流式输出的优势:让用户看到“逐字生成”的打字机效果,能够显著减少等待焦虑,提供更好的交互体验 [1]。
- 修改请求参数:只需在原本的 API 调用方法中,加入一个关键参数
stream=True即可开启数据流 [1]。 - 数据流的遍历与处理:使用
for chunk in stream循环接收数据块,验证并实时打印chunk.choices.delta.content[1]。 - Web 端流式适配:如果在 Web 环境下使用流式输出,需确保后端返回
text/event-stream类型,前端配合 EventSource 或 Fetch 读取 [2, 3]。
幻灯片 4:实现记忆功能:多轮对话历史
- AI 状态管理痛点:AI 模型本身是无状态的(Stateless),它不会主动记住上一句话,需要开发者手动维护上下文 [3]。
- 构建历史列表:在代码中创建一个
history列表,初始化加入系统提示词(System Prompt),并在整个对话生命周期中维护它 [3]。 - 动态更新对话闭环:每次用户提问时,将用户输入
append进列表;模型返回结果后,再将助手的回复也追加进去 [3]。 - 命令行交互循环:使用
while True构建一个持续运行的对话输入框,并提供类似quit或exit的退出机制 [3]。
幻灯片 5:构建 FastAPI 后端服务
- 引入高性能框架:通过
pip install fastapi uvicorn安装 FastAPI 框架及其服务器 [3]。 - API 基础与跨域配置:初始化
FastAPI应用,并挂载CORSMiddleware中间件以允许前端跨域请求 [3]。 - 定义数据请求模型:借助 Pydantic 定义
ChatRequest类,明确接收messages列表及stream布尔值 [3]。 - 编写对话路由:开发
/chatPOST 接口,结合普通 JSON 响应和StreamingResponse提供灵活的对话返回方式 [3]。
幻灯片 6:开发简单的 Web 前端页面
- 页面 UI 结构:编写纯 HTML/CSS 的
index.html,实现一个包含对话展示区 (#chat-box) 和输入控制区的用户界面 [2, 3]。 - 前端交互逻辑:编写 JavaScript 脚本,在前端维护一个
messages数组以同步状态,并定义addMessage方法渲染气泡 [2]。 - 前后端数据联调:利用
fetchAPI 监听回车或点击事件,将历史记录打包为 JSON 发送至 FastAPI 的/chat接口 [2]。 - 静态资源托管:在 FastAPI 后端引入
StaticFiles和FileResponse,使得访问http://localhost:8000/直接返回前端页面 [2]。
幻灯片 7:项目总结与进阶答疑
- 项目结构概览:完成后的项目包含了环境配置(
.env)、多次迭代的脚本、FastAPI 后端 (server.py) 以及前端界面 (index.html) [2]。 - 应对身份验证报错:遇到
AuthenticationError时,需排查.env是否正确配置,并确保load_dotenv()发生在客户端初始化之前 [2]。 - Token 成本与性能优化:多轮对话会导致上下文不断变长,导致变慢变贵;实际项目中需进行截断保留最近 N 轮,或用摘要替代早期对话 [2]。
- 应用部署建议:开发完成后,推荐使用
gunicorn + uvicorn worker部署至 VPS 服务器,或使用 Railway 等 PaaS 平台一键部署 [2]。
博客摘要 + 核心看点 点击展开
从零搭建你的第一个AI应用 — summary
这是一为您定制的 SEO 友好博客摘要及核心看点:
SEO 友好博客摘要(约 150 字)
想要快速入门 AI 开发?这篇《从零搭建你的第一个AI应用》实战教程不容错过[1]!本文手把手教你使用 Python 结合 OpenAI 或 Anthropic API,完成从环境搭建、基础调用、配置流式输出到多轮对话状态管理的核心开发流程[1, 2]。教程更进一步涵盖了使用 FastAPI 构建后端 API 服务,以及编写完整 Web 聊天界面的全栈实战[2, 3]。结合防坑指南与部署建议,助你轻松上线专属 AI 助手[3]!
3 条核心看点(每条 < 40 字)
- 零基础 API 对接:掌握主流大模型调用,轻松实现逐字生成的流式输出体验[1]。
- 多轮对话管理:解析 AI 无状态难题,手把手教你手动维护上下文历史[2]。
- 全栈项目实战:利用 FastAPI 配合原生前端代码,快速打造可视化 Web 界面[2, 3]。
60 秒短视频脚本 点击展开
从零搭建你的第一个AI应用 — video
这是一段为您定制的 60 秒短视频脚本,严格按照字数要求和内容结构提炼:
【开场钩子】(14字)
从零搭建你的第一个AI应用![1]
【核心解说】
- 画面一(29字):建Python环境,配API密钥,几行代码即可完成首次AI调用。[1]
- 画面二(26字):开启流式输出实现逐字生成,维护历史列表让AI拥有记忆。[1, 2]
- 画面三(28字):用FastAPI建后端,配HTML前端,专属网页AI即刻上线![2, 3]
【结尾收束】
只需几步实操,新手也能轻松搞定,快去敲出你的第一行AI代码吧![1]
课后巩固
与本文内容匹配的闪卡与测验,帮助巩固所学知识
延伸阅读
根据本文主题,为你推荐相关的学习资料