AI全栈开发实战:构建一个基于大模型的用户查询聊天机器人
本文以构建一个基于用户数据的AI聊天机器人为例,系统展示了AI时代“全干工程师”的开发范式:利用json-server快速搭建模拟API,通过Node.js调用OpenAI实现自然语言问答,前端采用Bootstrap+原生JS完成交互。文章强调借助AI工具可高效整合前后端与大模型,实现从需求描述到产品原型的极速落地,体现Prompt Engineering与全栈能力融合的新趋势。
引言
本文将通过一个完整的项目案例,深入剖析当前AI赋能下的全栈开发新范式,并结合代码实践展示如何从前端界面到后端服务再到大模型集成,实现一个具备自然语言交互能力的“用户聊天机器人”。
一、背景与趋势:从“全栈”走向“全干”的AI时代开发者
随着生成式人工智能(AIGC)技术的迅猛发展,软件开发正经历一场深刻的变革。传统意义上“前端+后端+数据库”的分工模式正在被打破,取而代之的是以AI为核心驱动力的“全干工程师”角色——即能够独立完成产品设计、前后端开发、部署运维甚至测试优化的全能型开发者。
核心趋势总结:
- AI极大提升个人生产力:过去需要1~2年经验积累才能完成的完整应用,如今借助AI工具可在数小时内搭建原型。
- 岗位转型加速:未来5~6年内,传统CRUD型开发岗位将逐步被“AI应用开发工程师”取代。
- 技术栈聚焦:掌握 JavaScript(前端) + Python/Node.js(后端) + Prompt Engineering(提示工程) 成为最高效的路径。
- 开发范式转变:从“写代码实现功能”转向“用自然语言描述需求 + AI辅助生成 + 人工校验优化”。
本文将以一个用户数据聊天机器人为例,手把手带你体验这一全新开发流程。
二、项目目标与整体架构
功能需求
用户在页面输入自然语言问题(如“谁是北京人?”),系统自动调用本地用户数据,并通过大模型(LLM)理解问题、分析数据并返回答案。
技术架构图
[浏览器]
│
├── GET /users → [json-server:3001] → 返回用户列表
│
└── POST /?question=...&data=[...] → [Node.js LLM Server:1314]
│
└── 调用 OpenAI API (via agicto.cn)
└── 返回结构化回答
项目目录建议

