🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度

使用Node.js和Taotoken构建一个智能客服问答后端服务

基础教程类,面向全栈或后端开发者,讲解如何利用Node.js环境下的openai包,结合Taotoken提供的API Key与聚合baseURL,构建一个简单的HTTP服务器,接收用户问题并将其转发至大模型获取智能回复,最后返回给前端,展示完整的服务端接入流程。

1. 项目准备与环境搭建

在开始编写代码之前,我们需要准备好开发环境。确保你的系统已经安装了Node.js(建议版本18或更高)和npm。我们将创建一个新的项目目录,并初始化项目,安装必要的依赖。

首先,打开终端,创建一个新的项目文件夹并进入。

mkdir taotoken-chatbot-backend
cd taotoken-chatbot-backend

接下来,初始化一个新的Node.js项目。你可以一路按回车使用默认配置,或者根据需要进行修改。

npm init -y

然后,安装本项目所需的核心依赖包。我们将使用express来构建HTTP服务器,使用openai这个官方SDK来调用大模型API,同时安装dotenv来管理环境变量。

npm install express openai dotenv

至此,基本的项目环境就搭建完成了。接下来,我们需要获取访问大模型服务的凭证。

2. 获取并配置Taotoken API密钥

要使用Taotoken的服务,你需要一个API Key。请访问Taotoken平台,注册并登录后,在控制台的API密钥管理页面创建一个新的密钥。创建成功后,请妥善保管这串字符。

为了安全地使用这个密钥,我们不会将它硬编码在代码中。在项目根目录下创建一个名为.env的文件,用于存储环境变量。

touch .env

打开.env文件,添加以下内容。请将YOUR_TAOTOKEN_API_KEY替换为你刚刚在控制台获取的真实API Key。

TAOTOKEN_API_KEY=YOUR_TAOTOKEN_API_KEY
PORT=3000

这里我们还定义了一个PORT变量,用于指定我们的HTTP服务器监听的端口号。.env文件通常包含敏感信息,请确保它被添加到.gitignore文件中,避免被意外提交到代码仓库。

3. 构建核心的问答服务模块

我们将创建一个独立的模块来处理与大模型的交互逻辑。在项目根目录下创建一个名为chatService.js的文件。

这个模块的核心是初始化OpenAI客户端,并配置其指向Taotoken的聚合端点。OpenAI SDK的baseURL参数需要设置为https://taotoken.net/api。模型ID可以在Taotoken平台的模型广场查看并选择,例如claude-sonnet-4-6gpt-4o-mini等。

打开chatService.js,写入以下代码:

const OpenAI = require('openai');
require('dotenv').config();

// 初始化OpenAI客户端,配置Taotoken的Base URL
const client = new OpenAI({
  apiKey: process.env.TAOTOKEN_API_KEY,
  baseURL: 'https://taotoken.net/api', // 关键配置:使用Taotoken的聚合端点
});

/**
 * 向大模型发送消息并获取回复
 * @param {string} userMessage - 用户输入的问题
 * @param {string} model - 要使用的大模型ID,默认为 claude-sonnet-4-6
 * @returns {Promise<string>} - 模型返回的回复内容
 */
async function getChatResponse(userMessage, model = 'claude-sonnet-4-6') {
  try {
    const completion = await client.chat.completions.create({
      model: model,
      messages: [
        { role: 'system', content: '你是一个专业、友好的智能客服助手。请用清晰、简洁的语言回答用户的问题。' },
        { role: 'user', content: userMessage },
      ],
      temperature: 0.7, // 控制回复的随机性,值越高越有创意
      max_tokens: 500, // 控制回复的最大长度
    });

    // 返回模型生成的内容
    return completion.choices[0]?.message?.content || '抱歉,我没有收到回复。';
  } catch (error) {
    console.error('调用AI服务失败:', error);
    // 返回一个友好的错误提示,避免将内部错误暴露给前端
    return '服务暂时不可用,请稍后再试。';
  }
}

module.exports = { getChatResponse };

这段代码做了几件关键的事情:首先,它从环境变量中读取API密钥,并创建了一个配置了Taotoken baseURL的OpenAI客户端实例。其次,它定义了一个异步函数getChatResponse,该函数接收用户消息和可选的模型ID,构造一个包含系统指令和用户消息的请求体发送给API,并返回模型的文本回复。我们还添加了基本的错误处理,确保服务在API调用异常时仍能向客户端返回一个友好的信息。

4. 创建Express HTTP服务器

现在我们来构建Web服务器部分。在项目根目录下创建主文件index.js

这个服务器需要完成以下任务:提供静态文件服务(用于托管一个简单的前端页面)、提供一个接收用户问题的API端点、调用我们刚刚编写的聊天服务、并将结果返回给前端。

打开index.js,写入以下代码:

const express = require('express');
const path = require('path');
const { getChatResponse } = require('./chatService');
require('dotenv').config();

const app = express();
const PORT = process.env.PORT || 3000;

// 中间件:解析JSON格式的请求体
app.use(express.json());
// 中间件:提供静态文件服务,将public目录下的文件(如HTML)暴露出去
app.use(express.static(path.join(__dirname, 'public')));

