AI 面试问题

什么是 Harness 工程?

Harness Engineering,也被叫做驾驭工程,是给 AI Agent 设计工作环境的一套工程方法,包括上下文管理、工具调用、沙箱环境、权限控制、测试验证、日志观测、评审机制和反馈回路,目的是为了让Agent在真实工程系统中更可靠、更可控,并持续完成任务。


Harness 工程解决了什么问题?

Harness 工程的核心思路是为 Coding Agent 提供良好的环境条件,限制边界条件,避免模型犯错。 比如:团队架构规则只存在于老员工脑子里、项目启动方式没有写清楚、测试入口散落在不同目录、日志和报错没有暴露给 Agent、UI 问题需要打开浏览器才能验证,但 Agent 只能看代码代码、评审标准没有机械化,只能靠人最后兜底


Harness 工程包含哪些内容?

主要分为两部分:引导和反馈

引导是在Agent 执行任务之前,告诉它怎么做,常见形式包括:AGENTS.md、架构文档、编码规范、项目启动脚本、API 文档、领域知识、示例任务、Skills、任务拆解方式。

反馈发生在 Agent执行任务之后,作用是告诉Agent有没有做对,常见形式包括:单元测试、类型检查、linter、静态分析、架构测试、浏览器自动化、运行日志、metrics 和 traces、代码评审 Agent、LLM judge、人类 review。


Harness 工程和 Prompt 工程的区别?

Prompt 工程偏向输入设计,主要解决“这次怎么让模型更好地回答”;Harness 工程偏向系统设计,主要解决“怎么让模型在工程环境里长期可靠地工作”。

如果在 prompt 里写:请遵守项目架构,不要跨层调用。这是 Prompt工程。但如果你把架构边界写进 custom linter,让 Agent 每次改代码后都能被自动检查,这就是 Harness 工程。

如果在 prompt 里说:修改完成后请运行测试,这还只是提示工程。但如果系统在 Agent 准备结束前拦截它,要求它执行测试、读取完整输出、失败后回到需求重新修,那就是Harness工程。


你设计 Prompt 的核心原则是什么?

  • 清晰:把任务目标、边界和输出要求讲清楚
  • 结构化:把角色、指令、上下文、示例、格式约束拆开组织
  • 可评测:每次调整 Prompt 都要基于测评集做对比

既然大模型已经这么强了,为什么还要做 Agent?

我理解 Agent 本质上是一个能自主完成目标的 AI 系统,跟传统 AI 最核心的区别在于「自主性」和「能行动」。

传统 AI 是你问一个问题它回答一个问题,每次都是独立的,被动响应。

而 Agent 有自己的规划能力,你给它一个复杂目标,它会自己把任务拆成多步,通过调工具、访问记忆、感知环境来一步步执行,直到完成。

它不只是输出文字,而是真的能做事。


Agent 的本质是什么?

Agent是以 LLM 为核心,具备规划(Planning)、记忆(Memory)和工具调用(Tool Use)能力,能够自主拆解复杂任务、循环执行、感知反馈并持续推进任务直到完成的计算实体,实现从“文本生成”到“任务自主执行”,不再只是被动响应指令,而是能像人类员工一样,自主实现任务闭环。


Agent 核心组件有哪些?

有四个核心组件:LLM、工具、记忆、规划模块。

  • LLM 是整个系统的大脑,负责理解任务和做决策。
  • 工具让 Agent 能跟外部世界交互,搜索、执行代码、调 API 都靠它。
  • 记忆让 Agent 在任务执行过程中保持状态,不会「失忆」。
  • 规划模块负责把复杂目标拆解成可执行的步骤。这四个组合在一起,才让 Agent 具备了自主完成任务的能力。

Agent 和单纯的LLM接口调用(chat)区别是什么?

核心在于是否具备实际执行任务的能力,LLM主要是被动接受用户的输入来生成文本回答,主要为一问一答。Agent是设定任务目标、拆解复杂任务、主动调用工具、获取反馈直到完成任务的循环逻辑,LLM只是Agent的大脑,Agent还有手脚(插件/工具/API)和记忆。


