# 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 answerprint("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 在其集成中已加入该选项)。
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"},}技术支持
import time
from langchain_core.messages import SystemMessage, HumanMessage
from model_config import get_model, calculate_cost, MODEL_PRICING
defquery_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()技术支持
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")技术支持
# Main content areaif"context"notin 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 checkboxeswith 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 executionif st.button("🚀 Query Models",type="primary"):ifnot 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 indicatorfor 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 availableif"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/2for i in x], input_tokens, width, label='Input', color='#1f77b4')
axes[1,0].bar([i + width/2for i in x], output_tokens, width, label='Output', color='#ff7f0e')
axes[1,0].set_title('Token Usage Comparison')
axes[1,0].legend()技术支持
DeepSeek 刚刚发布了 v3.2-Exp,这是一款将 API 成本削减一半以上的实验性模型。如果您一直在使用大语言模型,您会知道长上下文处理的花费会迅速攀升。此次发布通过一种称为 DeepSeek 稀疏注意力 的技术来解决这个问题。
在本教程中,我将解释 v3.2 相较于之前 DeepSeek 版本的不同之处、稀疏注意力的底层机制,以及如何在您的项目中使用该模型。我们将覆盖发起 API 调用的基础,并构建一个演示项目,展示该模型在哪些场景表现最佳。
最后,您将构建一个 Streamlit 应用,用于比较不同 LLM(包括 DeepSeek v3.2)的成本:
我也建议您查看我们关于全新 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 可以交互,而不考虑实际文本内容。有时您需要将文档开头的一个词与末尾的内容关联,固定模式可能会错过这种联系。
DeepSeek 稀疏注意力(DSA):更细粒度的方法
DSA 采用不同路径。它不使用固定模式,而是基于内容本身学习哪些 token 需要相互关注。模型会动态选择相关连接。
其高层原理如下:在训练期间,DeepSeek 在每个注意力层中加入了一个选择机制。该机制查看您的 token,决定哪些注意力连接值得计算。它保留重要连接,跳过其余部分。
这种选择并非随机。模型在训练中学会了不同任务下哪些连接类型更重要。当您发送与代码相关的提示时,它会关注不同于法律文档的模式。
结果是:DSA 在不损害输出质量的前提下减少了注意力计算量。技术报告显示,v3.2 在基准上与 v3.1-Terminus 表现几乎一致,但每个 token 的计算更少。您以大约一半的 API 成本获得相同的模型质量。
为何这对开发者重要
DSA 在实践中的意义:
这些优势在以下用例中尤为明显:
如果您的应用需要处理长输入,DSA 将带来实实在在的差异。您不仅能省钱,还能在传统注意力吃力的任务中获得更好的表现。
发起您的第一条 DeepSeek V3.2 调用
了解 DSA 的工作原理后,让我们通过其 API 使用该模型。
先决条件
您需要在机器上安装 Python 3.8 或更高版本。如果您是通过 API 使用 LLM 的新手,或许可以先看看 DataCamp 的 AI 学习指南来熟悉基础知识。我们还有更详细的 DeepSeek API 教程覆盖更早的版本,适合深入学习。
好消息是:如果您用过 OpenAI 的 API,您已经会用 DeepSeek。API 格式完全一致。
环境配置
首先,从 platform.deepseek.com 获取您的 API 密钥。如果您还没有账号,需要先创建一个。
安装所需依赖:
在项目目录下创建
.env文件,并添加您的 API 密钥:第一次 API 调用
下面是使用 OpenAI SDK 的基础示例。与 OpenAI API 的唯一区别是
base_url参数以及您的 API 密钥:运行后,您会得到类似如下的返回:
deepseek-chat是v3.2-Exp的非“思考”模式。它会处理您的请求并返回答案,但不会展示推理步骤。使用推理模型
如果您想查看模型的推理过程,请使用
deepseek-reasoner。该模型会先展示其思维链,再给出最终答案:输出类似如下:
该推理模型在生成最终答案前,最多可生成 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 是正确的选择。按量计费,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。您将并排看到成本差异、响应时间及输出质量。
最终应用界面如下:
注意:本节余下内容详细讲解如何从零构建此应用。不构建也不影响理解对比结果,但走一遍代码能给您用 DeepSeek 构建长上下文应用的实用范式。
构建应用
我们将用 Streamlit 搭配三个辅助模块来构建:一个用于加载文档,一个用于模型配置,一个用于处理查询。应用流程很简单:加载 PDF、选择模型、提出问题并比较结果。
先创建项目目录并安装依赖:
创建包含 API 密钥的
.env文件:下载三篇关于注意力机制的论文:
这三篇论文加载后合计 57,204 个 token。
加载与统计 token
创建
document_loader.py:该函数从目录中加载所有 PDF,提取各页文本,并用文档分隔符拼接在一起。
token 计数使用 tiktoken 的 GPT-4 编码,在各提供商之间都有较高一致性。可在 GitHub 查看完整的 document_loader.py。
配置模型与定价
创建
model_config.py:该定价字典存储了每百万 token 的成本(截至 2025 年 10 月)。带稀疏注意力的 DeepSeek v3.2 比 GPT-5 和 Claude 便宜约 10 倍,而 v3.1 大致是 v3.2 成本的 2 倍,处于中间水平。
get_model()函数使用 LangChain 的统一接口初始化各模型。DeepSeek 模型使用与 OpenAI 兼容的端点并设定自定义 base URL。 注意:v3.1-Terminus 端点将于 2025 年 10 月 15 日过期。 完整脚本见 GitHub 上的 model_config.py。带指标追踪的模型查询
创建
query_handler.py:系统提示中嵌入了全部 57,000 个 token 的文档。传统注意力会在所有 token 间两两计算;DeepSeek v3.2 的稀疏注意力跳过无关连接,从而降低成本。
不同的 LangChain 集成返回 token 使用的字段格式不一(OpenAI 使用
response_metadata,Anthropic 使用usage_metadata),因此需要两种都检查。该函数会记录时长、提取 token 计数、计算成本,并返回包含所有指标的字典。完整代码见 GitHub 上的 query_handler.py。构建 Streamlit 界面
创建
app.py:标准的 Streamlit 配置,采用宽屏布局,便于并排对比。
侧边栏负责加载文档并显示 token 数。Streamlit 的会话状态可在交互之间保留文档。
四个模型选择复选框与若干预设示例问题。
用户选择或自拟问题,点击“Query Models”即可对所选模型进行比较。
顺序查询各模型,并以旋转进度指示进行提示。
结果以可展开面板展示,每个面板标题显示成本与耗时,并附带可排序的指标表。
2x2 网格展示四个图表:成本柱状图、时间柱状图、分组 token 使用柱状图,以及成本—时间散点图。
关键发现会自动高亮最省钱与最快的模型。完整代码见 GitHub 上的 app.py。
运行对比
启动应用:
点击“Load Documents”加载三份 PDF(共 57,204 个 token)。选择要比较的模型(默认全选),选择或输入问题,然后点击“Query Models”。
57,000-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。
图表验证了 DeepSeek v3.2 在成本—时间权衡中的左下象限位置:总成本最低($0.0162),同时保持约 32 秒的合理速度。Claude 以成本换速度(昂贵但最快),GPT-5 在两项指标上都靠后(更贵且最慢),v3.1 则居中。token 使用图显示所有模型处理的输入规模相近,但输出长度有差异——GPT-5 生成了最长的 1,996 个 token,Claude 最短为 485 个,两个 DeepSeek 版本则在 700 个左右。
何时采用这种方法
将完整文档加载到上下文最适合需要跨文档理解的场景。如果问题需要连接三篇论文中的观点,切块与检索可能会错失这些联系。模型需要一次性看到全部内容。
该模式适用于多种用例:
以下情况不太适合:
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 最新进展,欢迎阅读这些博文: