现在,AI 代理程序广泛存在于我们的网络世界。本文将带领大家学习如何使用 DeepSeek 模型编写一个 Node 版本的 AI 模型问答程序。
首先,我们需要先申请一个调用大模型时的 API Key。
创建 API Key
登录 DeepSeek 官网。
从右上角“API 开放平台”进入。
点击左侧侧边栏“API Keys”,点击“创建 API Key”按钮:
输入创建的 API Key 的名称,点击“创建”:
复制创建出来的 API Key,找个地方存储好,因为后续没有可以查看的地方了:
调用 API
API Key 创建好之后,接下来我们就可以着手编写项目。
首先,查看 Node 环境:
PS D:\fe-projects> node -v
v20.18.2
PS D:\fe-projects> npm -v
10.8.2
创建项目,使用你的编辑器打开目录:
PS D:\fe-projects> mkdir ds-demo
目录: D:\fe-projects
Mode LastWriteTime Length Name
---- ------------- ------ ----
d----- xxxx/x/x xx:xx ds-demo
PS D:\fe-projects> cd .\ds-demo\
PS D:\fe-projects\ds-demo> trae .
我使用的编辑器是 Trae。
初始化一个 Node 项目,采用 ES Module 组织文件:
d:\fe-projects\ds-demo
├── ds.js
└── package.json
package.json:
{
"name": "ds-demo",
"version": "1.0.0",
"type": "module",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"dependencies": {
"openai": "^4.97.0"
}
}
ds.js(这里,咱们直接参考官方案例代码):
// Please install OpenAI SDK first: `npm install openai`
import OpenAI from "openai";
const openai = new OpenAI({
baseURL: 'https://api.deepseek.com',
apiKey: '<DeepSeek API Key>'
});
async function main() {
const completion = await openai.chat.completions.create({
messages: [{ role: "system", content: "You are a helpful assistant." }],
model: "deepseek-chat",
});
console.log(completion.choices[0].message.content);
}
main();
将这里 <DeepSeek API Key>
替换成你的 API Key。
安装依赖,并启动项目:
PS D:\fe-projects\ds-demo> npm install openai
PS D:\fe-projects\ds-demo> node .\ds.js
file:///D:/fe-projects/ds-demo/node_modules/openai/error.mjs:64
return new APIError(status, error, message, headers);
^
APIError: 402 Insufficient Balance
at APIError.generate (file:///D:/fe-projects/ds-demo/node_modules/openai/error.mjs:64:16)
如果你的终端上报了 402 错误,其含义表示 “需要支付”,在这里具体指的是你的 DeepSeek API 账户余额不足,无法继续处理请求。
这时候再次进入“开放平台”,点击左侧的“充值”菜单,进行充值:
你可以按需充值。
充值好之后,我们再次启动程序,就能看到 DeepSeek 模型的欢迎语了:
PS D:\fe-projects\ds-demo> node .\ds.js
Thank you! I'm here to assist you with any questions or tasks you have. How can I help you today? 😊
修改 ds.js 文件,添加对话历史变量并更新请求参数以支持输入对话。
import OpenAI from "openai";
const openai = new OpenAI({
baseURL: "https://api.deepseek.com",
apiKey: "<DeepSeek API Key>",
});
const messages = [{ role: "system", content: "You are a helpful assistant." }];
import readline from "node:readline";
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout,
});
async function getResponse(userInput) {
messages.push({ role: "user", content: userInput });
const completion = await openai.chat.completions.create({
messages: messages,
model: "deepseek-chat",
});
const assistantResponse = completion.choices[0].message.content;
messages.push({ role: "assistant", content: assistantResponse });
console.log(assistantResponse);
}
function askQuestion() {
rl.question("请输入您的问题: ", async (userInput) => {
if (userInput.toLowerCase() === "exit") {
rl.close();
return;
}
await getResponse(userInput);
askQuestion();
});
}
askQuestion();
你可以通过在命令行中运行 node ds.js
"你的问题" 来测试对话功能。
流式输出
以上样例为非流式输出,输入问题后,你需要等一段时间才能看到结果。当然,你可以通过将 stream
设置为 true
来应用流式输出,这样就类似于我们现在使用的各种 AI 代理了:
import OpenAI from "openai";
const openai = new OpenAI({
baseURL: "https://api.deepseek.com",
apiKey: "<DeepSeek API Key>",
});
const messages = [{ role: "system", content: "You are a helpful assistant." }];
import readline from "node:readline";
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout,
});
async function getResponse(userInput) {
messages.push({ role: "user", content: userInput });
- const completion = await openai.chat.completions.create({
+ const stream = await openai.chat.completions.create({
messages: messages,
model: "deepseek-chat",
+ stream: true,
});
- const assistantResponse = completion.choices[0].message.content;
- messages.push({ role: "assistant", content: assistantResponse });
- console.log(assistantResponse);
+ let fullResponse = "";
+ for await (const part of stream) {
+ const content = part.choices[0]?.delta?.content || "";
+ fullResponse += content;
+ process.stdout.write(content);
+ }
+
+ messages.push({ role: "assistant", content: fullResponse });
+ console.log("");
}
function askQuestion() {
rl.question("请输入您的问题: ", async (userInput) => {
if (userInput.toLowerCase() === "exit") {
rl.close();
return;
}
await getResponse(userInput);
askQuestion();
});
}
askQuestion();
再来测试一下:
发现回答的语句就是按照流式输出了。
总结
以上,我们学习了如何使用 DeepSeek 语言模型,编写一个 Node 问答程序。总的流程并不复杂,首先在 DeepSeek 官方申请 API key,并做充值。然后,安装三方依赖 openai。最后,一句回答问题的方式,我们分别实现了非流式输出和流式输出,相对而言,后者的体验会更好。