当前位置: 首页 > news >正文

Node.js后端服务调用Phi-3-mini:构建AI中间层REST API实战

Node.js后端服务调用Phi-3-mini:构建AI中间层REST API实战

1. 为什么需要AI中间层?

在Web应用中直接调用本地部署的大语言模型会遇到几个典型问题:前端无法直接访问本地模型、缺乏统一的API规范、难以管理并发请求、没有缓存和限流机制。这就是我们需要构建AI中间层的原因。

想象一下,你开发了一个电商客服系统,前端需要频繁调用Phi-3-mini生成回复。如果没有中间层,每个前端请求都要直接连接模型服务,不仅安全性存疑,当流量突增时还可能把模型服务压垮。而中间层就像个智能管家,帮你打理好一切。

2. 环境准备与快速部署

2.1 Node.js安装及环境配置

首先确保你的开发环境已经准备好:

# 检查Node.js版本(需要v16+) node -v # 如果没有安装,可以用nvm管理版本 curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash nvm install 18

2.2 初始化项目

创建一个新目录并初始化Node.js项目:

mkdir phi3-middleware && cd phi3-middleware npm init -y npm install express axios body-parser p-queue

这里我们安装了四个核心包:

  • express:Web框架
  • axios:HTTP客户端
  • body-parser:请求体解析
  • p-queue:并发控制

3. 构建基础REST API服务

3.1 创建Express服务器

新建server.js文件,搭建基础框架:

const express = require('express'); const bodyParser = require('body-parser'); const app = express(); // 中间件配置 app.use(bodyParser.json()); // 健康检查端点 app.get('/health', (req, res) => { res.json({ status: 'healthy' }); }); // 启动服务器 const PORT = process.env.PORT || 3000; app.listen(PORT, () => { console.log(`Server running on port ${PORT}`); });

测试服务是否正常运行:

node server.js curl http://localhost:3000/health

3.2 连接Phi-3-mini模型

假设Phi-3-mini已经在本地运行(比如通过Ollama),通常会在http://localhost:11434提供服务。我们添加一个代理接口:

const axios = require('axios'); const PHI3_URL = 'http://localhost:11434/api/generate'; app.post('/api/chat', async (req, res) => { try { const { prompt } = req.body; const response = await axios.post(PHI3_URL, { model: 'phi3', prompt: prompt }); res.json(response.data); } catch (error) { res.status(500).json({ error: error.message }); } });

现在你可以用curl测试这个接口:

curl -X POST http://localhost:3000/api/chat \ -H "Content-Type: application/json" \ -d '{"prompt":"介绍一下Node.js"}'

4. 进阶功能实现

4.1 请求队列管理

直接调用模型接口可能导致并发过高。我们用p-queue控制并发:

const { default: PQueue } = require('p-queue'); const queue = new PQueue({ concurrency: 3 }); // 最多3个并发 app.post('/api/chat', async (req, res) => { await queue.add(async () => { try { const { prompt } = req.body; const response = await axios.post(PHI3_URL, { model: 'phi3', prompt: prompt }); res.json(response.data); } catch (error) { res.status(500).json({ error: error.message }); } }); });

4.2 简单缓存实现

对相同prompt的请求,我们可以缓存结果:

const cache = new Map(); app.post('/api/chat', async (req, res) => { const { prompt } = req.body; if (cache.has(prompt)) { return res.json(cache.get(prompt)); } await queue.add(async () => { try { const response = await axios.post(PHI3_URL, { model: 'phi3', prompt: prompt }); cache.set(prompt, response.data); res.json(response.data); } catch (error) { res.status(500).json({ error: error.message }); } }); });

4.3 限流保护

防止单个客户端发送过多请求:

