Node.js 调用 DeepSeek API 实现流式对话详细教程

老大白菜 2025-02-17 14:55:43编程技术
159

简介

本文将介绍如何使用 Node.js 调用 DeepSeek API,实现流式对话并保存对话记录。Node.js 版本使用现代异步编程方式实现,支持流式处理和错误处理。

1. 环境准备

1.1 系统要求

  • Node.js 14.0 或更高版本

  • npm 包管理器

1.2 项目结构

deepseek-project/
├── main.js           # 主程序
├── package.json      # 项目配置文件
└── conversation.txt  # 对话记录文件

1.3 安装依赖

在项目目录下打开命令行,执行:

# 安装项目依赖
npm install

# 如果出现权限问题,可以尝试:
sudo npm install  # Linux/Mac
# 或
npm install --force  # Windows

此命令会安装 package.json 中定义的所有依赖项:

  • axios: 用于发送 HTTP 请求

  • moment: 用于时间格式化

如果安装过程中遇到网络问题,可以尝试使用国内镜像:

# 设置淘宝镜像
npm config set registry https://registry.npmmirror.com

# 然后重新安装
npm install

1.4 运行程序

安装完依赖后,使用以下命令启动程序:

# 使用 npm 启动
npm start

# 或者直接使用 node
node main.js

如果遇到权限问题:

# Linux/Mac
sudo npm start

# Windows (以管理员身份运行命令提示符)
npm start

2. 完整代码实现

2.1 package.json

{
  "name": "deepseek-chat",
  "version": "1.0.0",
  "description": "DeepSeek API chat implementation in Node.js",
  "main": "main.js",
  "scripts": {
    "start": "node main.js"
  },
  "dependencies": {
    "axios": "^1.6.2",
    "moment": "^2.29.4"
  }
}

2.2 main.js

const fs = require('fs').promises;
const readline = require('readline');
const axios = require('axios');
const moment = require('moment');

class DeepSeekChat {
    constructor() {
        this.url = 'https://api.siliconflow.cn/v1/chat/completions';
        this.apiKey = 'YOUR_API_KEY';  // 替换为你的 API Key
        this.logFile = 'conversation.txt';
    }

    async saveToFile(content, isQuestion = false) {
        const timestamp = moment().format('YYYY-MM-DD HH:mm:ss');
        const text = isQuestion
            ? `\n[${timestamp}] Question:\n${content}\n\n[${timestamp}] Answer:\n`
            : content;
        
        await fs.appendFile(this.logFile, text);
    }

    async chat() {
        // 创建命令行接口
        const rl = readline.createInterface({
            input: process.stdin,
            output: process.stdout
        });

        // 使用 Promise 封装问题输入
        const question = (prompt) => new Promise((resolve) => rl.question(prompt, resolve));

        try {
            while (true) {
                const userInput = await question('\n请输入您的问题 (输入 q 退出): ');
                
                if (userInput.trim().toLowerCase() === 'q') {
                    console.log('程序已退出');
                    break;
                }

                // 保存问题
                await this.saveToFile(userInput, true);

                // 准备请求数据
                const data = {
                    model: 'deepseek-ai/DeepSeek-V3',
                    messages: [
                        {
                            role: 'user',
                            content: userInput
                        }
                    ],
                    stream: true,
                    max_tokens: 2048,
                    temperature: 0.7,
                    top_p: 0.7,
                    top_k: 50,
                    frequency_penalty: 0.5,
                    n: 1,
                    response_format: {
                        type: 'text'
                    }
                };

                try {
                    // 发送流式请求
                    const response = await axios({
                        method: 'post',
                        url: this.url,
                        data: data,
                        headers: {
                            'Content-Type': 'application/json',
                            'Authorization': `Bearer ${this.apiKey}`
                        },
                        responseType: 'stream'
                    });

                    // 处理流式响应
                    response.data.on('data', async (chunk) => {
                        const lines = chunk.toString().split('\n');
                        for (const line of lines) {
                            if (line.trim() === '') continue;
                            if (line.trim() === 'data: [DONE]') continue;

                            if (line.startsWith('data: ')) {
                                try {
                                    const json = JSON.parse(line.slice(6));
                                    if (json.choices[0].delta.content) {
                                        const content = json.choices[0].delta.content;
                                        process.stdout.write(content);
                                        await this.saveToFile(content);
                                    }
                                } catch (e) {
                                    continue;
                                }
                            }
                        }
                    });

                    // 等待响应完成
                    await new Promise((resolve) => {
                        response.data.on('end', async () => {
                            console.log('\n----------------------------------------');
                            await this.saveToFile('\n----------------------------------------\n');
                            resolve();
                        });
                    });

                } catch (error) {
                    const errorMsg = `请求错误: ${error.message}\n`;
                    console.error(errorMsg);
                    await this.saveToFile(errorMsg);
                }
            }
        } finally {
            rl.close();
        }
    }
}

// 运行程序
async function main() {
    const chatbot = new DeepSeekChat();
    await chatbot.chat();
}

main().catch(console.error);

3. 代码详解

3.1 类结构

  • DeepSeekChat: 主类,封装所有功能

  • constructor: 构造函数,初始化配置

  • saveToFile: 异步保存对话记录

  • chat: 主对话循环

3.2 关键功能

文件操作

