半个小时实现AI聊天机器人

0 阅读5分钟

从零实现AI聊天机器人

在AI应用开发中,聊天机器人是最常见的应用场景之一。本文将详细讲解如何从零实现一个完整的AI聊天机器人,重点介绍Open API规范、SSE流响应技术以及本项目的实现细节。

一、项目架构设计

一个完整的AI聊天机器人通常包含以下组件:

1. 技术栈选择

  • 后端:Node.js + Express(轻量级、高性能)
  • 前端:原生JavaScript(无需框架,保持轻量)
  • AI服务:OpenAI兼容API(支持多种模型提供商)
  • 数据存储:内存存储(对话历史)+ IndexedDB(用户配置)

2. 系统架构

20260321_031924_mini-ai_architecture.png

二、Open API规范详解

OpenAI API已经成为行业标准,了解其规范对于开发AI应用至关重要。

1. 核心API端点

获取模型列表
GET /v1/models

响应格式:

{
"object": "list",
"data": [
    {
    "id": "gpt-3.5-turbo",
    "object": "model",
    "created": 1687882411,
    "owned_by": "openai"
    }
]
}
聊天完成
POST /v1/chat/completions

请求体:

{
"model": "gpt-3.5-turbo",
"messages": [
    {"role": "user", "content": "你好"},
    {"role": "assistant", "content": "你好!有什么可以帮助你的?"}
],
"stream": true
}

2. 消息格式规范

OpenAI API使用统一的消息格式:

  • role:消息角色(user/assistant/system)
  • content:消息内容

这种设计使得多轮对话管理变得简单,只需维护一个消息数组即可。

3. 流式响应格式

stream=true时,API返回SSE(Server-Sent Events)格式的数据:

data: {"id":"chatcmpl-123","object":"chat.completion.chunk","created":1694268190,"model":"gpt-3.5-turbo-0613","choices":[{"index":0,"delta":{"content":"你"},"finish_reason":null}]}

data: {"id":"chatcmpl-123","object":"chat.completion.chunk","created":1694268190,"model":"gpt-3.5-turbo-0613","choices":[{"index":0,"delta":{"content":"好"},"finish_reason":null}]}

data: [DONE]

三、SSE流响应技术

Server-Sent Events(SSE)是一种服务器向客户端推送数据的技术,非常适合AI聊天场景。

1. SSE原理

  • 基于HTTP长连接
  • 服务器单向推送数据
  • 使用text/event-stream MIME类型
  • 数据格式为data: message\n\n

2. 后端实现(Node.js)

// 设置SSE响应头
res.setHeader('Content-Type', 'text/event-stream');
res.setHeader('Cache-Control', 'no-cache');
res.setHeader('Connection', 'keep-alive');

// 流式处理AI响应
const response = await axios({
method: 'post',
url: endpoint,
data: body,
headers: {
    'Authorization': `Bearer ${apiKey}`,
    'Content-Type': 'application/json'
},
responseType: 'stream'
});

// 处理流式数据
response.data.on('data', (chunk) => {
const lines = chunk.toString().split('\n');
for (const line of lines) {
    if (line.startsWith('data: ')) {
    const data = line.slice(6);
    if (data === '[DONE]') {
        res.write('data: [DONE]\n\n');
        res.end();
        return;
    }
    try {
        const json = JSON.parse(data);
        const content = json.choices?.[0]?.delta?.content;
        if (content) {
        res.write(`data: ${JSON.stringify({ content })}\n\n`);
        }
    } catch (e) {
        // 忽略解析错误
    }
    }
}
});

3. 前端处理(JavaScript)

// 获取响应流
const response = await fetch('/api/chat', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ message, apiKey, apiUrl, model, stream: true })
});

// 读取流式数据
const reader = response.body.getReader();
const decoder = new TextDecoder();

while (true) {
const { done, value } = await reader.read();
if (done) break;

const chunk = decoder.decode(value);
const lines = chunk.split('\n');

for (const line of lines) {
    if (line.startsWith('data: ')) {
    const data = line.slice(6);
    if (data === '[DONE]') {
        return;
    }
    try {
        const json = JSON.parse(data);
        if (json.content) {
        fullContent += json.content;
        messageDiv.innerHTML = marked.parse(fullContent);
        // 滚动到最新消息
        messagesDiv.scrollTop = messagesDiv.scrollHeight;
        }
    } catch (e) {
        // 忽略解析错误
    }
    }
}
}

四、本项目核心实现

1. 智能URL处理

为了兼容不同提供商的API URL格式,实现了智能URL处理逻辑:

