不知道你有没有看过一句很扎心的项目复盘:“We're lying to Claude in almost every session”——我们在几乎每一次与 Claude 的会话里,都在对 Claude 说谎。
这句话不是 AI 产生了自我意识,也不是什么科幻伦理讨论,而是很多人在高强度使用 Claude Code、Cursor、Copilot 这类编码 Agent 之后的真实感受:我们在提示词里没有交代完整的项目背景,没有把约束条件说清楚,把过时的依赖版本当成当前环境,让 Claude 按照一个错误的假设去改代码,结果 AI 一本正经地完成了错误需求。
本文不想站在道德角度批判“骗模型”,更想从工程角度聊聊:为什么我们会在会话中不知不觉地“说谎”给 Claude 听,以及怎样通过项目上下文、提示词设计和 CLI 配置,尽量把这段关系从“你说什么它信什么”变成“你给它真相,它给你答案”。
如果你是刚听说 Claude Code 的新手,本文也适合你。因为下面要讲的很多内容,其实是所有 LLM 编码工具共同面对的问题:上下文质量决定输出质量。
1. 我们到底对 Claude 说了什么谎
1.1 编码 Agent 不是搜索引擎,是“偏执的合作者”
Claude Code 是 Anthropic 推出的命令行 AI 编程工具,可以直接在终端里让 Claude 读取代码目录、修改文件、运行命令、执行测试。相比网页版对话,它最大的特点是能访问你的仓库,能真正“动手改代码”。
但这也带来一个严重问题:Claude 并不天然知道你仓库里的一切。它依赖两类信息:
- 你提供的对话内容。
- 它能读取到的文件内容、目录结构、git 状态。
如果你在提示词里没说清楚,Claude 就会根据它有限的观察去“脑补”。脑补出来的东西当然不一定错,但大概率是不完整的,甚至是与你的真实环境冲突的。
1.2 最常见的“谎言”场景
我整理了几个高频“说谎”模式,你看看自己中了几条。
_场景一:版本环境骗局。
Claude,帮我写一个 Python 爬虫,用 requests 和 BeautifulSoup 就行。但你的项目其实运行在 Python 3.12 环境,并且依赖版本锁定在某个比较新的版本上。Claude 可能按它记忆里的旧 API 给你写代码,你跑起来才发现loop参数、find_all行为都不一样。
_场景二:架构上下文缺失。
Claude,给这个用户模块加一个缓存功能。这个模块在项目里可能是多层架构,Service 层负责业务逻辑,Repository 层负责数据访问。你直接说“加缓存”,Claude 可能把缓存直接放在 Controller 层,完全绕过 Service 的语义。
_场景三:接口契约说明不清。
Claude,把返回结果里的字段从 name 改成 displayName。但name可能出现在前端、后端、数据库映射、API 文档等多个位置。你如果只说“字段改名”,Claude 会尽量改,但很可能漏掉某个地方,或者改动了一些不该动的序列化逻辑。
_场景四:隐藏约束没说。
这个功能你帮忙实现一下。你没说性能要求、并发量、异常处理规范、日志格式、是否需要兼容旧数据。Claude 只能按“常规写法”来,最后交出来的代码看起来能用,真一上线就暴露出问题。
看到没有?这些“谎言”不是我们有意的恶意欺骗,而是我们把模型当成了能读心的同事,但实际上它只是一个拥有很强推理能力、依赖上下文窗口的程序员实习生。
2. Claude Code 环境准备与安装:先让工具跑起来
要说怎么“对 Claude 诚实”,第一步是让你的 Claude Code 环境是可靠的。如果你连命令行都起不来,后面所有提示词技巧都白搭。
下面以常见环境为例,演示在 Node.js 环境下安装 Claude Code 的流程。
2.1 安装 Node.js 与 npm
Claude Code 目前主要依赖 Node.js 运行时。你需要先确认本机已经安装 Node 且版本不要太老。
node -v npm -v如果提示node不是内部或外部命令,就需要先去 Node.js 官网下载 LTS 版本安装。
2.2 安装 Claude Code
在终端里执行:
npm install -g @anthropic-ai/claude-code安装完成后,验证一下:
claude --version如果出现:
claude : 无法将“claude”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。或者:
'claude' 不是内部或外部命令,也不是可运行的程序或批处理文件。这通常说明 npm 全局安装目录没有加入系统 PATH 环境变量。在 Windows 上,可以检查 npm 全局前缀:
npm config get prefix然后把得到目录下的node_modules/.bin路径加入 PATH。macOS 和 Linux 上,常见问题则是当前用户对全局目录没有写权限,你可以把 npm 全局前缀改到用户目录,或者用sudo安装,但注意权限安全。
2.3 VS Code 集成
很多同学更喜欢在 VS Code 里用 Claude Code,而不是直接开终端。常见做法是给 VS Code 安装对应扩展,然后在命令面板里输入Claude Code相关命令。有的最新网络热词里出现“vscode配置claude code”“vscode安装claude code”,本质都是把 CLI 工具和编辑器打通。配置成功后,你可以在编辑器内直接选中代码片段,让 Claude 解释或修改。
2.4 验证登录
首次运行claude命令,会要求登录账号。如果遇到类似的提示:
Unfortunately, Claude is not available to new users right now.或者:
Your organization has disabled Claude subscription access for Claude Code.说明账号或组织层面没有开通 Claude Code 的访问权限,这不是本机配置的问题,需要换用具备访问权限的账号,或联系组织管理员。
2.5 常见安装报错速查
| 问题现象 | 常见原因 | 解决思路 |
|---|---|---|
claude不是内部或外部命令 | npm 全局目录不在 PATH 中 | 修复 PATH 或重装全局 npm 包 |
error: claude native binary not installed | postinstall 脚本没有执行成功 | 删除 node_modules 缓存后重新安装 |
connection dropped (ECONNRESET) | 网络不稳定或代理冲突 | 切换稳定网络,关闭不必要的系统代理后重试 |
DeepSeek-v4-Pro is not a model this version of Claude Code recognizes | 自定义模型名称写错或版本不支持 | 检查模型名称配置,切换到官方支持模型 |
注意:这些报错和修复思路只代表常见情况,Claude Code 迭代速度很快,遇到具体问题时应先查看官方 changelog 或仓库 issue,不要盲改配置。
3. 核心概念:上下文,才是诚实的关键
3.1 什么是“上下文窗口”
Claude 这类模型处理输入时,一次能接收的信息量是有限的,这个上限叫“上下文窗口”。你可以把它理解成一块工作台。工作台上能放的东西越多,Claude 在做任务时能参考的图纸就越多。
在 Claude Code 的使用场景中,上下文来自三个渠道:
- 你在对话里输入的内容。
- 它自动读取的项目文件内容。
- 系统级/项目级的规则文件,例如
CLAUDE.md。
撒谎的本质,就是让工作台上堆满了错误的图纸。Claude 拿到图纸后不会质疑图纸的正确性,它会在错误图纸上精心施工。
3.2 CLAUDE.md:项目的“宪法”
Claude Code 支持一个非常关键的机制:CLAUDE.md文件。这个文件可以写在仓库根目录,也可以放在全局配置目录下,用于告诉 Claude 本项目或本机使用的重要规则。
例如,在仓库根目录创建CLAUDE.md:
# 项目编码约定 ## 技术栈 - 后端:Java 17 + Spring Boot 3.x - 数据库:PostgreSQL 15,使用 JPA 访问 - 前端:Vue 3 + Vite ## 常用命令 - 开发启动:./mvnw spring-boot:run - 测试:./mvnw test - 代码格式化:./mvnw spotless:apply ## 架构分层 - Controller 层只负责参数校验和协议转换 - Service 层负责业务逻辑 - Repository 层负责数据访问,禁止写复杂业务 SQL ## 易踩的坑 - 不要修改 resources/db/migration 下已经发布的迁移脚本 - 不要在 Controller 中返回实体类,统一返回 DTO这样一来,当你下次说“给用户模块加缓存”时,Claude 读取到CLAUDE.md后,会知道项目是 Spring Boot 三层架构,它大概率会优先考虑在 Service 层加 Spring Cache 注解,而不是顺手在 Controller 层塞一个Map当缓存。
这就是“停止说谎”的第一步:把那些你以为“不用说”的信息,写进项目上下文里。不是让 Claude 猜,而是让它看见。
3.3 全局上下文与项目上下文
如果你在多台机器上使用 Claude Code,可以对每个项目分别配置CLAUDE.md;如果想要对所有项目生效,可以配置全局的CLAUDE.md。两者作用域不同,使用时注意区分:
- 项目根目录的
CLAUDE.md:当前仓库有效。 - 全局配置文件:该用户所有项目都会读取。
建议优先使用项目级配置,因为每个项目的技术栈、命令、规范都不完全一样,把全局配置做得太厚反而会污染不相关的项目。
4. 实战:从“说谎式提示”到“事实驱动提示”
4.1 改造前:模糊需求
我见过最经典的“谎言”提示,长这样:
Claude,这段代码有点慢,帮我优化一下。无论你用中文还是英文,只要信息量这么少,Claude 都只能靠猜。它可能把for循环改成列表推导式,可能建议加缓存,也可能改一改 I/O 逻辑——但哪个才是你要的?
我把这种提示称为“甩锅式提示”:你把所有决策责任都丢给模型。
4.2 改造后:带上下文的事实提示
一个好的提示,至少要包含以下四类信息中的三类:
- 目标:你要实现什么行为。
- 约束:不能改变什么,必须遵守什么。
- 环境:相关文件、依赖版本、运行方式。
- 验收标准:怎么算完成任务。
来看具体例子。
_优化前。
Claude,这段代码有点慢,帮我优化一下。_优化后。
Claude,请帮我优化 src/main/java/com/example/service/OrderService.java 中的 getOrdersByUserId 方法。 现状: - 当前传入 userId 后,先查出用户所有订单,再在内存里过滤 status。 - 订单表接近 200 万行,内存过滤导致 OOM。 约束: - 不要改变返回类型和调用方接口。 - 不要引入新的中间件。 - 需要在 Service 层内完成改动。 验收标准: - 在本地测试环境跑通。 - 对 status 字段增加数据库索引,并在代码注释中说明索引迁移文件位置。 - 尽量用 Spring Data JPA 的派生查询或 Specification 实现。你看,优化后我们给 Claude 提供了真实的环境信息、约束边界、验收标准。它即便不知道你的完整业务,也能在正确的范围内执行,不会自作主张地引入 Redis、拆表、改接口。
4.3 让 Claude 主动反问
有些时候,你没有足够时间写完整上下文。一个实用的技巧是:明确要求 Claude 在动手前先提问。
Claude,下面这个需求我先给你一个初步版本。你可以先读一下仓库里的相关文件,如果发现信息不足,请先列出所有你需要澄清的问题,确认后再写代码。 需求:用户模块增加缓存。这样 Claude 会先检查项目文件,如果它看到CLAUDE.md里的技术栈,可能会问:
- 缓存希望放在 Service 层还是 Repository 层?
- 是否允许使用 Redis,还是只用内存 Cache?
- 缓存失效策略用 TTL 还是手动更新?
虽然多了一轮对话,但这比你让它猜错后返工更高效。
4.4 把大任务拆成小步骤
对着 Claude Code 做“诚实沟通”的另一条重要原则是:不要让它在一次提示里完成一个横跨多个模块的大型重构。
对于这类任务,你应该把它拆成几个互相独立的小步骤,每步验证完结果之后,再进入下一步。例如:
第 1 步:先只修改 OrderService 中的查询逻辑,不改 Controller 和 DTO。 第 2 步:运行单元测试,确认原有测试通过。 第 3 步:再考虑新增缓存逻辑。这种顺序式描述,比“帮我重构订单模块,顺便加个缓存”要可靠得多。因为 Claude Code 在执行中也需要上下文连续性,如果一次会话里塞了太多任务,它很容易在中途遗落前面的约定。
4.5 不确认,不开始
在 Claude Code 的交互界面里,有一个比较实用的操作习惯:让模型在执行修改前,先输出“将要执行的改动计划”,等你确认后再真正写文件。你可以把计划输出理解为一种廉价的干跑。
如果你发现计划不对,立刻打断并纠正,而不是等它把错误代码全部写完再改。
5. 在会话里保持诚实的更多技巧
5.1 明确告诉 Claude 它能看到什么、不能看到什么
Claude Code 有自动读取文件的能力,但你应该主动说明文件的边界。
只允许修改 src/main/java 下的代码,不要动 pom.xml 和 application.yml。这句提示听起来简单,但能有效避免“改完业务代码,顺手把版本号升级了”这类事故。如果希望 Claude 即使遇到语法错误也不要擅自升级依赖,可以在CLAUDE.md里写明“禁止自动修改依赖清单”。
5.2 及时同步 git 状态
Claude Code 能看到 git 状态,但建议你在关键步骤前主动把代码提交到本地分支。这样即使 Claude 改坏了,也可以快速回滚。
git add -A git commit -m "chore: checkpoint before AI refactor"本质上,你是在给模型提供“可以后悔的上下文”。你让 Claude 放心改,也让自己放心退。
5.3 会话不是万能的,必要时开新会话
一个很常见的“说谎”模式是:在当前会话里,上下文已经被之前的问题污染了。比如前面讨论了 A 需求,中途又切换到 B 需求,这时候让 Claude 继续在当前会话写代码,它很可能会把 A 和 B 的逻辑混在一起。
在这种场景下,开一个新会话反而更诚实。因为新会话的上下文更干净,不会被之前的“错误假设”带着走。
5.4 对“听到的”版本保持怀疑
Claude Code 在安装和运行过程中,可能会涉及模型名称配置。有些同学会尝试把别的模型接入 Claude Code,例如搜索热词里出现的“claude code接入deepseek”。这类操作有一定社区玩法,但不同版本的 Claude Code 对模型名称的校验逻辑不一样。你可以把默认模型配置成环境变量,也可以修改配置文件,但要特别注意:
- 自定义模型名必须和当前版本支持的模型名称完全一致。
- 版本更新后,旧的模型名称可能失效。
- 生产环境强烈建议使用官方支持的模型和账号,避免被限流或封禁。
不要盲目跟风改模型配置。工具链越花哨,排查问题时就越难。
6. 常见报错排查与定位思路
6.1 启动与安装阶段的报错
| 问题现象 | 常见原因 | 解决思路 |
|---|---|---|
claude不是内部或外部命令 | 全局 bin 目录不在 PATH | 重装 npm 包或修复 PATH |
error: claude native binary not installed | 安装脚本没有完成 | 清理 npm 缓存后重装 |
Command failed with exit code 1 | Node 版本或网络问题 | 升级 Node 到 LTS,切换网络 |
| 登录时提示账号不可用 | 账号未开通访问权限 | 换账号或重新订阅 |
6.2 运行阶段的报错
| 问题现象 | 常见原因 | 解决思路 |
|---|---|---|
connection dropped (ECONNRESET) | 网络连接中断 | 检查网络,重试请求 |
retrying in 3s · attempt N/N | 服务端暂时不可达 | 等待重试,避免频繁请求 |
| 模型名称不被识别 | 模型配置错误 | 检查配置文件中的模型名 |
| 修改文件后测试仍失败 | 上下文信息不完整 | 补充技术栈和运行命令到 CLAUDE.md |
6.3 排查问题的一般顺序
遇到 Claude Code 报错,建议按以下顺序排查:
- 看报错信息本身,定位是网络错误、权限错误还是配置错误。
- 检查本机 Node 版本和 npm 全局目录是否正常。
- 确认是否启用了系统代理或防火墙,代理冲突很常见。
- 搜索该报错在官方 GitHub issues 或说明文档中的处理记录。
- 重装插件或 CLI 前,先备份你的
CLAUDE.md和配置文件。
6.4 遇到 API/服务问题怎么办
如果你的使用场景依赖 Claude API(例如写一个应用去调用 Claude 接口),请特别注意:
- 不要在生产环境硬编码 API 密钥。
- 使用环境变量或密钥管理服务。
- 对模型返回结果做超时和重试处理。
- 记录请求日志,方便排查。
示例的 Java 调用思路如下,不是完整代码,只是说明环境变量和超时配置的思路:
String apiKey = System.getenv("ANTHROPIC_API_KEY"); int timeoutSeconds = 60; // 用 apiKey 构造客户端,不要写死在代码里7. 工程化最佳实践与建议
7.1 把“诚实”固化到团队规范里
如果你是一个团队的负责人,想要让团队成员都能高效使用 Claude Code,可以在仓库里要求统一的CLAUDE.md文件,并纳入 Code Review 管理。这样即使新人第一次接触项目,Claude 也能在正确上下文中帮他改代码。
建议CLAUDE.md包含这些内容:
- 项目简介。
- 技术栈及版本。
- 启动、测试、构建命令。
- 架构分层约定。
- 禁止事项。
- 常见坑点和历史事故。
7.2 配置文件与密钥管理
在 Claude Code 使用过程中,可能会涉及一些配置项、环境变量、API 密钥。请务必遵守最小权限原则:
- 不要把密钥提交到 git 仓库。
- 使用
.gitignore排除本地配置文件。 - 生产环境使用独立密钥,不要和开发环境共用。
- 如果密钥泄露,第一时间吊销并更换。
7.3 日志与回滚
当 Claude 帮你完成一次较大规模的代码修改后,建议先运行已有测试,再手动 Code Review 改动。如果有条件,可以录制 AI 操作日志,方便回溯。
在终端里使用 Claude Code 时,可以保留会话日志。如果后续出现线上问题,你可以查到当时模型到底改了哪些文件,而不是靠记忆去猜。
7.4 提示词模板化
对于重复性任务,可以把“诚实的提示”做成模板,放入项目文档里。以后每次需要 Claude 改代码,先复制模板再补充具体细节,能有效避免临时编写时遗漏关键上下文。
示例模板:
任务目标:xxxxx 涉及文件:xxxxx 技术约束:xxxxx 验收标准:xxxxx 禁止事项:xxxxx8. 总结与技术边界
“We're lying to Claude in almost every session”这句话,其实戳中的是很多 AI 编码工具使用者的核心痛点:我们总是默认模型能理解那些我们心里清楚、但没有说出来的上下文。可它偏偏不理解。
要让 Claude Code 真正成为高效工具,不需要你去“讨好”模型,也不需要你用某种神奇咒语。你只需要做到两件事:
- 把项目事实写进
CLAUDE.md,让模型有据可查。 - 在提示词里给出足够的约束和验收标准,不让模型靠猜写代码。
剩下的执行、验证、代码审查,依然是你作为开发者的核心工作。AI 是放大器,不是读心术。
如果你正在被“Claude 写的代码不能用”困扰,不妨先检查一下:是你没说清楚,还是它真的没读懂?大概率,是你没“说真话”。
接下来可以继续学习的方向:
- 阅读 Claude Code 官方文档,了解最新命令和配置项。
- 尝试给项目搭一套完整的
CLAUDE.md,记录一个月内的使用效果。 - 用 Claude Code 写自动化测试、回归测试,减少手工验证成本。
- 关注社区关于 prompt engineering、AI 编码工作流的最新实践。
如果你在安装或使用 Claude Code 时遇到了具体的报错,欢迎在评论区留言。一起把“对 Claude 说谎”的次数降到最低。