从零搭建 AI 编程助手:开发、部署到上线源码全流程
AI编程 部署完整教程|附源码
本文将从零开始,带你完成一个“AI 编程助手”项目的搭建与部署。项目基于 Node.js + Express + OpenAI API 风格接口 + 前端页面 实现,支持用户输入编程需求,由 AI 返回代码、解释和优化建议。文章包含环境准备、项目结构、后端接口、前端页面、本地运行、生产部署、Nginx 配置、PM2 守护进程、常见问题以及完整源码示例。
一、项目简介
随着大模型技术的发展,AI 编程已经成为开发者日常工作中非常重要的辅助工具。无论是生成代码、解释报错、重构函数,还是编写 SQL、生成单元测试,AI 都可以显著提升开发效率。
本文要实现的是一个简易版 AI 编程助手系统,用户可以在网页中输入需求,例如:
请用 JavaScript 写一个防抖函数,并解释使用场景
系统会将该需求发送到后端,后端调用 AI 接口,最终将结果返回给前端展示。
该项目适合以下人群:
- 想学习 AI 应用开发的新手;
- 想快速搭建 AI 编程工具的开发者;
- 想了解 AI 项目从开发到部署完整流程的人;
- 想将大模型能力集成到自己系统中的团队。
二、技术选型
本教程采用较轻量的技术栈,方便理解和部署。
| 模块 | 技术 |
|---|---|
| 前端 | HTML + CSS + JavaScript |
| 后端 | Node.js + Express |
| 请求库 | node-fetch |
| 环境变量 | dotenv |
| 进程管理 | PM2 |
| 反向代理 | Nginx |
| 部署环境 | Linux 服务器,例如 Ubuntu |
| AI 接口 | OpenAI API 风格接口 |
说明:本文中的 AI 接口以 OpenAI Chat Completions 风格为例。如果你使用的是其他大模型服务商,只需要调整接口地址、模型名称和请求参数即可。
三、项目最终效果
项目运行后,用户访问网页,可以看到一个输入框和提交按钮。
用户输入:
帮我用 Python 写一个快速排序,并添加详细注释
AI 返回类似内容:
def quick_sort(arr):
"""
快速排序函数
:param arr: 待排序列表
:return: 排序后的新列表
"""
if len(arr) <= 1:
return arr
pivot = arr[len(arr) // 2]
left = [x for x in arr if x < pivot]
middle = [x for x in arr if x == pivot]
right = [x for x in arr if x > pivot]
return quick_sort(left) + middle + quick_sort(right)
同时会附带解释,说明算法思路、时间复杂度和使用方式。
四、准备工作
在开始之前,你需要准备以下环境。
1. 安装 Node.js
建议使用 Node.js 18 或更高版本。
查看版本:
node -v
npm -v
如果服务器中没有安装 Node.js,可以使用以下方式安装:
curl -fsSL https://deb.nodesource.com/setup_20.x | sudo -E bash -
sudo apt install -y nodejs
安装完成后再次检查:
node -v
npm -v
2. 准备 AI API Key
你需要准备一个可用的大模型 API Key。
通常你会获得以下信息:
AI_API_KEY=你的_API_KEY
AI_BASE_URL=https://api.openai.com/v1/chat/completions
AI_MODEL=gpt-4o-mini
如果你使用的是兼容 OpenAI API 格式的国内或第三方模型平台,也可以替换为对应地址。
例如:
AI_API_KEY=sk-xxxx
AI_BASE_URL=https://你的服务商地址/v1/chat/completions
AI_MODEL=你的模型名称
五、创建项目
新建项目目录:
mkdir ai-code-assistant
cd ai-code-assistant
初始化 Node.js 项目:
npm init -y
安装依赖:
npm install express dotenv node-fetch cors
如果使用 Node.js 18 以上,其实已经内置 fetch,但为了兼容性,这里仍然安装 node-fetch。
六、项目目录结构
最终目录结构如下:
ai-code-assistant/
├── public/
│ ├── index.html
│ ├── style.css
│ └── app.js
├── .env
├── package.json
└── server.js
各文件作用说明:
| 文件 | 作用 |
|---|---|
server.js |
后端主入口,提供 AI 接口 |
.env |
保存 API Key、模型名等敏感配置 |
public/index.html |
前端页面结构 |
public/style.css |
页面样式 |
public/app.js |
前端请求逻辑 |
package.json |
项目依赖与启动命令 |
七、编写后端代码
在项目根目录创建 server.js:
import express from "express";
import cors from "cors";
import dotenv from "dotenv";
import fetch from "node-fetch";
dotenv.config();
const app = express();
app.use(cors());
app.use(express.json());
app.use(express.static("public"));
const PORT = process.env.PORT || 3000;
app.post("/api/code", async (req, res) => {
try {
const { prompt } = req.body;
if (!prompt || typeof prompt !== "string") {
return res.status(400).json({
success: false,
message: "请输入有效的编程需求"
});
}
const systemPrompt = `
你是一个专业的 AI 编程助手。
你的任务是帮助用户完成代码编写、代码解释、Bug 修复、性能优化和工程化建议。
回答要求:
1. 使用中文回答;
2. 如果涉及代码,请使用 Markdown 代码块;
3. 代码应尽量完整、可运行;
4. 必要时解释关键逻辑;
5. 如果用户需求不明确,可以给出合理假设。
`;
const response = await fetch(process.env.AI_BASE_URL, {
method: "POST",
headers: {
"Content-Type": "application/json",
"Authorization": `Bearer ${process.env.AI_API_KEY}`
},
body: JSON.stringify({
model: process.env.AI_MODEL,
messages: [
{
role: "system",
content: systemPrompt
},
{
role: "user",
content: prompt
}
],
temperature: 0.3
})
});
if (!response.ok) {
const errorText = await response.text();
console.error("AI 接口错误:", errorText);
return res.status(500).json({
success: false,
message: "AI 服务调用失败",
detail: errorText
});
}
const data = await response.json();
const answer =
data.choices?.[0]?.message?.content ||
"AI 没有返回有效内容";
res.json({
success: true,
answer
});
} catch (error) {
console.error("服务器错误:", error);
res.status(500).json({
success: false,
message: "服务器内部错误",
detail: error.message
});
}
});
app.listen(PORT, () => {
console.log(`AI 编程助手已启动:http://localhost:${PORT}`);
});
八、配置 package.json
由于上面的代码使用了 ES Module 语法,需要在 package.json 中加入:
{
"type": "module"
}
完整示例:
{
"name": "ai-code-assistant",
"version": "1.0.0",
"description": "AI 编程助手部署教程源码",
"main": "server.js",
"type": "module",
"scripts": {
"start": "node server.js",
"dev": "node server.js"
},
"keywords": [
"AI",
"code",
"assistant",
"nodejs"
],
"author": "",
"license": "MIT",
"dependencies": {
"cors": "^2.8.5",
"dotenv": "^16.4.5",
"express": "^4.18.3",
"node-fetch": "^3.3.2"
}
}
九、编写环境变量
在项目根目录创建 .env 文件:
PORT=3000
AI_API_KEY=你的_API_KEY
AI_BASE_URL=https://api.openai.com/v1/chat/completions
AI_MODEL=gpt-4o-mini
注意:
.env文件不要上传到公开仓库;- API Key 是敏感信息;
- 如果部署到服务器,需要在服务器中单独配置;
- 如果使用 Git,建议创建
.gitignore文件,并加入.env。
创建 .gitignore:
node_modules
.env
logs
.DS_Store
十、编写前端页面
创建 public 目录:
mkdir public
创建 public/index.html:
AI 编程助手
AI 编程助手
输入你的编程需求,让 AI 帮你生成代码、解释逻辑、修复 Bug。
AI 返回结果
等待输入...
十一、编写前端样式
创建 public/style.css:
* {
box-sizing: border-box;
}
body {
margin: 0;
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Arial, sans-serif;
background: #f5f7fb;
color: #1f2937;
}
.container {
width: min(1000px, 92%);
margin: 0 auto;
padding: 40px 0;
}
header {
text-align: center;
margin-bottom: 32px;
}
header h1 {
font-size: 42px;
margin-bottom: 12px;
color: #111827;
}
header p {
color: #6b7280;
font-size: 16px;
}
.card {
background: #ffffff;
border-radius: 16px;
padding: 24px;
margin-bottom: 24px;
box-shadow: 0 12px 30px rgba(15, 23, 42, 0.08);
}
label {
display: block;
font-weight: 600;
margin-bottom: 12px;
}
textarea {
width: 100%;
height: 180px;
resize: vertical;
padding: 16px;
border: 1px solid #d1d5db;
border-radius: 12px;
font-size: 15px;
line-height: 1.6;
outline: none;
}
textarea:focus {
border-color: #2563eb;
box-shadow: 0 0 0 3px rgba(37, 99, 235, 0.15);
}
button {
margin-top: 16px;
border: none;
border-radius: 10px;
padding: 12px 20px;
background: #2563eb;
color: #ffffff;
font-size: 15px;
cursor: pointer;
}
button:hover {
background: #1d4ed8;
}
button:disabled {
background: #9ca3af;
cursor: not-allowed;
}
.result-title {
display: flex;
justify-content: space-between;
align-items: center;
}
.result-title h2 {
margin: 0;
}
#copyBtn {
background: #10b981;
}
#copyBtn:hover {
background: #059669;
}
pre {
white-space: pre-wrap;
word-wrap: break-word;
background: #0f172a;
color: #e5e7eb;
padding: 20px;
border-radius: 12px;
min-height: 220px;
line-height: 1.7;
overflow-x: auto;
}
十二、编写前端请求逻辑
创建 public/app.js:
const promptInput = document.getElementById("prompt");
const submitBtn = document.getElementById("submitBtn");
const resultEl = document.getElementById("result");
const copyBtn = document.getElementById("copyBtn");
submitBtn.addEventListener("click", async () => {
const prompt = promptInput.value.trim();
if (!prompt) {
alert("请输入编程需求");
return;
}
submitBtn.disabled = true;
submitBtn.textContent = "生成中...";
resultEl.textContent = "AI 正在思考,请稍候...";
try {
const response = await fetch("/api/code", {
method: "POST",
headers: {
"Content-Type": "application/json"
},
body: JSON.stringify({ prompt })
});
const data = await response.json();
if (!data.success) {
resultEl.textContent = data.message || "请求失败";
return;
}
resultEl.textContent = data.answer;
} catch (error) {
resultEl.textContent = "网络错误:" + error.message;
} finally {
submitBtn.disabled = false;
submitBtn.textContent = "生成代码";
}
});
copyBtn.addEventListener("click", async () => {
const text = resultEl.textContent;
if (!text || text === "等待输入...") {
alert("暂无可复制内容");
return;
}
try {
await navigator.clipboard.writeText(text);
copyBtn.textContent = "已复制";
setTimeout(() => {
copyBtn.textContent = "复制结果";
}, 1500);
} catch (error) {
alert("复制失败,请手动复制");
}
});
十三、本地运行项目
安装依赖:
npm install
启动项目:
npm run start
如果看到以下输出:
AI 编程助手已启动:http://localhost:3000
说明项目启动成功。
打开浏览器访问:
http://localhost:3000
输入编程需求进行测试,例如:
请用 Java 写一个单例模式,并解释饿汉式和懒汉式的区别
如果配置正确,页面会返回 AI 生成的代码和解释。
十四、接口测试
如果你不想打开浏览器,也可以使用 curl 测试接口:
curl -X POST http://localhost:3000/api/code \
-H "Content-Type: application/json" \
-d '{"prompt":"用 Go 写一个 HTTP 服务,并提供 /ping 接口"}'
正常情况下会返回:
{
"success": true,
"answer": "..."
}
如果返回 AI 服务调用失败,通常是以下原因:
- API Key 错误;
- 模型名称错误;
- 接口地址错误;
- 网络无法访问模型服务;
- 账号额度不足;
- 服务商接口格式不兼容。
十五、部署到 Linux 服务器
下面以 Ubuntu 服务器为例,介绍生产环境部署流程。
1. 上传代码
你可以使用 Git 拉取:
git clone https://你的仓库地址/ai-code-assistant.git
cd ai-code-assistant
也可以使用 scp 上传:
scp -r ai-code-assistant root@你的服务器IP:/var/www/
进入项目目录:
cd /var/www/ai-code-assistant
2. 安装依赖
npm install --production
创建生产环境 .env:
vim .env
内容示例:
PORT=3000
AI_API_KEY=你的线上_API_KEY
AI_BASE_URL=https://api.openai.com/v1/chat/completions
AI_MODEL=gpt-4o-mini
3. 使用 PM2 启动项目
安装 PM2:
npm install pm2 -g
启动项目:
pm2 start server.js --name ai-code-assistant
查看运行状态:
pm2 list
查看日志:
pm2 logs ai-code-assistant
设置开机自启:
pm2 startup
pm2 save
以后如果更新代码,可以执行:
pm2 restart ai-code-assistant
十六、配置 Nginx 反向代理
如果你希望通过域名访问,例如:
https://ai.example.com
可以使用 Nginx 做反向代理。
安装 Nginx:
sudo apt install nginx -y
创建配置文件:
sudo vim /etc/nginx/sites-available/ai-code-assistant
写入以下配置:
server {
listen 80;
server_name ai.example.com;
location / {
proxy_pass http://127.0.0.1:3000;
proxy_http_version 1.1;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
}
启用配置:
sudo ln -s /etc/nginx/sites-available/ai-code-assistant /etc/nginx/sites-enabled/
检查配置是否正确:
sudo nginx -t
重启 Nginx:
sudo systemctl restart nginx
现在你可以通过域名访问项目。
十七、配置 HTTPS 证书
推荐使用 Certbot 免费申请 SSL 证书。
安装 Certbot:
sudo apt install certbot python3-certbot-nginx -y
申请证书:
sudo certbot --nginx -d ai.example.com
按照提示输入邮箱并确认即可。
申请成功后,Certbot 会自动修改 Nginx 配置,并开启 HTTPS。
测试自动续期:
sudo certbot renew --dry-run
十八、生产环境优化建议
1. 增加请求频率限制
AI 接口通常按调用次数或 Token 收费,因此生产环境必须限制请求频率,避免被恶意刷接口。
安装:
npm install express-rate-limit
在 server.js 中加入:
import rateLimit from "express-rate-limit";
const limiter = rateLimit({
windowMs: 60 * 1000,
max: 20,
message: {
success: false,
message: "请求过于频繁,请稍后再试"
}
});
app.use("/api/", limiter);
这表示每个 IP 每分钟最多访问 API 20 次。
2. 限制输入长度
避免用户提交超长文本导致成本过高:
if (prompt.length > 3000) {
return res.status(400).json({
success: false,
message: "输入内容过长,请控制在 3000 字以内"
});
}
3. 隐藏错误详情
开发环境可以返回 detail,但生产环境不建议暴露详细错误。
可以这样写:
const isProd = process.env.NODE_ENV === "production";
res.status(500).json({
success: false,
message: "服务异常,请稍后再试",
detail: isProd ? undefined : error.message
});
4. 添加日志系统
可以使用 winston 记录接口调用、错误日志和响应耗时。
安装:
npm install winston
简单示例:
import winston from "winston";
const logger = winston.createLogger({
level: "info",
transports: [
new winston.transports.File({ filename: "logs/app.log" }),
new winston.transports.Console()
]
});
5. 支持流式输出
当前项目是等待 AI 完整返回后再展示结果。如果模型响应较慢,用户体验会受到影响。
更好的方式是使用 流式输出,让结果像聊天一样逐字显示。实现流式输出需要后端支持 SSE 或 WebSocket,前端逐步接收内容并渲染。
对于正式 AI 编程产品,建议支持:
- 流式生成;
- 会话上下文;
- 多模型切换;
- 代码高亮;
- Markdown 渲染;
- 用户登录;
- 调用额度控制;
- 历史记录保存。
十九、完整后端增强版源码
下面给出一个更适合生产环境的增强版 server.js,包含频率限制、输入长度限制和更规范的错误处理。
安装额外依赖:
npm install express-rate-limit
增强版代码:
import express from "express";
import cors from "cors";
import dotenv from "dotenv";
import fetch from "node-fetch";
import rateLimit from "express-rate-limit";
dotenv.config();
const app = express();
const PORT = process.env.PORT || 3000;
const isProd = process.env.NODE_ENV === "production";
app.use(cors());
app.use(express.json({ limit: "1mb" }));
app.use(express.static("public"));
const limiter = rateLimit({
windowMs: 60 * 1000,
max: 20,
standardHeaders: true,
legacyHeaders: false,
message: {
success: false,
message: "请求过于频繁,请稍后再试"
}
});
app.use("/api/", limiter);
function validateEnv() {
const required = ["AI_API_KEY", "AI_BASE_URL", "AI_MODEL"];
const missing = required.filter((key) => !process.env[key]);
if (missing.length > 0) {
console.error("缺少必要环境变量:", missing.join(", "));
process.exit(1);
}
}
validateEnv();
app.post("/api/code", async (req, res) => {
const startTime = Date.now();
try {
const { prompt } = req.body;
if (!prompt || typeof prompt !== "string") {
return res.status(400).json({
success: false,
message: "请输入有效的编程需求"
});
}
if (prompt.length > 3000) {
return res.status(400).json({
success: false,
message: "输入内容过长,请控制在 3000 字以内"
});
}
const systemPrompt = `
你是一个专业、严谨、耐心的 AI 编程助手。
你擅长 JavaScript、TypeScript、Python、Java、Go、SQL、Linux、前端工程化和后端架构设计。
请根据用户需求输出高质量答案。
回答规范:
1. 默认使用中文;
2. 涉及代码时使用 Markdown 代码块;
3. 尽量给出可直接运行的完整代码;
4. 对关键逻辑进行简明解释;
5. 对不安全或不合理的代码写法给出提醒;
6. 如果用户问题不明确,先说明你的合理假设,再给出实现。
`;
const aiResponse = await fetch(process.env.AI_BASE_URL, {
method: "POST",
headers: {
"Content-Type": "application/json",
"Authorization": `Bearer ${process.env.AI_API_KEY}`
},
body: JSON.stringify({
model: process.env.AI_MODEL,
messages: [
{
role: "system",
content: systemPrompt
},
{
role: "user",
content: prompt
}
],
temperature: 0.3,
max_tokens: 3000
})
});
if (!aiResponse.ok) {
const errorText = await aiResponse.text();
console.error("AI 接口调用失败:", {
status: aiResponse.status,
body: errorText
});
return res.status(500).json({
success: false,
message: "AI 服务调用失败",
detail: isProd ? undefined : errorText
});
}
const data = await aiResponse.json();
const answer =
data.choices?.[0]?.message?.content ||
"AI 没有返回有效内容";
const duration = Date.now() - startTime;
console.log(`请求完成,耗时 ${duration}ms`);
res.json({
success: true,
answer,
duration
});
} catch (error) {
console.error("服务器异常:", error);
res.status(500).json({
success: false,
message: "服务器内部错误",
detail: isProd ? undefined : error.message
});
}
});
app.listen(PORT, () => {
console.log(`AI 编程助手运行中:http://localhost:${PORT}`);
});
二十、常见问题排查
1. 页面可以打开,但 AI 没有返回
优先检查后端日志:
pm2 logs ai-code-assistant
常见原因包括:
.env没有正确配置;- API Key 无效;
- 模型名称写错;
- 服务器无法访问 AI 服务商接口;
- 服务商账号余额不足。
2. Nginx 访问 502 Bad Gateway
502 通常表示 Nginx 无法连接后端服务。
检查 Node 服务是否运行:
pm2 list
检查端口是否监听:
netstat -tulnp | grep 3000
如果没有启动,执行:
pm2 restart ai-code-assistant
3. 本地可以访问,服务器不能访问
请检查服务器安全组和防火墙。
如果直接访问 3000 端口,需要开放端口:
sudo ufw allow 3000
如果通过 Nginx 访问,只需要开放:
sudo ufw allow 80
sudo ufw allow 443
4. 返回内容格式不好看
当前前端只是使用 pre 标签展示文本,没有进行 Markdown 渲染。你可以引入 marked.js 和代码高亮库 highlight.js,让 AI 返回的代码块显示得更美观。
5. 响应速度较慢
AI 响应速度受以下因素影响:
- 模型服务商速度;
- 用户输入长度;
- 输出内容长度;
- 服务器网络质量;
- 是否开启流式输出。
如果要优化体验,建议优先实现流式输出。
二十一、后续扩展方向
这个项目只是一个基础版本。如果你想继续完善,可以从以下方向扩展:
1. 增加多轮对话
当前接口每次只发送当前问题,没有保留历史上下文。可以将历史消息保存到前端或数据库中,每次请求时一起发送给模型。
2. 增加用户登录
如果项目公开访问,建议加入用户系统,控制每个用户的调用次数。
3. 增加数据库
可以使用 MySQL、PostgreSQL 或 MongoDB 保存:
- 用户信息;
- 历史对话;
- 生成代码记录;
- 调用 Token 消耗;
- 用户反馈。
4. 增加模型切换
可以在前端增加模型选择框,例如:
- 快速模型;
- 高质量模型;
- 低成本模型;
- 本地私有化模型。
5. 增加代码高亮和 Markdown 渲染
AI 编程助手非常依赖代码展示效果,因此 Markdown 渲染和代码高亮是非常值得加入的功能。
6. 增加项目级代码分析
进一步扩展后,可以支持用户上传项目文件,让 AI 分析整个项目结构,生成重构建议、接口文档或测试用例。
二十二、总结
本文完整介绍了一个 AI 编程助手项目从开发到部署的全过程,包括:
- 项目技术选型;
- Node.js 后端接口开发;
- 前端页面编写;
- 环境变量配置;
- 本地运行测试;
- Linux 服务器部署;
- PM2 进程管理;
- Nginx 反向代理;
- HTTPS 证书配置;
- 生产环境优化;
- 完整源码示例;
- 常见问题排查。
通过这个项目,你已经掌握了一个 AI 应用最核心的开发链路:前端输入需求,后端调用大模型接口,再将模型结果返回给用户。
后续你可以基于该项目继续扩展,做成更完整的 AI 编程平台,例如 AI 代码生成器、Bug 修复助手、SQL 生成器、接口文档生成器、单元测试生成器,甚至企业内部私有化研发助手。
对于 AI 编程应用而言,最关键的不只是“能调用模型”,而是围绕真实开发场景做好体验设计、成本控制、安全防护和工程化部署。只要掌握了本文的基础框架,你就可以快速构建属于自己的 AI 编程产品。