面经

真实问答记录

这是学习过程中真实产生的问答,保留原始问题形态和完整答案。与 Sessions 中经过"面试题化"处理的深题不同,这里记录的是原始知识点和直接答案,作为查漏补缺的基准。

Q1 · AI 的 message 接口或 response 接口有哪些参数?含义是什么?

提问背景:直接列举主流 LLM API 的请求参数和响应字段,作为理解 API 契约的基准。

Anthropic Messages API

Endpoint: POST /v1/messages

参数类型必填含义
modelstring模型名称,如 claude-opus-4-6claude-sonnet-4-6
messagesarray对话消息列表,每条含 role(user/assistant)和 content
max_tokensint模型输出的最大 token 数
systemstring系统提示词,用于设定模型行为(顶层参数,与 messages 平级)
temperaturefloat控制随机性,0.0~1.0,越高越随机
top_pfloatnucleus sampling,与 temperature 二选一使用
top_kint限制候选 token 数量(Anthropic 独有)
stop_sequencesarray遇到这些字符串时停止生成
streambool是否流式返回
toolsarray可用工具定义列表
tool_choiceobject工具调用策略(auto/any/tool)
metadataobject元数据,如 user_id

Response 返回字段(Anthropic)

字段含义
id请求唯一标识
type响应类型(message)
roleassistant
content输出内容数组(text/tool_use blocks)
model实际使用的模型
stop_reason停止原因(end_turn / max_tokens / tool_use / stop_sequence)
usagetoken 用量(input_tokens / output_tokens,含 cache 细分)

OpenAI Chat Completions API

Endpoint: POST /v1/chat/completions

参数类型必填含义
modelstring模型名称,如 gpt-4ogpt-4
messagesarray消息列表,含 role(system/user/assistant/tool)和 content;system 放在 messages[0]
max_tokensint最大输出 token 数
temperaturefloat随机性控制,0.0~2.0(范围比 Anthropic 宽)
top_pfloatnucleus sampling
nint生成多个候选结果
streambool流式返回
stopstring/array停止序列
presence_penaltyfloat鼓励新话题(-2.0~2.0,OpenAI 独有)
frequency_penaltyfloat降低重复(-2.0~2.0,OpenAI 独有)
toolsarray函数/工具定义
tool_choicestring/object工具选择策略
response_formatobject输出格式(json_object / text)
seedint可复现的种子

Response 返回字段(OpenAI)

字段含义
id请求标识
objectchat.completion
model实际模型
choices结果数组,每条含 message(role/content/tool_calls)、finish_reason
usagetoken 用量(prompt_tokens / completion_tokens / total_tokens)

两者核心差异

Q2 · 怎么权衡 cache 和长上下文?

提问背景:Prompt Caching 要求前缀稳定才能命中;长上下文意味着每次对话前缀都在变化,缓存命中率下降。核心矛盾是缓存效率与上下文丰富度之间的权衡。

核心矛盾

缓存效率 ←————————→ 上下文丰富度
(成本低、延迟低)      (信息全、理解准)

三种策略对比

1. 全量上下文(不缓存)

2. 激进缓存(固定前缀)

3. 分层策略(推荐)

┌─────────────────────────────────────┐
│  System Prompt(缓存,稳定前缀)      │  ← 高命中率
├─────────────────────────────────────┤
│  长期记忆摘要(缓存,低频更新)        │  ← 中命中率
├─────────────────────────────────────┤
│  近期对话(不缓存,每轮更新)          │  ← 低命中率但内容少
└─────────────────────────────────────┘

具体权衡指标

指标倾向缓存倾向长上下文
对话轮数< 10 轮> 20 轮
单轮 token< 1k> 5k
QPS 要求高并发低并发
成本敏感度
上下文依赖弱(独立问答)强(连续推理)

实用技巧

  1. 滑动窗口 + 摘要:保留最近 5-10 轮原文,更早的对话用 LLM 压缩成摘要放入缓存区
  2. 结构化缓存 key:将稳定部分(system prompt、用户画像)放最前,变化部分(对话历史)放最后,最大化缓存命中
  3. 按需召回:用向量检索从历史中召回相关片段,而非全量塞入上下文
  4. 成本监控:对比 cache read(便宜 10x)vs cache miss 的成本,动态调整缓存粒度

一句话总结

稳定的放缓存,变化的放上下文,用摘要做桥梁,用检索补细节。

Q3 · Skill 渐进式加载怎么实现?依赖哪些工具?

提问背景:理解 agent 系统中 skill 的按需加载机制,以及它依赖的工具链。

核心思路

全量加载:启动时把所有 skill 内容塞进 context → 浪费 token、启动慢
渐进加载:只加载索引,按需加载完整内容 → 节省 token、响应快

实现机制

第一层:元数据索引(启动时加载)

system-reminder 中只注入 skill 名称 + 一句话描述。例如:

- superpowers:brainstorming — You MUST use this before any creative work
- superpowers:test-driven-development — Use when implementing any feature
- lark-im — 飞书即时通讯:收发消息和管理群聊

这一层占用极小,只够模型判断"要不要用这个 skill"。每个 skill 约 50 tokens。

第二层:完整内容(按需加载)

当模型决定使用某个 skill 时,调用 Skill 工具:

Skill(skill: "superpowers:brainstorming")

工具返回该 skill 的完整 prompt 内容,注入当前对话上下文,模型按指令执行。

第三层:子依赖(链式加载)

