DeepSeek API 基础教学

前言

随着AI聊天的兴起,越来越多的网站开始融入 AI聊天功能。AI聊天能够:

  • 提供更加便捷的用户指引
  • 一定程度上降低客服成本
  • 凸显企业技术能力
  • 提供更好的用户交互体验

因此,AI 聊天开始成为新一代网页开发的重要需求。本文将着重介绍DeepSeek API的使用方式,并通过完整的代码示例教导大家如何实现 AI 聊天。

DeepSeek API 概述

两种模式介绍

DeepSeek API 提供两种不同的模式:

模式 标识符 主要特点 适用场景
V3 deepseek-chat 普通对话,响应快速 成本有限、快速响应、内容相对固定
R1 deepseek-reasoner 深度推理,思考过程 复杂多变、深入分析、内容不固定

API 请求格式详解

这是我们发送给 DeepSeek API 的请求格式,以及 DeepSeek API 返回的响应格式。

V3 模式 (deepseek-chat)

{
  "model": "deepseek-chat",
  "messages": [
    {
      "role": "system",
      "content": "你是一个有用的AI助手"
    },
    {
      "role": "user", 
      "content": "用户的问题"
    }
  ],
  "temperature": 0.7,        // 可选:创意度(0-2)
  "max_tokens": 2048,        // 可选:最大输出长度
  "top_p": 1.0,             // 可选:核采样(0-1)
  "stream": false           // 可选:是否流式输出
}

响应格式:

{
  "choices": [{
    "message": {
      "role": "assistant",
      "content": "AI的回复内容"
    }
  }]
}

R1 模式 (deepseek-reasoner)

{
  "model": "deepseek-reasoner",
  "messages": [
    {
      "role": "system",
      "content": "你是专业的推理助手"
    },
    {
      "role": "user",
      "content": "复杂的推理问题"
    }
  ],
  "max_tokens": 32000,       // 可选:支持更大值
  "stream": false           // 可选:是否流式输出
}

响应格式:

{
  "choices": [{
    "message": {
      "role": "assistant",
      "content": "最终答案",
      "reasoning_content": "详细思考过程"
    }
  }]
}

两种模式对比

特性 V3 (deepseek-chat) R1 (deepseek-reasoner)
输出长度 默认 4K,最大 8K 默认 32K,最大 64K
请求参数 temperaturetop_ppresence_penaltyfrequency_penalty 仅支持 max_tokens, stream
响应特点 直接回答 包含 reasoning_content 详细思考过程
适用场景 快速对话、内容生成 复杂推理、深度分析

以下是参数配置指南

Temperature 参数建议

场景 推荐温度值
代码生成/数学解题 0.0
数据抽取/分析 1.0
通用对话 1.3
翻译 1.3
创意写作/诗歌 1.5

消息格式说明

完整的 messages 数组应该包含:

[
  {
    "role": "system",
    "content": "你是一个专业的编程助手,善于解释技术概念。"
  },
  {
    "role": "user", 
    "content": "什么是API?"
  },
  {
    "role": "assistant",
    "content": "API是应用程序编程接口的缩写..."
  },
  {
    "role": "user",
    "content": "那DeepSeek API有什么特点?"
  }
]

角色说明:

  • system:系统提示词,定义AI的角色和行为
  • user:用户输入的问题或指令
  • assistant:AI之前的回复(用于维持对话历史)

核心参数详解

通用参数(V3 & R1)

参数名 类型 说明 是否必填
model string 模型名称:deepseek-chatdeepseek-reasoner 必填
messages array 包含对话历史的对象数组 {role, content} 必填
max_tokens integer AI 回复生成的最大 token 数,控制回复长度 可选
stream boolean 是否启用流式响应,默认为 false 可选

注意max_tokens 指的是输出的最大长度,输入和输出的总 token 不能超过模型上限。

V3 模式专属参数

temperature (float, 可选)

控制输出的随机性和创造性:

  • 值越低(接近 0.0):输出越确定、保守、一致
  • 值越高(接近 2.0):输出越随机、多样、有创意
  • 默认值:1.0
  • 取值范围:0.0 - 2.0
{
  "temperature": 0.7,  // 平衡创造性和一致性
  // 其他参数...
}
top_p (float, 可选)