Agent 如果在执行中陷入死循环怎么办?

这其实是在落地Agent中必须考虑的问题,可以通过设置最大迭代次数、引入反思机制Reflection、人工介入等方式来解决。


Agent 系统测评有哪些关键指标?

  • 任务完成率:用户交给 Agent 的任务到底有没有完成。比如订票 Agent 有没有完成订票,代码 Agent 有没有成功生成可运行代码
  • 结果质量:最终回答是否准确、完整、有用,是否符合用户意图
  • 执行过程质量:工具有没有调用对,步骤是否合理,有没有无意义的重复调用,有没有错误处理和降级逻辑
  • 系统性能:包括延迟、token 消耗、接口费用、整体成本
  • 稳定性:模型调用、工具调用、外部 API 是否经常失败,失败后是否能重试或降级
  • 用户反馈:包括点赞、点踩、评分、评论,也包括隐式反馈,比如用户是否重复提问、是否频繁点击重新生成、是否换一种说法继续问。

如何设计多 Agent 的协作与动态切换机制?

协作靠两件事:消息传递和共享状态。

消息传递是 Agent 完成自己的工作后把结果发出去,下一个 Agent 取用;共享状态是所有 Agent 共同读写一个状态对象,记录任务进展和中间结果。

动态切换靠 Orchestrator 来做,有两种方式:一种是静态路由,提前写好规则「任务类型 A 就找 Agent X」;另一种是让 LLM 动态决策,根据当前情况实时判断该把任务交给谁。我的实践是两种混用,主流程用静态路由保证稳定,边缘情况才交给 LLM 动态判断。


为什么有时候选择「手搓」Agent,而不是直接用成熟框架?

我的感受是框架用起来快,但有几个实际痛点。第一是抽象层太多,调试的时候不知道哪步出了问题,得一层层往下扒;第二是版本升级经常有破坏性变更,线上稳定性难保证;第三是框架的通用设计往往和具体业务需求有偏差,定制起来反而更费劲。手搓的代码完全在自己掌控之内,可观测性好、出问题好排查,也更方便做性能优化。所以我现在的策略是核心逻辑手写,只在边缘功能上用框架的工具。


单体 Agent 遇到瓶颈,Multi-Agent 方案怎么设计?

Single-Agent 适合任务流程清晰、复杂度适中的场景,实现简单、好维护;Multi-Agent 适合需要专业分工、任务量大或者需要并行执行的复杂场景。

Multi-Agent 架构上主要有两种拓扑:中心化的 Orchestrator 模式,由一个主 Agent 统一调度各个 Worker;去中心化的 Peer-to-Peer 模式,Agent 之间直接通信。

我在工程里用中心化用得更多,因为好控制、好调试,出问题链路清晰。


什么是 Multi-Agent?

多智能体系统(Multi-Agent)就是多个 Agent 协作完成任务,每个 Agent 各有分工,有的负责搜索、有的负责写代码、有的负责做评审。

我理解单个 Agent 主要受两个限制:一是 context 窗口大小,复杂任务信息量一多就撑爆了;二是单点能力,什么都让一个 Agent 做,每件事都是泛才。

Multi-Agent 通过专业分工和并行执行,能处理更复杂、更长流程的任务,这是我在实际项目里选择多智能体方案的核心原因。


Agent 是如何进行反思的?

Agent 的反思机制,本质上是“生成后再评估,然后根据反馈修正结果”。常见有两类:

  • 自我反馈和外部反馈,自我反馈靠大模型自己审查输出,适合查文案一致性、约束遵循、有没有误改内容;
  • 外部反馈是把结果放进真实工具里验证,适合代码、计算、JSON、图表这类必须拿事实说话的任务。

Agent 的记忆系统是什么?短期和长期记忆方案怎么设计?

我理解记忆系统分两层。

第一层是短期记忆,用于当前会话,用截断对话或者总结摘要去控制prompt长度、同时保持语义连贯。

第二层是长期记忆,用于跨会话场景,用向量召回最相关的历史信息,再按需放回上下文。在实践中,不要把写入长期记忆做成“默认全部存储”,而要设准入条件(该存储的存储,该忘的忘),同时要对记忆定期清理、合并和更新,这样Agent的记忆才能更稳定。


