1. 为什么 analysis_claude_code 的 SystemPrompt 值得单独拆解
如果你正在做代码分析类 Agent,大概率会遇到一个尴尬:模型能写代码,但一让它"读一个仓库、定位问题、给出修改建议",输出就开始飘——要么泛泛而谈,要么漏掉关键文件,要么把猜测当结论。analysis_claude_code 这个项目之所以被反复讨论,不是因为它复刻了某个工具,而是它把 Claude Code 这类代码 Agent 的 SystemPrompt 结构暴露成了一个可以研究、可以拆、可以改的样本。SystemPrompt 在这里不是一段"你是一个 helpful assistant"的客套话,而是决定 Agent 行为边界的核心配置。
先把概念说清楚。SystemPrompt(系统提示词)是对话开始前注入、优先级高于用户消息的那段指令,它定义角色、约束工具使用方式、规定输出格式、划定安全边界。对代码分析类 Agent 来说,它还要额外承担几件事:告诉模型先探索再下结论、要求引用具体文件路径和行号、限制它在没有证据时不要编造 API、规定它如何组织"发现—验证—建议"的结构。analysis_claude_code 的价值就在于,它把这些约束拆成了可辨认的字段和段落,而不是揉成一团。
这篇适合谁看?三类人。第一类是想给自己的代码审查 Agent 写 SystemPrompt、但不知道从哪下手的开发者;第二类是用 Claude Code 风格工具做二次开发、需要理解提示词分层的人;第三类是想把提示词工程从"调参玄学"变成"可复制模板"的工程师。我会给出可复制的模板、逐段改写对照,以及怎么在 TaoToken 的统一 Key/API 通道下把配置跑通、验证输出是否符合预期。全程按"能跟着做"来写,不堆概念。
需要提前说明一点:analysis_claude_code 是对某个版本工具的分析资料,不是官方产物,结论仅供技术参考。我们借它的结构思路来设计自己的 SystemPrompt,而不是照抄某段具体文本。理解这一点,后面的模板你才能改得动。
2. TaoToken 前置准备:统一 Key 与 API 通道怎么配
在写 SystemPrompt 之前,得先有一个能稳定调用模型的通道,否则你改完提示词没法验证效果。我用 TaoToken 作为统一入口,原因是它把模型调用收敛成一套 Base URL + Key + Model ID 的组合,切换模型时不用改代码结构,这对反复调试 SystemPrompt 特别友好——同一段提示词换不同模型跑,能快速看出提示词本身的问题还是模型能力的问题。
先拿 Key。打开 https://taotoken.net/api-keys ,登录后创建一个 API Key,复制保存。注意 Key 只在创建时完整显示一次,丢了就重建。这个 Key 后面会同时用在环境变量和配置文件里。
Base URL 统一用 https://taotoken.net/api ,不要带任何多余路径。Model ID 按你实际要调的模型填,比如做代码分析常用的是长上下文、强推理的模型,具体可用列表在控制台 https://taotoken.net/console 里能看到。如果你还没决定用哪个,可以先在模型对话页 https://taotoken.net/chat 里手动试几轮,确认模型对代码分析类任务的表现,再写进配置。
环境变量方式适合脚本和 CLI 工具:
export TAOTOKEN_API_KEY="sk-你的Key" export TAOTOKEN_BASE_URL="https://taotoken.net/api"如果你用的是 Claude Code 风格的 CLI 工具,通常它读的是 Anthropic 兼容的环境变量,那就这样设:
export ANTHROPIC_BASE_URL="https://taotoken.net/api" export ANTHROPIC_API_KEY="sk-你的Key"这里有个容易踩的点:Base URL 结尾不要加/v1,也不要加/messages,SDK 会自己拼。我见过有人写成https://taotoken.net/api/v1然后一直 404,排查半天。统一用https://taotoken.net/api就行。
如果你用的是 Cline、Roo 这类插件,或者需要 MCP 配置,那就要把三件套写全:Base URL、API Key、Model ID。缺一个都连不上。下面这段是通用的 JSON 配置形态,字段名按你实际工具的要求微调:
{ "provider": "anthropic", "baseUrl": "https://taotoken.net/api", "apiKey": "sk-你的Key", "model": "你的ModelID" }配置完先别急着写 SystemPrompt,用一条最简单的请求确认通道是通的。这一步很重要,因为后面提示词不生效时,你要能区分是通道问题还是提示词问题。验证方法下一节给。
3. 可复制的 SystemPrompt 模板与逐段改写对照
这一节是核心。我先把一个面向代码分析的 SystemPrompt 模板完整给出,然后逐段解释每个字段在干什么、为什么这么写、以及常见的错误写法长什么样。你可以直接复制,再按自己的场景改。
模板用 Markdown 结构组织,因为模型对分节标题的遵循度比纯段落高。整体分五块:角色定义、工作流程、工具约束、输出格式、安全边界。
# 角色 你是一个代码分析 Agent,专注于阅读代码库、定位问题、给出有证据支撑的结论。 你不负责直接改代码,除非用户明确要求。 # 工作流程 1. 先探索:在给出任何结论前,先用搜索和读取工具了解相关文件结构。 2. 再定位:找到与问题相关的具体文件、函数、行号。 3. 后验证:对每个判断,说明依据来自哪个文件的哪段代码。 4. 最后输出:按下方格式组织结论,区分"已确认"和"待验证"。 # 工具使用约束 - 读取文件前先确认路径存在,不要假设文件内容。 - 搜索时优先用精确关键词,避免一次拉取过多无关文件。 - 不要在没有读取源码的情况下描述某个函数的实现。 - 涉及外部 API 时,若无法确认签名,标注为"需人工确认"。 # 输出格式 ## 结论摘要 (3 行以内,说明发现的核心问题) ## 证据 - 文件路径:行号 — 说明 - 文件路径:行号 — 说明 ## 建议 (按优先级排列,每条建议对应上面的证据) ## 不确定项 (列出你无法从代码中确认、需要人工核对的内容) # 安全边界 - 不执行任何写操作、删除操作、网络请求,除非用户明确授权。 - 不输出密钥、令牌、密码等敏感信息,即使它们在代码中出现。 - 遇到无法判断的权限或合规问题,停下来询问用户。现在逐段拆。
角色定义这段的关键是"不负责直接改代码,除非用户明确要求"。很多人的 SystemPrompt 只写"你是代码助手",结果模型一上来就给 patch,用户其实只想让它分析。把职责边界写死,能省掉大量来回。改写对照:错误写法是"你是一个专业的代码分析专家,帮助用户解决代码问题"——太泛,模型会自由发挥。正确写法要包含"做什么"和"不做什么"。
工作流程这段是 analysis_claude_code 思路里最值得借鉴的部分:把"先探索再结论"变成硬性步骤。代码分析类 Agent 最大的毛病就是跳过读取直接下判断。用编号步骤约束后,模型会倾向于先调用工具。注意第 4 步"区分已确认和待验证",这是防止幻觉的关键——它给了模型一个合法的出口去表达不确定,而不是硬编一个答案。
工具使用约束这段针对的是具体行为。"不要在没有读取源码的情况下描述某个函数的实现"这句话看着啰嗦,但实测能明显降低编造。因为模型在长上下文里容易"记得"某个常见库的写法,然后套到你的代码上。明确禁止后,它会先去读。
输出格式这段决定了结果好不好用。固定四段结构:摘要、证据、建议、不确定项。证据段强制要求"文件路径:行号",这样你拿到输出能直接跳转核对。不确定项单独成段,比混在建议里更醒目。改写对照:错误写法是"请给出详细的分析报告"——模型会写一大段散文,没法用。正确写法是给出带标题的骨架,模型填空即可。
安全边界这段不能省。代码库里经常有硬编码的密钥、内部地址、测试账号。SystemPrompt 里明确"不输出敏感信息",能挡掉一部分泄露。另外"不执行写操作"这条,配合工具的权限控制,能防止 Agent 误删文件。
把模板存成文件,比如system_prompt.md,方便版本管理。改提示词时用 git 记录,出问题能回滚。这一点很多人忽略,等到提示词改崩了想找回上一版,只能凭记忆。
4. 验证请求与成功结果:把配置跑通
配置和模板都齐了,现在验证。先确认通道通,再确认提示词生效。分两步走,别混在一起。
第一步,最小请求验证通道。用 curl 直接打,排除 SDK 干扰:
curl https://taotoken.net/api/v1/messages \ -H "x-api-key: $TAOTOKEN_API_KEY" \ -H "anthropic-version: 2023-06-01" \ -H "content-type: application/json" \ -d '{ "model": "你的ModelID", "max_tokens": 256, "system": "你是一个测试助手,只回复 OK。", "messages": [{"role": "user", "content": "ping"}] }'预期返回是一段 JSON,content数组里有一条text为 "OK" 的消息。如果这里报 401,说明 Key 不对或没带上;报 404,多半是路径写错,检查是不是多加了/v1之外的东西;报 model 相关错误,说明 Model ID 填错,去控制台核对。
第二步,把完整 SystemPrompt 注入,跑一个真实的小任务。准备一个测试仓库,哪怕只有两三个文件也行。用 Python SDK 调用:
import anthropic client = anthropic.Anthropic( api_key="sk-你的Key", base_url="https://taotoken.net/api" ) with open("system_prompt.md", "r", encoding="utf-8") as f: system_prompt = f.read() resp = client.messages.create( model="你的ModelID", max_tokens=2048, system=system_prompt, messages=[{ "role": "user", "content": "分析当前目录下的代码,找出可能的空指针风险,给出文件路径和行号。" }] ) print(resp.content[0].text)成功的结果长什么样?应该能看到四段结构:结论摘要、证据(带文件路径:行号)、建议、不确定项。如果模型没按格式来,说明 SystemPrompt 里的格式约束不够强,或者被用户消息盖过了。这时候把格式段往前挪,或者加一句"必须严格按以下格式输出"。
我试过把同一段提示词分别喂给两个模型,一个严格按四段输出,另一个把"不确定项"省了。这说明格式遵循度和模型本身有关,提示词只能提高概率,不能保证 100%。所以验证时别只跑一次,跑三五次看稳定性。
还有一个验证点:让模型分析一个你已知答案的问题。比如你故意在测试文件里放一个未使用的变量,看它能不能定位到。如果它报了一堆不存在的问题,说明提示词里的"证据约束"没生效,回去加强"没有读取源码不要下结论"那条。
跑通之后,把这次成功的请求参数、SystemPrompt 版本、模型 ID 记下来。后面调提示词时,这是你的基线。
5. 本篇常见错误排查:401、local proxy failed 与格式跑偏
调试过程中会撞到几类典型错误,逐个说清楚怎么定位。
第一类,401 Unauthorized。报错信息通常是authentication_error或invalid api key。原因有三个:Key 复制时带了空格或换行;环境变量没生效(比如在错误的 shell 里 export);用了旧的 Key。排查顺序:先echo $TAOTOKEN_API_KEY看值对不对,再确认请求头字段名对不对——Anthropic 兼容接口用x-api-key,OpenAI 兼容接口用Authorization: Bearer,别搞混。如果都没问题,去控制台重新生成一个 Key 试。
第二类,local proxy failed 或连接被拒。这类报错通常出现在你本地配了某个转发工具、但那个工具没启动或端口不对的时候。排查思路:先确认你的请求是不是直连https://taotoken.net/api,如果代码里还残留着http://localhost:xxxx之类的地址,改掉。再检查系统代理设置,有时候环境变量里残留了HTTP_PROXY,会导致请求走错路。用env | grep -i proxy看一眼,有就清掉。
第三类,reading 'choices'或类似字段读取失败。这多半是响应格式和你的解析代码不匹配。比如你按 OpenAI 的choices[0].message.content解析,但实际返回的是 Anthropic 的content[0].text。解决方法是先打印原始响应,看清楚结构再写解析。别凭记忆写字段名。
第四类,OAuth 相关报错。如果你用的是 Claude Code 风格的 CLI,它可能默认走 OAuth 登录流程,而不是 API Key。这时候要显式设置环境变量让它走 Key 模式,通常是ANTHROPIC_API_KEY和ANTHROPIC_BASE_URL两个都设上。如果 CLI 有配置文件(比如~/.claude/settings.json或类似路径),检查里面有没有残留的 OAuth token 字段,有就删掉或改成 Key 模式。
第五类,格式跑偏。模型不按你定义的输出格式来。原因可能是:SystemPrompt 太长,格式段被淹没;用户消息里的指令和 SystemPrompt 冲突;模型本身遵循度差。对策:把格式段用更强的措辞("必须""严格按"),或者把格式要求同时写进用户消息里做双重约束。如果还不行,换遵循度更好的模型。
第六类,模型编造文件路径。它给了一个src/utils/helper.js:42,但你仓库里根本没这个文件。这是幻觉,说明"证据约束"没压住。加强 SystemPrompt 里的"只引用你实际读取过的文件",并且在工具层面限制它只能读存在的路径。另外,把温度调低也有帮助。
排查时养成一个习惯:先隔离变量。通道问题用 curl 测,提示词问题用固定输入测,模型问题换模型测。别一次改好几个地方,否则你不知道是哪个改动生效了。
6. 把 SystemPrompt 用起来:从模板到长期编码工作流
模板跑通、错误排查完,接下来是把它变成日常能用的东西。这里给几个实操建议。
第一,把 SystemPrompt 和模型选择解耦。同一段提示词,在不同模型上表现不同。做代码分析时,长上下文模型适合读大仓库,强推理模型适合定位复杂逻辑。你可以准备两三个模型 ID,用同一段提示词分别跑,看哪个组合最稳。TaoToken 的统一通道在这里省事——换模型只改一个字段,不用重配 Key 和地址。
第二,给 SystemPrompt 做版本管理。每次改动记一条 commit message,写清楚改了什么、为什么改、效果如何。比如"加强证据约束,减少编造路径"。积累十几版之后,你会有一份自己的提示词演进记录,比任何教程都实用。
第三,把常用任务拆成不同的 SystemPrompt 变体。代码审查一个版本,架构分析一个版本,Bug 定位一个版本。它们的角色定义和输出格式不同,但可以共享工具约束和安全边界。用 include 或者模板拼接的方式复用公共段,避免重复维护。
第四,长期跑编码类 Agent 的话,考虑用 Coding Plan 这类按量方案,比单次调用更划算,适合持续性的仓库分析任务。入口在 https://taotoken.net/coding-plan 。如果你的任务偏对话式验证,模型对话页 https://taotoken.net/chat 更方便快速试提示词。接入文档在 https://taotoken.net/doc ,配置细节以文档为准。
最后说一个我踩过的坑:一开始我把 SystemPrompt 写得很长,恨不得把所有规则都塞进去,结果模型反而抓不住重点。后来砍到五段、每段不超过五条,遵循度明显上升。提示词不是越长越好,是越清晰越好。把最关键的约束放在最前面,次要的往后放,格式要求用骨架而不是散文。这个原则,比任何具体模板都重要。