1. 这不是题库,而是一份AI Agent工程师的“能力解剖图”
你打开这份文档时,大概率正面临两种处境:要么刚投出第7份AI方向的简历,收到的回复里反复出现“需具备AI Agent开发经验”;要么在技术分享会上被问到“你们团队的Agent架构怎么设计的”,一时卡壳,只能含糊说“用了LangChain”。这两种场景背后,藏着一个被严重低估的事实:当前市面上90%的所谓“AI Agent面试题”,根本没碰触到真实工程现场的毛细血管。它们要么停留在“什么是ReAct框架”的定义复述,要么陷入“手写Parser解析JSON”的算法内卷——可现实是,你在凌晨三点调试一个微信小程序里的Agent时,真正让你崩溃的,从来不是理论模型,而是用户发来一张模糊截图后,Agent把“转账500元”误识别成“转帐5000元”,而重试机制又因token超限直接崩掉。这份扩写版的100题,我刻意绕开了所有教科书式问答,每一道题都锚定在一个具体、可感知的工程切口上:比如第37题“当用户连续三次输入‘没听懂’,Agent如何动态降级到纯规则引擎模式”,背后是我们在某银行客服项目中踩过的坑;第62题“如何让本地部署的Qwen-Agent在无GPU环境下稳定处理10路并发语音转文本请求”,直接对应我们为社区养老中心定制的离线语音助手方案。它不承诺让你“秒过面试”,但能确保当你坐进会议室,面对面试官抛出的“你们怎么解决Agent的幻觉传播问题”时,你能掏出手机,调出自己上周刚修复的trace日志截图,指着其中一行Span ID说:“我们在这里加了双校验熔断,这是压测数据。”——这才是技术人该有的底气。
2. 面试官真正想验证的,从来不是你背了多少概念
很多候选人把AI Agent面试当成一场知识竞答,疯狂记忆“Tool Calling”“Memory Management”“Planning Loop”这些术语。这就像学开车只背《道路交通安全法》条文,却从没摸过方向盘。真实面试中,技术负责人最常做的,是突然打断你的理论阐述,问一句:“如果现在要给一个只有4GB内存的树莓派部署一个能控制智能灯泡的Agent,你会砍掉哪三层模块?为什么?”——这个问题的答案,瞬间就能暴露你是否真干过活。我梳理这100题的底层逻辑,就是围绕三个不可替代的工程维度展开:环境适配性、故障韧性、成本敏感度。
环境适配性(占题量35%):绝非简单问“你用过哪些框架”,而是深挖“当客户要求Agent必须运行在国产飞腾CPU+麒麟OS组合上,你如何绕过PyTorch对ARM64的CUDA依赖?”(第12题)。这类问题直指落地能力——再炫酷的架构,跑不起来就是废纸。我们曾为某政务系统做适配,发现LangChain的默认向量库在麒麟OS下会静默丢弃中文分词结果,最终靠替换Jieba分词器并手动注入编码参数才解决。
故障韧性(占题量40%):面试官最怕听到“理论上不会出错”。真实世界里,Agent的崩溃往往始于最荒诞的细节。第48题“当第三方天气API返回空JSON且HTTP状态码为200时,Agent如何避免将‘undefined’作为城市名发起下一轮搜索?”就源于我们某次上线事故:气象局接口临时改版,返回了空体但没改状态码,导致Agent疯狂向不存在的“undefined市”请求天气,触发了对方的风控封禁。解决方案不是加try-catch,而是建立“响应契约校验层”,在进入LLM前强制校验关键字段存在性。
成本敏感度(占题量25%):大厂面试最爱问“如何优化Token消耗”,但很少有人追问“当用户上传一张10MB的PDF,你让LLM直接读取还是先用OCR提取文字?这个决策背后的ROI计算公式是什么?”(第89题)。我们在某法律咨询项目中测算过:对一份标准合同PDF,OCR预处理耗时1.2秒+0.03元,而让GPT-4-turbo直接解析耗时8.7秒+0.18元。当并发量超50QPS时,后者会让月成本飙升至2.3万元——这个数字比任何技术方案都更有说服力。
提示:如果你在准备面试,建议用这三把尺子重新审视自己的项目经历。不要说“我用LangChain做了个客服机器人”,而要说“我把LangChain的Memory模块替换成Redis Stream,因为原生ConversationBufferWindowMemory在1000+并发时会产生120ms的锁等待,而Stream的XADD操作平均延迟仅0.8ms”。
3. 从“能跑通Demo”到“敢上生产环境”的七道生死关
很多开发者卡在“Demo很炫,一上生产就崩”的死循环里。这不是能力问题,而是缺少一套面向真实世界的Agent健康检查清单。我按实际项目推进顺序,把这100题中的核心攻坚点,浓缩为七道必须跨过的门槛。每道关卡都配有一个血泪教训案例,以及可直接抄作业的验证脚本。
3.1 第一道关:输入污染防御(第5、18、33题)
你以为用户只会输入文字?现实是:他们可能粘贴带隐藏字符的Word表格、发送截屏里带水印的二维码、甚至故意输入“ ”测试你的过滤器。第5题“当用户输入包含Unicode零宽空格(U+200B)的指令时,Agent如何防止其干扰意图识别模型的tokenization?”就源于我们某电商Agent的事故——用户复制的商品链接里混入了零宽空格,导致URL解析失败,Agent误判为“搜索商品”,而非“跳转详情页”。
实操方案:
# 在所有输入入口处强制清洗 import re def sanitize_input(text): # 移除零宽空格、零宽连接符等隐形字符 text = re.sub(r'[\u200b-\u200f\u202a-\u202e]', '', text) # 替换全角标点为半角(避免中文逗号被误判为分隔符) text = text.replace(',', ',').replace('。', '.') # 截断超长输入(防爆栈) return text[:2000] # 根据模型上下文窗口调整 # 验证脚本:生成含零宽空格的测试用例 test_cases = [ "查询订单" + "\u200b" + "状态", # 零宽空格插入中间 "https://example.com\u200c/product?id=123" # 零宽连接符 ] for case in test_cases: print(f"原始: {repr(case)} -> 清洗后: {repr(sanitize_input(case))}")注意:别只依赖前端过滤!我们吃过亏——某次安卓App更新后,WebView的剪贴板API会自动注入零宽空格,后端没做二次清洗,导致3天内27%的订单查询失败。
3.2 第二道关:工具调用熔断(第22、41、76题)
Agent最危险的幻觉,不是胡说八道,而是“自信地犯错”。第22题“当天气工具连续3次返回‘城市未找到’,Agent应如何触发降级策略而非无限重试?”直指要害。我们某旅游Agent曾因此陷入死循环:用户问“巴黎天气”,工具因地理编码精度问题返回空,Agent以为自己理解错了,转而问“您是指法国巴黎还是美国巴黎?”,用户回复“当然是法国”,Agent再次调用工具……如此往复,直到超时。
熔断设计四原则:
- 计数器隔离:每个工具维护独立失败计数器,避免A工具失败影响B工具
- 时间衰减:失败计数器按小时衰减(如每小时-1),防止历史错误长期阻塞
- 降级梯度:首次失败→切换备用API;二次失败→启用缓存数据;三次失败→返回结构化提示“请确认城市名是否准确”
- 人工接管开关:当单日失败率超15%,自动邮件告警并开放后台强制降级开关
# 快速验证熔断逻辑的curl命令(模拟工具连续失败) curl -X POST http://localhost:8000/agent \ -H "Content-Type: application/json" \ -d '{"input": "查询巴黎天气", "tool_history": [{"name":"weather_api","status":"failed","count":3}]}' # 应返回:{"response": "未找到匹配的城市,请确认名称是否为'Paris, France'或提供经纬度"}3.3 第三道关:记忆泄漏防控(第29、54、85题)
ConversationBufferMemory看着省事,但在高并发场景下是内存黑洞。第29题“如何证明Agent的记忆模块不会因用户长时间闲聊导致OOM?”的答案,不是“我用了Redis”,而是给出具体的内存增长曲线。我们在某教育Agent中监控发现:当100个学生同时进行30分钟对话,原生BufferMemory占用内存达4.2GB,而改用Redis的LRU策略后降至210MB。
关键配置:
| 参数 | 原生BufferMemory | Redis LRU | 效果 |
|---|---|---|---|
| 单会话最大消息数 | 50(硬编码) | 可配置,推荐20 | 防止长对话撑爆内存 |
| 消息过期时间 | 无 | TTL=3600s | 自动清理陈旧会话 |
| 内存占用(100并发) | 4.2GB | 210MB | 降低20倍 |
| 检索延迟 | <1ms | 3-8ms | 可接受范围 |
踩坑心得:别迷信“向量数据库存记忆”。我们测试过ChromaDB,当会话数超5000时,相似度检索延迟飙升至2.3秒,远超用户耐心阈值。对大多数场景,带TTL的键值存储比向量库更务实。
3.4 第四道关:输出格式强约束(第38、67、92题)
“请用JSON格式返回”这种提示词,在真实场景中约等于无效。第38题“当LLM输出的JSON包含中文引号或尾部逗号时,如何保证下游服务能100%解析?”的答案,是放弃依赖LLM的格式生成能力。我们在某政务系统中,强制所有工具调用返回标准化Schema:
{ "status": "success", "data": { /* 实际业务数据 */ }, "metadata": { "tool_used": "egov_api", "confidence": 0.92, "parse_errors": [] // 当JSON解析失败时,此处填入原始字符串 } }解析函数必须包含容错:
def safe_parse_json(raw_output): try: return json.loads(raw_output) except json.JSONDecodeError as e: # 尝试修复常见错误 fixed = raw_output.replace("“", '"').replace("”", '"').rstrip(',') try: return json.loads(fixed) except: # 终极兜底:返回结构化错误对象 return { "status": "parse_failed", "raw_output": raw_output[:500], "error": str(e) }3.5 第五道关:多模态输入归一化(第45、71、88题)
第45题“当用户上传一张手写体‘付款500元’的图片,Agent如何确保OCR结果不被LLM幻觉篡改?”揭示了一个残酷事实:多模态Agent的瓶颈不在模型,而在输入管道。我们某支付Agent上线首周,因OCR引擎将手写“500”识别为“5000”,导致37笔误转账。
归一化三步法:
- OCR后置校验:对金额类字段,用正则
r'¥?\d+(,\d{3})*(\.\d{2})?'强制提取,丢弃所有非匹配文本 - LLM只做语义确认:输入“OCR识别:¥5000.00,用户原始图片已存档”,让LLM判断“该金额是否与上下文逻辑一致”(如用户刚说“还欠款500元”)
- 人工复核触发:当OCR置信度<0.85或LLM判断冲突时,自动转人工,并标注“需核验原始图片”
关键数据:引入此流程后,金额类错误率从3.2%降至0.07%,且92%的复核请求能在15秒内完成。
3.6 第六道关:本地化部署的冷启动(第15、59、96题)
“普通电脑部署AI Agent”不是营销话术,而是刚需。第15题“如何让Qwen1.5-4B在8GB内存的MacBook Air上以<2秒延迟响应?”的答案,是彻底抛弃通用方案。我们实测发现:
- 默认transformers加载:内存占用6.8GB,首token延迟4.2秒
- 启用llama.cpp量化(Q4_K_M):内存降至3.1GB,延迟1.3秒
- 终极优化:用llama.cpp的
--mlock参数锁定内存,避免swap,延迟稳定在0.9秒
一键部署脚本(macOS):
# 安装llama.cpp(已编译好) brew install llama-cpp # 下载量化模型(4.2GB) curl -O https://huggingface.co/Qwen/Qwen1.5-4B-GGUF/resolve/main/qwen1.5-4b-q4_k_m.gguf # 启动API服务(关键参数:--mlock避免swap,--n-gpu-layers 0强制CPU) llama-server -m qwen1.5-4b-q4_k_m.gguf \ --host 0.0.0.0 --port 8080 \ --n-gpu-layers 0 --mlock \ --ctx-size 2048 --batch-size 5123.7 第七道关:合规性审计追踪(第7、64、99题)
第7题“如何向审计部门证明Agent从未将用户身份证号传给第三方API?”不是考技术,而是考工程素养。我们某金融项目为此建立了三级审计体系:
- 代码层:所有网络请求函数强制接收
audit_context参数,记录调用方、目的、脱敏规则 - 运行时:用OpenTelemetry捕获所有HTTP请求,自动过滤含
id_card、bank_no等关键词的请求体 - 存储层:审计日志单独存入只读S3桶,开启版本控制,每次修改生成SHA256哈希
审计报告生成命令:
# 查询过去24小时所有含敏感词的请求 aws s3 cp s3://audit-logs/2024-06-15/ - | \ jq 'select(.request_body | contains("id_card") or contains("bank_no"))' | \ jq '{timestamp:.timestamp, endpoint:.endpoint, masked_body:(.request_body | sub("id_card\":\"[^\"]+\""; "id_card\":\"***\""))}'4. 那些没人告诉你的“灰色地带”实战技巧
教科书不会写,但老手天天用的野路子,才是拉开差距的关键。这100题里,我特意埋了12道“灰色技巧题”,它们不涉及黑科技,而是对基础工具的极限压榨。
4.1 用Prompt Engineering绕过模型限制(第11、44、81题)
第11题“如何让不支持function calling的旧版模型(如Llama2-7B)实现工具调用效果?”的答案,是把工具描述编译成Prompt模板。我们为某嵌入式设备Agent设计的方案:
【可用工具】 1. weather(city): 获取城市天气,输入格式:city=北京 2. news(topic): 获取新闻,输入格式:topic=人工智能 【执行规则】 - 仅当用户明确要求查天气/新闻时,才输出对应工具调用格式 - 绝对禁止输出解释性文字,只输出一行工具调用 - 示例:用户问“北京天气”,你必须输出:weather(city=北京) 现在开始: 用户:上海明天天气如何?效果:在Llama2-7B上,工具调用准确率达89.3%,远超直接微调的72.1%。关键是——它不需要任何模型修改,纯Prompt即可上线。
4.2 用操作系统特性提升响应速度(第27、73、94题)
第27题“如何将Agent的HTTP响应延迟从350ms压到80ms?”的答案,藏在Linux内核参数里。我们某高并发客服Agent通过三步优化:
- 禁用Nagle算法:
echo 'net.ipv4.tcp_nodelay = 1' >> /etc/sysctl.conf - 增大TCP接收缓冲区:
echo 'net.core.rmem_max = 16777216' >> /etc/sysctl.conf - 绑定CPU亲和性:
taskset -c 0-3 uvicorn app:app --workers 4
压测对比(wrk -t4 -c100 -d30s):
| 优化项 | P95延迟 | QPS |
|---|---|---|
| 默认配置 | 352ms | 210 |
| 仅禁用Nagle | 210ms | 340 |
| 全部优化 | 78ms | 890 |
注意:别盲目调大缓冲区!我们曾因
rmem_max设为64MB,导致小包传输延迟反而增加,最终确定16MB为最优值。
4.3 用文件系统做轻量级向量库(第52、83题)
第52题“如何在无数据库的树莓派上实现基于文档的问答?”的答案,是放弃向量库,用文件系统+BM25。我们为某农业物联网Agent设计的方案:
- 将所有农技文档按段落切分,保存为
/docs/pest_control_001.txt等文件 - 用
whoosh库建立全文索引(内存占用<15MB) - 用户提问时,用BM25检索Top3文档,拼接后送入LLM
实测数据:在树莓派4B(4GB RAM)上,索引1000份文档耗时2.3秒,单次检索平均47ms,准确率比Embedding+FAISS高11%(因农技术语专业性强,通用Embedding效果差)。
4.4 用Git做Agent配置版本管理(第68、97题)
第68题“如何让10人团队协同开发Agent时,避免提示词冲突?”的答案,是把Prompt当代码管。我们强制所有Prompt存于/prompts/目录,结构如下:
/prompts/ ├── intent_classifier/ # 意图分类Prompt │ ├── v1.2.yaml # 当前生产版本 │ └── v1.3.yaml # 待灰度版本 ├── tool_selection/ # 工具选择Prompt │ └── base.yaml └── audit_log/ # 审计日志Prompt └── template.md发布流程:
- 所有修改必须提PR,附带A/B测试报告(对比v1.2与v1.3在1000条测试集上的准确率)
- 合并后自动触发CI:用
promptfoo工具验证新Prompt是否符合安全规范(如无越狱指令) - 灰度发布:通过HTTP Header
X-Prompt-Version: v1.3控制流量比例
这套流程让我们Prompt迭代周期从“凭感觉改”缩短到“3小时验证+上线”,且0次因Prompt错误导致线上事故。
5. 100题背后的技能树:从“会用”到“能建”的跃迁路径
这100道题不是孤立的知识点,而是指向一条清晰的能力成长路径。我把它拆解为四个阶段,每个阶段对应不同的技术纵深和业务视角。你可以对照自查:自己卡在哪一阶?下一步该补什么?
5.1 阶段一:Agent使用者(掌握20题)
典型画像:能基于LangChain/LlamaIndex快速搭建Demo,但遇到报错第一反应是Google错误信息。
核心能力:
- 熟练使用至少1个主流框架(LangChain/LLamaIndex/Flowise)
- 能配置基础Memory(ConversationBufferMemory)、Retrieval(ChromaDB)
- 掌握Prompt基础语法(System/User/Assistant角色)
必刷题:第1-20题(基础概念、框架选型、环境搭建)
致命短板:无法解释“为什么选Redis而不是SQLite存Session?”——这暴露了对分布式系统基础的缺失。
5.2 阶段二:Agent调优者(掌握50题)
典型画像:能通过调整temperature、max_tokens等参数提升效果,但无法定位性能瓶颈。
核心能力:
- 理解LLM推理流程(Prefill/Decode阶段)
- 掌握性能分析工具(
torch.profiler、llama.cpp的--verbose-prompt) - 能设计A/B测试验证优化效果(如对比不同RAG chunk size的准确率)
必刷题:第21-50题(性能调优、RAG优化、缓存策略)
致命短板:当QPS从100升到500时系统崩溃,只会重启服务,不懂看vmstat查内存交换。
5.3 阶段三:Agent构建者(掌握80题)
典型画像:能从零设计Agent架构,但缺乏大规模运维经验。
核心能力:
- 能设计高可用架构(如Tool Registry服务、Fallback Engine)
- 掌握可观测性三件套(Metrics/Logs/Traces)
- 理解合规要求(GDPR/等保2.0对AI系统的约束)
必刷题:第51-80题(架构设计、可观测性、合规审计)
致命短板:设计的“多Agent协作”方案,在真实网络环境下因DNS解析超时导致级联失败,却没想过加本地Hosts映射。
5.4 阶段四:Agent治理者(掌握100题)
典型画像:能制定团队AI工程规范,推动技术决策。
核心能力:
- 建立AI系统全生命周期管理(从Prompt版本控制到模型退役)
- 设计成本核算模型(Token/Compute/Storage的ROI分析)
- 主导跨部门协作(与法务共定AI使用边界,与产品共定用户提示文案)
必刷题:第81-100题(成本治理、组织协同、伦理边界)
终极考验:当CEO问“投入200万做AI Agent,6个月ROI是多少?”,你能拿出包含获客成本降低、客服人力节省、转化率提升的三维测算表,而非只说“提升用户体验”。
个人体会:我在第三阶段卡了14个月,直到接手一个烂摊子项目——前任留下的Agent每天产生2TB无效日志,监控告警全是噪音。我花3周重构日志体系,把告警准确率从31%提到92%,这才真正理解什么叫“可观测性不是锦上添花,而是生存底线”。所以别急着冲第四阶段,先把第三阶段的每一根钉子砸实。
6. 最后一条:关于“手搓AI Agent”的残酷真相
标题里“手搓AI Agent从0到1”听起来很热血,但现实是:95%的“手搓”项目,死于过度设计。我们团队曾用3个月开发一个号称“全自研”的Agent框架,支持17种规划算法、8种记忆机制、5种工具协议……上线后发现,87%的业务需求,用LangChain的create_react_agent加两个自定义Tool就搞定了。那3个月,本可以用来打磨一个真正解决用户痛点的功能。
这100题里,我刻意加入了15道“反手搓”题目(如第100题“当现有框架已满足90%需求时,什么情况下你仍要坚持自研?”),答案永远是:只有当你能精确说出‘现有方案在XX场景下,因XX技术限制,导致XX业务指标下降XX%’时,自研才有意义。
比如我们自研的轻量级Tool Router,是因为LangChain的Tool Calling在1000+工具时,JSON Schema验证耗时超200ms,而业务要求端到端延迟<500ms。我们用Rust重写核心路由,耗时压到8ms,这才值得。
所以,别被“手搓”绑架。真正的工程师精神,不是炫耀自己写了多少行代码,而是用最少的代码,解决最痛的问题。当你下次看到“手搓”这个词,先问自己:
- 这个“搓”,是为了解决一个真实存在的、可量化的业务问题?
- 还是为了在简历上多写一行“自研框架”?
如果是后者,请立刻关掉编辑器,去读读这100题里第37、48、62题——那里有比“手搓”酷得多的真实战场。