const rateLimit = require('express-rate-limit'); const limiter = rateLimit({ windowMs: 15 * 60 * 1000, // 15分钟 max: 100 // 每个IP最多100次请求 }); app.use(limiter);

5. 完整代码示例

以下是整合所有功能的完整server.js

const express = require('express'); const bodyParser = require('body-parser'); const axios = require('axios'); const { default: PQueue } = require('p-queue'); const rateLimit = require('express-rate-limit'); const app = express(); const PHI3_URL = 'http://localhost:11434/api/generate'; const queue = new PQueue({ concurrency: 3 }); const cache = new Map(); // 中间件 app.use(bodyParser.json()); app.use(rateLimit({ windowMs: 15 * 60 * 1000, max: 100 })); // 健康检查 app.get('/health', (req, res) => { res.json({ status: 'healthy' }); }); // 聊天接口 app.post('/api/chat', async (req, res) => { const { prompt } = req.body; if (cache.has(prompt)) { return res.json(cache.get(prompt)); } await queue.add(async () => { try { const response = await axios.post(PHI3_URL, { model: 'phi3', prompt: prompt }); cache.set(prompt, response.data); res.json(response.data); } catch (error) { res.status(500).json({ error: error.message }); } }); }); // 启动服务器 const PORT = process.env.PORT || 3000; app.listen(PORT, () => { console.log(`Server running on port ${PORT}`); });

6. 部署与测试建议

实际部署时,建议使用PM2管理Node.js进程:

npm install -g pm2 pm2 start server.js --name phi3-middleware pm2 save pm2 startup

测试时可以模拟多个并发请求:

const axios = require('axios'); const prompts = ['Node.js是什么', '如何学习JavaScript', '解释一下闭包']; async function test() { const results = await Promise.all( prompts.map(prompt => axios.post('http://localhost:3000/api/chat', { prompt }) ) ); console.log(results.map(r => r.data)); } test();

7. 总结

通过这个实战教程,我们构建了一个功能完整的AI中间层服务。它不仅解决了前端直接调用模型的问题,还通过队列、缓存和限流等机制提升了系统的稳定性和性能。实际使用中,你还可以考虑添加认证、日志监控等功能,让中间层更加健壮。

这套方案已经在我们团队的生产环境中稳定运行,处理日均上万次模型调用。特别是在流量高峰时段,队列和缓存机制显著降低了模型服务的压力。如果你正在寻找一个简单高效的AI中间层解决方案,不妨从这个基础版本开始,根据实际需求逐步扩展。


获取更多AI镜像

想探索更多AI镜像和应用场景?访问 CSDN星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。

http://www.jsqmd.com/news/643133/

相关文章:

  • Qwen3.5-9B GPU优化:梯度检查点+序列并行降低显存峰值方案
  • PyTorch底层揭秘:c10::ArrayRef和at::IntArrayRef如何优化张量操作性能
  • 北航毕设论文排版终极指南:告别格式焦虑的完整解决方案
  • 什么是增值税发票
  • 从生活案例到统计检验:正态分布、卡方分布、t分布、F分布及其检验方法全解析
  • 独立站建站平台怎么选?新手一看就懂的选型指南|帮你少走弯路
  • AI核心知识119—大语言模型之 监督微调 (简洁且通俗易懂版)
  • Cursor Free VIP:终极解决方案,突破Cursor AI限制,免费享受Pro功能
  • 比斯特自动化动力电池组半自动生产线的工艺革新与效率提升
  • Vue前端集成Hunyuan-MT 7B:实时翻译Web应用开发实战
  • AIAgent情感陪伴不是拟人化,而是神经符号融合——2026奇点大会首席科学家亲授4步验证法
  • Qwen3在网络安全领域的应用:音视频内容安全审核字幕生成
  • 小白也能用!MedGemma医学影像分析系统快速部署教程
  • 告别机械音!用Step-Audio-EditX的标签魔法,为你的视频配音注入灵魂(附情绪/方言标签大全)
  • 2026最新数据抓取实战:如何用 ChatGPT 实现网页数据抓取?
  • **发散创新:基于Rust的内存安全防御技术实战解析**在现代软件开
  • 一站式教程:轻松修复msvcr120.dll丢失问题,提升电脑性能
  • BERT文本分割-中文-通用领域部署避坑指南:常见报错与解决方法
  • 比 FastAPI 更轻量:Starlette 源码深挖 + 手写高性能接口网关(含请求鉴权、限流)
  • 从零开始:Fiji图像处理平台全面解析与实战指南
  • golang如何实现Trace上下文传播_golang Trace上下文传播实现思路
  • DeepSeek对话导出Word/PDF全攻略,【Linux】 开启关闭MediaMTX服务。
  • PowerBI进阶技巧:利用SVG打造动态数据标签与进度条
  • CSS如何设置文本自动断字效果_使用hyphens属性优化排版
  • 高效论文降重方案:TOP10平台功能对比与选择建议(实测AIGC率最低降至5%以下!)
  • 【稀缺首发】2024最新AIAgent模仿学习基准测试报告:LLM-Augmented Imitation在12类任务中准确率跃升至91.7%
  • JavaScript中Object-defineProperties批量设置属性
  • 如何指定PHP版本运行phpMyAdmin_多版本共存配置
  • 为什么83%的三甲医院AI影像系统仍在用2023年前架构?2026奇点大会披露4大技术债清单及迁移路线图(限首批200家机构获取)
  • 云主机入侵排查与应急响应:从日志分析到后门清除实战手册