本文基于 bilibili up主 @堂吉诃德拉曼查的英豪 《近年 AI 应用技术串讲与优质文档分享|Agent、Skill、OpenClaw、Harness……》整理,在此表示感谢!

最近几年,AI 应用从“输入一句话,得到一段回答”,逐渐发展到能够搜索资料、调用软件、修改文件、执行代码的系统。

这些系统经常出现一些术语:LLM、Prompt Engineering、Fine-tuning、RAG、Function Calling、MCP、Agent、Multi-Agent、Context Engineering、Skill、OpenClaw、Harness。

这些术语使得初学者难以理解,加深了学习的难度与壁垒。

简而言之:

  • LLM 是生成和理解文本的模型。
  • Prompt、RAG、Fine-tuning 主要影响模型获得什么信息,以及如何完成任务。
  • Function Calling 和 MCP 负责让模型使用外部工具。
  • Agent 是一个能够多次思考、调用工具并根据结果继续行动的应用系统。
  • Skill 和 Harness 主要用于组织能力、约束流程和提高可靠性。
  • OpenClaw 是一种把这些能力组合起来的开放式 AI 助手项目。

01 | LLM:生成文字的模型

LLM 是 Large Language Model 的缩写,中文通常译为“大语言模型”。

它的基本任务是:根据已经出现的文本,预测接下来最可能出现的内容。

例如:

今天的天气很

模型可能预测:

好

也可能预测:

冷

在实际使用中,模型一次会根据整段上下文生成许多词。所谓“回答问题”“总结文章”“写代码”,都可以看作模型根据输入内容生成后续文本。

1. LLM 是怎样学会这些能力的

训练过程通常包含几个阶段。

第一阶段是预训练。模型从大量文本中学习词语、句子、代码和不同知识之间的统计关系。

第二阶段是指令微调。训练数据会变成类似下面的形式:

用户:解释什么是递归。

助手:递归是一种让函数调用自身的编程方法……

模型通过这些数据学习如何理解指令,以及如何组织回答。

第三阶段通常还会加入人工反馈或偏好优化,让模型更倾向于给出有帮助、清晰、安全的回答。

2. LLM 的局限

LLM 的回答来自训练数据和当前上下文。它可能存在几个问题:

  1. 训练数据有截止时间,无法自动知道最新信息。
  2. 它可能生成语法正确但事实错误的内容。
  3. 它不一定知道用户的私人资料。
  4. 它只能输出文本,除非应用额外提供搜索、计算、文件操作等工具。

因此,一个真正有用的 AI 应用通常需要在 LLM 外面增加其他组件。

02 | Prompt:告诉模型要做什么

Prompt 可以理解为发送给模型的输入,包括问题、背景、限制条件和输出格式。

最简单的 Prompt 是:

解释一下 RAG。

更明确的 Prompt 可以写成:

面向只会使用聊天机器人的初学者,
解释 RAG 的工作流程。
先给出定义,再举一个技术文档问答的例子。
避免使用没有解释过的术语。

后一个 Prompt 包含了四类信息:

  • 任务:解释 RAG。
  • 读者:只会使用聊天机器人的初学者。
  • 结构:先定义,再举例。
  • 限制:解释术语,避免默认读者已有背景。

Prompt Engineering 指的是系统地设计、测试和修改 Prompt,使模型更稳定地完成任务。

1. 一个好的 Prompt 通常包含什么

可以使用下面这个结构:

角色:
你是一名负责技术教学的助手。

任务:
解释什么是函数调用。

背景:
读者只了解基本的 AI 聊天工具。

要求:
1. 先解释术语。
2. 给出完整流程。
3. 使用一个天气查询的例子。
4. 指出模型和程序分别负责什么。

输出格式:
使用 Markdown,包含小标题和代码块。

这类写法的可以减少歧义,但它不能保证模型永远正确,因此仍然需要检查和测试。

