最近圈子里有个挺火的话题:一个开源模型在几个关键基准测试上,把 GPT-5 和 Claude 4.5 都给比下去了,而且成本只有它们的零头。这个模型就是月之暗面(Moonshot AI)在 2025 年 11 月发布的 Kimi K2 Thinking。
K2 Thinking 最让我感兴趣的地方是它能自主连续执行 200-300 次工具调用,这对于构建复杂的 Agent 工作流来说是个不小的突破。它还提供了一个专门的 API 字段,让你能看到它解决问题时的“思考过程”。
这篇教程,我会带你上手 Kimi K2 Thinking 的 API,实现一个工具调用工作流,并最终构建一个对比 App,把它和 GPT-5、Claude 放在一起“烤一烤”,看看它到底强在哪,适合用在什么地方。
在开始敲代码之前,我们先搞清楚 K2 Thinking 和其他大模型到底有什么不一样。
Kimi K2 Thinking 是个什么模型?
大多数语言模型拿到提示就直接生成回答。K2 Thinking 的工作方式有点不同,它天生就是为那些需要规划、推理和自主行动的多步骤任务设计的。
架构和设计
它用了现在很流行的混合专家(MoE)架构,总参数量达到 1 万亿,但每次推理只会激活其中的 320 亿。这就好比一个巨大的工具箱,但你每次只拿出需要的那几件,既保证了能力,又控制了成本。256k 的上下文窗口也足够大了,可以把整个代码库、长篇报告或者对话历史直接扔给它,不用费心去做分块处理。
月之暗面发布了两个版本:K2 Instruct 主要处理像文本生成、分类这种追求速度的直接任务;而我们今天的主角 K2 Thinking,则专为复杂的推理任务而生。
两个核心亮点
K2 Thinking 第一个非常吸引人的特性是透明推理 (Transparent Reasoning)。你可以清晰地看到它如何分解问题、评估选项,并最终得出结论。这对于调试和理解模型的决策过程至关重要。
第二个是工具编排 (Tool Orchestration)。K2 能处理超长的连续工具调用,远超大多数模型的能力范围。它能自己决定用什么工具、什么时候用、怎么组合结果,整个过程几乎不需要人工干预。
Kimi K2 Thinking vs. GPT-5 vs. Claude 4.5
直接上数据最直观。下面是 K2 和 GPT-5、Claude Sonnet 4.5 以及 DeepSeek V3.2 的一些关键指标对比。
| 指标 | Kimi K2 Thinking | GPT-5 (High) | Claude Sonnet 4.5 | DeepSeek-V3.2 |
|---|---|---|---|---|
| HLE (含工具) | 44.9 | 41.7 | 32 | 20.3 |
| HLE 重度模式 | 51 | 42 | — | — |
| AIME25 (含 Python) | 99.1 % | 99.6 % | 100 % | 58.1 % |
| GPQA | 84.5 | 85.7 | 83.4 | 79.9 |
| SWE-bench Verified | 71.3 % | 74.9 % | 77.2 % | 67.8 % |
| 上下文窗口 | 256k tokens | 400k tokens | 200k tokens | 128k tokens |
| 输入价格 ($/1M) | $0.60 | $1.25 | $3.00 | $0.55 |
| 输出价格 ($/1M) | $2.50 | $10.00 | $15.00 | $2.19 |
| 最大工具调用 | 200–300 次 | 几十次+ | 几十次+ | 未明确 |
从数据能看出,K2 在需要 Agent 能力的基准测试(比如 HLE)上表现突出,尤其是在并行运行 8 个推理路径的“重度模式”下,把 GPT-5 甩开了 9 分。而在代码修复能力(SWE-bench)上,Claude 依然是王者。
但最关键的区别在工具调用上。K2 能处理 200-300 次的连续调用,这意味着它可以独立完成复杂的自主研究、调试流程或多步数据分析,而不需要你在每一步都介入。
到底该选哪个?
我个人的建议是:
- 选 Kimi K2 Thinking:当你需要构建复杂的 Agent 工作流,涉及大量工具调用、网络研究和信息整合时,或者当你需要清晰的推理链来进行调试或合规审计时。它的的的性价比极高。
- 选 GPT-5:当你需要最大的上下文窗口(400k),或者追求在各种任务上都有均衡且可靠表现时。
- 选 Claude Sonnet 4.5:当你的项目主要围绕软件工程,特别是代码调试和修复时。
- 选 DeepSeek:当你的首要考虑是预算,并且需要一个 MIT 许可的开源模型时。
上手 Kimi K2 Thinking API
你可以直接通过月之暗面的平台 platform.moonshot.ai 访问 K2,但为了方便后面做多模型对比,我推荐使用 OpenRouter。它是一个统一的 API 网关,用一个 API Key 就能调用 K2、GPT-5、Claude 等几十个模型。
首先,去 openrouter.ai 注册个账户,在后台的 “Keys” 部分生成一个 API Key。新用户有 5 美元的免费额度,足够我们测试了。
然后,配置你的 Python 环境。我们需要 OpenAI 的 Python SDK(OpenRouter 兼容 OpenAI 的 API 格式)和 python-dotenv 来管理密钥。
pip install openai python-dotenv
在你的项目根目录创建一个 .env 文件,把你的密钥放进去:
OPENROUTER_API_KEY=your_key_here
写一小段代码测试一下连接:
import os
from openai import OpenAI
from dotenv import load_dotenv
# 从 .env 文件加载 API 密钥
load_dotenv()
# 配置客户端指向 OpenRouter
client = OpenAI(
base_url="https://openrouter.ai/api/v1",
api_key=os.getenv("OPENROUTER_API_KEY")
)
# 测试调用 K2 Thinking
response = client.chat.completions.create(
model="moonshotai/kimi-k2-thinking",
messages=[
{"role": "user", "content": "15 * 24 等于多少?"}
]
)
print(response.choices[0].message.content)
如果能看到 15 * 24 = 360 的结果,那就说明一切就绪了。
窥探 K2 的“思考过程”
前面提到 K2 的透明推理能力,现在我们看看怎么在代码里把它调出来。K2 Thinking 默认就会在每次响应中包含它的思考过程。
API 响应里有两个关键字段:content 字段是最终给用户的答案,而 reasoning 字段则包含了它一步步的思考逻辑。来看一个计算折扣的例子:
response = client.chat.completions.create(
model="moonshotai/kimi-k2-thinking",
messages=[
{"role": "user", "content": "一台笔记本电脑 850 美元,今天有 20% 的折扣,折扣后的价格还要再加 8% 的消费税。我最终要付多少钱?"}
],
temperature=1.0 # 推荐为推理模式设置高一些的温度
)
print("最终答案:")
print(response.choices[0].message.content)
print("\n推理过程:")
# 注意:OpenAI 官方 SDK 可能没有直接的 .reasoning 属性,
# 这取决于 OpenRouter 的具体实现。通常需要访问原始响应体。
# 假设这里是理想情况,如果不行,可能需要打印 response.choices[0].message 的全部内容查看。
# 在实际的 OpenRouter 响应中,它可能位于 extra_body 或类似字段。
# 为简化,我们这里假设 SDK 已适配。
# 实际代码可能需要这样: print(response.choices[0].message.model_extra.get('reasoning'))
# 假设可以直接访问
print(response.choices[0].message.reasoning)
输出:
最终答案:
你最终需要支付的金额是 **$734.40**。
计算步骤如下:
1. 折扣金额: 20% of $850 = $170
2. 折扣后价格: $850 - $170 = $680
3. 消费税: 8% of $680 = $54.40
4. 最终金额: $680 + $54.40 = $734.40
推理过程:
用户想知道笔记本电脑打折并加税后的最终价格。
第一步:计算折扣金额。$850 * 0.20 = $170
第二步:计算折扣后价格。$850 - $170 = $680
第三步:计算消费税金额。$680 * 0.08 = $54.40
第四步:计算最终支付金额。$680 + $54.40 = $734.40
我再检查一下计算... [核对步骤省略]
最终金额是 $734.40
content 字段提供干净的答案,而 reasoning 字段则暴露了模型的思考过程。这对于我们理角模型是否真的“想明白了”还是蒙对了答案,非常有帮助。
用工具调用打造自主 Agent
工具调用让 K2 可以在推理过程中执行外部函数。你通过 JSON Schema 定义好工具的功能和参数,当 K2 认为需要外部数据或计算能力时,它就会调用相应的工具。
这形成了一个循环:K2 分析你的提示,如果需要工具,它会返回一个 finish_reason: "tool_calls" 的响应。你的代码负责执行这个函数,然后把结果以 role: "tool" 的形式发回给 K2,它会继续下一步的推理,直到任务完成。
构建一个 CSV 分析工具
我们来写一个实用的工具:分析 CSV 文件。这在数据科学场景中很常见。
首先,定义工具的 Schema:
import csv
import os
import json
tools = [
{
"type": "function",
"function": {
"name": "analyze_csv",
"description": "读取并分析 CSV 文件的前几行。返回列名、样本行、总行数和文件大小。",
"parameters": {
"type": "object",
"properties": {
"filepath": {
"type": "string",
"description": "CSV 文件的路径"
},
"num_rows": {
"type": "integer",
"description": "要读取的行数",
"default": 10
}
},
"required": ["filepath"]
}
}
}
]
接着,实现这个函数:
def analyze_csv(filepath: str, num_rows: int = 10) -> dict:
if not os.path.exists(filepath):
return {"error": f"文件未找到: {filepath}"}
try:
with open(filepath, 'r') as f:
reader = csv.DictReader(f)
columns = reader.fieldnames
sample_rows = [dict(row) for i, row in enumerate(reader) if i < num_rows]
f.seek(0)
# 跳过表头
next(f)
total_rows = sum(1 for line in f)
return {
"columns": list(columns),
"sample_rows": sample_rows,
"total_rows": total_rows,
"file_size_kb": round(os.path.getsize(filepath) / 1024, 2)
}
except Exception as e:
return {"error": str(e)}
实现工具调用循环
有了工具,我们还需要一个循环来处理 K2 和函数之间的交互。
# 假设 client 已经初始化
messages = [
{"role": "user", "content": "分析一下 sample_employees.csv,告诉我工程部门员工的平均薪资。"}
]
# 先创建一个假的 CSV 文件用于测试
with open("sample_employees.csv", "w", newline="") as f:
writer = csv.writer(f)
writer.writerow(["name", "department", "salary"])
writer.writerow(["Alice", "Engineering", "95000"])
writer.writerow(["Bob", "Marketing", "75000"])
writer.writerow(["Carol", "Engineering", "110000"])
writer.writerow(["David", "Sales", "82000"])
while True:
response = client.chat.completions.create(
model="moonshotai/kimi-k2-thinking",
messages=messages,
tools=tools,
temperature=1.0
)
message = response.choices[0].message
messages.append(message) # 把 assistant 的回复也加入历史
if message.tool_calls:
for tool_call in message.tool_calls:
function_name = tool_call.function.name
arguments = json.loads(tool_call.function.arguments)
if function_name == "analyze_csv":
result = analyze_csv(**arguments)
messages.append({
"role": "tool",
"tool_call_id": tool_call.id,
"name": function_name,
"content": json.dumps(result)
})
else:
# 当没有工具调用时,表示任务完成
print(message.content)
break
在这中情况下,K2 首先会调用 analyze_csv 来获取文件内容,然后根据返回的数据,自己完成后续的筛选和计算,最终给出工程部门的平均薪资。这展示了它独立编排任务的能力。
实战:构建一个多模型对比 App
理论讲得再多,不如亲手试试。我们来构建一个 Streamlit 应用,可以同时向 Kimi K2、GPT-5 和 Claude 4.5 发送同一个提示,并排查看它们的回答和思考过程。
这里我只讲一下核心的构建思路。
- 项目设置:你需要安装
streamlit和anthropic。 - API 配置:在你的
.env文件里,除了OPENROUTER_API_KEY,再把OPENAI_API_KEY和ANTHROPIC_API_KEY也加上。 - 统一的调用函数:写一个
call_model函数,根据传入的模型名称,调用对应的客户端,并处理每个模型独特的 API 响应格式,最后返回一个标准化的字典(包含内容、推理过程、耗时等)。 - 并行调用:为了提升体验,我们用
ThreadPoolExecutor来并行调用三个模型的 API,这样等待时间就取决于最慢的那个,而不是三个的总和。 - Streamlit 界面:用
st.columns(3)创建三列布局,每一列显示一个模型的输出。思考过程可以用st.expander包裹起来,默认折叠。
终极对决:复杂任务下的表现
App 建好后,我用三个有挑战性的提示对它们进行了测试:一个复杂的数学应用题,一个多约束的逻辑推理题,以及一个带复杂要求的代码生成任务。
结果是,三个模型都正确解决了所有问题。但它们的“解题风格”截然不同:
- Kimi K2 的风格:深思熟虑,反复核查。它就像一个严谨的学霸,会不断地自问自答,“等等,我再检查一遍……”,整个思考过程非常详细,但也因此耗时最长,消耗的 Token 也最多。如果你需要一个能带你学习、帮你调试或提供审计追踪的过程,K2 是最好的选择。
- GPT-5 的风格:条理清晰,稳扎稳打。它像一个经验丰富的项目经理,把问题分解成清晰的步骤,然后有条不紊地执行。它的思考过程既有深度又不过于冗长,在速度和细节之间取得了很好的平衡。
- Claude 的风格:快、准、狠。它像一个顶尖的程序员,能迅速找到最优解并直接给出结果。它的思考过程很精炼,几乎没有多余的验证步骤。如果你对结果有信心,并且追求极致的响应速度,Claude 是首选。
我的看法
Kimi K2 Thinking 绝不只是一个廉价的 GPT 或 Claude 替代品。它是一种为特定场景——即复杂的、需要高度自主性的 Agent 工作流——而设计的工具。
它通过透明的推理过程和强大的工具编排能力,为我们打开了一扇新的大门。在很多需要模型“自己想办法”的场景里,比如自动化研究、多步骤数据处理流水线、复杂的软件调试等,K2 的表现可能会远超我们的预期。
你用我上面提到的方法搭建的那个对比 App,是体验这三者差异最直接的方式。试试用你自己的问题去测试它们,慢慢地你就会对何时该用哪个模型,形成自己的直觉。
关于
关注我获取更多资讯