Agent 面试题

0 / 7
# AI Agent 面试题 - 前沿技术与协议篇

> 基于 AgentGuide 项目整理 | 适用:Agent 开发工程师 & 架构师

---

## 一、LLM 与 Agent 的本质区别

**Q1: LLM 和 Agent 有什么区别?为什么说 Agent = LLM + 工具 + 记忆 + 规划?**

- **难度**: ⭐⭐
- **岗位**: 通用
- **公司**: 所有公司(必考)

**核心区别**:

| 维度 | LLM | Agent |
|:---|:---|:---|
| **本质** | 条件概率模型 P(token_n \| token_1...token_{n-1}) | 自主决策执行系统 |
| **状态** | 无状态,每次调用独立 | 有状态,可维护记忆 |
| **能力** | 只会说,不会做 | 能说会做,调用工具执行 |
| **知识** | 知识截止,无法获取实时信息 | 可检索、可更新知识 |
| **规划** | 线性回答,不会自主拆解任务 | 可自主规划多步骤任务 |

**Agent 四模块详解**:

┌─────────────────────────────────────────┐
│ Agent 完整架构 │
├─────────────────────────────────────────┤
│ │
│ ┌─────────┐ ┌─────────┐ ┌─────────┐ │
│ │ LLM │ │ 规划 │ │ 记忆 │ │
│ │ (大脑) │ │ (思考) │ │ (存储) │ │
│ └────┬────┘ └────┬────┘ └────┬────┘ │
│ └─────────────┼─────────────┘ │
│ ▼ │
│ ┌─────────┐ │
│ │ 工具 │ │
│ │ (执行) │ │
│ └─────────┘ │
│ │
└─────────────────────────────────────────┘

**面试示例对比**:

任务:查明天北京天气,如果下雨就取消日历里的跑步计划

| 角色 | 实际行为 |
|:---|:---|
| **LLM** | "您可以打开天气 App 查询北京明天天气,如果降雨概率超过 60% 建议取消户外运动..." |
| **Agent** | 1. 调用天气 API → 明天北京中雨<br>2. 调用日历 API → 找到明天 7:00 跑步计划<br>3. 调用日历 API → 删除该计划<br>4. 回复:"明天北京有雨,已为您取消跑步计划。" |

**面试加分点**: LLM 告诉你怎么做,Agent 直接帮你做完,这就是本质区别。

---

**Q2: Agent 和 Workflow 有什么区别?如何判断一个任务该用 Agent 还是 Workflow?**

- **难度**: ⭐⭐⭐
- **岗位**: 开发岗重点
- **公司**: 字节、阿里、腾讯

**核心区别:控制权在谁手里?**

| 维度 | Workflow | Agent |
|:---|:---|:---|
| **控制者** | 代码/开发者 | LLM |
| **流程** | 预定义,写死在代码里 | 动态规划,LLM 自主决定 |
| **Token 消耗** | 低(约 1x) | 高(约 4-8x) |
| **可预测性** | 高 | 低 |
| **灵活性** | 低 | 高 |
| **调试难度** | 容易 | 困难 |
| **适合任务** | 固定流程(订单处理、报表生成) | 开放式目标(研究分析、复杂客服) |

**选型决策树**:

任务分析

├── 流程是否固定且明确?
│ ├── 是 → Workflow(稳定可控)
│ └── 否 → Agent(灵活适应)

└── 是否需要处理大量异常情况?
├── 是 → Agent 或 混合架构
└── 否 → Workflow

**生产实践:混合架构最常见**

智能客服系统示例:

用户问题

├── 简单问题(FAQ)→ Workflow 直接回答

├── 复杂问题 → Agent 自主分析决策

└── 投诉工单 → 直接升级人工

**面试加分点**: 大多数生产系统是 Workflow + Agent 的混合架构,Workflow 提供稳定骨架,Agent 处理异常和复杂情况。

---

## 二、Agent 工作模式详解

**Q3: Agent 有哪些主流工作模式?ReAct、Plan-and-Execute、Reflection、Multi-Agent 各自的特点是什么?**

- **难度**: ⭐⭐⭐
- **岗位**: 通用
- **公司**: 字节、阿里、腾讯(高频)

### 模式一:ReAct(推理 + 行动)