2. Prompt 与上下文的关系

模型每次生成回答时,都只能看到当前请求中提供的上下文。上下文可能包括:

  • 系统指令。
  • 用户问题。
  • 对话历史。
  • 检索到的文档。
  • 工具返回结果。
  • 当前任务的中间状态。

Prompt 更像是一次任务说明;上下文则是模型在这次任务中能够读取到的全部信息。

03 | Fine-tuning:改变模型的行为倾向

Fine-tuning,中文称为微调,是在已有模型的基础上继续训练。

假设一个模型已经具备通用语言能力,开发者可以使用自己的数据训练它,让模型更熟悉某种格式、领域或表达方式。

例如,训练数据可以是:

{
  "input": "订单 10086 当前状态是什么?",
  "output": "订单状态:已发货;预计明天送达。"
}

经过大量类似数据训练后,模型可能更熟悉客服问答的语气和格式。

1. 微调适合解决什么问题

微调通常适合以下场景:

  • 固定的输出格式。
  • 稳定的语气和风格。
  • 特定领域的术语和任务模式。
  • 需要模型始终遵循的分类标准。

例如:

  • 把客服问题分成退款、物流、账户三类。
  • 按公司规定的 JSON 格式输出。
  • 让模型生成统一风格的法律文书初稿。

2. 微调不适合存储经常变化的知识

如果公司每天更新商品价格,把价格写入微调数据并不方便。价格变化后,需要重新准备数据和训练模型。

这类信息更适合使用 RAG:回答问题时,先检索最新资料,再把资料交给模型。

04 | RAG:先检索,再生成

RAG 是 Retrieval-Augmented Generation 的缩写,中文常译为“检索增强生成”。

它的基本流程是:

用户提问
  ↓
检索相关资料
  ↓
把资料放入上下文
  ↓
LLM 根据资料生成回答

例如,用户询问:

公司的年假规定是什么?

系统可以先从员工手册中找到相关段落:

工作满一年后,每年享有五天带薪年假……

然后将这段内容和用户问题一起发送给模型。

1. 文档怎样被检索出来

常见做法是先把文档切成许多小段,再把每一段转换成向量。

向量是一串数字,用于表示文本的语义特征。含义相近的文本,向量通常也更接近。

例如:

如何申请年假?
年假需要在哪里提交?

虽然用词不同,但语义相近,系统可以将它们检索到相同的文档片段。

2. RAG 的完整流程

一个简单的 RAG 系统通常包含以下步骤:

  1. 读取 PDF、网页或数据库内容。
  2. 将长文档切分为多个片段。
  3. 为每个片段生成向量。
  4. 将向量保存到向量数据库。
  5. 用户提问时,将问题转换成向量。
  6. 找到最相关的文档片段。
  7. 把片段和问题一起交给 LLM。
  8. 生成带有资料依据的回答。

3. RAG 的问题

RAG 的效果取决于检索结果。如果检索阶段找错了内容,模型可能会基于错误资料回答。

常见问题包括:

  • 文档切分得太碎,缺少上下文。
  • 关键词匹配到相似但无关的内容。
  • 文档本身已经过期。
  • 检索内容太多,挤占了模型的上下文空间。

因此,RAG 需要同时关注文档清洗、切分、检索和答案引用。

05 | Function Calling:让模型请求程序执行操作

Function Calling 通常译为“函数调用”。

这里的函数不是模型内部自动拥有的函数,而是开发者提供给模型的一组程序接口。

例如,开发者可以提供:

{
  "name": "get_weather",
  "description": "查询指定城市的天气",
  "parameters": {
    "city": "城市名称"
  }
}

用户问:

北京今天的天气怎么样?

模型可能返回一个结构化请求:

{
  "name": "get_weather",
  "arguments": {
    "city": "北京"
  }
}

接下来由应用程序真正执行 get_weather,访问天气服务,再把结果返回给模型:

{
  "temperature": 24,
  "condition": "晴"
}

模型最后把结果整理成自然语言:

北京今天晴,气温约 24℃。

1. 模型和程序各自做什么

整个过程可以分为四步:

  1. 模型理解用户意图。
  2. 模型选择合适的函数,并生成参数。
  3. 程序执行函数。
  4. 模型根据执行结果组织回答。

模型负责决定“需要什么操作”;程序负责真正执行操作。

模型本身不会因为知道 get_weather 的名字,就自动获得天气数据。它必须通过应用程序提供的接口访问外部服务。

2. Function Calling 的安全问题

工具可能会读取文件、修改数据库或发送消息,因此开发者需要限制:

  • 工具可以访问哪些数据。
  • 参数允许使用什么范围。
  • 是否需要用户确认。
  • 失败时如何停止。
  • 是否记录每一次调用。

查询天气和删除数据库的风险完全不同,二者不应使用同样的权限和确认流程。

06 | MCP:统一连接工具的协议

MCP 是 Model Context Protocol 的缩写,中文可以译为“模型上下文协议”。

它规定了模型应用如何发现和调用外部工具、资源与提示模板。

没有统一协议时,每个 AI 应用都需要为每个服务单独开发连接方式:

AI 应用 ↔ GitHub 接口
AI 应用 ↔ 数据库接口
AI 应用 ↔ 文件系统接口

使用 MCP 后,可以将连接方式标准化:

AI 应用 ↔ MCP Server ↔ GitHub
AI 应用 ↔ MCP Server ↔ 数据库
AI 应用 ↔ MCP Server ↔ 文件系统

1. MCP Server 和 MCP Client

MCP 中通常有两个角色:

  • MCP Client:负责使用工具的 AI 应用。
  • MCP Server:负责提供工具或数据的服务。

例如,一个 GitHub MCP Server 可以提供:

  • 搜索仓库。
  • 读取 Issue。
  • 查看 Pull Request。
  • 创建分支。

AI 应用连接到这个 Server 后,就可以通过统一的方式发现和调用这些能力。

2. MCP 与 Function Calling 的关系

Function Calling 解决的是:

模型怎样提出一个结构化的工具调用请求?

MCP 解决的是:

工具由谁提供?
工具怎样被发现?
不同工具怎样使用统一协议连接?

两者经常一起使用,但处在不同层次。

07 | Agent:能够循环执行任务的系统

Agent 可以译为“智能体”。

一个普通聊天应用通常是:

用户输入 → 模型回答

一个 Agent 的流程更接近:

用户提出目标
  ↓
模型制定下一步计划
  ↓
调用工具
  ↓
读取工具结果
  ↓
决定下一步
  ↓
继续调用工具或结束

例如,用户要求:

找出项目中所有使用了过时 API 的文件,并给出修改建议。

Agent 可能执行:

  1. 搜索项目文件。
  2. 读取依赖配置。
  3. 检查代码中的 API。
  4. 查阅官方文档。
  5. 汇总过时用法。
  6. 生成修改建议。
  7. 运行测试确认结果。

1. Workflow 与 Agent 的区别

Workflow 是预先写好的固定流程:

提取文章
  ↓
翻译文章
  ↓
检查语法
  ↓
输出结果

每一步都由程序提前规定。

Agent 的步骤可以根据任务动态变化。例如,检查不同项目时,涉及的文件数量、错误类型和所需工具可能不同,Agent 会根据当前结果决定下一步。

Anthropic 在技术文章中也区分了这两个概念:Workflow 通过预定义代码路径组织模型和工具;Agent 让模型动态决定过程和工具使用方式。

2. Agent 的基本循环

可以用这样的伪代码表示:

while not finished:
    response = model(context, tools)

    if response.requests_tool:
        result = run_tool(response.tool_name, response.arguments)
        context.append(result)
    else:
        return response.text

