跳至主要内容

DeepSeek V3.2:指南与演示项目

了解 DeepSeek-V3.2-Exp、其全新的稀疏注意力机制、如何降低 API 成本并改进长上下文处理,以及如何在您自己的项目中使用它。
· 12分钟 阅读

使用 AI 探索

DeepSeek 刚刚发布了 v3.2-Exp,这是一款将 API 成本削减一半以上的实验性模型。如果您一直在使用大语言模型,您会知道长上下文处理的花费会迅速攀升。此次发布通过一种称为 DeepSeek 稀疏注意力 的技术来解决这个问题。

在本教程中,我将解释 v3.2 相较于之前 DeepSeek 版本的不同之处、稀疏注意力的底层机制,以及如何在您的项目中使用该模型。我们将覆盖发起 API 调用的基础,并构建一个演示项目,展示该模型在哪些场景表现最佳。

最后,您将构建一个 Streamlit 应用,用于比较不同 LLM(包括 DeepSeek v3.2)的成本:

多文档研究助手界面,侧边栏显示已加载文档(57,204 个 token)、GPT-5、Claude Sonnet 4.5、DeepSeek v3.2-Exp、DeepSeek v3.1-Terminus 四个模型选择复选框,以及问题输入区域

我也建议您查看我们关于全新 DeepSeek-V3.2-Speciale 变体的演示项目。

什么是 DeepSeek V3.2?

先从 DeepSeek 的背景以及此次发布发生了哪些变化说起。

DeepSeek 模型家族

DeepSeek 是一家来自中国的开源 AI 公司,在 MIT 许可下构建大语言模型。其模型在推理、编程和通用任务上可与 GPT-5 和 Claude 竞争。过去一年,该公司发布了多个版本,包括 DeepSeek-V3 和 DeepSeek-R1,凭借比闭源替代方案更低的成本和强劲的表现而备受关注。

在 v3.2 之前,最近的发布是 v3.1-Terminus,一个 6850 亿参数的模型。尽管其表现稳健,但处理长上下文的成本依然高昂。这正是新实验性版本发挥作用的地方。

V3.2-Exp:实验性发布

DeepSeek 于 2025 年 9 月 29 日(2025-09-29)发布了 v3.2-Exp。“Exp”代表实验性,意味着该模型仍在测试和打磨中。暂时不要指望生产级稳定性,但您可以将其用于研究和想要尝鲜新功能的项目。

该模型构建在 v3.1-Terminus 之上,保留了相同的 6850 亿参数架构。其差异在于内部的信息处理方式。它使用与 OpenAI 兼容的 API 格式,因此如果您使用过 OpenAI SDK,基本已经会用 DeepSeek(本文也会讲解如何发起您的第一条 API 调用)。

核心创新:成本与效率

重大变化在这里:与 v3.1 相比,DeepSeek 将 API 价格下调了 50% 以上,且性能保持不变。您以一半的成本获得相同质量的回答。

这一下调源于一个名为 DeepSeek Sparse Attention(DSA,稀疏注意力)的技术改进。模型不再对输入中的每一个 token 都给予关注(这在计算上昂贵),而是有选择地聚焦于重要部分。下一节我们将看看它如何工作。

如果您想了解完整技术细节,DeepSeek 在 GitHub 发布了 技术报告,讲解架构变更与基准测试结果。

什么是 DeepSeek 稀疏注意力(DSA)?

在进入代码之前,先聊聊是什么让 v3.2 更便宜、更快速。关键在于模型处理您的输入的方式。

Transformer 中的注意力机制:速览

当您将文本发送给语言模型时,它会将输入拆分为 token(大致对应词或词片)。模型随后需要判断哪些 token 彼此相关。这个过程称为注意力。

在传统Transformer 中,每个 token 都会查看所有其他 token。若有 1,000 个 token,每个都会检查另外 999 个,一共 100 万次比较。到 10,000 个 token 时,这一数字是 1 亿次。其数学复杂度是二次方:输入长度加倍,计算成本翻四倍。

这就是长上下文处理昂贵的原因。随着文档变长,您的 API 账单会迅速增长。

稀疏注意力的含义

