Node.js后端集成指南:调用Qwen3.5-4B模型API构建AI服务

1. 引言

最近AI大模型的应用越来越广泛,很多开发者都想在自己的Node.js后端服务中集成这些强大的能力。今天我们就来手把手教你如何将Qwen3.5-4B模型的能力集成到你的Node.js应用中。

通过这篇教程,你将学会:

  • 如何配置Node.js环境来调用大模型API
  • 使用axios或fetch发送请求到模型服务
  • 处理流式响应和异步请求
  • 实现基本的用户认证和限流机制
  • 封装成RESTful API供前端调用

整个过程不需要深厚的AI背景知识,只要你有基本的Node.js开发经验就能跟着做。我们会提供完整的代码示例,确保你能快速上手。

2. 环境准备

2.1 Node.js安装及环境配置

首先确保你已经安装了Node.js。推荐使用LTS版本(目前是18.x或20.x),可以通过以下命令检查:

node -v
npm -v

如果没有安装,可以去Node.js官网下载安装包。安装完成后,创建一个新项目:

mkdir qwen-node-integration
cd qwen-node-integration
npm init -y

2.2 安装必要依赖

我们需要安装几个核心依赖包:

npm install axios express dotenv cors
  • axios:用于发送HTTP请求到模型API
  • express:构建我们的后端服务
  • dotenv:管理环境变量
  • cors:处理跨域请求

3. 调用模型API

3.1 获取API访问凭证

假设你已经部署好了Qwen3.5-4B模型的API服务,通常你会得到一个API端点URL和访问密钥。创建一个.env文件来存储这些敏感信息:

API_BASE_URL=https://your-model-api-endpoint.com
API_KEY=your-secret-key-here

3.2 基础API调用

创建一个api.js文件,实现基础的API调用功能:

const axios = require('axios');
require('dotenv').config();

async function callQwenAPI(prompt) {
  try {
    const response = await axios.post(
      `${process.env.API_BASE_URL}/v1/completions`,
      {
        prompt: prompt,
        max_tokens: 1000,
        temperature: 0.7,
      },
      {
        headers: {
          'Authorization': `Bearer ${process.env.API_KEY}`,
          'Content-Type': 'application/json'
        }
      }
    );
    return response.data.choices[0].text;
  } catch (error) {
    console.error('API调用失败:', error);
    throw error;
  }
}

module.exports = { callQwenAPI };

3.3 处理流式响应

大模型API通常支持流式响应,我们可以这样处理:

async function callQwenAPIStream(prompt, onData) {
  const response = await axios.post(
    `${process.env.API_BASE_URL}/v1/completions`,
    {
      prompt: prompt,
      max_tokens: 1000,
      temperature: 0.7,
      stream: true
    },
    {
      headers: {
        'Authorization': `Bearer ${process.env.API_KEY}`,
        'Content-Type': 'application/json'
      },
      responseType: 'stream'
    }
  );

  return new Promise((resolve, reject) => {
    let fullResponse = '';
    
    response.data.on('data', (chunk) => {
      const lines = chunk.toString().split('\n').filter(line => line.trim() !== '');
      for (const line of lines) {
        const message = line.replace(/^data: /, '');
        if (message === '[DONE]') {
          return;
        }
        
        try {
          const parsed = JSON.parse(message);
          const text = parsed.choices[0].text;
          fullResponse += text;
          if (onData) onData(text);
        } catch (err) {
          console.error('解析流数据出错:', err);
        }
      }
    });

    response.data.on('end', () => {
      resolve(fullResponse);
    });

    response.data.on('error', (err) => {
      reject(err);
    });
  });
}

4. 构建RESTful服务

4.1 创建Express应用

现在我们把API调用封装成RESTful服务。创建server.js文件:

const express = require('express');
const cors = require('cors');
const { callQwenAPI, callQwenAPIStream } = require('./api');

const app = express();
app.use(cors());
app.use(express.json());

const PORT = process.env.PORT || 3000;

