引言
在这个教程中,我们将从头开始构建一个全栈AI项目,它包括前端用户界面、后端数据接口以及AI服务器。我们将利用JSON Server作为后端数据提供者,并通过OpenAI API来实现自然语言处理功能。
架构概览
我们的项目架构如下:
- 前端:负责展示用户界面和与用户交互。
- 后端:提供数据接口,模拟数据库操作。
- LLM(大语言模型)服务器:调用AI服务,处理用户的查询并返回答案。
前端
前端部分使用HTML5、CSS3 (Bootstrap) 和JavaScript来构建用户界面。我们使用了Bootstrap框架来快速设计响应式的布局。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>AI Users Rag chatbot</title>
<link href="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.0.3/css/bootstrap.min.css" rel="stylesheet">
</head>
<body>
<div class="container">
<div class="row col-md-6 col-md-offset-3">
<table class="table table-striped" id="user_table">
<thead>
<tr>
<th>ID</th>
<th>姓名</th>
<th>家乡</th>
</tr>
</thead>
<tbody>
</tbody>
</table>
<div class="row">
<form name="aiForm" action="http://www.baidu.com">
<div class="from-group">
<label for="questionInput">提问</label>
<input type="text" id="questionInput" class="form-control" name="question" placeholder="请输入问题" required>
</div>
<button type="submit" class="btn btn-default" name="btn">查询</button>
</form>
<div class="row" id="message"></div>
</div>
</div>
</div>
<script>
// js 主动向后端发送数据接口请求
// 前端向后端拉取数据
const tableBody = document.querySelector('table tbody');
const oForm = document.forms['aiForm']
let usersData;
fetch('http://localhost:3001/users')
// 数据到达前端 二进制 -> json
.then(res => res.json())
.then(users => {
// console.log(data);
usersData = users;
for (let user of users) {
// console.log(user);
const tr = document.createElement('tr');
// for in json 对象遍历
for (let key in user) {
const td = document.createElement('td');
td.innerText = user[key];
tr.appendChild(td);
}
tableBody.appendChild(tr)
}
})
oForm.addEventListener('submit', e => {
// 事件对象
//console.log(e);
e.preventDefault(); // 阻止表单默认行为
// fetch 在页面不刷新的时候 向ai server 发出请求
// const question = oForm.question.value;
// 发送数据到后端
//web 2.0 动态页面开发 js fetch 可以主动拉取数据
const question = oForm.question.value.trim();
if (!question) {
alert('请输入问题');
return;
}
fetch(`http://localhost:1314/api?question=${question}&data=${JSON.stringify(usersData)}`)//把问题和内容 发送到后端
.then(data => data.json())
.then(data => {
console.log(data);
document.querySelector('#message').innerText = data.result;
})
//const formData = new FormData(oForm);
// console.log(formData);
})
</script>
</body>
</html>
当然,我们可以进一步拓展后端部分的解释,使其更加详细和易于理解。以下是关于使用JSON Server作为后端数据源的详细说明:
后端
1. 介绍 JSON Server
JSON Server 是一个用于快速创建 RESTful API 的工具。它非常适合在开发过程中模拟后端服务,而无需实际搭建复杂的服务器环境。JSON Server 可以根据提供的 JSON 文件自动生成 API 接口,支持基本的 CRUD(创建、读取、更新、删除)操作。
2. 安装依赖
首先,您需要安装 json-server。这可以通过 npm (Node.js 包管理器) 来完成。
npm install json-server
3. 配置 package.json
接下来,在您的项目根目录中配置 package.json 文件,以便可以轻松地启动 JSON Server。
{
"name": "backend",
"version": "1.0.0",
"scripts": {
"dev": "json-server --watch user.json --port 3001"
},
"dependencies": {
"json-server": "^1.0.0-beta.3"
}
}
name: 项目的名称。version: 项目的版本号。scripts:"dev": 这是一个脚本命令,用于启动 JSON Server。--watch参数表示监视user.json文件的变化,并自动重启服务器。--port 3001指定服务器运行的端口号。
dependencies: 列出项目依赖的库及其版本。
4. 创建数据文件 (user.json)
创建一个名为 user.json 的文件,用于存储用户数据。这个文件将作为 JSON Server 的数据源。
{
"users": [
{"id": 1, "name": "过宇鑫", "hometown": "进贤"},
{"id": 2, "name": "彭威", "hometown": "宜春"},
{"id": 3, "name": "徐超", "hometown": "宜春"}
]
}
5. 启动后端服务
现在,您可以使用以下命令启动 JSON Server:
npm run dev
启动后,JSON Server 将监听 http://localhost:3001,并提供以下 API 端点:
- GET /users: 获取所有用户数据。
- GET /users/:id: 获取指定 ID 的用户数据。
- POST /users: 添加新用户数据。
- PUT /users/:id: 更新指定 ID 的用户数据。
- PATCH /users/:id: 部分更新指定 ID 的用户数据。
- DELETE /users/:id: 删除指定 ID 的用户数据。
6. 测试 API
您可以通过浏览器或使用工具如 Postman 来测试这些 API 端点。例如,访问 http://localhost:3001/users 应该返回所有的用户数据。
通过使用 JSON Server,您可以快速搭建一个简单的后端服务,用于模拟 RESTful API。这对于前端开发人员来说非常有用,因为它允许他们在没有实际后端的情况下进行开发和测试。当项目逐渐成熟时,您可以考虑迁移到更复杂的后端解决方案,如 Express + MySQL 或其他数据库系统。
AI服务器
AI服务器使用Node.js构建,通过HTTP模块创建一个web服务器,并且使用OpenAI库来与GPT-3.5进行交互。
安装依赖
npm install openai
index.js - AI服务器入口点
const http = require("http");
const OpenAI = require("openai");
const url = require("url");
const client = new OpenAI({
apiKey: "YOUR_API_KEY",
baseURL: "https://api.302.ai/v1"
});
const getCompletion = async (prompt, model = "gpt-3.5-turbo") => {
const messages = [{ role: 'user', content: prompt }];
const response = await client.chat.completions.create({
model,
messages,
temperature: 0.1
});
return response.choices[0].message.content;
};
const server = http.createServer(async (req, res) => {
// CORS设置
res.setHeader('Access-Control-Allow-Origin', '*');
res.setHeader('Access-Control-Allow-Methods', 'GET, POST, OPTIONS');
res.setHeader('Access-Control-Allow-Headers', 'Content-Type, Authorization');
const { query } = url.parse(req.url, true);
const prompt = `${query.data} 请根据上面的JSON数据,回答${query.question}这个问题`;
const result = await getCompletion(prompt);
res.writeHead(200, { 'Content-Type': 'application/json' });
res.end(JSON.stringify({ result }));
});
server.listen(1314, () => console.log('Server is running on port 1314'));
确保替换YOUR_API_KEY为您的实际API密钥,在实际开发中我们一般使用.env文件配合dotenv包来隐藏我们的敏感信息(如 API 密钥、数据库连接字符串等)。
好了最后展示一下这个应用的成果吧!
通过引入AI,我们的程序变得更加智能、互动和用户友好。它不仅提升了用户体验,还提供了更多的数据洞察和自动化能力,从而提高了效率和竞争力。
总结
本教程展示了如何构建一个基本的全栈AI应用,它能够处理用户输入的问题,并通过集成的AI服务给出相应的答案。这只是一个起点,您可以在此基础上扩展更多的功能,如更复杂的用户界面、更丰富的数据源或者更先进的AI模型等。