// 定义处理用户问答的API端点
app.post('/api/chat', async (req, res) => {
  const { message, model } = req.body;

  // 验证用户输入
  if (!message || typeof message !== 'string') {
    return res.status(400).json({ error: '请输入有效的问题内容。' });
  }

  try {
    console.log(`收到问题: ${message}, 使用模型: ${model || '默认'}`);
    // 调用聊天服务获取AI回复
    const aiResponse = await getChatResponse(message, model);
    
    // 返回成功响应
    res.json({
      success: true,
      question: message,
      answer: aiResponse,
      model: model || 'claude-sonnet-4-6'
    });
  } catch (error) {
    console.error('处理请求时出错:', error);
    res.status(500).json({ error: '服务器内部错误,处理请求失败。' });
  }
});

// 启动服务器
app.listen(PORT, () => {
  console.log(`智能客服后端服务已启动,监听端口: ${PORT}`);
  console.log(`前端页面访问地址: http://localhost:${PORT}`);
});

服务器定义了一个POST /api/chat的接口。它接收一个包含message(用户问题)和可选model参数的JSON请求体,经过简单校验后,调用chatService.js中的函数获取AI回复,最后将结果包装成JSON格式返回给客户端。

5. 创建简单的前端演示页面

为了让整个流程完整可见,我们创建一个极简的前端页面来测试后端服务。在项目根目录下创建一个public文件夹,并在其中创建一个index.html文件。

mkdir public
touch public/index.html

打开public/index.html,写入以下HTML和JavaScript代码:

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Taotoken智能客服演示</title>
    <style>
        body { font-family: sans-serif; max-width: 800px; margin: 40px auto; padding: 20px; }
        #chatBox { border: 1px solid #ccc; height: 300px; overflow-y: scroll; padding: 10px; margin-bottom: 10px; }
        .user { text-align: right; color: blue; margin: 5px 0; }
        .bot { text-align: left; color: green; margin: 5px 0; }
        #inputArea { display: flex; gap: 10px; }
        #question { flex-grow: 1; padding: 10px; }
        button { padding: 10px 20px; }
    </style>
</head>
<body>
    <h1>智能客服问答演示</h1>
    <p>这是一个连接到Taotoken聚合大模型服务的简易客服界面。</p>
    <div id="chatBox"></div>
    <div id="inputArea">
        <input type="text" id="question" placeholder="请输入您的问题..." />
        <button onclick="sendQuestion()">发送</button>
    </div>
    <p><small>模型:<select id="modelSelect">
        <option value="claude-sonnet-4-6">Claude 3.5 Sonnet</option>
        <option value="gpt-4o-mini">GPT-4o Mini</option>
    </select></small></p>

    <script>
        const chatBox = document.getElementById('chatBox');
        const questionInput = document.getElementById('question');
        const modelSelect = document.getElementById('modelSelect');

        function addMessage(sender, text) {
            const msgDiv = document.createElement('div');
            msgDiv.className = sender;
            msgDiv.innerHTML = `<strong>${sender}:</strong> ${text}`;
            chatBox.appendChild(msgDiv);
            chatBox.scrollTop = chatBox.scrollHeight; // 滚动到底部
        }

        async function sendQuestion() {
            const message = questionInput.value.trim();
            const model = modelSelect.value;
            if (!message) return;

            addMessage('user', message);
            questionInput.value = ''; // 清空输入框
            questionInput.disabled = true;

            try {
                const response = await fetch('/api/chat', {
                    method: 'POST',
                    headers: { 'Content-Type': 'application/json' },
                    body: JSON.stringify({ message, model })
                });
                const data = await response.json();
                if (data.success) {
                    addMessage('bot', data.answer);
                } else {
                    addMessage('bot', `错误: ${data.error}`);
                }
            } catch (error) {
                addMessage('bot', '网络请求失败,请检查后端服务。');
                console.error(error);
            } finally {
                questionInput.disabled = false;
                questionInput.focus();
            }
        }

        // 支持按回车键发送
        questionInput.addEventListener('keypress', (e) => {
            if (e.key === 'Enter') sendQuestion();
        });
    </script>
</body>
</html>

这个页面提供了一个简单的聊天界面,包含一个显示对话历史的区域、一个输入框、一个发送按钮和一个模型选择下拉框。当用户输入问题并点击发送后,JavaScript代码会调用我们刚刚创建的/api/chat接口,并将返回的AI回复展示在页面上。

6. 运行与测试服务

所有代码都已就绪,现在可以启动服务并进行测试了。首先,请再次确认你的.env文件中的TAOTOKEN_API_KEY已正确填写。

在终端中,运行以下命令启动服务器:

node index.js

如果一切正常,你将看到控制台输出“智能客服后端服务已启动,监听端口: 3000”以及前端页面的访问地址。打开你的浏览器,访问http://localhost:3000

在页面中输入一个问题,例如“介绍一下Taotoken平台”,然后点击发送。稍等片刻,你就能看到来自大模型的智能回复显示在页面上。你可以通过下拉框切换不同的模型来体验。

通过这个教程,我们完成了一个从环境搭建、密钥配置、服务端逻辑编写到前端交互演示的完整流程。你可以以此为基础,根据实际业务需求,扩展更多的功能,例如添加对话历史管理、支持流式响应、集成用户认证或连接数据库等。


你可以访问 Taotoken 平台获取API Key并探索更多可用的模型,以丰富你的智能客服应用。

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