当前位置: 首页 > 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.cnnetsun.cn/news/1899111.html

相关文章:

  • Cursor Free VIP:终极解决方案,突破Cursor AI限制,免费享受Pro功能
  • 视频理解大模型正面临“语义鸿沟”危机?2026奇点大会提出的动态概念对齐框架,72小时内可集成
  • 图片服务器被刷流量怎么办?防盗链、限速、黑名单三招防劫持
  • LFM2.5-1.2B-Thinking实战分享:Ollama部署,用它来帮你梳理工作思路
  • Phi-4-mini-reasoning镜像安全合规说明:本地化部署规避API泄露与数据外传风险
  • Qwen3-ASR-1.7B模型结构解析:深入理解CNN在语音识别中的应用
  • 告别眨眼和心电干扰:用Python+MNE库实战EEG预处理全流程(含ICA去伪迹代码)
  • 千问3.5-2B效果展示:高清图主体识别+中英文OCR+场景问答真实案例集
  • **发散创新:基于Rust的内存安全防御技术实战解析**在现代软件开
  • Pixel Epic · Wisdom Terminal 结合WSL2:打造Windows下无缝AI开发环境
  • 20260414_202828_滴滴大模型二面:你项目中_RAG_的存储架构是怎么设计的?
  • 算法打卡第二天/数组增删改查及双指针法
  • AIAgent安全合规红线预警:SITS2026强制要求的6项LLM交互审计日志规范(含审计模板下载)
  • 手把手教你用MDFEND模型实战微博假新闻检测(附Weibo21数据集下载)
  • PS制作1:1商品主图教程:用StartAI Banana修图,一键复刻参考图风格
  • 别急着编译!修复银河麒麟OpenSSH漏洞前,先搞懂ssh、sshd版本与apt仓库的“爱恨情仇”
  • Redis 网络模型
  • springboot基于微信小程序的智慧社区娱乐服务管理平台_jm78648u_zz042
  • 此数学博导等编《数学分析讲义》 有非常低级的概念性错误
  • Java NIO到底是个什么东西?
  • Haproxy服务介绍
  • Smithay Wayland 协议支持大全:从核心协议到扩展协议
  • Docker容器备份与恢复全攻略
  • Chart.js颜色理论应用:数据可视化的色彩心理学
  • LÖVR音频系统终极教程:从3D音效到空间音频的完整实现
  • 前端安全开发规范
  • 终极Ceres Solver损失函数指南:如何构建鲁棒的非线性最小二乘问题
  • 医院HIS管理系统winform源码 医院源代码 带文档 Oracle
  • craftzdog-homepage设计理念:从概念到实现的完整思考过程
  • DM V5.0.6.03.103 Windows 2000 (2026.04.13)