某些 skill 内部会引用其他 skill 或资源,按需进一步加载,而非预先全部展开。

依赖的工具链

工具作用
Skill tool核心入口,触发 skill 加载,将内容注入对话
Read tool读取 skill 文件原始内容(~/.claude/skills/*.md
Glob tool发现 skill 文件路径,建立索引
system-reminder在每轮对话中注入 skill 列表摘要,维持索引可见性
Agent tool部分 skill 会 dispatch 子 agent 执行独立任务

设计要点

1. 索引与内容分离

索引(始终在 context 中):skill name + 1句描述 → ~50 tokens/skill
内容(按需加载):完整 prompt → 500~5000 tokens/skill

2. 触发判断由模型完成

3. 加载即执行

通用化设计(伪代码)

class SkillRegistry:
    def __init__(self):
        self.index = {}    # name -> description (always in context)
        self.content = {}  # name -> full prompt (lazy loaded)

    def get_index(self) -> str:
        # 返回所有 skill 的摘要,注入 system prompt
        return "\n".join(f"- {k}: {v}" for k, v in self.index.items())

    def load(self, skill_name: str) -> str:
        # 按需读取完整内容
        if skill_name not in self.content:
            self.content[skill_name] = read_file(f"skills/{skill_name}.md")
        return self.content[skill_name]

关键设计选择

一句话总结

索引常驻、内容懒加载、模型决策触发、工具链执行 —— 用最小的 context 成本覆盖最大的能力范围。

Q4 · 哪些工具适合 tools,哪些适合 skill/cli?如何权衡?

提问背景:AI Agent 系统中,能力应该实现为 Tool、Skill 还是 CLI,判断依据是什么。

三者本质区别

Tool:模型直接调用的原子能力,返回结构化结果
Skill:注入模型的流程/方法论,指导"怎么做"
CLI:终端原生命令,模型通过 Bash 间接调用

适合做成 Tool 的特征

特征说明
原子操作单一动作,输入输出明确
需要确定性不能靠 LLM 推断,必须精确执行
结构化数据返回 JSON/文件路径等可解析结果
高频使用每次对话可能调用多次
权限控制需要用户审批/沙箱隔离
副作用可控文件读写、网络请求等

典型例子:文件操作(Read/Write/Edit/Glob/Grep)、代码执行(Bash)、网络请求(WebFetch/WebSearch)、浏览器控制(Playwright)、子任务调度(Agent/TaskCreate)。

适合做成 Skill 的特征

特征说明
流程/方法论不是单一动作,而是一系列步骤
需要判断模型需要根据上下文决策如何执行
组合现有工具不引入新原子能力,而是编排已有工具
低频/条件触发特定场景才需要,不适合常驻
可解释性用户需要知道模型在遵循什么流程
可演进流程经常更新,不想改代码

典型例子:开发流程(TDD、brainstorming、code review)、工作流编排(会议纪要整理、日报生成)、最佳实践(debugging 方法论、git 提交规范)、领域知识(API 使用指南)。

适合做成 CLI 的特征

特征说明
已有成熟工具不需要重新造轮子
用户直接使用人也会用,不只是 AI
复杂配置需要大量参数和环境配置
跨平台不依赖特定 AI 运行时
调试友好可以独立测试和调试

典型例子:包管理(npm/yarn/pip)、版本控制(git/gh)、构建工具(webpack/vite/make)、部署工具(docker/kubectl/terraform)、云服务 CLI(aws/gcloud/az)。

决策矩阵

                    原子性高
                       │
                       ▼
              ┌────────┴────────┐
              │                 │
         高频使用           低频使用
              │                 │
              ▼                 ▼
           Tool             CLI
        (Read/Write)     (git/npm)

                    原子性低
                       │
                       ▼
              ┌────────┴────────┐
              │                 │
         流程固定           需要判断
              │                 │
              ▼                 ▼
           CLI             Skill
      (固定脚本)        (TDD/debug)

灰色地带的权衡

场景:代码审查

推荐:Skill + CLI 组合 —— skill 指导审查流程,CLI 做静态检查,模型做语义审查。

场景:数据库查询

推荐:Tool(封装连接和安全检查)+ Skill(注入查询规范)。

一句话总结

Tool 做原子能力,Skill 做流程方法,CLI 做现有工具 —— 复杂场景三者组合使用。

拓展问题

以下是基于上述 4 个原始问题可以进一步深挖的方向,部分已在 Session 10 和 Session 11 中展开为面试题。

围绕 Q1(API 参数)可拓展

围绕 Q2(Cache vs 上下文)可拓展

围绕 Q3(Skill 加载)可拓展

围绕 Q4(能力分层)可拓展

与 Sessions 的对应关系

原始问题对应 Session说明
Q1 · API 参数Session 10在 Session 10 中被面试题化为深题 01(system prompt 差异)和深题 02(stop_reason 语义),本页保留原始的完整参数对照表
Q2 · Cache vs 上下文Session 10在 Session 10 中被面试题化为深题 04(缓存机制)和深题 05(分层策略),本页保留原始的策略对比和权衡指标
Q3 · Skill 渐进式加载Session 11在 Session 11 中被面试题化为深题 02(渐进式加载机制),本页保留原始的三层架构和工具链依赖
Q4 · Tool/Skill/CLI 选型Session 11在 Session 11 中被面试题化为深题 01(选型决策框架),本页保留原始的特征清单和决策矩阵

建议学习路径:先读本页保留的原始答案建立知识基准,再进入对应 Session 做面试题化训练。