第23章 · AI Agent 与工具使用 · 阶段测试题¶
题型: 单选 × 8 / 多选 × 4 / 简答 × 5 / 编程 × 2 = 共 19 题 建议用时: 60 分钟
一 · 单选题 (8 题)¶
1.1 ReAct 的核心思想? - A. Reason + Act 交替 - B. Plan + Execute - C. Tree Search - D. Reflection
1.2 Tree of Thoughts (ToT) 用什么数据结构组织推理? - A. 链表 - B. 树 - C. 图 - D. 栈
1.3 MCP 协议是由谁发布的? - A. OpenAI - B. Google - C. Anthropic - D. Meta
1.4 MCP 三大组件? - A. Tool / Function / Plugin - B. Resources / Tools / Prompts - C. Server / Client / API - D. Read / Write / Delete
1.5 A2A 协议发布方? - A. Anthropic - B. Google - C. IBM - D. Microsoft
1.6 MemGPT 借鉴了哪个计算机概念? - A. 进程调度 - B. 虚拟内存 (主存 + 虚存) - C. 文件系统 - D. 中断
1.7 Reflexion 的核心机制? - A. 增加参数 - B. 生成反思文本存长期记忆 - C. 多模型投票 - D. 数据增强
1.8 Voyager 在什么环境中实验? - A. Web 自动化 - B. Minecraft - C. 棋盘游戏 - D. 自动驾驶
二 · 多选题 (4 题)¶
2.1 Agent 5 大记忆类型? (多选) - A. 短期 (Working) - B. 长期 (Long-term) - C. 情节 (Episodic) - D. 语义 (Semantic) - E. 程序 (Procedural)
2.2 MCP 与 OpenAI Function Calling 区别? (多选) - A. MCP 是跨厂商标准 - B. Function Calling 是 OpenAI 专有 - C. MCP 不支持 JSON - D. Function Calling 不支持工具
2.3 自进化范式包括? (多选) - A. Reflexion - B. Voyager - C. Self-RAG - D. Constitutional AI - E. AlphaEvolve
2.4 Computer Use / Operator 评测基准包括? (多选) - A. OSWorld - B. WebArena - C. WebVoyager - D. AitW
三 · 简答题 (5 题)¶
3.1 解释 ReAct / Reflexion / Voyager 三个范式的核心区别, 各举一个适用场景。
3.2 解释 MCP 协议的设计动机和核心组件, 与传统 Function Calling 相比的优势。
3.3 解释 MemGPT 的"虚拟内存"设计思想, 如何让 LLM 突破 Context Window 限制。
3.4 解释 Anthropic Computer Use 与 OpenAI Operator v2 的设计差异 (协议、模型、安全)。
3.5 设计一个企业知识库 RAG Agent 系统, 包含: 工具 (MCP Server) + 记忆 (Mem0) + 反思 (Self-RAG) + 评估 (RAGAS)。
四 · 编程题 (2 题)¶
4.1 实现 ReAct Agent 循环
class ReActAgent:
def __init__(self, llm, tools):
self.llm = llm
self.tools = tools # {"search": search_func, ...}
def run(self, task, max_steps=10):
"""ReAct 循环: Reason → Act → Observe → Reason"""
pass
4.2 实现简单 MCP Server (暴露 2 个工具)
from mcp.server import Server
from mcp.types import Tool
# 实现: server 暴露 search_db 和 send_email 两个工具
五 · 参考答案¶
单选¶
1.1 A 1.2 B 1.3 C 1.4 B 1.5 B 1.6 B 1.7 B 1.8 B
多选¶
2.1 ABCDE 2.2 AB 2.3 ABCDE 2.4 ABCD
简答¶
3.1 - ReAct = Reason + Act 交替, 适合单步工具调用 (查资料 / 调 API) - Reflexion = 失败反思 + 长期记忆, 适合多轮调试 (编程 / 调试) - Voyager = 技能库 + 自动课程, 适合长期开放任务 (游戏 / 探索)
3.2 MCP 设计动机: LLM 应用中"工具对接"重复劳动 (每个 LLM 厂商一套 API), 需要跨厂商标准。组件: Resources (数据) + Tools (函数) + Prompts (模板)。优势: ① 一次开发跨 Claude/Gemini/本地模型; ② 工具市场 (1000+ MCP Server); ③ 标准化错误处理。
3.3 MemGPT 把 LLM 上下文比作"主存", 把外部存储比作"虚存"。通过系统指令让 LLM 主动管理: ① Recall (把虚存中相关数据调入主存); ② Archival (把主存数据持久化到虚存)。突破 Context Window 限制, 实现"无限长期记忆"。
3.4 - Anthropic Computer Use: 桌面优先 (macOS/Linux), 截图 → 鼠标键盘, Claude 模型, 沙盒 - OpenAI Operator v2: 全 OS (桌面+浏览器+移动), GPT-5.6, 1M context, 沙盒 + 权限 共同: 都用视觉 + 工具调用, 都强调安全
3.5 架构: - Loader: PDF / Word / Confluence - Splitter: 512 token, 重叠 50 - Embedder: BGE-large-zh - Retriever: BM25 + 向量混合 (Hybrid) - Generator: Claude 4.5 + System Prompt (引用源) - 记忆: Mem0 存用户偏好 - 反思: Self-RAG 判断是否需要重检索 - 评估: RAGAS (Faithfulness / Answer Relevance / Context Relevance)
编程¶
4.1 参考答案:
class ReActAgent:
def __init__(self, llm, tools):
self.llm = llm
self.tools = tools
self.history = []
def run(self, task, max_steps=10):
self.history = [{"role": "user", "content": task}]
for step in range(max_steps):
# Reason
prompt = f"Task: {task}\nHistory: {self.history}\nNext action (JSON):"
response = self.llm(prompt)
action = parse_action(response) # {"tool": "search", "args": {...}}
# Act
if action["tool"] == "finish":
return action["args"]["answer"]
result = self.tools[action["tool"]](**action["args"])
# Observe
self.history.append({"action": action, "result": result})
return "Max steps exceeded"
4.2 参考答案:
from mcp.server import Server
from mcp.types import Tool, TextContent
server = Server("company-tools")
@server.list_tools()
async def list_tools():
return [
Tool(
name="search_db",
description="搜索企业数据库",
inputSchema={
"type": "object",
"properties": {"query": {"type": "string"}},
"required": ["query"]
}
),
Tool(
name="send_email",
description="发送邮件",
inputSchema={
"type": "object",
"properties": {
"to": {"type": "string"},
"subject": {"type": "string"},
"body": {"type": "string"}
},
"required": ["to", "subject", "body"]
}
),
]
@server.call_tool()
async def call_tool(name, arguments):
if name == "search_db":
result = db.search(arguments["query"])
elif name == "send_email":
result = email.send(arguments["to"], arguments["subject"], arguments["body"])
return [TextContent(type="text", text=str(result))]