**核心循环**: Thought → Action → Observation → ... → Answer

```python
# ReAct 伪代码示例
class ReActAgent:
    def run(self, task, max_steps=15):
        steps = 0
        seen_actions = []

        while steps < max_steps:
            thought, action = self.llm_think(task, history)

            # 防死循环检测
            if action in seen_actions[-3:]:
                return self.llm_summarize("工具持续失败,基于已有信息给出答案")

            seen_actions.append(action)
            observation = self.execute(action)
            steps += 1

        return "达到最大步数限制"

优点: 透明可审计、灵活适应、通用性强
缺点: Token 消耗大、可能死循环、延迟高

防死循环三要素:

  1. 最大步数限制(通常 15 步)
  2. 重复动作检测(连续 3 次相同动作退出)
  3. 超时控制(设置最大执行时间)

模式二:Plan-and-Execute(先规划再执行)

两阶段工作:

  1. Planner LLM: 一次性生成完整计划
  2. Executor: 按计划逐步执行
用户请求: "做一份竞品分析"
Planner 生成计划:
├── 1. 搜集竞品列表
├── 2. 逐个分析功能
├── 3. 对比价格策略
├── 4. 分析用户评价
└── 5. 生成对比报告
Executor 逐步执行(每步无需重新思考全局)

Token 消耗对比: ReAct 每步思考全局(100%)vs Plan-and-Execute 规划一次(约 20%)

模式三:Reflection(自我反思)

核心思想: 一个 Agent 生成,另一个 Agent 审查,循环迭代

Writer Agent → 生成内容
Reviewer Agent → 发现问题(安全漏洞、性能问题)
Writer Agent → 修改
Reviewer Agent → 确认通过
最终输出

适用场景: 代码生成、法律文书、学术论文、创意写作

面试加分点: Reflection 可用于自我校正幻觉,当 Agent 发现事实存疑时,触发"验证反思"调用搜索工具核实。

模式四:Multi-Agent(多智能体协作)

┌─────────────────────────────────────────┐
│         Multi-Agent 架构                 │
├─────────────────────────────────────────┤
│                                         │
│           ┌─────────────┐               │
│           │ Orchestrator │              │
│           │  (协调 Agent)│              │
│           └──────┬──────┘               │
│                  │                      │
│    ┌─────────────┼─────────────┐        │
│    ▼             ▼             ▼        │
│ ┌──────┐    ┌──────┐    ┌──────┐       │
│ │Research│   │Coder │   │Reviewer│      │
│ │ Agent │    │Agent │   │ Agent │       │
│ └──────┘    └──────┘    └──────┘       │
│                                         │
└─────────────────────────────────────────┘

主流框架对比:

框架 特点 适用场景
LangGraph 图结构编排,状态机模型 需要精细控制的复杂工作流
CrewAI 角色化 Agent,任务分工 团队协作场景,上手简单
OpenAI SDK Handoff 机制,工具调用原生支持 官方推荐,生态完善
AutoGen 微软出品,对话式多 Agent 研究型项目友好

面试加分点: Anthropic 提醒——不要过早引入 Multi-Agent,一个强大的单 Agent 往往比多个简单 Agent 更稳定、更省钱。


三、Function Call 底层实现

Q4: Function Call 是什么?底层怎么实现?LLM 真的在执行函数吗?

  • 难度: ⭐⭐⭐
  • 岗位: 开发岗重点
  • 公司: 所有公司(高频)

关键认知: LLM 不执行函数!

Function Call 是让 LLM 输出结构化的工具调用指令,再由应用程序实际执行。

Function Call 四步流程

Step 1: 定义工具

{
  "tools": [{
    "type": "function",
    "function": {
      "name": "get_weather",
      "description": "获取指定城市的实时天气信息",
      "parameters": {
        "type": "object",
        "properties": {
          "city": {
            "type": "string",
            "description": "城市名称,如:北京、上海"
          },
          "date": {
            "type": "string",
            "description": "日期,格式 YYYY-MM-DD"
          }
        },
        "required": ["city"]
      }
    }
  }]
}

Step 2: LLM 生成调用指令

{
  "tool_calls": [{
    "id": "call_abc123",
    "type": "function",
    "function": {
      "name": "get_weather",
      "arguments": "{\"city\": \"北京\", \"date\": \"2025-04-11\"}"
    }
  }]
}

Step 3: 应用程序解析执行

def handle_tool_calls(tool_calls):
    results = []
    for call in tool_calls:
        func_name = call.function.name
        args = json.loads(call.function.arguments)

        if func_name == "get_weather":
            result = weather_api.get(args["city"], args.get("date"))
        elif func_name == "search_calendar":
            result = calendar_api.search(args["query"])

        results.append({
            "tool_call_id": call.id,
            "role": "tool",
            "content": json.dumps(result)
        })
    return results

Step 4: 结果传回 LLM 生成最终回答

messages.append({"role": "assistant", "tool_calls": tool_calls})
messages.extend(tool_results)
final_response = client.chat.completions.create(
    model="gpt-4o",
    messages=messages
)

Parallel Function Call(并行调用)

{
  "tool_calls": [
    {"id": "call_1", "function": {"name": "get_weather", "arguments": "{\"city\":\"北京\"}"}},
    {"id": "call_2", "function": {"name": "search_calendar", "arguments": "{\"date\":\"明天\"}"}},
    {"id": "call_3", "function": {"name": "get_traffic", "arguments": "{\"route\":\"上班路线\"}"}}
  ]
}

性能对比:

  • 串行执行: T = T1 + T2 + T3
  • 并行执行: T = max(T1, T2, T3)

各厂商格式对比

特性 OpenAI Anthropic Claude
工具定义 tools + function tools + input_schema
调用输出 tool_calls 数组 tool_use content block
结果传回 role: "tool" role: "user" + tool_result block

面试核心点: LLM 只输出"我想调用什么"的指令,真正执行的是你的应用程序。这个设计保证了安全性——LLM 无法绕过代码直接操作系统。


四、MCP 协议详解

Q5: MCP 是什么协议?它解决了什么问题?和 Function Call 有什么本质区别?

  • 难度: ⭐⭐⭐⭐
  • 岗位: 开发岗重点
  • 公司: 字节、阿里、腾讯(新兴热点)

MCP 解决的根本问题: N × M 爆炸

没有 MCP 之前:

  • 3 个应用 × 3 个工具 = 9 套集成代码
  • 10 个应用 × 20 个工具 = 200 套代码

有了 MCP 之后:

  • 每个应用只需接入 MCP 协议
  • 每个工具只需实现一个 MCP Server
  • 总共 N + M 套代码

MCP 架构三角色

┌─────────────────────────────────────────┐
│           MCP 架构                       │
├─────────────────────────────────────────┤
│                                         │
│  ┌─────────┐      ┌─────────┐          │
│  │MCP Host │◄────►│MCP Client│          │
│  │(AI应用) │      │(翻译官) │          │
│  └────┬────┘      └────┬────┘          │
│       │                │               │
│       └────────────────┘               │
│                        │               │
│                        ▼               │
│              ┌─────────────────┐       │
│              │   MCP Server    │       │
│              │ (工具能力提供)  │       │
│              └─────────────────┘       │
│                                         │
└─────────────────────────────────────────┘
角色 说明 示例
MCP Host 使用的 AI 应用 Claude Desktop、Cursor、你的 Agent
MCP Client 负责和 Server 通信的"翻译官" 内置于 Host
MCP Server 暴露具体工具能力的服务端 GitHub MCP Server、Slack MCP Server

MCP 提供的三类能力

类型 说明 示例
Tools 可执行的操作 发消息、查数据、写文件
Resources 可读的数据源 文档、代码库、数据库
Prompts 预设提示词模板 代码审查模板、SQL 生成模板

MCP 工具发现机制

Agent 启动
扫描 MCP Server 列表
发送 tools/list 请求到每个 Server
接收工具列表和描述
注入 LLM 上下文
运行时动态发现新能力

核心优势: Agent 可以在运行时动态发现新能力,不需要重新部署代码。

MCP 安全性设计

层级 机制 说明
第一层 能力声明 Server 明确声明提供哪些工具
第二层 授权控制 敏感操作要求人工确认
第三层 审计追踪 所有工具调用都有日志

MCP 底层协议

通信方式 协议 适用场景
本地通信 stdio(标准输入输出) 本地工具
远程通信 HTTP + SSE 远程服务、流式支持
消息格式 JSON-RPC 2.0 标准规范

面试加分点: MCP 让工具集成从 N×M 变成 N+M,且支持运行时动态发现,是 Agent 工具生态的重要基础设施。


五、Skills 与 Prompt 的区别

Q6: Skills 是什么?和 System Prompt 有什么区别?如何设计一个 Skill?

  • 难度: ⭐⭐⭐
  • 岗位: 开发岗重点
  • 公司: 字节、阿里

Skills 解决的问题

给 Agent 一堆工具还不够,它还需要知道:

  • 遇到代码审查,该用什么标准?
  • 写 SQL 查询时,DBA 的最佳实践是什么?
  • 回复客户时,品牌的语气要求是什么?

这些领域专家经验,就是 Skills 要编码的东西。

Skills vs System Prompt

维度 System Prompt Skills
作用范围 全局,一直生效 按需激活,场景触发
内容 通用行为规范 特定领域专业指导
激活方式 每次都加载 匹配场景才加载
可维护性 随功能增多变复杂 模块化,各自独立
典型内容 "你是一个助手..." 代码审查流程/标准

Skill 设计示例

# code_review_skill.yaml
name: "Code Review Expert"
description: "专业的代码审查技能,用于发现代码中的安全漏洞和性能问题"
triggers:
  - keywords: ["review", "代码审查", "code review"]
  - file_patterns: ["*.py", "*.js", "*.go"]

instructions: |
  你是一位资深代码审查专家,请按照以下标准审查代码:

  ## 审查维度
  1. **安全性**: 检查 SQL 注入、XSS、敏感信息泄露
  2. **性能**: 检查 N+1 查询、内存泄漏、算法复杂度
  3. **可维护性**: 检查代码重复、命名规范、注释完整性
  4. **最佳实践**: 检查是否符合语言/框架的惯用写法

  ## 输出格式
  - 🔴 严重问题(必须修复)
  - 🟡 建议优化(推荐修复)
  - 🟢 良好实践(值得保持)  

tools:
  - security_scanner
  - performance_profiler

Skill 生命周期

用户输入
Skill Router 匹配触发条件
加载对应 Skill 的 instructions
注入 LLM 上下文 + 关联 Tools
执行并输出

面试加分点: Skills 是 Prompt 工程的高级形态,将领域知识模块化、可复用,支持按需加载,解决了 System Prompt 臃肿难维护的问题。


六、Function Call、MCP、Skills 三者关系

Q7: Function Call、MCP、Skills 三者的区别与协作关系是什么?

  • 难度: ⭐⭐⭐⭐
  • 岗位: 架构岗重点
  • 公司: 字节、阿里、腾讯

三者定位对比

概念 层级 解决的问题 类比
Function Call 底层机制 LLM 如何表达"我要调用工具" 函数调用语法
MCP 协议标准 工具如何被统一发现和调用 USB 接口标准
Skills 应用层 Agent 如何获得领域专家能力 职业技能证书

协作关系图

┌─────────────────────────────────────────┐
│           应用层                         │
│  ┌─────────────────────────────────┐   │
│  │           Skills                │   │
│  │  (领域知识 + 触发条件 + 工具集)  │   │
│  └─────────────────────────────────┘   │
├─────────────────────────────────────────┤
│           协议层                         │
│  ┌─────────────────────────────────┐   │
│  │            MCP                  │   │
│  │  (工具发现 + 统一调用 + 安全)    │   │
│  └─────────────────────────────────┘   │
├─────────────────────────────────────────┤
│           机制层                         │
│  ┌─────────────────────────────────┐   │
│  │       Function Call             │   │
│  │  (结构化输出 + 参数传递)         │   │
│  └─────────────────────────────────┘   │
├─────────────────────────────────────────┤
│           模型层                         │
│  ┌─────────────────────────────────┐   │
│  │            LLM                  │   │
│  └─────────────────────────────────┘   │
└─────────────────────────────────────────┘

实际协作流程

用户: "帮我审查这段代码"
Skill Router 匹配到 "Code Review Skill"
加载 Skill 的 instructions 和关联 Tools
通过 MCP Client 发现可用的代码分析工具
LLM 生成 Function Call 调用代码扫描工具
MCP Server 执行扫描,返回结果
LLM 根据 Skill 的审查标准生成报告

面试加分点: 三者是层层递进的关系——Function Call 是基础能力,MCP 是标准化协议,Skills 是领域封装。实际项目中往往是三者结合使用。


七、A2A 协议与 MCP 的关系

Q8: A2A 协议是什么?和 MCP 有什么关系和区别?

  • 难度: ⭐⭐⭐⭐
  • 岗位: 架构岗重点
  • 公司: Google、字节、阿里(前沿技术)

A2A 协议简介

A2A = Agent-to-Agent Protocol(Agent 间通信协议)

由 Google 于 2025 年推出,旨在解决不同厂商、不同框架的 Agent 之间如何协作的问题。

MCP vs A2A

维度 MCP A2A
全称 Model Context Protocol Agent-to-Agent Protocol
定位 工具调用协议 Agent 间通信协议
解决的问题 Agent 如何调用外部工具 Agent 之间如何协作
通信对象 Agent ↔ Tool Agent ↔ Agent
发起方 Agent 主动调用 双向协商
典型场景 查天气、调 API、读文件 多 Agent 协作完成任务

类比理解

类比 MCP A2A
操作系统 系统调用 API 进程间通信 IPC
网络 HTTP 客户端调用服务 P2P 节点通信
团队 员工使用工具 员工之间协作

两者关系

┌─────────────────────────────────────────┐
│         Agent 生态协议栈                 │
├─────────────────────────────────────────┤
│                                         │
│  ┌─────────────────────────────────┐   │
│  │            A2A                  │   │
│  │    (Agent 间协作协议)            │   │
│  │                                 │   │
│  │  Agent A ◄────────────► Agent B │   │
│  │     │                      │    │   │
│  │     ▼                      ▼    │   │
│  │  ┌──────┐              ┌──────┐ │   │
│  │  │ MCP  │              │ MCP  │ │   │
│  │  │Client│              │Client│ │   │
│  │  └──┬───┘              └──┬───┘ │   │
│  └─────┼─────────────────────┼─────┘   │
│        │                     │          │
│        └──────────┬──────────┘          │
│                   ▼                     │
│           ┌─────────────┐               │
│           │  MCP Server │               │
│           │  (工具生态)  │               │
│           └─────────────┘               │
│                                         │
└─────────────────────────────────────────┘

协作示例

用户: "帮我规划一次日本旅行"
Travel Agent (A2A 协调者)
    ├──► Flight Agent (A2A)
    │      └── 调用 MCP 工具查询航班
    ├──► Hotel Agent (A2A)
    │      └── 调用 MCP 工具查询酒店
    └──► Guide Agent (A2A)
           └── 调用 MCP 工具查询景点
汇总结果返回用户

面试加分点: MCP 解决"Agent 如何调用工具",A2A 解决"Agent 如何与其他 Agent 协作"。两者是互补关系,共同构成 Agent 生态的基础设施。


八、Agent 记忆系统设计

Q9: Agent 的记忆系统怎么设计?短期记忆和长期记忆如何实现?

  • 难度: ⭐⭐⭐⭐
  • 岗位: 开发岗重点
  • 公司: 字节、阿里、腾讯(高频)

记忆分层架构

┌─────────────────────────────────────────┐
│           Agent 记忆系统                 │
├─────────────────────────────────────────┤
│                                         │
│  ┌─────────────────────────────────┐   │
│  │        短期记忆 (Working Memory) │   │
│  │  - 当前对话最近 N 轮             │   │
│  │  - 直接放在 LLM Context Window   │   │
│  │  - 容量有限,受模型上下文限制     │   │
│  └─────────────────────────────────┘   │
│                                         │
│  ┌─────────────────────────────────┐   │
│  │        中期记忆 (Session Memory) │   │
│  │  - 当前会话的完整历史            │   │
│  │  - 存储在内存/Redis              │   │
│  │  - 会话结束可压缩为摘要          │   │
│  └─────────────────────────────────┘   │
│                                         │
│  ┌─────────────────────────────────┐   │
│  │        长期记忆 (Long-term)      │   │
│  │  - 向量数据库 (语义检索)         │   │
│  │  - 知识图谱 (关系推理)           │   │
│  │  - 用户画像 (偏好学习)           │   │
│  └─────────────────────────────────┘   │
│                                         │
└─────────────────────────────────────────┘

短期记忆实现

class ShortTermMemory:
    def __init__(self, max_turns=10):
        self.messages = []
        self.max_turns = max_turns

    def add(self, role, content):
        self.messages.append({"role": role, "content": content})
        # 保持最近 N 轮
        if len(self.messages) > self.max_turns * 2:
            self.messages = self.messages[-self.max_turns * 2:]

    def get_context(self):
        return self.messages

长期记忆实现

class LongTermMemory:
    def __init__(self, vector_db):
        self.vector_db = vector_db

    def store(self, conversation_id, content, metadata=None):
        """存储对话到向量数据库"""
        embedding = get_embedding(content)
        self.vector_db.add(
            ids=[f"{conversation_id}_{timestamp}"],
            embeddings=[embedding],
            documents=[content],
            metadatas=[metadata or {}]
        )

    def retrieve(self, query, conversation_id, top_k=5):
        """检索相关历史记忆"""
        query_embedding = get_embedding(query)
        results = self.vector_db.query(
            query_embeddings=[query_embedding],
            n_results=top_k,
            where={"conversation_id": conversation_id}
        )
        return results

记忆压缩策略

class MemoryCompressor:
    def compress(self, messages):
        """将长对话压缩为摘要"""
        if len(messages) < 10:
            return messages

        # 早期消息摘要
        early_messages = messages[:-10]
        summary = self.llm_summarize(early_messages)

        # 保留近期完整消息
        recent_messages = messages[-10:]

        return [
            {"role": "system", "content": f"历史对话摘要: {summary}"}
        ] + recent_messages

记忆检索策略

策略 实现方式 适用场景
最近优先 按时间倒序 上下文连贯性要求高
语义检索 向量相似度 需要相关信息但不一定最近
混合策略 时间衰减 + 语义相似度 平衡时效性和相关性

面试加分点: 记忆设计的核心是分层——短期记忆保证上下文连贯,长期记忆支持知识积累,中间层做缓冲和压缩。


九、Agent 安全与可靠性

Q10: Agent 的安全与可靠性如何保障?如何防止 Prompt Injection 和工具滥用?

  • 难度: ⭐⭐⭐⭐
  • 岗位: 开发岗重点
  • 公司: 字节、阿里、腾讯(高频)

安全防护体系

┌─────────────────────────────────────────┐
│         Agent 安全防护体系               │
├─────────────────────────────────────────┤
│                                         │
│  ┌─────────────────────────────────┐   │
│  │        输入层防护                │   │
│  │  - Prompt Injection 检测         │   │
│  │  - 敏感词过滤                    │   │
│  │  - 输入长度限制                  │   │
│  └─────────────────────────────────┘   │
│                   │                     │
│                   ▼                     │
│  ┌─────────────────────────────────┐   │
│  │        执行层防护                │   │
│  │  - 工具权限控制                  │   │
│  │  - 参数校验                      │   │
│  │  - 沙箱执行                      │   │
│  └─────────────────────────────────┘   │
│                   │                     │
│                   ▼                     │
│  ┌─────────────────────────────────┐   │
│  │        输出层防护                │   │
│  │  - 内容审核                      │   │
│  │  - 敏感信息脱敏                  │   │
│  │  - 输出格式化校验                │   │
│  └─────────────────────────────────┘   │
│                                         │
└─────────────────────────────────────────┘

Prompt Injection 防护

class InputValidator:
    DANGEROUS_PATTERNS = [
        "ignore previous instructions",
        "ignore all previous instructions",
        "system prompt",
        "DAN mode",
        "jailbreak",
        "you are now",
        "new role:",
        "developer mode",
    ]

    def validate(self, user_input):
        # 1. 模式匹配检测
        lower_input = user_input.lower()
        for pattern in self.DANGEROUS_PATTERNS:
            if pattern in lower_input:
                return False, f"检测到潜在注入攻击: {pattern}"

        # 2. 语义分析检测
        if self.is_sematically_suspicious(user_input):
            return False, "语义分析检测到异常"

        # 3. 长度限制
        if len(user_input) > 10000:
            return False, "输入过长"

        return True, "OK"

工具调用安全

class ToolSecurityManager:
    def __init__(self):
        self.tool_permissions = {
            "read_file": {"allowed": True, "sensitive_paths": ["/etc", "/root"]},
            "write_file": {"allowed": False, "requires_approval": True},
            "execute_code": {"allowed": False, "sandbox_only": True},
            "send_email": {"allowed": True, "max_recipients": 10},
        }

    def validate_tool_call(self, tool_name, arguments):
        config = self.tool_permissions.get(tool_name)
        if not config:
            return False, "未知工具"

        if not config.get("allowed", False):
            if config.get("requires_approval"):
                return "pending", "需要人工确认"
            return False, "工具被禁用"

        # 参数校验
        if tool_name == "read_file":
            path = arguments.get("path", "")
            for sensitive in config["sensitive_paths"]:
                if path.startswith(sensitive):
                    return False, f"禁止访问敏感路径: {path}"

        return True, "OK"

可靠性保障机制

机制 实现方式 作用
超时控制 设置函数调用最大执行时间 防止无限等待
重试策略 指数退避重试 应对临时故障
熔断机制 连续失败 N 次后暂停服务 防止雪崩效应
降级策略 LLM 调用失败时返回预设回答 保证可用性
限流控制 Token/请求数限制 防止资源耗尽
from tenacity import retry, stop_after_attempt, wait_exponential

class ReliableLLMClient:
    @retry(
        stop=stop_after_attempt(3),
        wait=wait_exponential(multiplier=1, min=2, max=10),
        retry=retry_if_exception_type((TimeoutError, RateLimitError))
    )
    def call_llm(self, prompt):
        return self.llm.invoke(prompt)

    def call_with_fallback(self, prompt):
        try:
            return self.call_llm(prompt)
        except Exception as e:
            logger.error(f"LLM call failed: {e}")
            return self.get_fallback_response()

面试加分点: Agent 安全是系统工程,需要从输入、执行、输出三层防护,同时配合可靠性机制保证服务稳定。


十、RAG 与 Agent 的关系

Q11: RAG 和 Agent 是什么关系?RAG 可以作为 Agent 的组成部分吗?

  • 难度: ⭐⭐⭐
  • 岗位: 通用
  • 公司: 字节、阿里、腾讯

关系定位

┌─────────────────────────────────────────┐
│           RAG 与 Agent 关系              │
├─────────────────────────────────────────┤
│                                         │
│  ┌─────────────────────────────────┐   │
│  │            Agent                │   │
│  │  ┌─────┐ ┌─────┐ ┌─────┐       │   │
│  │  │规划 │ │记忆 │ │工具 │       │   │
│  │  └─────┘ └─────┘ └─────┘       │   │
│  │       │       │       │        │   │
│  │       ▼       ▼       ▼        │   │
│  │  ┌─────────────────────────┐   │   │
│  │  │  RAG (作为工具/记忆组件) │   │   │
│  │  │  - 知识检索工具           │   │   │
│  │  │  - 长期记忆存储           │   │   │
│  │  └─────────────────────────┘   │   │
│  └─────────────────────────────────┘   │
│                                         │
└─────────────────────────────────────────┘

RAG 在 Agent 中的三种角色

角色 说明 示例
知识工具 Agent 的一个 Tool,用于检索知识 search_knowledge(query)
记忆组件 Agent 长期记忆的实现方式 向量数据库存储历史对话
上下文增强 自动检索相关背景信息 用户提问前自动检索相关资料

RAG as a Tool

# RAG 作为 Agent 的工具
tools = [
    Tool(
        name="search_knowledge",
        func=rag_query,
        description="从知识库中检索相关信息,输入应该是具体的查询问题"
    ),
    Tool(
        name="calculate",
        func=calculator,
        description="执行数学计算"
    ),
    Tool(
        name="send_email",
        func=send_email,
        description="发送邮件"
    )
]

# Agent 可以自主决定何时使用 RAG
# Thought: 用户问的是公司产品信息,我应该调用 search_knowledge
# Action: search_knowledge(query="产品A的功能介绍")

对比总结

维度 RAG Agent
核心能力 知识检索与增强 自主决策与执行
交互方式 单次检索-生成 多轮思考-行动-观察
工具使用 固定检索工具 动态选择多种工具
规划能力
记忆能力 知识库 短期+长期记忆

面试加分点: RAG 是 Agent 的重要组件,但 Agent 的能力远超 RAG。RAG 解决"知道什么",Agent 解决"能做什么"。


十一、大厂面试追问汇总

Q12: 大厂 Agent 面试有哪些高频追问?如何准备?

  • 难度: ⭐⭐⭐⭐
  • 岗位: 通用
  • 公司: 字节、阿里、腾讯、美团、京东

高频追问 TOP 10

追问 考察点 回答要点
Function Call 底层怎么实现的? 理解深度 LLM 输出结构化指令,应用层解析执行
MCP 和 Function Call 什么关系? 技术视野 MCP 基于 Function Call,解决 N×M 问题
Agent 死循环怎么解决? 工程经验 最大步数、重复检测、超时控制
Tool 调用失败怎么处理? 容错设计 重试、降级、人工介入
上下文太长怎么办? 优化能力 摘要、压缩、选择性注入
怎么评估 Agent 效果? 方法论 任务成功率、步骤正确率、人工评估
Multi-Agent 怎么选型? 架构能力 LangGraph/CrewAI/AutoGen 对比
Prompt Injection 怎么防? 安全意识 输入过滤、语义检测、权限控制
Token 成本怎么优化? 成本意识 模型选择、缓存、Prompt 压缩
RAG 和 Agent 什么关系? 概念理解 RAG 是 Agent 的组件之一

面试准备建议

1. 项目介绍 STAR 法则

S - Situation (背景)
    "我在上一家公司负责智能客服系统的 Agent 模块"

T - Task (任务)
    "需要构建一个能理解用户问题、调用工具查询订单的 Agent"

A - Action (行动)
    "采用 ReAct 框架,设计了分层 Memory 系统,集成了 5 个工具,
     使用 MCP 协议接入外部服务"

R - Result (结果)
    "系统上线后,客服问题解决率提升 40%,人工介入减少 60%,
     平均响应时间从 5s 降到 2s"

2. 技术深度展示

不要只说 要说
"用了 RAG" "用了 Hybrid Search + Rerank,Recall@5 达到 85%"
"有 Memory" "设计了分层 Memory:短期对话 + 中期摘要 + 长期向量库"
"用了 Agent" "采用 ReAct 框架,支持 Plan-and-Execute 模式切换"
"调了 API" "基于 MCP 协议统一接入,支持动态工具发现"

3. 面试加分金句

  • "LLM 告诉你怎么做,Agent 直接帮你做完"
  • "MCP 让工具集成从 N×M 变成 N+M"
  • "大多数生产系统是 Workflow + Agent 的混合架构"
  • "不要过早引入 Multi-Agent,一个强大的单 Agent 往往更稳定"

附录:面试题汇总表

题号 题目 难度 岗位 公司
26 LLM 与 Agent 的本质区别 ⭐⭐ 通用 所有公司
27 Agent 与 Workflow 的区别与选型 ⭐⭐⭐ 开发 字节、阿里、腾讯
28 Agent 四种工作模式详解 ⭐⭐⭐ 通用 字节、阿里、腾讯
29 Function Call 底层实现 ⭐⭐⭐ 开发 所有公司
30 MCP 协议原理与应用 ⭐⭐⭐⭐ 开发 字节、阿里、腾讯
31 Skills 与 Prompt 的区别 ⭐⭐⭐ 开发 字节、阿里
32 Function Call / MCP / Skills 三者关系 ⭐⭐⭐⭐ 架构 字节、阿里、腾讯
33 A2A 协议与 MCP 的关系 ⭐⭐⭐⭐ 架构 Google、字节、阿里
34 Agent 记忆系统设计 ⭐⭐⭐⭐ 开发 字节、阿里、腾讯
35 Agent 安全与可靠性保障 ⭐⭐⭐⭐ 开发 字节、阿里、腾讯
36 RAG 与 Agent 的关系 ⭐⭐⭐ 通用 字节、阿里、腾讯
37 大厂面试追问汇总 ⭐⭐⭐⭐ 通用 所有公司

总计: 37 道核心面试题(新增 12 道)

祝面试顺利!


阅读全文