使用Nodejs和Taotoken构建一个智能客服问答后端服务
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。👉。
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度
使用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-6或gpt-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并探索更多可用的模型,以丰富你的智能客服应用。
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度
更多推荐


所有评论(0)