// 基础API端点
app.post('/api/chat', async (req, res) => {
  try {
    const { prompt } = req.body;
    if (!prompt) {
      return res.status(400).json({ error: 'Prompt is required' });
    }

    const response = await callQwenAPI(prompt);
    res.json({ response });
  } catch (error) {
    res.status(500).json({ error: error.message });
  }
});

// 流式API端点
app.post('/api/chat/stream', async (req, res) => {
  try {
    const { prompt } = req.body;
    if (!prompt) {
      return res.status(400).json({ error: 'Prompt is required' });
    }

    res.setHeader('Content-Type', 'text/event-stream');
    res.setHeader('Cache-Control', 'no-cache');
    res.setHeader('Connection', 'keep-alive');

    await callQwenAPIStream(prompt, (chunk) => {
      res.write(`data: ${JSON.stringify({ chunk })}\n\n`);
    });

    res.write('data: [DONE]\n\n');
    res.end();
  } catch (error) {
    console.error('流式请求出错:', error);
    res.status(500).json({ error: error.message });
  }
});

app.listen(PORT, () => {
  console.log(`Server running on port ${PORT}`);
});

4.2 添加认证和限流

为了保护API,我们可以添加简单的认证和限流:

const rateLimit = require('express-rate-limit');

// 限流中间件
const limiter = rateLimit({
  windowMs: 15 * 60 * 1000, // 15分钟
  max: 100, // 每个IP限制100次请求
  message: '请求过于频繁,请稍后再试'
});

// API密钥认证中间件
function apiKeyAuth(req, res, next) {
  const apiKey = req.headers['x-api-key'];
  if (apiKey !== process.env.API_KEY) {
    return res.status(401).json({ error: '无效的API密钥' });
  }
  next();
}

// 应用中间件
app.use('/api', limiter);
app.use('/api', apiKeyAuth);

5. 前端调用示例

5.1 普通请求

前端可以使用fetch调用我们的API:

async function sendChatPrompt(prompt) {
  const response = await fetch('http://localhost:3000/api/chat', {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json',
      'X-API-Key': 'your-frontend-api-key'
    },
    body: JSON.stringify({ prompt })
  });
  
  if (!response.ok) {
    throw new Error('请求失败');
  }
  
  return await response.json();
}

5.2 流式请求

对于流式响应,可以这样处理:

async function streamChatPrompt(prompt, onChunk) {
  const response = await fetch('http://localhost:3000/api/chat/stream', {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json',
      'X-API-Key': 'your-frontend-api-key'
    },
    body: JSON.stringify({ prompt })
  });

  if (!response.ok) {
    throw new Error('请求失败');
  }

  const reader = response.body.getReader();
  const decoder = new TextDecoder();
  let done = false;

  while (!done) {
    const { value, done: streamDone } = await reader.read();
    done = streamDone;
    
    if (value) {
      const chunk = decoder.decode(value);
      const lines = chunk.split('\n').filter(line => line.trim() !== '');
      
      for (const line of lines) {
        if (line.startsWith('data: ')) {
          const data = line.replace(/^data: /, '');
          if (data === '[DONE]') {
            done = true;
            break;
          }
          
          try {
            const parsed = JSON.parse(data);
            if (onChunk) onChunk(parsed.chunk);
          } catch (err) {
            console.error('解析流数据出错:', err);
          }
        }
      }
    }
  }
}

6. 总结

通过这篇教程,我们完整地走了一遍在Node.js后端集成Qwen3.5-4B模型API的流程。从环境配置到API调用,再到封装成RESTful服务,最后实现前端调用。整个过程其实并不复杂,关键是理解大模型API的工作方式和对异步请求的处理。

实际应用中,你可能还需要考虑更多生产环境的问题,比如错误处理、日志记录、性能监控等。但基础框架已经搭建好了,你可以在此基础上继续扩展功能。比如添加对话历史管理、支持多轮对话、实现更复杂的限流策略等。

建议你先按照教程把基础功能跑通,然后再根据自己的需求逐步添加更多功能。大模型API的集成可以大大增强你应用的能力,为用户提供更智能的交互体验。


获取更多AI镜像

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

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