并非所有 token 都需要关注所有其他 token。就像您现在阅读这句话时,不会反复回看前面的每个词,您会聚焦于相关内容。

稀疏注意力也是如此。模型不再让每个 token 与每个其他 token 比较,而是选择性地挑选重要的比较。一些早期方法包括:

  • 块稀疏注意力:将 token 划分为块,仅允许相邻块之间的注意力
  • 局部窗口注意力:每个 token 只关注固定距离内的 token

这些方法节省了算力,但较为僵硬。它们预先决定了哪些 token 可以交互,而不考虑实际文本内容。有时您需要将文档开头的一个词与末尾的内容关联,固定模式可能会错过这种联系。

DeepSeek 稀疏注意力(DSA):更细粒度的方法

DSA 采用不同路径。它不使用固定模式,而是基于内容本身学习哪些 token 需要相互关注。模型会动态选择相关连接。

其高层原理如下:在训练期间,DeepSeek 在每个注意力层中加入了一个选择机制。该机制查看您的 token,决定哪些注意力连接值得计算。它保留重要连接,跳过其余部分。

这种选择并非随机。模型在训练中学会了不同任务下哪些连接类型更重要。当您发送与代码相关的提示时,它会关注不同于法律文档的模式。

结果是:DSA 在不损害输出质量的前提下减少了注意力计算量。技术报告显示,v3.2 在基准上与 v3.1-Terminus 表现几乎一致,但每个 token 的计算更少。您以大约一半的 API 成本获得相同的模型质量。

为何这对开发者重要

DSA 在实践中的意义:

  • 更低的 API 成本:以更低的费用获得相同质量的回答
  • 更好的长上下文处理:模型支持 128K token 的上下文窗口,并以比无稀疏注意力的模型更低的成本处理更长输入
  • 更快的推理速度:更少的运算意味着更快的响应

这些优势在以下用例中尤为明显:

  • 同时分析多份文档
  • 维持长对话中的上下文
  • 处理大型代码库或技术文档
  • 总结研究论文或法律合同

如果您的应用需要处理长输入,DSA 将带来实实在在的差异。您不仅能省钱,还能在传统注意力吃力的任务中获得更好的表现。

发起您的第一条 DeepSeek V3.2 调用

了解 DSA 的工作原理后,让我们通过其 API 使用该模型。

先决条件

您需要在机器上安装 Python 3.8 或更高版本。如果您是通过 API 使用 LLM 的新手,或许可以先看看 DataCamp 的 AI 学习指南来熟悉基础知识。我们还有更详细的 DeepSeek API 教程覆盖更早的版本,适合深入学习。

好消息是:如果您用过 OpenAI 的 API,您已经会用 DeepSeek。API 格式完全一致。

环境配置

首先,从 platform.deepseek.com 获取您的 API 密钥。如果您还没有账号,需要先创建一个。

安装所需依赖:

uv add openai python-dotenv

在项目目录下创建 .env 文件,并添加您的 API 密钥:

DEEPSEEK_API_KEY=your_api_key_here

第一次 API 调用

下面是使用 OpenAI SDK 的基础示例。与 OpenAI API 的唯一区别是 base_url 参数以及您的 API 密钥:

from openai import OpenAI
from dotenv import load_dotenv
import os

# Load environment variables from .env file
load_dotenv()

# Initialize OpenAI-compatible client with DeepSeek endpoint
client = OpenAI(
   api_key=os.getenv("DEEPSEEK_API_KEY"),
   base_url="https://api.deepseek.com"
)

# Send a chat completion request to DeepSeek v3.2
response = client.chat.completions.create(
   model="deepseek-chat",
   messages=[
       {"role": "user", "content": "Explain sparse attention in one sentence."}
   ]
)

# Print the model's response
print(response.choices[0].message.content)

运行后,您会得到类似如下的返回:

Sparse attention reduces computational cost by having each token attend to only a subset of relevant tokens rather than all tokens in a sequence.

deepseek-chat 是 v3.2-Exp 的非“思考”模式。它会处理您的请求并返回答案,但不会展示推理步骤。

使用推理模型

