从零开始构建全栈AI项目

583 阅读5分钟

引言

在这个教程中,我们将从头开始构建一个全栈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 密钥、数据库连接字符串等)。


好了最后展示一下这个应用的成果吧!

image.png 通过引入AI,我们的程序变得更加智能、互动和用户友好。它不仅提升了用户体验,还提供了更多的数据洞察和自动化能力,从而提高了效率和竞争力。

总结

本教程展示了如何构建一个基本的全栈AI应用,它能够处理用户输入的问题,并通过集成的AI服务给出相应的答案。这只是一个起点,您可以在此基础上扩展更多的功能,如更复杂的用户界面、更丰富的数据源或者更先进的AI模型等。

20200229174423_bzukt.jpg