这个循环中有三个关键部分:

  • context:模型当前可以看到的信息。
  • tools:模型能够调用的工具。
  • finished:任务是否达到结束条件。

3. Agent 适合什么任务

Agent 适合步骤数量难以提前确定的任务,例如:

  • 排查复杂代码问题。
  • 搜索并比较多个资料来源。
  • 操作多个软件完成工作。
  • 根据执行结果不断调整方案。

如果任务可以用三四个固定步骤完成,普通 Workflow 往往更容易调试,也更容易控制成本。

Agent 会带来额外的延迟、模型调用费用和错误累积,因此应该设置最大循环次数、权限边界和人工确认点。

08 | Multi-Agent:多个 Agent 协作

Multi-Agent 指多个 Agent 共同完成一个任务。

一种常见结构是“协调者—执行者”:

协调 Agent
 ├── 搜索 Agent
 ├── 编程 Agent
 ├── 测试 Agent
 └── 总结 Agent

协调 Agent 负责拆分任务和汇总结果,其他 Agent 分别完成具体工作。

例如,写一篇技术调研报告时,可以安排:

  • 一个 Agent 搜集资料。
  • 一个 Agent 检查数据。
  • 一个 Agent 整理结构。
  • 一个 Agent 审核结论。

1. Multi-Agent 的优点

不同 Agent 可以拥有不同的工具和指令:

  • 搜索 Agent 只能访问网页。
  • 编程 Agent 可以读取代码和运行测试。
  • 审核 Agent 负责发现错误。

这样可以减少单个 Agent 的任务复杂度。

2. Multi-Agent 的代价

多个 Agent 会带来更多模型调用,也会产生协调问题:

  • 不同 Agent 得到的结论可能互相矛盾。
  • 中间结果需要设计统一格式。
  • 协调者需要判断哪些结果可信。
  • 错误可能从一个 Agent 传递到下一个 Agent。

因此,Multi-Agent 适合任务确实可以拆分的场景。为了展示复杂架构而增加 Agent,通常不会带来稳定收益。

09 | Context Engineering:管理模型能看到的信息

Context Engineering 可以译为“上下文工程”。

Prompt Engineering 重点是写好指令;Context Engineering 关注如何构造模型每次真正看到的完整输入。

一个 Agent 的上下文可能包括:

系统指令
用户目标
对话历史
相关文档
工具说明
工具返回结果
已经完成的步骤
当前文件状态
剩余任务

如果把所有信息都塞进上下文,模型可能难以找到真正重要的内容。上下文工程需要决定:

  • 哪些信息应该保留。
  • 哪些历史可以压缩。
  • 哪些文档需要检索。
  • 工具返回结果使用什么格式。
  • 什么时候清理已经无用的内容。

1. 一个简单例子

假设 Agent 正在修改代码。上下文中可能有几十次工具调用记录。

早期的目录搜索结果可能已经没有用,但最近一次测试失败信息仍然重要。系统可以压缩旧记录,只保留:

任务目标
已修改文件
当前错误
最近一次测试结果
下一步限制

这样可以减少上下文长度,让模型把注意力放在当前问题上。

10 | Skill:可复用的任务能力

Skill 通常指一组可以复用的任务说明、操作流程和辅助文件。

一个 Skill 可能包含:

skill/
├── SKILL.md
├── examples/
├── scripts/
└── references/

其中 SKILL.md 可以说明:

  • 这个 Skill 解决什么问题。
  • 什么时候使用。
  • 需要遵守哪些步骤。
  • 输出应该是什么格式。
  • 如何处理常见错误。

例如,一个“PDF 处理 Skill”可以规定:

  1. 先提取文本。
  2. 如果涉及布局,再渲染页面检查。
  3. 使用统一的文件命名方式。
  4. 最后报告生成文件的位置。

1. Skill 与微调的区别

微调会改变模型参数,需要准备训练数据并进行训练。