async saveToFile(content, isQuestion = false) {
    const timestamp = moment().format('YYYY-MM-DD HH:mm:ss');
    const text = isQuestion
        ? `\n[${timestamp}] Question:\n${content}\n\n[${timestamp}] Answer:\n`
        : content;
    
    await fs.appendFile(this.logFile, text);
}

流式处理

response.data.on('data', async (chunk) => {
    const lines = chunk.toString().split('\n');
    for (const line of lines) {
        if (line.startsWith('data: ')) {
            const json = JSON.parse(line.slice(6));
            if (json.choices[0].delta.content) {
                const content = json.choices[0].delta.content;
                process.stdout.write(content);
                await this.saveToFile(content);
            }
        }
    }
});

3.3 参数说明

  • model: 使用的模型名称

  • stream: 启用流式输出

  • max_tokens: 最大输出长度 (2048)

  • temperature: 控制随机性 (0.7)

  • top_ptop_k: 采样参数

  • frequency_penalty: 重复惩罚系数

4. 错误处理

代码包含完整的错误处理机制:

  • 网络请求错误处理

  • JSON 解析错误处理

  • 文件操作错误处理

  • 优雅退出处理

5. 使用方法

5.1 安装依赖

在项目目录下打开命令行,执行:

# 安装项目依赖
npm install

# 如果出现权限问题,可以尝试:
sudo npm install  # Linux/Mac
# 或
npm install --force  # Windows

此命令会安装 package.json 中定义的所有依赖项:

  • axios: 用于发送 HTTP 请求

  • moment: 用于时间格式化

如果安装过程中遇到网络问题,可以尝试使用国内镜像:

# 设置淘宝镜像
npm config set registry https://registry.npmmirror.com

# 然后重新安装
npm install

5.2 修改配置

在 main.js 中替换 YOUR_API_KEY 为你的实际 API Key。

5.3 运行程序

安装完依赖后,使用以下命令启动程序:

# 使用 npm 启动
npm start

# 或者直接使用 node
node main.js

如果遇到权限问题:

# Linux/Mac
sudo npm start

# Windows (以管理员身份运行命令提示符)
npm start

5.4 交互方式

  1. 输入问题进行对话

  2. 输入 ‘q’ 退出程序

  3. 查看 conversation.txt 获取对话记录

6. 性能优化建议

  1. 内存管理

    • 使用流式处理大数据

    • 及时清理事件监听器

    • 避免内存泄漏

  2. 错误处理

    • 实现重试机制

    • 添加超时处理

    • 优雅降级策略

  3. 并发控制

    • 限制并发请求数

    • 实现请求队列

    • 添加速率限制

总结

本文详细阐述了如何利用Node.js技术调用DeepSeek API,并实现一个流式对话的聊天机器人。教程从创建命令行交互接口开始,逐步介绍了如何接收用户输入、通过axios库与DeepSeek API进行通信、实时处理API返回的流式数据,并将对话内容记录到日志文件中。文章不仅提供了完整的代码实现,还深入讲解了每个步骤的逻辑和关键细节,如错误处理、配置灵活性等。通过本教程,读者可以掌握使用Node.js调用API实现流式对话的基本方法,为开发自己的聊天机器人或对话系统打下坚实基础。

Node DeepSeek
THE END
蜜芽
故事不长,也不难讲,四字概括,毫无意义。

相关推荐

DeepSeek+Vue:打造丝滑的点击动画(Click Animations)
点击动画作为一种常见的交互效果,能够显著提升用户体验。Vue作为一款流行的前端框架,提供了丰富的功能和便捷的开发方式。而DeepSeek作为一款强大的AI工具,能够帮助开发者们...
2025-02-21 编程技术
181

保姆级教程:在Linux服务器本地部署DeepSeek-R1大模型并远程通过Web-UI访问
DeepSeek-R1作为一款高性能的大模型,能够为用户提供强大的计算能力和丰富的功能。然而,如何在Linux服务器上本地部署DeepSeek-R1大模型,并通过远程Web-UI进行访问,成为了许...
2025-02-21 编程技术
165

义乌老板利用DeepSeek卖空小商品,AI技术助力国际贸易
2025年,在“世界小商品之都”义乌,一场由AI技术引领的商业变革正在悄然发生。众多义乌老板正利用最新的人工智能工具——DeepSeek,将自家的小商品销往全球各地,实现了销售...
2025-02-21 新闻资讯
150

腾讯理财通升级AI能力:同时接入DeepSeek和混元大模型
腾讯理财通2月20日宣布重要升级:同时接入DeepSeek-R1模型满血版和腾讯混元大模型,标志着这家服务数亿用户的财富管理平台在AI金融服务领域迈出重要一步。本次升级后,腾讯理财...
2025-02-20 新闻资讯
155

10分钟上手DeepSeek开发:SpringBoot + Vue2快速构建AI对话系统
作为国产大语言模型的新秀,DeepSeek以其出色的中文理解能力和开放的API接口,为开发者提供了构建AI应用的新选择。在本文中,我将带领大家使用SpringBoot和Vue技术栈,快速搭...
2025-02-20 编程技术
167

DeepSeek+RAGFlow本地部署指南:轻松构建个性化知识库
本文将详细介绍 DeepSeek+RAGFlow 的本地部署指南,帮助用户快速上手。无论您是技术专家还是初学者,只要按照本文的步骤操作,都能轻松构建属于自己的个性化知识库。通过这种...
2025-02-19 编程技术
183