核采样(Nucleus Sampling)参数:

  • 作用:控制从累积概率超过 top_p 的最小 token 集合中采样
  • 取值范围:0.0 - 1.0
  • 示例top_p=0.9 意味着只考虑概率质量占前 90% 的 token
  • 默认值:1.0(即考虑所有 token)

重要提示:通常建议只更改 temperaturetop_p 中的一个,而非同时更改。

presence_penalty (float, 可选)

存在惩罚参数:

  • 作用:根据 token 是否已在文本中出现过来降低其概率
  • 效果:正值鼓励模型使用新词汇,避免重复
  • 取值范围:-2.0 到 2.0
  • 默认值:0
{
  "presence_penalty": 0.6,  // 鼓励使用新词汇
  // 其他参数...
}
frequency_penalty (float, 可选)

频率惩罚参数:

  • 作用:根据 token 在文本中已出现的频率降低其概率
  • 效果:正值鼓励模型使用低频词汇,减少重复表达
  • 取值范围:-2.0 到 2.0
  • 默认值:0

了解到上述内容后,便能开始编写代码,实现一个简单聊天页面

基础版本

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <title>简单DeepSeek聊天</title>
</head>
<body>
    <div id="messages"></div>
    <input type="text" id="input" placeholder="输入消息...">
    <button onclick="sendMessage()">发送</button>

    <script>
        const API_KEY = '你的api key';
        const API_URL = 'https://api.deepseek.com/chat/completions';
        
        let messages = [
            { role: 'system', content: '用中文回复' }
        ];

        async function sendMessage() {
            const input = document.getElementById('input');
            const message = input.value.trim();
            if (!message) return;

            // 显示用户消息
            addMessage('用户: ' + message);
            messages.push({ role: 'user', content: message });
            input.value = '';

            // 调用API
            try {
                const response = await fetch(API_URL, {
                    method: 'POST',
                    headers: {
                        'Content-Type': 'application/json',
                        'Authorization': `Bearer ${API_KEY}`
                    },
                    body: JSON.stringify({
                        model: 'deepseek-chat',
                        messages: messages
                    })
                });

                const data = await response.json();
                const aiMessage = data.choices[0].message.content;
                
                addMessage('AI: ' + aiMessage);
                messages.push({ role: 'assistant', content: aiMessage });
            } catch (error) {
                addMessage('错误: ' + error.message);
            }
        }

        function addMessage(text) {
            const div = document.createElement('div');
            div.textContent = text;
            document.getElementById('messages').appendChild(div);
        }
    </script>
</body>
</html>

执行流程解析

1. 初始化阶段
const API_KEY = '你的api key';
const API_URL = 'https://api.deepseek.com/chat/completions';

let messages = [
    { role: 'system', content: '用中文回复' }
];

流程说明:

  • API配置:设置DeepSeek API的认证密钥和请求端点
  • 消息历史初始化:创建包含系统提示词的消息数组,这是AI的"人设"定义
  • 系统角色system角色的消息告诉AI应该如何表现
2. 用户输入处理
const input = document.getElementById('input');
const message = input.value.trim();
if (!message) return;

流程说明:

  • 获取输入:从输入框获取用户输入的文本
  • 输入验证:使用trim()去除前后空格,检查是否为空
  • 早期返回:如果输入为空,直接返回,避免无效的API调用
3. 消息显示与状态更新
addMessage('用户: ' + message);
messages.push({ role: 'user', content: message });
input.value = '';

流程说明:

  • 即时反馈:立即在界面上显示用户输入的消息,提供即时反馈
  • 历史记录:将用户消息加入messages数组,维持对话上下文
  • 界面重置:清空输入框,准备下一次输入
4. API请求构建
const response = await fetch(API_URL, {
    method: 'POST',
    headers: {
        'Content-Type': 'application/json',
        'Authorization': `Bearer ${API_KEY}`
    },
    body: JSON.stringify({
        model: 'deepseek-chat',
        messages: messages
    })
});

流程说明:

  • HTTP方法:使用POST方法向API发送请求
  • 请求头设置
    • Content-Type:指定请求体为JSON格式
    • Authorization:使用Bearer token认证方式
  • 请求体构建
    • model:选择deepseek-chat模式(V3版本)
    • messages:发送完整的对话历史,包含system、user等角色消息
5. API响应处理
const data = await response.json();
const aiMessage = data.choices[0].message.content;