如果您想查看模型的推理过程,请使用 deepseek-reasoner。该模型会先展示其思维链,再给出最终答案:

# Use deepseek-reasoner to see the model's reasoning process
response = client.chat.completions.create(
   model="deepseek-reasoner",
   messages=[
       {"role": "user", "content": "Which is larger: 9.11 or 9.8?"}
   ]
)

# Print both reasoning and final answer
print("Reasoning:", response.choices[0].message.reasoning_content)
print("Answer:", response.choices[0].message.content)

输出类似如下:

Reasoning: To compare 9.11 and 9.8, I need to look at the digits after the decimal point. 9.11 has digits 1 and 1 after the decimal, making it 9 + 0.11. Meanwhile, 9.8 is 9 + 0.8. Since 0.8 is greater than 0.11, 9.8 is the larger number.

Answer: 9.8 is larger than 9.11.

该推理模型在生成最终答案前,最多可生成 64K 个 token 的推理内容(默认 32K)。请注意,它不支持 temperature 或 top_p 等参数。DeepSeek 官方 API 目前尚未提供用于控制推理深度的 reasoning_effort 参数(尽管一些第三方提供商如 LangChain 在其集成中已加入该选项)。

响应对象遵循 OpenAI 的结构。您可以通过 response.choices[0].message.content 访问正文,通过 response.usage 查看 token 使用量,并通过 response.model 查看所用模型。

访问 DeepSeek v3.2 的其他方式

API 并非唯一选项。DeepSeek 以开源形式发布模型,您可以自主管理运行。

Hugging Face:模型可在 huggingface.co/deepseek-ai/DeepSeek-V3.2-Exp 获取。您可以使用 Hugging Face 的推理提供商来运行模型而无需自管基础设施,或下载权重本地推理。如果您有相应硬件(6850 亿参数规模,考虑数据中心预算或家中“小型 GPU 机柜”),本地运行也是可行路径。

vLLM:若要进行规模化自托管部署, vLLM 提供了针对 v3.2 的优化推理。它比标准 transformers 运行更快,并能良好处理批量。若您有严肃的基础设施并在生产中服务该模型,这是理想选择。

何时使用各方法:

  • 想要快速上手、不愿自管基础设施或负载波动较大时,用 API
  • 希望获得托管推理的便利且有更多提供商选择时,用 Hugging Face 推理提供商
  • 若您需要完全控制、有隐私要求,或想试验模型架构,则通过 Hugging Face 权重自托管
  • 若您运行高吞吐的生产工作负载且有硬件预算,用 vLLM

对大多数刚开始的开发者来说,API 是正确的选择。按量计费,DeepSeek 负责扩缩与维护。

多文档研究助手:比较长上下文表现

您已经了解了 DeepSeek v3.2 的 API 并完成了首次调用。现在用真实对比来验证。

DeepSeek 的稀疏注意力在处理长上下文时真的能省钱吗?与 GPT-5 和 Claude Sonnet 4.5 相比表现如何?

为此,我们将构建一个比较工具,将多篇研究论文加载到同一上下文中,并向四个模型发送相同查询。您将清楚看到每个模型的成本、响应速度及回答类型。

大多数文档分析系统使用RAG:将文档切块、向量化,并在提问时仅检索相关块。这对简单查找很有效,但会丢失文档不同部分之间的关联。如果答案需要理解多篇论文之间的关系呢?

长上下文模型通过一次性“读全”来解决:无需切块、无需检索、不丢上下文。将所有文档加载到单个提示中,让模型全面把握。问题在于成本:使用传统注意力时,处理 50,000+ token 会迅速变贵。

这正是我们测试 DeepSeek 稀疏注意力的地方。我们将构建一个应用,将三篇研究论文(总计约 57,000 个 token)加载到同一上下文中,对比四个模型处理相同查询:GPT-5、Claude Sonnet 4.5、带稀疏注意力的 DeepSeek v3.2-Exp,以及不含稀疏注意力的上一版 DeepSeek v3.1-Terminus。您将并排看到成本差异、响应时间及输出质量。

最终应用界面如下:

多文档研究助手界面,侧边栏显示已加载文档(57,204 个 token)、GPT-5、Claude Sonnet 4.5、DeepSeek v3.2-Exp、DeepSeek v3.1-Terminus 四个模型选择复选框,以及问题输入区域

结果区显示四个响应面板,以及包含 GPT-5、Claude Sonnet 4.5、DeepSeek v3.2-Exp、DeepSeek v3.1-Terminus 的 Token 使用、成本与响应时间对比表

可视化对比图,展示四个模型的成本、响应时间、Token 使用与成本-时间权衡,重点指出 DeepSeek v3.2-Exp 成本最低($0.0162),Claude Sonnet 4.5 速度最快(16.13 秒)

注意:本节余下内容详细讲解如何从零构建此应用。不构建也不影响理解对比结果,但走一遍代码能给您用 DeepSeek 构建长上下文应用的实用范式。

构建应用

我们将用 Streamlit 搭配三个辅助模块来构建:一个用于加载文档,一个用于模型配置,一个用于处理查询。应用流程很简单:加载 PDF、选择模型、提出问题并比较结果。

先创建项目目录并安装依赖:

mkdir multi-document-qa
cd multi-document-qa
uv add streamlit langchain langchain-openai langchain-anthropic langchain-community pypdf tiktoken python-dotenv matplotlib pandas

创建包含 API 密钥的 .env 文件:

OPENAI_API_KEY=your_openai_key
ANTHROPIC_API_KEY=your_anthropic_key
DEEPSEEK_API_KEY=your_deepseek_key

下载三篇关于注意力机制的论文:

mkdir documents
cd documents
curl -L -o selective-attention.pdf "https://arxiv.org/pdf/2410.02703"
curl -L -o differential-transformer.pdf "https://arxiv.org/pdf/2410.05258"
curl -L -o sparse-attention-long-range.pdf "https://arxiv.org/pdf/2406.16747"
cd ..

这三篇论文加载后合计 57,204 个 token。

加载与统计 token

创建 document_loader.py:

from langchain_community.document_loaders import PyPDFLoader
import tiktoken
from pathlib import Path


def load_documents(documents_dir="documents"):
   docs_path = Path(documents_dir)
   pdf_files = list(docs_path.glob("*.pdf"))
  
   all_text = ""
   document_names = []
  
   # Load each PDF and concatenate with separators
   for pdf_file in sorted(pdf_files):
       loader = PyPDFLoader(str(pdf_file))
       pages = loader.load()
       doc_text = "\n\n".join([page.page_content for page in pages])
       all_text += f"\n\n=== Document: {pdf_file.name} ===\n\n{doc_text}"
       document_names.append(pdf_file.name)

该函数从目录中加载所有 PDF,提取各页文本,并用文档分隔符拼接在一起。

# Count tokens using GPT-4 encoding (accurate across providers)
   encoding = tiktoken.encoding_for_model("gpt-4")
   token_count = len(encoding.encode(all_text))
  
   return all_text, token_count, document_names

token 计数使用 tiktoken 的 GPT-4 编码,在各提供商之间都有较高一致性。可在 GitHub 查看完整的 document_loader.py。

配置模型与定价

创建 model_config.py:

from langchain_openai import ChatOpenAI
from langchain_anthropic import ChatAnthropic
import os


# Pricing per million tokens (as of October 2025)
MODEL_PRICING = {
   "gpt-5": {"input": 2.50, "output": 10.00, "name": "GPT-5"},
   "claude-sonnet-4-5-20250929": {"input": 3.00, "output": 15.00, "name": "Claude Sonnet 4.5"},
   "deepseek-chat": {"input": 0.28, "output": 0.42, "name": "DeepSeek v3.2-Exp"},
   "deepseek-chat-v3.1": {"input": 0.55, "output": 2.19, "name": "DeepSeek v3.1-Terminus"},
}

该定价字典存储了每百万 token 的成本(截至 2025 年 10 月)。带稀疏注意力的 DeepSeek v3.2 比 GPT-5 和 Claude 便宜约 10 倍,而 v3.1 大致是 v3.2 成本的 2 倍,处于中间水平。