// 智能处理URL,避免重复 /v1 或 /api/v1
let baseUrl = apiUrl.replace(/\/$/, ''); // 移除末尾斜杠

// 如果URL已经包含完整路径,直接使用
if (baseUrl.includes('/chat/completions')) {
baseUrl = baseUrl.replace('/chat/completions', '');
}
if (baseUrl.includes('/v1')) {
baseUrl = baseUrl.replace('/v1', '');
}
if (baseUrl.includes('/api/v1')) {
baseUrl = baseUrl.replace('/api/v1', '');
}

const endpoint = `${baseUrl}/v1/chat/completions`;

2. 会话管理

使用Map存储对话历史,按API Key和模型分开管理:

// 存储对话历史
const conversations = new Map();

// 获取或创建对话历史(按apiKey和model分开存储)
const conversationId = `${apiKey}_${model}`;
if (!conversations.has(conversationId)) {
conversations.set(conversationId, []);
}
const history = conversations.get(conversationId);

// 添加用户消息
history.push({ role: 'user', content: message });

3. 配置管理

使用IndexedDB存储用户配置,支持多提供商:

// 配置数据库
const DB_NAME = 'MiniAIChat';
const STORE_NAME = 'settings';

// 保存配置
async function saveConfig(provider, configData) {
const transaction = db.transaction([STORE_NAME], 'readwrite');
const store = transaction.objectStore(STORE_NAME);
const data = { provider, ...configData };
const request = store.put(data);
}

// 读取配置
async function loadConfig(provider) {
const transaction = db.transaction([STORE_NAME], 'readonly');
const store = transaction.objectStore(STORE_NAME);
const request = store.get(provider);
}

4. Markdown渲染与代码高亮

使用Marked.js和Highlight.js实现富文本渲染:

// Markdown解析
messageDiv.innerHTML = marked.parse(fullContent);

// 代码高亮
messageDiv.querySelectorAll('pre code').forEach((block) => {
if (typeof hljs !== 'undefined') {
    hljs.highlightElement(block);
}
});

五、最佳实践

1. 错误处理

完善的错误处理机制:

try {
// API调用逻辑
} catch (error) {
console.error('❌ API请求失败:');
console.error('URL:', error.config?.url);
console.error('Error:', error.response?.data?.error?.message || error.message);
res.status(500).json({ 
    error: error.response?.data?.error?.message || error.response?.data?.error || error.message 
});
}

2. 用户体验优化

  • 加载状态指示:使用加载动画提示用户
  • 自动滚动:新消息自动滚动到可视区域
  • 键盘快捷键:支持Enter键发送消息
  • 流式切换:允许用户选择普通响应或流式响应

3. 安全性考虑

  • API Key保护:本地存储,不发送到服务器
  • 输入验证:验证用户输入,防止注入攻击
  • CORS配置:正确配置跨域资源共享

六、扩展功能建议

1. 多模态支持

  • 添加图片上传功能
  • 支持语音输入/输出
  • 集成OCR识别

2. 高级功能

  • 支持系统提示词配置
  • 添加对话历史存储、导出功能
  • 实现模型参数调整(temperature、top_p等)

3. 部署优化

  • 添加Docker容器支持
  • 实现环境变量配置
  • 添加日志系统

七、总结

实现一个完整的AI聊天机器人需要考虑多个方面:

  1. API集成:理解并遵循OpenAI兼容API规范
  2. 流式响应:使用SSE技术实现实时聊天体验
  3. 会话管理:正确维护对话上下文
  4. 用户体验:提供流畅的交互体验
  5. 错误处理:确保应用的稳定性

本项目通过简洁的设计和清晰的架构,展示了如何实现一个功能完整的AI聊天机器人。通过学习本文的内容,你可以掌握AI应用开发的核心技术,并能够根据自己的需求进行扩展和定制。

应用截图

20260321_023041_screen_shot.png

技术要点回顾

  • ✅ OpenAI兼容API规范
  • ✅ SSE流式响应技术
  • ✅ 会话上下文管理
  • ✅ 智能URL处理
  • ✅ Markdown渲染与代码高亮
  • ✅ 本地配置存储
  • ✅ 错误处理机制

SSE、OpenAI API 规范

Server-Sent Events (SSE)

SSE (Server-Sent Events) 是一种服务器向客户端推送事件的技术标准,由W3C制定规范。

实现参考:

OpenAI API 规范

OpenAI API 是目前大语言模型领域的事实标准,提供RESTful接口和流式响应能力。 官方参考文档:

希望本文对你理解AI聊天机器人的实现有所帮助!如果你有任何问题或建议,欢迎交流讨论。

代码

🚀️ gitee仓库 🚀️ github