在项目中通过以下命令对项目进行配置
# 初始化项目,生成 package.json(只需执行一次)
npm init -y
# 使用 pnpm 安装 json-server,用于基于 JSON 文件快速创建本地 REST API 服务。
pnpm i json-server
# 安装openai和dotenv包
# OpenAI SDK,用于在代码中调用 GPT 等大模型 API。
# dotenv 包,用于从 .env 文件加载环境变量(如 API 密钥),提升安全性。
pnpm i openai dotenv
# 若此前未安装过pnpm,则使用以下命令
npm install -g pnpm
pnpm i openai dotenv json-server
三、前端实现:语义化HTML + Bootstrap布局 + 动态渲染
页面结构及JavaScript交互逻辑(index.html)
注意:运行index.html前,要在users.json所在文件夹打开终端运行以下命令,否则页面无法显示json文件内容
npx json-server --watch users.json --port 3001
<!DOCTYPE html>
<html lang="en">
<head>
<!-- 声明文档使用 UTF-8 编码,支持中文等多语言 -->
<meta charset="UTF-8">
<!-- 设置视口,确保在移动设备上正确缩放(响应式基础) -->
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Users Chatbot</title>
<!-- 引入 Bootstrap 3 的 CSS 样式库(通过国内 CDN 加速) -->
<!-- 用于快速构建美观的表单、表格和布局 -->
<link href="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.0.3/css/bootstrap.min.css" rel="stylesheet">
</head>
<body>
<!-- .container 是 Bootstrap 的固定宽度容器(居中,带左右 padding) -->
<div class="container">
<!-- 第一部分:用户数据表格 -->
<!--
- .row 表示一行(Bootstrap 栅格系统的基础)
- .col-md-6 表示在中等及以上屏幕宽度下占 6/12 列(即一半宽度)
- .col-md-offset-3 表示向右偏移 3 列,实现水平居中(3+6+3=12)
-->
<div class="row col-md-6 col-md-offset-3">
<!-- 使用 Bootstrap 的 table 样式:striped 表示斑马纹 -->
<table class="table table-striped" id="user_table">
<!-- 表头定义 -->
<thead>
<tr>
<th>ID</th>
<th>姓名</th>
<th>家乡</th>
</tr>
</thead>
<!-- 表体,动态内容将通过 JavaScript 插入此处 -->
<tbody></tbody>
</table>
</div>
<!-- 第二部分:AI 提问表单 -->
<!-- 注意:原代码中 form 外层缺少 col 布局,可能导致在小屏错位(建议也加 col-md-6 offset) -->
<div class="row">
<!-- 表单,通过 name="aiForm" 可在 JS 中通过 document.forms["aiForm"] 快速获取 -->
<form name="aiForm">
<div class="form-group">
<!-- label 绑定到 input 的 id,提升无障碍访问体验 -->
<label for="questionInput">请输入问题:</label>
<input
type="text"
class="form-control" <!-- Bootstrap 输入框样式 -->
id="questionInput" <!-- 与 label 的 for 对应 -->
name="question" <!-- 表单字段名,JS 中可通过 form.question 访问 -->
required <!-- HTML5 必填验证,空提交会被浏览器拦截 -->
placeholder="请输入问题"> <!-- 占位提示文字 -->
</div>
<div class="form-group">
<!-- 提交按钮,Bootstrap primary 主题样式 -->
<button type="submit" class="btn btn-primary">提交</button>
</div>
</form>
</div>
<!-- 第三部分:显示 AI 回答的区域 -->
<div class="row" id="message"></div>
</div>
<!-- 页面底部引入内联 JavaScript -->
<script>
// ========== 获取关键 DOM 元素 ==========
const oForm = document.forms["aiForm"]; // 通过表单 name 属性获取表单对象
const oBody = document.querySelector('#user_table'); // 注意:这里选的是整个 table,而非 tbody
const oBtn = document.querySelector(".btn"); // 获取提交按钮
let users = null; // 全局变量,用于存储从后端获取的用户数据
// ========== 监听表单提交事件 ==========
oForm.addEventListener("submit", (event) => {
event.preventDefault(); // 阻止表单默认提交行为(避免页面刷新)
// 获取用户输入的问题值
const question = oForm["question"].value.trim(); // 建议加 .trim() 去除首尾空格
// 前端二次校验(虽然有 required,但以防万一)
if (!question) {
alert("请输入问题");
return;
}
// 禁用按钮,防止重复点击(避免多次调用 AI 接口产生费用或混乱)
oBtn.disabled = true;
// 【调试】打印即将发送的请求 URL(注意:中文未编码,可能出错!)
console.log(`http://localhost:1314/?question=${question}&data=${JSON.stringify(users)}`);
// 向本地 AI 服务(1314 端口)发起 GET 请求
// 问题:question 和 data 中若含特殊字符(如空格、中文),需 URL 编码!
fetch(
`http://localhost:1314/?question=${question}&data=${JSON.stringify(users)}`
)
.then(res => res.json()) // 将响应体解析为 JSON 对象
.then(data => {
console.log('AI 返回结果:', data);
// 恢复按钮可用状态
oBtn.disabled = false;
// 将 AI 回答直接插入 message 区域(存在 XSS 风险,生产环境应转义)
document.getElementById('message').innerHTML = data.result;
})
.catch(err => {
console.error('请求失败:', err);
oBtn.disabled = false;
document.getElementById('message').innerHTML = '<p style="color:red;">请求出错,请重试</p>';
});
});
// ========== 页面加载时:获取用户数据 ==========
// 向 json-server 模拟 API(3001 端口)发起 GET 请求,获取 /users 数据
fetch('http://localhost:3001/users')
.then(res => res.json()) // 解析 JSON 响应
.then(data => {
users = data; // 保存数据到全局变量,供后续 AI 请求使用
// 将用户数据映射为 HTML 表格行字符串
// 使用 map 遍历数组,每项生成一个 <tr>...</tr>
const rowsHtml = data.map(user => `
<tr>
<td>${user.id}</td>
<td>${user.username}</td>
<td>${user.hometown}</td>
</tr>
`).join(""); // 将数组拼接成完整字符串
//问题:oBody 指向的是整个 <table>,而 innerHTML 会覆盖表头!
// 正确做法:应选择 tbody,例如:
// document.querySelector('#user_table tbody').innerHTML = rowsHtml;
oBody.innerHTML = rowsHtml;
})
.catch(err => {
console.error('加载用户数据失败:', err);
oBody.innerHTML = '<tr><td colspan="3">数据加载失败</td></tr>';
});
</script>
</body>
</html>
关键设计亮点:
- Bootstrap栅格系统:
col-md-6 col-md-offset-3实现PC端居中六列布局(12列中的中间6列)。 - 语义化标签:使用
<thead>、<tbody>提升可访问性与SEO。 - 无障碍交互:
<label for="...">与id绑定,支持屏幕阅读器。 - 必填校验:
required属性由浏览器自动拦截空提交。
JavaScript交互逻辑技术要点解析:
| 技术点 | 说明 |
|---|---|
fetch() |
浏览器原生API,用于发起HTTP请求,支持Promise链式调用 |
res.json() |
将响应体(二进制流)异步解析为JSON对象 |
JSON.stringify(users) |
将JS对象序列化为字符串,以便作为URL参数传输 |
encodeURIComponent() |
对中文等特殊字符进行URL编码,防止乱码 |
全局变量 users |
存储从后端获取的数据,供后续AI请求复用 |
| 按钮禁用机制 | 提升用户体验,避免重复计费或请求堆积 |
四、后端服务:双服务协同架构
本项目采用双后端服务设计:
- 模拟数据服务(3001端口):提供静态用户数据。
- AI代理服务(1314端口):接收前端问题,调用大模型并返回答案。
1. 模拟数据服务(json-server)
# 安装
npm install -g json-server
# 创建 users.json
{
"users": [
{"id": 1, "username": "张三", "hometown": "北京"},
{"id": 2, "username": "李四", "hometown": "吉安"},
{"id": 3, "username": "王五", "hometown": "上海"}
]
}
# 启动
json-server --watch users.json --port 3001
✅ 访问
http://localhost:3001/users即可获取JSON数组。
2. AI服务 (index.mjs)
// ================================
// 文件功能:创建一个 HTTP 服务,接收前端问题和数据,调用大模型(LLM)返回智能回答
// 技术栈:Node.js + OpenAI SDK + dotenv + 内置 http/url 模块
// 监听端口:1314
// ================================
// 引入 Node.js 内置的 http 模块,用于创建 Web 服务器
import http from 'http';
// 引入 OpenAI 官方 SDK,用于调用大语言模型(如 GPT-3.5、GPT-4)
import OpenAI from 'openai';
// 引入 Node.js 内置的 url 模块,用于解析请求 URL 中的查询参数(query string)
import url from 'url';
// 引入 dotenv 模块,用于从 .env 文件中加载环境变量(如 API 密钥)
import { config } from 'dotenv';
// 执行 dotenv 的 config 函数,读取项目根目录下的 .env 文件
// 将其中的键值对(如 OPENAI_API_KEY=sk-xxx)注入到 process.env 对象中
config({
path: '.env' // 明确指定 .env 文件路径(默认就是当前目录,此处显式写出更清晰)
});
// 【调试用】打印出从 .env 加载的 API 密钥(实际部署时应移除,避免泄露)
console.log(process.env.OPENAI_API_KEY, '////');
// 初始化 OpenAI 客户端实例
// 注意:这里使用了国内代理地址(api.agicto.cn),可加速访问并绕过网络限制
const client = new OpenAI({
apiKey: process.env.OPENAI_API_KEY, // 从环境变量安全读取 API 密钥
baseURL: 'https://api.agicto.cn/v1' // 替换为官方地址 https://api.openai.com/v1 也可
});
// ================================
// 封装大模型调用函数:给定提示词(prompt),返回模型生成的文本
// ================================
/**
* 调用大语言模型生成回答
* @param {string} prompt - 发送给模型的提示词(包含指令和上下文)
* @param {string} model - 使用的模型名称,默认为 'gpt-3.5-turbo'(性价比高)
* @returns {Promise<string>} 模型返回的纯文本内容
*/
const getCompletion = async (prompt, model = 'gpt-3.5-turbo') => {
// 构造聊天消息数组(OpenAI Chat Completions API 要求格式)
// 当前仅包含一条用户消息(role: 'user')
const messages = [{
role: 'user', // 角色:用户
content: prompt // 内容:完整的提示词
}];
// 调用 OpenAI API,发起异步请求
const result = await client.chat.completions.create({
model: model, // 指定模型
messages: messages, // 传入消息历史
temperature: 0.1 // 控制输出随机性:0.1 表示非常确定、少“胡说”,适合事实问答
});
// 从响应中提取第一条回答的文本内容并返回
// result.choices 是一个数组,通常只取第一个(index 0)
return result.choices[0].message.content;
};
// ================================
// (已注释掉的测试代码)可用于本地快速验证模型是否连通
// ================================
// const result = await getCompletion('你好');
// console.log(result); // 应输出类似“你好!有什么我可以帮您的吗?”
// ================================
// 创建 HTTP 服务器,处理来自前端的 AI 请求
// ================================
http.createServer(async (req, res) => {
// 设置响应头:允许任何来源的前端页面跨域访问此接口(CORS)
// 否则浏览器会因同源策略拦截响应
res.setHeader('Access-Control-Allow-Origin', '*');
// 解析请求的 URL,提取查询参数(query)
// 第二个参数 true 表示自动将 query 字符串解析为 JavaScript 对象
// 例如:/?question=谁是吉安人&data=[...] → parsedUrl.query = { question: '谁是吉安人', data: '[...]' }
const parsedUrl = url.parse(req.url, true);
// 从查询参数中取出前端传来的两个关键数据:
// - question:用户提出的问题(如“谁来自北京?”)
// - data:前端序列化后的用户数据(JSON 字符串)
const { question, data } = parsedUrl.query;
// 构造发送给大模型的完整提示词(Prompt Engineering 的核心!)
// 将原始数据和问题拼接成自然语言指令
const prompt = `
${data}
请根据上面的JSON数据,回答“${question}”这个问题。
`;
// 调用封装好的 getCompletion 函数,传入提示词,等待模型返回结果
const result = await getCompletion(prompt);
// 准备返回给前端的 JSON 数据结构
let info = {
result: result // 将模型回答放入 result 字段
};
// 设置 HTTP 状态码为 200(成功)
// 注意:原代码写的是 res.status = 200,但 Node.js 原生 http 模块应使用 res.statusCode
res.statusCode = 200; // 使用 statusCode 而非 status
// 设置响应内容类型为 JSON,告知浏览器如何解析返回数据
res.setHeader('Content-Type', 'application/json');
// 将 info 对象序列化为 JSON 字符串,并作为响应体发送给前端
res.end(JSON.stringify(info));
}).listen(1314, () => {
// 服务器启动成功后执行的回调
console.log('AI 服务已启动,正在监听 http://localhost:1314');
});
关键配置说明:
.env文件:安全存储API密钥OPENAI_API_KEY=sk-xxxxxx- Base URL 代理:使用
api.agicto.cn可绕过网络限制,提升国内访问速度。 - Prompt Engineering:精心设计提示词,明确指令边界,防止模型“幻觉”。
- 错误处理:捕获异常并返回友好提示,避免前端崩溃。
五、运行结果
1. 运行以下命令
# 终端1:在后端文件夹 backend 终端启动模拟数据服务
npx json-server --watch users.json --port 3001