短期记忆过长超过 token 限制怎么办?

记忆压缩常见有四种方法:摘要压缩、滑动窗口、重要性过滤、结构化抽取。

  • 摘要压缩是把长对话总结成简短摘要;
  • 滑动窗口是只保留最近 N 轮对话;
  • 重要性过滤是打分筛选,只留重要内容;
  • 结构化抽取是把关键信息抽成结构化数据存起来。

在实际项目里最常用的是摘要压缩和滑动窗口,而且经常组合用,滑动窗口丢弃前先做一次摘要,尽量不丢重要信息。


Agent 中的 Skills 是什么?

Skills 本质是结构化的本地文件夹,用来补充某个领域的流程、知识和工具,让模型在相关场景下自动或按需调用,是面向大模型的能力封装。


Agent 中的 Skills 和 Prompt 的区别是什么?

Prompt是一段临时说明,告诉大模型这次要做什么和怎么做,等任务结束后,这段说明的作用基本也就结束了;Skills是把这套做事方法沉淀下来,下次遇到类似问题,不需要从头再讲一遍,大模型可以按场景去调用。


Agent 系统里面 Skill 是怎么编写的?如何保证高质量的Skill?

通过Skill创建器(例如Codex自带的 Skill Creator),来协助创建Skill,但是高质量的Skill的标准需要我们自己来把关,通过下面五个流程来创建Skill:

  1. 判断这个任务值不值得封装
  2. 提取专家决策和常见反模式
  3. 把指令写得简洁且约束合适
  4. 配齐模板、参考资料和脚本
  5. 用真实任务反复验证执行效果

如何判断任务值不值得做成 skill?

  • 如果一个任务里,熟手和新手的差距主要体现在边界判断、风险识别、优先级取舍,那它就很适合做成 Skill
  • 如果一个任务一句 Prompt 就能说清,或者三步以内就能完成,通常没必要专门做成 Skill。Skill 不是越多越好。它有维护成本,要写说明、配资源、做测试、反复迭代。
  • Skill 的价值在复用。如果你的团队每周都会做类似的分析、审核、发布、改写或生成任务,那么把它沉淀成 Skill,长期收益通常很高。

提取专家决策该写什么?

  1. 提取决策树
    • 什么条件下走方案 A
    • 什么条件下切到方案 B
    • 什么情况下应该停止、降级或者补充信息
  2. 提取反模式和不要做的事情
    • 不要把来源不明的内容当成事实写进输出
    • 不要在高风险操作里直接执行修改,应该先生成计划再验证
    • 不要为了把结果写完整,擅自编造缺失信息
  3. 提取模板和示例

Agent 推理模式有哪些?ReAct 是啥?具体是怎么实现的?

Agent 的推理模式我用过几种。

最基础的是直接输出答案,没有中间推理;CoT 是让 LLM 先把推理过程写出来再给答案,准确率更高;ReAct 是在 CoT 基础上加了「行动」,让 LLM 交替输出思考和工具调用,每次行动后再根据结果继续思考,形成一个循环。

我觉得 ReAct 是目前 Agent 用得最广的模式,因为它推理过程可见,又能动态利用外部工具,两个优点都有。


什么是 RAG?

RAG全称检索增强生成,就是让大模型在回答问题前先去“查资料”(检索),相当于让它开卷考试:模型本身可能没学过公司的内部文档,但只要把相关内容找出来给它,它就能结合这些资料给出靠谱的答案(生成)。


为什么需要RAG?

大模型本身只有它训练时见过的知识,如果问它“你们公司差旅报销流程是什么”,它肯定答不上来,因为它根本没见过你们的制度文件(不了解私域知识)。如果硬要它回答,大概率就是瞎编。解决这个问题的直观思路:把相关资料喂给它不就行了,这就是RAG的核心逻辑,关键是如何做到“精确投喂”,只把问题最相关的知识检索出来给大模型。


RAG 你也做了一段时间了,你觉得实际落地中最难的地方在哪?