def get_model(model_name):
   """Initialize a chat model by name using LangChain's unified interface."""
   if model_name == "gpt-5":
       return ChatOpenAI(model="gpt-5", temperature=0, api_key=os.getenv("OPENAI_API_KEY"))
   elif model_name == "claude-sonnet-4-5-20250929":
       return ChatAnthropic(model="claude-sonnet-4-5-20250929", temperature=0,
                          api_key=os.getenv("ANTHROPIC_API_KEY"))
   elif model_name == "deepseek-chat":
       return ChatOpenAI(model="deepseek-chat", temperature=0,
                        api_key=os.getenv("DEEPSEEK_API_KEY"),
                        base_url="https://api.deepseek.com")
   elif model_name == "deepseek-chat-v3.1":
       # Note: v3.1-Terminus endpoint expires on October 15, 2025
       return ChatOpenAI(model="deepseek-chat", temperature=0,
                        api_key=os.getenv("DEEPSEEK_API_KEY"),
                        base_url="https://api.deepseek.com/v3.1_terminus_expires_on_20251015")


def calculate_cost(model_name, input_tokens, output_tokens):
   """Calculate total cost based on input and output token usage."""
   pricing = MODEL_PRICING[model_name]
   input_cost = (input_tokens / 1_000_000) * pricing["input"]
   output_cost = (output_tokens / 1_000_000) * pricing["output"]
   return input_cost + output_cost

get_model() 函数使用 LangChain 的统一接口初始化各模型。DeepSeek 模型使用与 OpenAI 兼容的端点并设定自定义 base URL。 注意:v3.1-Terminus 端点将于 2025 年 10 月 15 日过期。 完整脚本见 GitHub 上的 model_config.py。

带指标追踪的模型查询

创建 query_handler.py:

import time
from langchain_core.messages import SystemMessage, HumanMessage
from model_config import get_model, calculate_cost, MODEL_PRICING


def query_model(model_name, context, question):
   """Query a model with document context and track performance metrics."""
   model = get_model(model_name)
  
   # Embed full document context in system prompt
   system_prompt = f"""Use the given context to answer the question.
If you don't know the answer, say you don't know. Keep the answer concise.

Context:
{context}"""
  
   messages = [
       SystemMessage(content=system_prompt),
       HumanMessage(content=question)
   ]
  
   # Track response time
   start_time = time.time()

系统提示中嵌入了全部 57,000 个 token 的文档。传统注意力会在所有 token 间两两计算;DeepSeek v3.2 的稀疏注意力跳过无关连接,从而降低成本。

try:
       response = model.invoke(messages)
       elapsed_time = time.time() - start_time
      
       # Extract token usage (different providers use different formats)
       if hasattr(response, 'response_metadata') and 'token_usage' in response.response_metadata:
           token_usage = response.response_metadata['token_usage']
           input_tokens = token_usage.get('prompt_tokens', 0)
           output_tokens = token_usage.get('completion_tokens', 0)
       elif hasattr(response, 'usage_metadata'):
           input_tokens = response.usage_metadata.get('input_tokens', 0)
           output_tokens = response.usage_metadata.get('output_tokens', 0)
      
       # Calculate total cost
       cost = calculate_cost(model_name, input_tokens, output_tokens)
      
       return {
           "model": MODEL_PRICING[model_name]["name"],
           "response": response.content,
           "input_tokens": input_tokens,
           "output_tokens": output_tokens,
           "total_tokens": input_tokens + output_tokens,
           "cost": cost,
           "time": elapsed_time,
           "error": None
       }

不同的 LangChain 集成返回 token 使用的字段格式不一(OpenAI 使用 response_metadata,Anthropic 使用 usage_metadata),因此需要两种都检查。该函数会记录时长、提取 token 计数、计算成本,并返回包含所有指标的字典。完整代码见 GitHub 上的 query_handler.py。

构建 Streamlit 界面

创建 app.py:

import streamlit as st
import pandas as pd
import matplotlib.pyplot as plt
from document_loader import load_documents
from query_handler import query_model
from dotenv import load_dotenv

# Load API keys from .env file
load_dotenv()