addMessage('AI: ' + aiMessage);
messages.push({ role: 'assistant', content: aiMessage });

流程说明:

  • 响应解析:将API返回的JSON数据解析为JavaScript对象
  • 内容提取:从响应结构中提取AI的回复内容
    • choices[0]:获取第一个(也是唯一一个)回复选项
    • message.content:提取实际的回复文本
  • 界面更新:将AI回复显示在聊天界面上
  • 历史维护:将AI回复加入消息历史,保持对话连续性
6. 错误处理机制
try {
    // API调用逻辑
} catch (error) {
    addMessage('错误: ' + error.message);
}

流程说明:

  • 异常捕获:使用try-catch包装API调用,处理可能的网络错误
  • 错误显示:将错误信息显示给用户,而不是让应用崩溃
  • 用户友好:提供有意义的错误提示,帮助用户了解问题所在
7. 消息显示功能
function addMessage(text) {
    const div = document.createElement('div');
    div.textContent = text;
    document.getElementById('messages').appendChild(div);
}

流程说明:

  • DOM操作:动态创建新的div元素来显示消息
  • 内容设置:使用textContent安全地设置文本内容,避免XSS攻击
  • 界面更新:将新消息添加到消息容器中,实现聊天记录的累积显示
完整执行时序图
用户输入 → 输入验证 → 显示用户消息 → 更新消息历史 → 
构建API请求 → 发送请求 → 等待响应 → 解析响应 → 
显示AI回复 → 更新消息历史 → 准备下一轮对话

进阶功能:流式传输

什么是流式传输?

流式传输可以让用户实时看到AI的回复过程,大大提升用户体验:

  • 普通模式:发送请求 → 等待完整回复 → 一次性显示
  • 流式模式:发送请求 → 实时接收片段 → 逐字显示(类似打字机效果)

流式传输实现

async function sendStreamMessage(userMessage) {
    try {
        const response = await fetch(API_URL, {
            method: 'POST',
            headers: {
                'Content-Type': 'application/json',
                'Authorization': `Bearer ${API_KEY}`
            },
            body: JSON.stringify({
                model: 'deepseek-chat',
                messages: [...messages, { role: 'user', content: userMessage }],
                stream: true  // 启用流式传输
            })
        });

        const reader = response.body.getReader();
        const decoder = new TextDecoder();
        let fullResponse = '';
        
        // 创建AI消息容器
        const aiMessageDiv = addMessage('', 'ai');

        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]') continue;
                    
                    try {
                        const parsed = JSON.parse(data);
                        const content = parsed.choices[0]?.delta?.content;
                        
                        if (content) {
                            fullResponse += content;
                            // 实时更新界面显示
                            aiMessageDiv.textContent = fullResponse;
                            // 保持滚动到底部
                            document.getElementById('messages').scrollTop = document.getElementById('messages').scrollHeight;
                        }
                    } catch (e) {
                        // 忽略JSON解析错误
                    }
                }
            }
        }

        // 将完整回复加入消息历史
        messages.push({ role: 'assistant', content: fullResponse });
        return fullResponse;
        
    } catch (error) {
        console.error('流式传输错误:', error);
        throw error;
    }
}

关键技术点解析

  • stream: true:在请求体中启用流式传输
  • getReader():获取响应流的读取器
  • TextDecoder:将二进制数据解码为文本
  • SSE格式解析:处理服务器发送事件格式的数据
  • 实时界面更新:每接收到新内容立即更新显示

总结

通过本教程,我们学习了:

  1. DeepSeek API的两种模式及其特点
  2. 完整的API请求和响应格式
  3. 参数配置的最佳实践
  4. 基础聊天功能的实现
  5. 流式传输

DeepSeek API为开发者提供了强大而灵活的AI对话能力。无论是简单的客服机器人还是复杂的推理助手,都能通过合理的参数配置和代码实现来满足需求。

希望这个教程能帮助你快速上手DeepSeek API,开发出更好的AI应用!


重要提示

  • API密钥保护:生产环境中API Key不应直接暴露给前端,建议通过后端代理调用
  • 内容合规过滤:必须实现关键词过滤和内容审核机制,AI可能生成违法违规、敏感或不当内容。
  • 访问频率控制:实施API调用频率限制,防止滥用和恶意攻击
Logo

火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。

更多推荐