Skill 通常保留在模型外部,模型在需要时读取对应说明。修改 Skill 文件后,可以立即更新流程,成本也更低。

Skill 更适合描述操作方法和工作规范;微调更适合改变长期稳定的输出行为。

2. Skill 与工具的区别

工具负责执行动作,例如:

读取文件
运行代码
搜索网页
发送请求

Skill 负责告诉模型如何完成一类任务,例如:

处理 PDF 时先提取文本,再检查页面布局。

一个 Skill 往往会组合多个工具。

11 | OpenClaw:开放式 AI 助手项目

OpenClaw 是一个开源的个人 AI 助手项目。它关注的是让 AI 通过聊天入口连接外部工具,完成持续性的任务。

它通常包含几个部分:

  • 消息入口:接收用户指令。
  • 模型接口:负责理解和生成文本。
  • 工具系统:访问文件、网页和其他服务。
  • 任务循环:根据工具结果继续工作。
  • 权限控制:限制可执行的操作。
  • 记忆或状态:保存必要的任务信息。

例如,用户可以通过聊天要求助手读取某个文件、整理内容,再将结果保存到指定位置。

使用这类系统时,需要特别关注权限。能够读取文件、执行命令和发送消息的助手,权限范围已经超过普通聊天机器人。工具应当只开放完成任务所需的最小权限。

12 | Harness Engineering:为 Agent 建立可靠的工作环境

Harness 原本是工程领域中的“控制系统”或“约束结构”。在 AI Agent 开发中,Harness Engineering 通常指围绕 Agent 建立的运行框架和保障机制。

它负责处理模型本身不擅长或不应该独自处理的部分:

  • 任务状态保存。
  • 工具调用和结果记录。
  • 权限控制。
  • 超时和重试。
  • 最大执行步数。
  • 测试和评估。
  • 人工确认。
  • 错误恢复。
  • 日志和审计。

一个简单的 Agent 可能只有:

模型 → 工具 → 模型 → 工具

加入 Harness 后,流程会变成:

模型提出调用
  ↓
Harness 检查权限和参数
  ↓
Harness 执行工具
  ↓
Harness 记录结果
  ↓
模型读取结果并继续

1. 为什么需要 Harness

模型可能会:

  • 选择错误的工具。
  • 生成不完整的参数。
  • 重复执行同一个动作。
  • 误解工具返回值。
  • 在任务已经完成后继续运行。

Harness 可以在这些地方加入程序检查。

例如,模型提出删除文件的请求时,Harness 可以要求用户确认;模型尝试访问工作目录之外的文件时,Harness 可以直接拒绝。

Harness 不会让模型自动变得可靠,但它可以限制错误的影响范围,并让问题更容易追踪。

13 | 把这些概念放在一起

一个较完整的 AI 应用可以表示为:

用户
 ↓
聊天界面
 ↓
Agent
 ├── Prompt:任务指令
 ├── Context:当前上下文
 ├── Skill:任务流程
 ├── RAG:检索知识
 ├── Function Calling:请求工具
 ├── MCP:连接外部服务
 └── Harness:权限、状态和执行控制
       ↓
      LLM

它们之间的关系可以这样理解:

概念 主要解决的问题
LLM 理解文本并生成内容
Prompt Engineering 怎样向模型说明任务
Fine-tuning 怎样改变模型的稳定行为
RAG 怎样让模型使用外部知识
Function Calling 怎样让模型请求程序执行操作
MCP 怎样用统一协议连接工具和资源
Agent 怎样让模型循环完成多步骤任务
Multi-Agent 怎样让多个 Agent 分工合作
Context Engineering 怎样管理模型看到的信息
Skill 怎样封装可复用的任务流程
OpenClaw 怎样组合模型、工具和聊天入口
Harness 怎样控制 Agent 的执行过程

14 | 一个完整例子:让 AI 整理项目文档

假设我们希望构建一个助手,完成下面的任务:

扫描项目中的 Markdown 文件,
提取每篇文章的标题和摘要,
找出缺少摘要的文章,
最后生成一份报告。

系统可能这样工作:

第一步:Agent 接收目标

模型分析任务,判断需要:

  1. 列出 Markdown 文件。
  2. 读取文件内容。
  3. 提取标题和摘要。
  4. 检查缺失项。
  5. 生成报告。

第二步:调用文件工具

模型通过 Function Calling 请求:

{
  "name": "list_files",
  "arguments": {
    "pattern": "**/*.md"
  }
}

Harness 检查路径是否在允许的项目目录内,然后执行工具。

第三步:读取文件

模型根据文件列表,调用读取工具。

如果文件数量很多,Context Engineering 可能会先筛选文件,或分批处理,避免一次性把全部内容放入上下文。

第四步:使用 Skill

一个“博客文章检查 Skill”可以规定:

  • 标题必须存在。
  • 摘要建议控制在两句话以内。
  • front matter 必须包含 title、slug 和 date。
  • 报告使用表格输出。

模型按照这个流程检查文件。

第五步:生成报告

最终结果可能是:

| 文件 | 标题 | 摘要 | 问题 |
| :--- | :--- | :--- | :--- |
| blog/a.md | 已存在 | 已存在 | 无 |
| blog/b.md | 已存在 | 缺少 | 需要补充摘要 |

这个例子中:

  • LLM 负责理解任务和生成报告。
  • Agent 负责安排多个步骤。
  • Function Calling 负责请求文件操作。
  • Harness 负责权限和执行限制。
  • Skill 负责规定检查标准。
  • Context Engineering 负责控制传给模型的信息量。

15 | 常见问题

“有了 LLM 就等于有了 Agent”吗?

不等于。

LLM 是模型,Agent 是围绕模型构建的应用系统。Agent 通常还需要工具、状态、循环和停止条件。

“RAG 会改变模型参数吗?”

通常不会。

RAG 在回答时临时提供检索结果,模型参数保持不变。微调才会更新模型参数。

“MCP 是一种模型吗?”

不是。

MCP 是连接 AI 应用和外部工具的协议。

“Function Calling 会让模型自己执行代码吗?”

通常不会。

模型生成的是工具调用请求,真正的执行由外部程序完成。

“Multi-Agent 一定比单个 Agent 好吗?”

不一定。

多个 Agent 会增加协调成本。只有当任务能够清晰拆分,并且不同角色确实需要不同工具或指令时,Multi-Agent 才更有价值。

“Skill 和 Prompt 有什么区别?”

Prompt 往往针对一次具体请求;Skill 通常是一套可以反复使用的任务说明和流程。

16 | 总结

理解 AI 应用时,可以按下面的顺序建立概念:

  1. LLM 负责理解和生成文本。
  2. Prompt 负责描述任务。
  3. RAG 负责提供外部知识。
  4. Function Calling 负责提出工具调用请求。
  5. MCP 负责标准化工具连接。
  6. Agent 负责根据结果循环推进任务。
  7. Multi-Agent 负责让多个角色协作。
  8. Context Engineering 负责管理模型看到的信息。
  9. Skill 负责封装任务流程。
  10. Harness 负责权限、状态、测试和错误控制。

一个稳定的 AI 应用通常从简单结构开始:

LLM + Prompt

需要外部知识时加入 RAG,需要外部操作时加入工具。任务步骤难以预先确定时,再考虑 Agent。只有在实际效果得到验证后,才有必要增加 Multi-Agent、复杂 Skill 或更完整的 Harness。

17 | 相关资料与致谢

本文基于《近年 AI 应用技术串讲与优质文档分享|Agent、Skill、OpenClaw、Harness……》整理,并补充了面向初学者的背景知识与示例。再次感谢bilibili up主 @堂吉诃德拉曼查的英豪 的细致整理。