# Configure Streamlit page with wide layout
st.set_page_config(
   page_title="Multi-Document Research Assistant",
   page_icon="📚",
   layout="wide"
)

st.title("📚 Multi-Document Research Assistant")
st.markdown("Compare long-context performance across GPT-5, Claude Sonnet 4.5, DeepSeek v3.2, and DeepSeek v3.1")

标准的 Streamlit 配置,采用宽屏布局,便于并排对比。

# Sidebar for document loading
with st.sidebar:
   st.header("📄 Documents Loaded")
  
   if st.button("Load Documents"):
       with st.spinner("Loading documents..."):
           # Load all PDFs and count tokens
           context, token_count, doc_names = load_documents("documents")
           st.session_state.context = context
           st.session_state.token_count = token_count
           st.session_state.doc_names = doc_names
  
   # Display loaded documents info
   if "token_count" in st.session_state:
       st.success(f"✅ Loaded {len(st.session_state.doc_names)} documents")
       st.metric("Total Tokens", f"{st.session_state.token_count:,}")
       st.write("**Documents:**")
       for name in st.session_state.doc_names:
           st.write(f"• {name}")

侧边栏负责加载文档并显示 token 数。Streamlit 的会话状态可在交互之间保留文档。

# Main content area
if "context" not in st.session_state:
   st.info("👈 Click 'Load Documents' in the sidebar to begin")
else:
   st.subheader("Select Models to Compare")
   col1, col2, col3, col4 = st.columns(4)
  
   # Model selection checkboxes
   with col1:
       use_gpt5 = st.checkbox("GPT-5", value=True)
   with col2:
       use_claude = st.checkbox("Claude Sonnet 4.5", value=True)
   with col3:
       use_deepseek_v32 = st.checkbox("DeepSeek v3.2-Exp", value=True)
   with col4:
       use_deepseek_v31 = st.checkbox("DeepSeek v3.1-Terminus", value=True)
  
   # Sample questions for quick testing
   sample_questions = [
       "Compare the main approaches to attention mechanisms described in these documents",
       "What are the key differences between sparse and dense attention?",
       "Summarize the common themes across all documents"
   ]

四个模型选择复选框与若干预设示例问题。

# Question input with samples
   question_choice = st.selectbox(
       "Select a sample question or write your own:",
       ["Custom"] + sample_questions
   )
  
   if question_choice == "Custom":
       question = st.text_area("Enter your question:", height=100)
   else:
       question = st.text_area("Enter your question:", value=question_choice, height=100)
  
   # Query button and model execution
   if st.button("🚀 Query Models", type="primary"):
       if not question:
           st.error("Please enter a question")
       else:
           # Build list of selected models
           selected_models = []
           if use_gpt5:
               selected_models.append("gpt-5")
           if use_claude:
               selected_models.append("claude-sonnet-4-5-20250929")
           if use_deepseek_v32:
               selected_models.append("deepseek-chat")
           if use_deepseek_v31:
               selected_models.append("deepseek-chat-v3.1")

用户选择或自拟问题,点击“Query Models”即可对所选模型进行比较。

results = []
          
           # Query each model sequentially with progress indicator
           for model_name in selected_models:
               with st.spinner(f"Querying {model_name}..."):
                   result = query_model(
                       model_name,
                       st.session_state.context,
                       question
                   )
                   results.append(result)
          
           # Store results in session state for persistence
           st.session_state.results = results

顺序查询各模型,并以旋转进度指示进行提示。

# Display results if available
if "results" in st.session_state:
   st.divider()
   st.subheader("📊 Results")
  
   results = st.session_state.results
  
   # Show model responses in expandable panels
   st.markdown("### Responses")
   for result in results:
       with st.expander(f"**{result['model']}** - ${result['cost']:.4f} | {result['time']:.2f}s"):
           if result['error']:
               st.error(f"Error: {result['error']}")
           else:
               st.write(result['response'])
  
   # Create metrics comparison table
   metrics_df = pd.DataFrame([
       {
           "Model": r['model'],
           "Input Tokens": r['input_tokens'],
           "Output Tokens": r['output_tokens'],
           "Total Tokens": r['total_tokens'],
           "Cost ($)": f"${r['cost']:.4f}",
           "Time (s)": f"{r['time']:.2f}"
       }
       for r in results
   ])
  
   st.dataframe(metrics_df, use_container_width=True)