# 终端2:在llm文件夹终端启动AI服务(需先配置 .env)
node index.mjs

注意:运行后不要关闭终端,否则启动HTML文件时无法获取json文件内容
2. 浏览器打开 index.html
输入问题:谁是北京人
运行结果如图

六、AI赋能开发的核心优势
1. 开发效率飞跃
- 原需数天的工作(前后端联调 + LLM集成),现在2小时内即可完成。
- AI工具可自动生成90%的样板代码,开发者聚焦业务逻辑与体验优化。
2. 自然语言交互成为可能
- 用户无需学习SQL或API,直接用“谁是吉安人?”这类口语提问。
- 系统自动解析意图、匹配数据、生成答案,实现低门槛数据查询。
3. 快速验证MVP
- 利用
json-server+Node.js HTTP+OpenAI SDK,零数据库、零框架即可跑通闭环。 - 适合创业团队快速验证产品想法。
七、扩展方向:
- 引入RAG(检索增强生成):将用户数据向量化,实现更精准的语义检索。
- 多轮对话支持:记录对话历史,提升上下文理解能力。
- 部署上线:使用 Vercel(前端) + Render(后端)免费托管。
- 权限控制:增加登录鉴权,保护敏感数据。
八、结语:拥抱“全干工程师”新时代
这个小小的聊天机器人项目,浓缩了AI时代全栈开发的精髓:
前端负责交互体验,后端负责数据流转,AI负责智能决策。
未来的开发者不再是“代码搬运工”,而是需求翻译者、系统架构师与AI协作者。掌握 JavaScript、Node.js、Prompt Engineering 和基础 DevOps,你就能以一人之力,构建过去需要一个小团队才能完成的产品。
正如本文所示:一行 fetch,一句 prompt,一个 server,即可让机器读懂人类语言,并为之服务。
这,就是AI全栈开发的魅力所在。
附:启动命令清单
# 终端1:在后端启动模拟数据服务 npx json-server --watch users.json --port 3001 # 终端2:在llm文件夹终端启动AI服务(需先配置 .env) node index.mjs # 浏览器打开 index.html 即可使用
更多推荐


所有评论(0)