
南北阁Nanbeige 4.1-3B环境搭建Node.js后端服务集成指南最近有不少朋友在尝试部署和使用南北阁Nanbeige 4.1-3B模型但发现直接调用API或者写个简单的脚本还不够想要一个更稳定、更易用的后端服务来管理。正好用Node.js来搭建这样一个服务是个不错的选择它轻量、高效生态也丰富。今天我就来分享一下怎么从零开始用Node.js和Express框架一步步搭建一个能调用Nanbeige模型API的后端服务。我们不仅会实现基础的调用功能还会加上用户认证和Docker部署让你能快速拥有一个属于自己的、可扩展的AI服务后端。1. 环境准备与项目初始化在开始敲代码之前我们得先把“舞台”搭好。这里主要就是安装Node.js和准备一个干净的项目目录。1.1 Node.js安装及环境配置如果你还没安装Node.js这是第一步。我建议直接去Node.js官网下载长期支持版这样更稳定。安装过程很简单一路下一步就行。装好后打开你的命令行工具输入下面两个命令检查一下node -v npm -v如果能看到版本号比如v18.x.x和9.x.x那就说明安装成功了。这里有个小建议如果你平时会做多个项目可以考虑用nvm这样的工具来管理不同版本的Node.js切换起来很方便。1.2 创建项目并初始化环境好了我们找个地方创建新项目。打开命令行进入你常用的工作目录然后执行mkdir nanbeige-backend cd nanbeige-backend npm init -y这个npm init -y命令会快速生成一个package.json文件里面记录了项目的基本信息和依赖。接下来我们把需要的“工具包”安装上。对于这个后端服务我们主要需要这几个express: 这是我们的Web框架用来处理HTTP请求和响应是Node.js里最流行的选择。axios: 一个非常好用的HTTP客户端我们用它来向Nanbeige模型的API发送请求。jsonwebtoken: 用来生成和验证JWT令牌实现用户登录认证。dotenv: 用来管理环境变量比如我们的API密钥就不应该硬写在代码里。一次性安装它们npm install express axios jsonwebtoken dotenv同时我们还需要安装一个开发时用的工具nodemon它能在我们修改代码后自动重启服务省去手动停止再启动的麻烦。npm install --save-dev nodemon安装完成后你的package.json文件里的dependencies和devDependencies部分应该已经更新了。为了让nodemon生效我们修改一下package.json中的scripts部分{ name: nanbeige-backend, version: 1.0.0, description: , main: index.js, scripts: { start: node index.js, dev: nodemon index.js }, keywords: [], author: , license: ISC, dependencies: { axios: ^1.6.0, dotenv: ^16.3.0, express: ^4.18.0, jsonwebtoken: ^9.0.0 }, devDependencies: { nodemon: ^3.0.0 } }这样运行npm run dev就可以在开发模式下启动项目了。2. 构建基础Express服务项目架子搭好了现在我们来创建服务的主干文件并实现最核心的模型调用功能。2.1 创建应用入口与配置首先在项目根目录下创建一个.env文件。这个文件用来存放我们的敏感配置记得要把它加到.gitignore里别上传到代码仓库。假设你已经有了Nanbeige模型的API访问地址和密钥可以这样配置PORT3000 NANBEIGE_API_URLhttps://your-nanbeige-api-endpoint.com/v1/chat/completions NANBEIGE_API_KEYyour_actual_api_key_here JWT_SECRETyour_super_secret_jwt_key_here接下来创建项目的入口文件index.js// index.js require(dotenv).config(); // 加载环境变量 const express require(express); const app express(); const port process.env.PORT || 3000; // 中间件解析JSON格式的请求体 app.use(express.json()); // 一个简单的根路由用于测试服务是否运行 app.get(/, (req, res) { res.json({ message: Nanbeige Model Backend Service is running! }); }); // 在这里我们后续会添加模型调用的路由 // 启动服务 app.listen(port, () { console.log(Server is listening on port ${port}); });现在在命令行运行npm run dev你应该能看到提示信息然后在浏览器访问http://localhost:3000就能看到返回的欢迎消息了。基础服务跑通了。2.2 实现模型API调用核心逻辑服务能跑了接下来就是重头戏和Nanbeige模型对话。我们在项目里新建一个services文件夹并在里面创建一个aiService.js文件专门负责处理与AI模型的通信。// services/aiService.js const axios require(axios); // 从环境变量中获取配置 const NANBEIGE_API_URL process.env.NANBEIGE_API_URL; const NANBEIGE_API_KEY process.env.NANBEIGE_API_KEY; class AIService { constructor() { // 创建配置好的axios实例统一添加认证头 this.client axios.create({ baseURL: NANBEIGE_API_URL, headers: { Authorization: Bearer ${NANBEIGE_API_KEY}, Content-Type: application/json, }, timeout: 60000, // 设置超时时间为60秒因为生成可能需要时间 }); } /** * 向Nanbeige模型发送对话请求 * param {Array} messages - 对话消息数组格式如 [{role: user, content: 你好}] * param {Object} options - 其他模型参数如temperature, max_tokens等 * returns {PromiseObject} - 模型返回的结果 */ async chatCompletion(messages, options {}) { try { const requestBody { model: nanbeige-4.1-3b, // 指定模型名称请根据实际情况调整 messages: messages, stream: false, // 我们先使用非流式响应更简单 ...options, // 合并用户传入的其他参数 }; console.log(Sending request to AI model...); const response await this.client.post(, requestBody); // 注意URL已在baseURL中 // 返回模型生成的内容 return { success: true, data: response.data.choices[0]?.message?.content || , usage: response.data.usage, fullResponse: response.data }; } catch (error) { console.error(Error calling Nanbeige API:, error.message); // 更细致地处理错误比如网络错误、API错误等 let errorMessage 模型服务调用失败; if (error.response) { // 请求已发出但服务器响应状态码不在 2xx 范围 errorMessage API Error: ${error.response.status} - ${JSON.stringify(error.response.data)}; } else if (error.request) { // 请求已发出但没有收到响应 errorMessage Network Error: No response received from the model server.; } return { success: false, error: errorMessage }; } } } module.exports new AIService(); // 导出一个单例实例这段代码创建了一个AIService类它封装了调用模型的所有细节。使用axios.create创建了一个预配置的HTTP客户端这样我们就不用每次请求都写一遍认证头。chatCompletion方法接收对话历史和参数然后向模型API发送请求并处理成功或失败的情况。3. 设计API路由与用户认证核心逻辑有了现在我们需要通过HTTP接口把它暴露出去并且为了保证安全不能谁都能调用得加上一层用户认证。3.1 创建模型调用路由回到index.js我们引入刚写好的服务并添加一个/api/chat路由。// index.js (续) const aiService require(./services/aiService); // ... 之前的中间件和根路由 ... // 模型对话接口 app.post(/api/chat, async (req, res) { const { messages, options } req.body; // 简单的请求体验证 if (!messages || !Array.isArray(messages)) { return res.status(400).json({ error: Invalid request: messages must be an array. }); } console.log(Received chat request with ${messages.length} messages.); const result await aiService.chatCompletion(messages, options); if (result.success) { res.json({ message: Success, reply: result.data, usage: result.usage }); } else { // 根据错误类型返回不同的状态码 res.status(500).json({ error: Model service error, details: result.error }); } });现在你可以用Postman或者curl测试一下这个接口了curl -X POST http://localhost:3000/api/chat \ -H Content-Type: application/json \ -d { messages: [ {role: user, content: 你好请介绍一下你自己。} ], options: { temperature: 0.7, max_tokens: 500 } }如果一切配置正确你应该能收到模型返回的自我介绍。3.2 集成JWT用户认证开放接口不安全我们加一个简单的认证层。新建一个middleware文件夹创建auth.js中间件。// middleware/auth.js const jwt require(jsonwebtoken); const JWT_SECRET process.env.JWT_SECRET; // 认证中间件验证请求头中的Token const authenticateToken (req, res, next) { const authHeader req.headers[authorization]; // Token通常以 Bearer token 格式发送 const token authHeader authHeader.split( )[1]; if (token null) { return res.status(401).json({ error: Authentication token required. }); } jwt.verify(token, JWT_SECRET, (err, user) { if (err) { return res.status(403).json({ error: Invalid or expired token. }); } req.user user; // 将解码后的用户信息挂载到request对象上 next(); // 验证通过继续下一个处理流程 }); }; module.exports authenticateToken;然后我们添加一个简单的登录路由来发放Token在实际生产中这里应该连接数据库验证用户名密码。// index.js (续) const jwt require(jsonwebtoken); const authenticateToken require(./middleware/auth); // ... 其他代码 ... // 模拟用户登录发放JWT Token app.post(/api/login, (req, res) { // 这里应该从数据库验证用户凭证这里为了演示写死 const { username, password } req.body; // 模拟验证 if (username demo password demo123) { const user { username: username }; // 生成一个有效期为1小时的token const token jwt.sign(user, process.env.JWT_SECRET, { expiresIn: 1h }); res.json({ token: token }); } else { res.status(401).json({ error: Invalid credentials }); } }); // 受保护的模型调用接口添加认证中间件 app.post(/api/secure/chat, authenticateToken, async (req, res) { // 这里的req.user包含了token解码后的用户信息 console.log(Request from user: ${req.user.username}); const { messages, options } req.body; // ... 后续处理逻辑与 /api/chat 完全相同 ... // 为了简洁这里省略重复代码实际应用中可以将处理逻辑提取为函数 const result await aiService.chatCompletion(messages, options); if (result.success) { res.json({ message: Success, reply: result.data, usage: result.usage, requestedBy: req.user.username // 可选在响应中体现请求用户 }); } else { res.status(500).json({ error: Model service error, details: result.error }); } });现在调用/api/secure/chat前必须先调用/api/login获取Token然后在请求头中带上Authorization: Bearer your_token。4. 使用Docker容器化部署开发调试没问题了最后一步是把它打包成Docker镜像这样在任何支持Docker的环境里都能一键运行非常方便。4.1 编写Dockerfile在项目根目录创建Dockerfile# 使用官方Node.js LTS版本作为基础镜像 FROM node:18-alpine # 设置工作目录 WORKDIR /usr/src/app # 复制package.json和package-lock.json COPY package*.json ./ # 安装生产依赖清理npm缓存以减小镜像体积 RUN npm ci --onlyproduction npm cache clean --force # 复制应用源代码 COPY . . # 暴露应用运行的端口 EXPOSE 3000 # 定义启动命令 CMD [ node, index.js ]这里用了npm ci而不是npm install因为它能根据package-lock.json安装确切的版本保证环境一致性。node:18-alpine镜像非常小巧。4.2 构建与运行镜像还需要一个.dockerignore文件告诉Docker哪些文件不用拷贝进镜像比如node_modules和本地日志。node_modules npm-debug.log .env .git现在打开命令行在项目根目录执行构建命令docker build -t nanbeige-backend .构建完成后运行容器。注意我们需要把本地的.env文件中的配置尤其是API密钥通过环境变量传递给容器。一种更安全的方式是使用Docker的--env-file参数或者运行时直接传递。docker run -d \ -p 3000:3000 \ --name nanbeige-app \ --env-file .env \ nanbeige-backend这个命令会以后台模式运行容器将容器的3000端口映射到主机的3000端口。使用docker logs nanbeige-app可以查看运行日志。现在你的Node.js后端服务就已经在Docker容器里跑起来了。5. 总结与后续建议跟着上面的步骤走一遍一个具备基本功能的Nanbeige模型Node.js后端服务就搭建完成了。它包括了服务框架、模型调用、用户认证和容器化部署算是一个比较完整的起点。实际用起来这个基础版本可能还需要根据你的具体需求打磨一下。比如可以考虑加上请求频率限制防止有人过度调用把用户信息存到数据库里而不是用写死的账号或者增加一个管理后台方便查看使用情况和监控服务状态。日志系统也挺重要把请求日志、错误日志好好记录一下出了问题好排查。部署方面除了单机Docker如果你服务量上来了可以研究一下用Docker Compose来管理多个服务或者用Kubernetes做集群部署那样扩展性和可靠性都会高很多。希望这个指南能帮你顺利起步把AI能力更顺畅地集成到自己的应用里。获取更多AI镜像想探索更多AI镜像和应用场景访问 CSDN星图镜像广场提供丰富的预置镜像覆盖大模型推理、图像生成、视频生成、模型微调等多个领域支持一键部署。