结果以可展开面板展示,每个面板标题显示成本与耗时,并附带可排序的指标表。

# Create visualization charts
   fig, axes = plt.subplots(2, 2, figsize=(12, 10))
  
   # Chart 1: Cost comparison bar chart
   axes[0, 0].bar([r['model'] for r in results], [r['cost'] for r in results],
                  color=['#1f77b4', '#ff7f0e', '#2ca02c', '#d62728'][:len(results)])
   axes[0, 0].set_title('Cost Comparison')
   axes[0, 0].set_ylabel('Cost ($)')
   axes[0, 0].tick_params(axis='x', rotation=45)
  
   # Chart 2: Response time bar chart
   axes[0, 1].bar([r['model'] for r in results], [r['time'] for r in results],
                  color=['#1f77b4', '#ff7f0e', '#2ca02c', '#d62728'][:len(results)])
   axes[0, 1].set_title('Response Time Comparison')
   axes[0, 1].set_ylabel('Time (seconds)')
  
   # Chart 3: Token usage grouped bar chart
   models = [r['model'] for r in results]
   input_tokens = [r['input_tokens'] for r in results]
   output_tokens = [r['output_tokens'] for r in results]
   x = range(len(models))
   width = 0.35
   axes[1, 0].bar([i - width/2 for i in x], input_tokens, width, label='Input', color='#1f77b4')
   axes[1, 0].bar([i + width/2 for i in x], output_tokens, width, label='Output', color='#ff7f0e')
   axes[1, 0].set_title('Token Usage Comparison')
   axes[1, 0].legend()

2x2 网格展示四个图表:成本柱状图、时间柱状图、分组 token 使用柱状图,以及成本—时间散点图。

# Chart 4: Cost vs time tradeoff scatter plot
   axes[1, 1].scatter([r['cost'] for r in results], [r['time'] for r in results],
                      s=100, alpha=0.6, color=['#1f77b4', '#ff7f0e', '#2ca02c', '#d62728'][:len(results)])
   for i, r in enumerate(results):
       axes[1, 1].annotate(r['model'], (r['cost'], r['time']), fontsize=8, ha='right')
   axes[1, 1].set_title('Cost vs Time Trade-off')
   axes[1, 1].set_xlabel('Cost ($)')
   axes[1, 1].set_ylabel('Time (seconds)')
   axes[1, 1].grid(True, alpha=0.3)
  
   plt.tight_layout()
   st.pyplot(fig)
  
   # Display key findings
   if len(results) > 1:
       cheapest = min(results, key=lambda x: x['cost'])
       fastest = min(results, key=lambda x: x['time'])
      
       col1, col2 = st.columns(2)
       with col1:
           st.metric("Most Cost-Effective", cheapest['model'], f"${cheapest['cost']:.4f}")
       with col2:
           st.metric("Fastest Response", fastest['model'], f"{fastest['time']:.2f}s")

关键发现会自动高亮最省钱与最快的模型。完整代码见 GitHub 上的 app.py。

运行对比

启动应用:

streamlit run app.py

点击“Load Documents”加载三份 PDF(共 57,204 个 token)。选择要比较的模型(默认全选),选择或输入问题,然后点击“Query Models”。

57,000-token 上下文的预期响应时间:

  • Claude Sonnet 4.5:15–20 秒
  • DeepSeek v3.2:30–35 秒
  • DeepSeek v3.1:35–40 秒
  • GPT-5:40–45 秒

结果:成本与性能分析

结果区显示四个响应面板,以及四个模型的 Token 使用、成本与响应时间对比表

GPT-5 处理了 56,937 个输入 token 并生成 1,996 个输出 token,耗时 42.28 秒,成本 $0.1623。Claude Sonnet 4.5 处理了 65,855 个输入 token 并生成 485 个输出 token,耗时 16.13 秒,成本 $0.2048——最快但最贵。DeepSeek v3.2-Exp 处理了 56,842 个输入 token 并生成 698 个输出 token,仅耗费 $0.0162,耗时 32.16 秒。DeepSeek v3.1-Terminus 处理了 56,842 个输入 token 并生成 700 个输出 token,成本 $0.0328,耗时 35.85 秒。

