上一篇 下一篇 分享链接 返回 返回顶部

从零搭建 AI 编程助手:开发、部署到上线源码全流程

发布人:慈云数据-客服中心 发布时间:21小时前 阅读量:3

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 编程产品。

目录结构
全文