AI 全栈应用开发:从数据服务到智能对话的完整实践
在当今快速发展的技术领域,全栈开发工程师的角色正在经历重大变革。随着人工智能技术的普及,传统的"全干工程师"正在向"AI应用开发工程师"转型。本文将详细介绍一个完整的AI全栈应用开发项目,从前端界面到后端API,再到AI大语言模型集成,展示如何构建一个智能的用户数据查询系统。
项目概述与技术栈
这个项目是一个集成了大语言模型能力的全栈Web应用,主要功能包括:
- 展示用户数据表格
- 通过自然语言查询用户信息
- 基于用户数据提供智能问答服务
技术栈组成:
- 前端:HTML5 + Bootstrap CSS + 原生JavaScript
- 后端:Node.js + JSON Server + 自定义HTTP服务器
- AI服务:OpenAI GPT-3.5-turbo模型
- 包管理:pnpm
- 数据格式:JSON
项目架构与目录结构
现代全栈应用的目录结构体现了关注点分离的原则:
text
复制下载
项目根目录/
├── package.json # 项目配置和依赖
├── pnpm-lock.yaml # 依赖锁文件
├── users.json # 数据文件
├── index.html # 前端页面
├── readme.md # 项目说明
└── server.js # 自定义后端服务
这种结构清晰地划分了前后端职责,便于团队协作和代码维护。
后端服务架构
JSON Server:轻量级REST API解决方案
项目中使用了JSON Server这一轻量级工具,它能够在几分钟内搭建一个完整的REST API,而无需编写任何后端代码。配置极为简单:
json
复制下载
{
"scripts": {
"dev": "json-server --watch users.json --port 3001"
},
"dependencies": {
"json-server": "1.0.0-beta.3"
}
}
JSON Server基于@tinyhttp框架构建,提供了完整的HTTP服务器功能,包括路由、中间件、CORS支持等。当执行npm run dev时,JSON Server会启动并在3001端口监听,自动为users.json文件中的数据结构生成对应的RESTful端点。
数据模型设计
users.json文件定义了应用的核心数据模型:
json
复制下载
{
"users": [
{
"id": 1,
"username": "张三",
"hometown": "九江"
},
{
"id": 2,
"username": "李四",
"hometown": "吉安"
}
]
}
这种简单的键值对结构充分体现了JSON格式的灵活性和易用性。每个用户对象包含ID、用户名和家乡三个字段,结构清晰且易于扩展。
自定义AI服务集成
项目中创建了一个自定义的HTTP服务器(监听1314端口),专门处理AI相关的请求:
javascript
复制下载
http.createServer(async (req, res) => {
res.setHeader('Access-Control-Allow-Origin', '*');
const parsedUrl = url.parse(req.url, true);
const prompt = `
${parsedUrl.query.data}
请根据上面的JSON数据,回答${parsedUrl.query.question}这个问题。
`;
const result = await getCompletion(prompt);
let info = { result };
res.status = 200;
res.setHeader('Content-Type', 'application/json');
res.end(JSON.stringify(info));
}).listen(1314)
这个服务充当了前端和OpenAI API之间的桥梁,接收包含用户数据和问题的请求,构造合适的提示词,调用AI模型,并将结果返回给前端。
前端设计与实现
响应式布局
前端页面采用Bootstrap框架实现响应式设计:
html
复制下载运行
<div class="container">
<div class="row col-md-6 col-md-offset-3">
<table class="table table-striped" id="user_table">
<!-- 表格内容 -->
</table>
</div>
</div>
Bootstrap的栅格系统(col-md-6 col-md-offset-3)确保表格在中等及以上屏幕尺寸的设备上居中显示,并占据50%的宽度,在小屏幕设备上自动调整为全宽,提供良好的移动端体验。
动态数据渲染
前端JavaScript使用Fetch API从JSON Server获取数据并动态渲染表格:
javascript
复制下载
fetch('http://localhost:3001/users')
.then(res => res.json())
.then(data => {
users = data;
oBody.innerHTML = data.map(user => `
<tr>
<td>${user.id}</td>
<td>${user.username}</td>
<td>${user.hometown}</td>
</tr>
`).join("")
})
这种方法实现了前后端分离,前端专注于数据展示和用户交互,后端专注于数据管理和API提供。
智能问答功能
用户可以通过自然语言提问,系统会将问题连同用户数据一起发送到AI服务:
javascript
复制下载
oForm.addEventListener("submit", (event) => {
event.preventDefault();
const question = oForm["question"].value;
fetch(`http://localhost:1314/?question=${question}&data=${JSON.stringify(users)}`)
.then(res => res.json())
.then(data => {
document.getElementById('message').innerHTML = data.result;
})
})
这种设计使得用户可以用自然语言查询如"有哪些用户的家乡是南昌?"或"列出所有用户的姓名"等问题,系统会理解问题意图并从数据中提取相关信息。
AI集成与提示工程
OpenAI API集成
项目通过OpenAI官方JavaScript库集成GPT-3.5-turbo模型:
javascript
复制下载
const client = new OpenAI({
apiKey: process.env.OPENAI_API_KEY,
baseURL: 'https://api.agicto.cn/v1'
})
const getCompletion = async (prompt, model = 'gpt-3.5-turbo') => {
const messages = [{ role: 'user', content: prompt }]
const result = await client.chat.completions.create({
model,
messages,
temperature: 0.1
})
return result.choices[0].message.content;
}
这里使用了较低的温度值(temperature: 0.1),确保模型输出更加确定和一致,适合处理结构化数据查询任务。
提示词设计
有效的提示词设计是AI应用成功的关键:
javascript
复制下载
const prompt = `
${parsedUrl.query.data}
请根据上面的JSON数据,回答${parsedUrl.query.question}这个问题。
`
这个简洁的提示词明确指示模型基于提供的JSON数据回答问题,避免了模型依赖训练数据中的信息,确保回答的准确性和针对性。
依赖管理与工程化
pnpm包管理
项目使用pnpm作为包管理器,pnpm-lock.yaml文件确保了依赖的一致性安装。与npm和yarn相比,pnpm采用内容可寻址存储,显著减少了磁盘空间占用,提高了安装速度。
环境变量管理
敏感信息如API密钥通过环境变量管理:
javascript
复制下载
config({ path: '.env' })
console.log(process.env.OPENAI_API_KEY, '////');
const client = new OpenAI({
apiKey: process.env.OPENAI_API_KEY,
// ...
})
这种方法避免了将敏感信息硬编码在源代码中,提高了安全性,便于在不同环境(开发、测试、生产)间切换配置。
开发工作流程
启动流程
- 启动JSON Server数据服务:
npm run dev(端口3001) - 启动自定义AI服务:
node server.js(端口1314) - 通过浏览器访问index.html文件
数据流
- 前端加载时从JSON Server获取用户数据并渲染表格
- 用户输入问题并提交
- 前端将问题和使用者数据发送到AI服务
- AI服务构造提示词,调用OpenAI API
- AI服务将结果返回前端显示
技术亮点与最佳实践
前后端分离架构
项目采用彻底的前后端分离架构:
- 前端:纯静态HTML/CSS/JavaScript,可通过任何Web服务器部署
- 后端:两个独立的服务分别处理数据API和AI功能
- 通过CORS(跨域资源共享)实现前后端通信
模块化设计
- 数据服务(JSON Server)独立于业务逻辑
- AI服务专注于处理自然语言查询
- 前端专注于用户界面和交互
错误处理与用户体验
javascript
复制下载
if(!question) {
alert("请输入问题")
return;
}
oBtn.disabled = true;
// ... 请求处理
oBtn.disabled = false;
通过按钮状态管理和用户输入验证,提供了良好的用户体验,防止重复提交和无效请求。
总结
这个AI全栈应用开发项目展示了现代Web开发的多个重要趋势:
- 前后端分离:通过REST API实现前后端解耦,提高开发效率和系统可维护性
- AI集成:将大语言模型能力无缝集成到传统Web应用中,显著增强应用智能
- 开发体验:使用JSON Server等工具快速原型开发,加速产品迭代
- 组件化思维:将系统拆分为独立且专注的模块,每部分各司其职
通过这个相对简单但完整的项目,开发者可以掌握全栈开发的核心技能,了解如何将传统Web开发与最新AI技术结合,为用户创造更智能、更自然的使用体验。随着AI技术的不断发展,这种"传统开发+AI能力"的模式将成为全栈开发的新标准,为开发者开辟更广阔的职业发展空间。