v3.1 与 v3.2 的对比展示了稀疏注意力的影响。两者处理的输入相同,输出几乎一致(698 vs 700),但 v3.2 的成本减半($0.0162 vs $0.0328),速度也略快(32.16 秒 vs 35.85 秒)。这意味着仅靠稀疏注意力就带来了 2 倍的成本降低。

与 GPT-5 和 Claude 相比,v3.2 比 GPT-5 便宜 10 倍($0.0162 vs $0.1623),比 Claude 便宜 13 倍($0.0162 vs $0.2048)。在 100 次此类长度的查询中,使用 DeepSeek v3.2 您将花费 $16.20,而用 GPT-5 为 $162.30、Claude 为 $204.80。

可视化对比图,展示四个模型的成本、响应时间、Token 使用与成本-时间权衡

图表验证了 DeepSeek v3.2 在成本—时间权衡中的左下象限位置:总成本最低($0.0162),同时保持约 32 秒的合理速度。Claude 以成本换速度(昂贵但最快),GPT-5 在两项指标上都靠后(更贵且最慢),v3.1 则居中。token 使用图显示所有模型处理的输入规模相近,但输出长度有差异——GPT-5 生成了最长的 1,996 个 token,Claude 最短为 485 个,两个 DeepSeek 版本则在 700 个左右。

何时采用这种方法

将完整文档加载到上下文最适合需要跨文档理解的场景。如果问题需要连接三篇论文中的观点,切块与检索可能会错失这些联系。模型需要一次性看到全部内容。

该模式适用于多种用例:

  • 研究与分析:比较多篇论文、报告或文章,更关注关系而非单点事实。
  • 法律文档审阅:合同对比、政策分析或合规审查,强调上下文与细微差异。
  • 技术文档:理解不同 API 文档或技术规范之间的关系。
  • 长篇内容创作:在保持各来源观点脉络的前提下综合信息。

以下情况不太适合:

  • 文档过大:多数模型的上限为 128K–200K token。若超出,需要进行切块。
  • 目标是查找事实:当问题是“查找某具体答案”且明确存在于某一段时,RAG 的检索更合适。
  • 文档数量很多:一次加载 20 篇完整文档可能超出上下文限制。可考虑先筛选的混合方案。
  • 预算不敏感:若成本无所谓,GPT-5 或 Claude 在复杂查询上可能略优。

DeepSeek 的稀疏注意力改变了长上下文处理的经济性。以往每次查询要 $0.15–0.20,如今降至 $0.01–0.02。这让全上下文方法在每天运行数百上千次查询的应用中变得切实可行。

结语

DeepSeek v3.2 的稀疏注意力以 v3.1 一半的成本提供相同的模型质量。我们构建的多文档对比在实践中证明了这一点。处理 57,000 个 token,v3.2 成本 $0.0162,而 v3.1 为 $0.0328,且二者输出几乎一致。与 GPT-5 和 Claude 相比,v3.2 便宜 10–13 倍,同时保持合理的响应时间。对于经常处理长上下文的应用,这些节省很快会累积起来。

如果您在做文档分析、研究工具,或任何涉及长上下文的应用,值得测试 v3.2。请记住它仍属实验性,将其用于生产前务必充分测试。

想了解更多 AI 最新进展,欢迎阅读这些博文:

Bexruz (Bex) Tuychiev

作者

Bexruz (Bex) Tuychiev

我是一名数据科学内容创作者,拥有超过 2 年的经验,并在 Medium 上拥有较大的读者群。我喜欢用略带讽刺的笔调撰写有关 AI 和机器学习的深度文章——毕竟总得想点办法让这些内容不那么枯燥。我已发表 130 多篇文章,并制作了一门 DataCamp 课程,另有一门正在筹备中。我的内容已被超过 500 万人次阅读,其中有 2 万人在 Medium 和 LinkedIn 上成为关注者。 

主题