我觉得 RAG 最难的不是把它跑起来,一个基础的 Demo 一两天就能搭起来,难的是把它调好。工程上最让我头疼的有三块。

  1. 第一是文档预处理,原始数据的格式五花八门,PDF 里面的表格、图片、嵌套的格式,处理不好就是一堆乱码进了知识库,进去的是垃圾出来的也是垃圾。
  2. 第二是检索质量的调优,向量召回不准是整个系统效果的天花板,但问题来源很多,Chunking、Embedding、Query 改写,任何一个环节出问题都会影响结果,排查起来很费劲。
  3. 第三是效果评估,答案对不对很难系统性地衡量,不知道是哪个环节出了问题,优化就变成了瞎猜。

你们 RAG 知识库上线之后,文档更新了怎么办?

我理解知识库更新的核心挑战是,文档变了,对应的 chunk 和向量都要跟着变,而且要做到增量处理,不能每次全量重建。

我们的通用方案是给每个文档算一个内容 hash,通过轮询或者监听数据源变更,检测到文档新增、修改、删除的时候,先清掉旧的向量,再重新切割入库。

对于实时性要求比较高的场景,我会用消息队列比如 Kafka 做变更事件驱动,实现秒级的入库。


你们线上跑了 RAG,那你怎么衡量它的效果好不好?

我评估 RAG 效果是分两层来看的。

检索层看该召回的有没有召回到,我用 Hit@K 和 MRR 来衡量。生成层看答案对不对、有没有幻觉、和问题相不相关,我主要用 RAGAs 框架,里面的 Faithfulness、Answer Relevancy 和 Context Recall 这三个指标是最核心的。

我的建议是一定要在自己的业务数据上跑,不能只看通用排行榜,那个不能代表你的场景。

另外线上指标,就是用户的点踩率、追问率、转人工率这些,才是最终的衡量标准,离线指标只是辅助。


什么是 MCP 协议?

MCP(Model Context Protocol)是模型上下文协议,目的是为AI应用提供一个标准化接口,使其能够连接外部数据源和工具。例如,AI应用可以通过MCP连接到本地文件或数据库、搜索引擎或计算器、工作流或专业提示词等,从而获取到上下文信息并执行实际任务,可以把 MCP 理解为 AI 应用的”TypeC 接口”。


什么是 Function Calling ?原理是什么?

Function Calling 我的理解是这样一套机制:开发者用 JSON schema 把工具描述好传给模型,模型判断需要调工具的时候不输出自然语言,而是直接输出一段结构化的 tool_calls JSON,告诉你「我要调哪个函数、参数是什么」,你的代码拿到这段 JSON 去真正执行,把结果塞回对话,模型再生成最终答案。

整个流程本质上是两轮对话:第一轮模型说「我需要调这个工具」,你去执行,第二轮模型拿到执行结果说「答案是这个」。我觉得最核心的设计是,模型全程只做决策,执行的事情一律由宿主代码完成,职责分得很清楚。


MCP 与 Function Calling(函数调用)有什么区别?

函数调用是LLM的内部能力,依赖于LLM的返回结果,不同模型(如ChatGPT和Claude)的函数调用返回结构体并不统一;MCP是和LLM无关的外部标准协议,不同的AI应用都可以接入相同的MCP Server。


MCP 的安全机制如何保障?

MCP本身无法在协议层面保证安全,需要开发者在应用层使用时遵循安全最佳实践:如沙箱隔离、最小权限原则、人工授权、安全说明文档等方式。


什么是 A2A 协议?它和 MCP 协议的区别是什么?

A2A 是 Google 在 2025 年发布的协议,专门解决多个 AI Agent 之间怎么互相通信的问题。我理解它和 MCP 的区别是这样的:MCP 解决的是「单个 Agent 怎么连工具和数据」,A2A 解决的是「多个 Agent 之间怎么分工协作」。

一个 Agent 通过 A2A 可以把子任务委托给另一个专业 Agent,接收方按自己的 Skill 声明承接,支持异步长任务和流式推送结果。两者是互补的,不冲突:MCP 向下连工具,A2A 向上连 Agent,在复杂的多 Agent 系统里这两个通常都要用到。