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

简介

本文将介绍如何使用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 安装依赖

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

#安装项目依赖npminstall#如果出现权限问题,可以尝试:sudonpminstall#Linux/Mac#或npminstall--force#Windows

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

  • axios: 用于发送 HTTP 请求

  • moment: 用于时间格式化

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

#设置淘宝镜像npmconfigsetregistryhttps://registry.npmmirror.com#然后重新安装npminstall

1.4 运行程序

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

#使用npm启动npmstart#或者直接使用nodenodemain.js

如果遇到权限问题:

#Linux/Macsudonpmstart#Windows(以管理员身份运行命令提示符)npmstart

2. 完整代码实现

2.1 package.json

{\"name\":\"deepseek-chat\",\"version\":\"1.0.0\",\"description\":\"DeepSeekAPIchatimplementationinNode.js\",\"main\":\"main.js\",\"scripts\":{\"start\":\"nodemain.js\"},\"dependencies\":{\"axios\":\"^1.6.2\",\"moment\":\"^2.29.4\"}}

2.2 main.js

constfs=require(\'fs\').promises;constreadline=require(\'readline\');constaxios=require(\'axios\');constmoment=require(\'moment\');classDeepSeekChat{constructor(){this.url=\'https://api.siliconflow.cn/v1/chat/completions\';this.apiKey=\'YOUR_API_KEY\';//替换为你的APIKeythis.logFile=\'conversation.txt\';}asyncsaveToFile(content,isQuestion=false){consttimestamp=moment().format(\'YYYY-MM-DDHH:mm:ss\');consttext=isQuestion?`\\n[${timestamp}]Question:\\n${content}\\n\\n[${timestamp}]Answer:\\n`:content;awaitfs.appendFile(this.logFile,text);}asyncchat(){//创建命令行接口constrl=readline.createInterface({input:process.stdin,output:process.stdout});//使用Promise封装问题输入constquestion=(prompt)=>newPromise((resolve)=>rl.question(prompt,resolve));try{while(true){constuserInput=awaitquestion(\'\\n请输入您的问题(输入q退出):\');if(userInput.trim().toLowerCase()===\'q\'){console.log(\'程序已退出\');break;}//保存问题awaitthis.saveToFile(userInput,true);//准备请求数据constdata={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{//发送流式请求constresponse=awaitaxios({method:\'post\',url:this.url,data:data,headers:{\'Content-Type\':\'application/json\',\'Authorization\':`Bearer${this.apiKey}`},responseType:\'stream\'});//处理流式响应response.data.on(\'data\',async(chunk)=>{constlines=chunk.toString().split(\'\\n\');for(constlineoflines){if(line.trim()===\'\')continue;if(line.trim()===\'data:[DONE]\')continue;if(line.startsWith(\'data:\')){try{constjson=JSON.parse(line.slice(6));if(json.choices[0].delta.content){constcontent=json.choices[0].delta.content;process.stdout.write(content);awaitthis.saveToFile(content);}}catch(e){continue;}}}});//等待响应完成awaitnewPromise((resolve)=>{response.data.on(\'end\',async()=>{console.log(\'\\n----------------------------------------\');awaitthis.saveToFile(\'\\n----------------------------------------\\n\');resolve();});});}catch(error){consterrorMsg=`请求错误:${error.message}\\n`;console.error(errorMsg);awaitthis.saveToFile(errorMsg);}}}finally{rl.close();}}}//运行程序asyncfunctionmain(){constchatbot=newDeepSeekChat();awaitchatbot.chat();}main().catch(console.error);

3. 代码详解

3.1 类结构

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

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

  • saveToFile: 异步保存对话记录

  • chat: 主对话循环

3.2 关键功能

文件操作

asyncsaveToFile(content,isQuestion=false){consttimestamp=moment().format(\'YYYY-MM-DDHH:mm:ss\');consttext=isQuestion?`\\n[${timestamp}]Question:\\n${content}\\n\\n[${timestamp}]Answer:\\n`:content;awaitfs.appendFile(this.logFile,text);}

流式处理

response.data.on(\'data\',async(chunk)=>{constlines=chunk.toString().split(\'\\n\');for(constlineoflines){if(line.startsWith(\'data:\')){constjson=JSON.parse(line.slice(6));if(json.choices[0].delta.content){constcontent=json.choices[0].delta.content;process.stdout.write(content);awaitthis.saveToFile(content);}}}});

3.3 参数说明

  • model: 使用的模型名称

  • stream: 启用流式输出

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

  • temperature: 控制随机性 (0.7)

  • top_p,top_k: 采样参数

  • frequency_penalty: 重复惩罚系数

4.错误处理

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

  • 网络请求错误处理

  • JSON 解析错误处理

  • 文件操作错误处理

  • 优雅退出处理

5. 使用方法

5.1 安装依赖

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

#安装项目依赖npminstall#如果出现权限问题,可以尝试:sudonpminstall#Linux/Mac#或npminstall--force#Windows

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

  • axios: 用于发送 HTTP 请求

  • moment: 用于时间格式化

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

#设置淘宝镜像npmconfigsetregistryhttps://registry.npmmirror.com#然后重新安装npminstall

5.2 修改配置

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

5.3 运行程序

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

#使用npm启动npmstart#或者直接使用nodenodemain.js

如果遇到权限问题:

#Linux/Macsudonpmstart#Windows(以管理员身份运行命令提示符)npmstart

5.4 交互方式

  1. 输入问题进行对话

  2. 输入 ‘q’ 退出程序

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

6. 性能优化建议

  1. 内存管理

    • 使用流式处理大数据

    • 及时清理事件监听器

    • 避免内存泄漏

  2. 错误处理

    • 实现重试机制

    • 添加超时处理

    • 优雅降级策略

  3. 并发控制

    • 限制并发请求数

    • 实现请求队列

    • 添加速率限制

总结

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

© 版权声明
THE END
喜欢就支持一下吧
点赞9 分享