最近在做一个大型遗留系统的重构项目,代码库大概有十几万行 Java。

想着既然 Claude 支持超长上下文,干脆一股脑把核心代码都丢进去,让它帮我分析整个模块的依赖关系。但很快我发现了一件奇怪的事:当我喂入的代码量越来越大,模型的"表现"开始产生微妙但肉眼可见的变化。

这引发了我做了一组系统性的测试,结果很有意思,整理出来分享给大家。


先搞清楚:128K 上下文到底意味着什么?

在聊测试结果之前,先对齐一下基础概念。

"上下文窗口(Context Window)"是指模型在处理一次请求时,能同时"看见"的最大 Token 数量。Token 不等于字符,大致规律是:英文约 1 Token ≈ 4 个字符,中文约 1 Token ≈ 1.5 个汉字,代码约 1 Token ≈ 3-4 个字符

128K Token 听起来很大,换算成代码量大概是这个级别:

代码类型 约等于的代码量
Python 脚本 约 5,000 ~ 8,000 行
Java 企业级代码 约 3,000 ~ 5,000 行
带注释的 TypeScript 约 4,000 ~ 6,000 行
压缩后的 JSON 配置 约 1MB 文件大小

对于一个中型项目来说,128K 听起来不少,但核心业务逻辑加上依赖文件,很容易就突破这个边界。


测试方法:我是怎么做这个实验的?

为了让结果有说服力,我设计了三组对照实验,使用同一个真实项目的代码,分别在 32K、64K、128K、160K+ 四个 Token 级别喂给 Claude,然后问它同一个问题:

「请分析这段代码里,OrderService 类和 PaymentGateway 接口之间的依赖调用链,并找出其中潜在的循环依赖风险。」

为了精确统计 Token 用量,我写了一个简单的计算脚本:

import anthropic

client = anthropic.Anthropic()

def count_tokens(file_path: str) -> int:
    """统计代码文件的 Token 数量"""
    with open(file_path, 'r', encoding='utf-8') as f:
        code_content = f.read()
    
    response = client.messages.count_tokens(
        model="claude-opus-4-5",
        messages=[{
            "role": "user",
            "content": code_content
        }]
    )
    return response.input_tokens

# 批量统计项目文件
import os
total_tokens = 0
for root, dirs, files in os.walk('./src'):
    # 过滤掉 node_modules 和编译产物
    dirs[:] = [d for d in dirs if d not in ['node_modules', 'dist', '__pycache__']]
    for file in files:
        if file.endswith(('.java', '.py', '.ts', '.js')):
            file_path = os.path.join(root, file)
            tokens = count_tokens(file_path)
            print(f"{file_path}: {tokens} tokens")
            total_tokens += tokens

print(f"\n项目总计: {total_tokens} tokens")

关键发现:超过 128K 之后,模型的推理发生了什么?

这是整个测试最核心的部分。

在 32K ~ 64K 范围内: 模型表现非常稳定,对代码逻辑的推理清晰,能精准地定位到具体的类名、方法名,给出的依赖链分析几乎没有错误。

在 64K ~ 128K 范围内: 分析依然准确,但回答的"颗粒度"开始有轻微变化。模型会更多地描述模块层面的关系,而不是逐行的逻辑推演。这个变化很细微,但已经能感知到。

超过 128K 之后: 明显的变化出现了,可以总结为以下三个特征:

① "注意力稀释"现象

当上下文过长时,模型对"中间段落"代码的关注度会下降。这在学术界有个专有名词叫 “Lost in the Middle”(中间遗忘现象)

简单来说,放在上下文开头和结尾的代码,被引用和分析的概率远高于中间部分。如果你把最关键的 OrderService 核心类放在了 5 万 Token 处,在总量 160K 的上下文里,它就很容易被"稀释"掉。

② 推理置信度的悄然下降

在超长上下文下,模型给出的结论会出现更多"可能是"、“从我观察到的部分来看"这样的措辞,而不是明确的断言。这不是在认怂,而是模型在诚实地表达自己的不确定性——上下文越长,它越难"全局掌握”。

③ 幻觉率(Hallucination)小幅上升

这是最需要警惕的地方。在超出 128K 的测试中,我有 3 次发现模型编造了并不存在于代码库中的类名或方法名,把 PaymentGatewayImpl 错误地引用为 PaymentProcessor。这在 64K 以内的测试中没有出现过。


开发者问答:这些问题该怎么应对?

Q1:既然有"中间遗忘"问题,我是不是应该把最重要的代码放到开头或结尾?

答: 是的,这是目前最有效的工程化 Trick。把你最想让模型重点分析的文件,放在 Prompt 的最前面,其次是放到最后面。中间部分只放辅助参考代码。

一个可以参考的提示词结构是这样的:

[最核心的目标文件:OrderService.java]
...(核心代码内容)...

[背景参考代码:其他 Service 类]
...(大量的参考文件)...

[任务说明]
请重点分析第一个文件中的依赖关系,参考后续文件理解整体上下文。
Q2:我的项目真的很大,代码量超过 200K Token,怎么办?

答: 不要硬喂。正确的姿势是代码分块(Chunking)+ 多轮对话。先让 AI 分析模块A,把结果记录下来;再用这份"摘要结果"作为上下文,去分析模块B。这样能在有限的窗口内处理更大的代码库,效果反而比硬塞更好。

Q3:国内用户怎么低成本地用上 Claude 做这类大代码量分析?

答: 这是个实际问题。一旦上下文超过 100K,消耗的 Token 量会很惊人,官方直连的成本比较高。推荐用 喜爱AI 这类多模型聚合平台,它汇聚了 Claude、DeepSeek、Gemini、ChatGPT 等主流模型。你可以根据任务复杂度灵活切换——超大代码分析用 Claude,日常代码补全用 DeepSeek Coder,综合下来性价比很高。


趋势分析:上下文窗口军备竞赛的边界在哪里?

从行业趋势来看,上下文窗口这个数字仍在快速增长。从早期的 4K、8K,到 GPT-4 的 32K,再到 Claude 的 200K,某些模型甚至已经宣称支持 1M Token。

但我认为这里存在一个常被忽视的事实:窗口大小 ≠ 有效利用率

真正决定模型"理解深度"的,不只是能装多少代码,而是模型能对这些代码产生多强的"关联推理"能力。200K Token 的窗口,如果中间 60% 的内容都是被稀释的"背景噪音",那实际有效理解的范围可能只有 80K。

未来真正的突破点,可能不在于继续把窗口做大,而在于**选择性注意力(Selective Attention)**技术的突破——让模型能像有经验的高级程序员一样,在几十万行代码里快速定位到最相关的部分,而不是把所有代码一视同仁地"看一遍"。


写在最后

总结一下这次测试的核心结论:

  • 128K 以内: 放心用,Claude 的代码分析能力非常可靠。
  • 128K ~ 200K: 需要工程化技巧辅助,重要代码放首尾,辅助代码放中间。
  • 超过 200K: 强烈建议采用分块分析策略,不要指望一次全喂进去。

理解工具的边界,才能用好工具。与其盲目地把所有代码都塞进上下文,不如花 10 分钟做一次合理的代码分块规划。这个小改变,能让你的 AI 编程效率翻倍。

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