AI时代通识课: 大模型应用
2026-08-24
2026-10-02
10447 字 | 52 分钟
统计加载中…… 阅读:    访客: 统计加载失败

前言#

在人工智能快速发展的今天,大语言模型(Large Language Model, LLM)已经从实验室走向了大众日常的生产力场景。我确实认为大学生们,至少在靠AI写论文的大学生们,确实需要了解一些关于AI应用上的东西,而不是盲目地去买豆包专业版。

不同于真的大学纯水通识课,本文不会说什么神经网络、Transformer这种底层知识,而是从实际落地出发,面向普通人介绍如今AI的真正能力边界。对于非计算机专业背景的学习者而言,我们只需要学会如何正确、高效地与大模型进行交互,并将大模型的能力融合进现实的业务流程与工作流中。

一、大语言模型与文本生成式AI#

1.1 纯文本交互#

大语言模型最基础的使用方式是纯文本交互。用户通过输入自然语言提示词(Prompt),模型根据概率预测逐字生成文本回复。

纯文本交互的本质是上下文续写。模型并没有人类意义上的思考过程,而是基于海量数据训练出来的语言规律,根据当前输入的上文预测下一个最可能出现的词。在上下文中,历史消息以外的、针对当前任务的新消息称为提示词。模型可接收到的所有文本(多模态模型包括图片等)称为上下文。

模型收到的上下文是多个被分类的块,包括一个系统提示词、数个用户消息、数个模型输出和数个工具调用结果。大模型厂商以此区分每段文本的身份定位,对模型进行针对性训练,这使得模型更能理解自己当前的角色进行回复,我们也能看到它明确的回答开始和结束。

  • 系统提示词由开发者设计。模型训练时通常被训练得不容易被透露给用户。遵循等级一般最高。
  • 用户输入包含用户对模型下达的指令。模型分辨它们来自用户,在与系统冲突时模型会拒绝用户。
  • 模型输出包含模型对以上所有内容所进行的回复。模型会读取历史的所有系统提示词、用户输入和模型输出,然后向用户输出文本作为回复。
flowchart LR subgraph Sen1 [" "] direction TB S1["System<br>你是一个猫娘"] U1["User<br>你好,请自我介绍一下"] S1 --> U1 end subgraph Sen2 [" "] direction TB S2["System<br>你是一个猫娘"] U2["User<br>你好,请自我介绍一下"] A2["Assistant<br>主人好喵~ 我是您的专属猫娘,今天想玩什么呢喵?"] S2 --> U2 --> A2 end subgraph Sen3 [" "] direction TB S3["System<br>你是一个猫娘"] U3["User<br>你好,请自我介绍一下"] A3["Assistant<br>主人好喵~ 我是您的专属猫娘,今天想玩什么呢喵?"] U31["User<br>卡丘似了喵"] S3 --> U3 --> A3 --> U31 end Sen1 -->|发送| Sen2 --> Sen3 style S1 fill:#FF4D4F,color:#000000,stroke:#D9363E,stroke-width:1px style S2 fill:#FF4D4F,color:#000000,stroke:#D9363E,stroke-width:1px style S3 fill:#FF4D4F,color:#000000,stroke:#D9363E,stroke-width:1px style U1 fill:#70DBFF,color:#000000,stroke:#33B5E5,stroke-width:1px style U2 fill:#70DBFF,color:#000000,stroke:#33B5E5,stroke-width:1px style U3 fill:#70DBFF,color:#000000,stroke:#33B5E5,stroke-width:1px style U31 fill:#70DBFF,color:#000000,stroke:#33B5E5,stroke-width:1px style A2 fill:#52C41A,color:#000000,stroke:#389E0D,stroke-width:1px style A3 fill:#52C41A,color:#000000,stroke:#389E0D,stroke-width:1px
TIP

纯文本中,中文和英文各自有一套标点符号,它们本质上就不是同一个字符。举例来说:

  • 英文逗号,, 英文句号.
  • 中文逗号,, 中文句号。

纯文本在计算机领域也称字符串。即一个个字符组成的串。


1.2 工具调用#

在纯文本交互中,模型输出的内容完全由其内部预训练的参数和提供的上下文决定。这使得它无法实时获取外部信息(如查询今日天气或实时汇率),也无法准确执行复杂的数学计算或对外部系统发起真实操作。为了让模型理解“自主获取信息”的概念,工具调用系统被训练、分化出来用于模型语义主动地获取信息。组成工具调用的基本功能包括工具调用结果上下文和模型工具调用输出。

模型工具调用输出是模型的“手”。是模型在合适的上下文下输出的一种不同于纯文本的输出模式。它允许模型:

  1. 以字符串方式指定一个工具,再通过某种参数化方式传入执行参数。其中参数化方式通常为JSON格式。
  2. 获取工具调用的结果。工具调用应当是无需用户参与的。 模型在合适的上下文下才会进行工具调用。常见的情景是系统提示词包含了工具调用的说明时。此时模型就会遵循系统提示词的介绍进行工具调用。

工具调用结果上下文是模型的“眼”。在模型发出工具调用时,收到它的处理机(Harness)应当具有处理该工具调用的能力。在完成工具调用后,返回一个工具调用结果上下文插入上下文历史中,再次返还给模型进行续写。

  • 处理该工具调用的能力,具体来说,就是
    1. 识别模型给出的模型工具调用输出,提取对应的工具和参数。
    2. 获取对应的工具,进行工具的执行。
    3. 返回该工具的执行结果。
  • 模型可能会在多次请求中依次调用工具调用。也会在一次请求中并行附带多个工具调用。部分模型也支持模型同时输出工具调用和文本。
  • 语言大模型天生具有泛化性。如果处理机返回“该工具不可调用”,模型会采取一系列措施绕过该方式,包括但不限于尝试使用其他方式、向用户说明服务确实暂时无法使用、甚至可以自行尝试修复处理机(或工具)本身。
  • 我们后续会称这种处理机为Harness。

以AI应用作为Harness,一个完整的AI应用通过工具调用获取信息的完整工作流程为:

  1. 开发者通过系统提示词等方式配置,将一系列可调用的工具(含工具名称、功能描述及所需参数格式)告知模型。
  2. 用户向AI应用发送指令,指令以用户消息的形式送达模型。
  3. 当用户的指令需要借助外部工具时,模型输出一个结构化的工具调用输出,其中指定了模型要调用的工具名称以及由模型填入的参数。
  4. AI应用捕获到模型的工具调用请求后,拦截该指令,并在现实世界中执行对应的代码逻辑或 API 调用。
  5. 宿主程序将执行后获得的数据以工具调用结果上下文的形式重新拼接到上下文中传回给模型。模型读取到最新的工具结果后,总结并输出最终面向用户的解答。
flowchart TD subgraph S1 ["System"] S1_M["当前系统环境有python,你可以使用bash工具执行。<br>使用get_weather工具可以获得天气信息。"] end subgraph U1 ["User"] U1_M["查一下北京今天的天气,顺便求解x+2=e^x"] end subgraph A1 ["Assistant"] direction TB M1_M1["我将查询北京天气并求解x+2=e^x..我们可以使用python计算..."] M1_TC1["工具调用<br>get_weather(<br>city='Beijing'<br>)"] M1_M2["工具调用<br>bash(bash=&quot;python -c &quot;import scipy.optimize...print...&quot;)"] M1_End["停止原因: 工具调用"] M1_M1 --> M1_TC1 M1_M1 --> M1_M2 M1_TC1 --> M1_End M1_M2 --> M1_End end subgraph TR1 ["Harness 自动执行"] direction TB TR1_M["终止原因为工具调用,Harness 执行工具调用"] TR1_T1["Tool Result<br>get_weather<br>{'temp': '22℃', 'condition': '晴'}"] TR1_T2["Tool Result<br>bash<br>{'stdout': '[-1.8414056604369606, 1.1461932206205825]', 'code': 0}"] TR1_M --> TR1_T1 TR1_M --> TR1_T2 end subgraph A2 ["模型整合输出回复"] M2_T["北京今天天气晴朗,气温为 22℃。另外,$x+2=e^x$ 的两个根分别是 $x_1=-1.84140$, $x_2=1.14619$。"] end S1 --> U1 --> A1 --> TR1 --> A2 style U1 fill:#70DBFF,color:#000000,stroke:#33B5E5,stroke-width:1px style A1 fill:#52C41A,color:#000000,stroke:#389E0D,stroke-width:1px style TR1 fill:#FF4D4F,color:#000000,stroke:#D9363E,stroke-width:1px style A2 fill:#52C41A,color:#000000,stroke:#389E0D,stroke-width:1px

通过这种机制,大模型能够体现一定的能动性,感知外部环境、调度多种计算资源。

马克思主义认为,能动性(Agency)是人区别于一般物的自觉活动能力,在实践基础上能动地认识世界和改造世界。

在极为充分的Harness环境下,大模型体现了与人类极为相似的能动性,我们称这种组合体为Agent。

思考:Agent是否拥有主观能动性? 马原背疯了说是


1.3 处理机 (Harness)#

模型本身只提供接收一段上下文,返回一段文本或工具调用的接口,而用户面对的是网页、终端或编辑器。介于二者之间、负责把请求送出去并把结果取回来的程序称为 Harness。Harness 位于用户界面与模型之间,负责模型提供接口不做、但所有可以按预期自动化执行的任务。

以一次普通的对话为例,Harness 至少完成了以下工作:

  1. 拼装请求:保存历史消息,在每次请求时把系统提示词、历史消息与用户的新输入按顺序拼接为完整的上下文,并携带 API 密钥发送给模型接口。
  2. 接收与呈现输出:接收模型返回的纯文本,流式输出时逐字显示在界面上;其中的标记语言交由渲染器转换为富文本。
  3. 执行工具:当模型输出工具调用时,解析其中的工具名与参数,执行这些工具,并把执行结果作为新的上下文块写回历史。
  4. 管理上下文长度:历史消息过长时,对上下文进行截断或摘要。
  5. 处理异常与用量:网络中断后的重试、接口限速的处理、用量与费用的统计。

需要强调的是,Harness 不必提供工具调用功能(例如网页版对话界面也属于一种 Harness),但工具调用功能一定由 Harness 提供。

NOTE

Harness 一词的广泛使用出现于2026年,目前尚无正式的中文译名,各类资料中通常直接沿用英文原词。本文在行文中一律写作 Harness。

“处理机”一词仅用于辅助理解,指的是 Harness 所处的位置,即处理模型请求与输出的那一层,并非通用译名。

NOTE

在接口与用户之间的程序,在IT界也称为前端。但由于对大模型的自动流程控制已经成为一个活跃新生领域,所以有必要对这类对接用户和大模型标准接口的程序作特殊讨论。本文将使用大量篇幅介绍Harness的原理。


二、富文本#

从上个世纪电脑刚普及开始,人们对于想在文本中指出重点这件事上就一直非常努力。

纯文本虽然能够完成绝大多数信息的传递,但在日常办公、学术研究和网页排版中,仅靠纯文本难以展现清晰的结构与视觉效果。包含加粗、标题、列表、表格甚至更奢侈的复杂样式的文本,我们称之为富文本。

在AI时代,掌握如何用纯文本字符来表达排版格式即文本编码语法变得至关重要。因为大语言模型本质上只能输出纯文本字符串,它能且只能通过生成特定的格式控制语法,再由 Harness 交给渲染器将其转换为视觉丰富的富文本界面。


2.1 图形界面工具与办公软件#

在传统的办公环境中,我们最熟悉的是可视化图形界面(GUI)工具,例如 Microsoft Office和 WPS Office(包括其中的Word、PowerPoint、Excel)。这类工具采用所见即所得的模式,用户通过点击鼠标按键(如“加粗”、“设置字号”)来调整样式。点击功能按钮时,软件实际上将当前操作的文本/段落对应的数据结构进行修改。这个数据结构中包含了大量刻意对用户隐藏的配置和样式,这使得用户界面十分简洁易用,但也经常导致找不到某个选项来进行某种修改。“字符底纹”和“文本突出显示颜色”就是一对这样的例子。

我们无法展示Office的语法。它的语法不是一种语言,它们被层层压缩到文件中,纯文本基本无法描述Word文档。这样的工具也并不匹配大模型的工作逻辑。人类使用图形界面的高效在于手眼协调,而模型有更好的方式编写带格式的文本,而不是输入文本后低效地模拟人类进行格式设置。


2.2 HTML5#

HTML5(超文本标记语言,H5)负责定义网页的结构与内容(如段落、标题、图片、表格),而 CSS(层叠样式表)则负责定义内容的视觉呈现(如颜色、字号、布局、动画)。我们不需要学习它的完整语法,仅了解它的有限特性即可。它的表示类似于:

<section>
<h2>二级标题</h2>
<p><b>重点</b><i>区分</i><u>下划线</u></p>
<p style="font-size: 20pt; color: red">20磅 红色</p>
</section>

显示起来就是:

二级标题

重点区分下划线

20磅 红色

一方面,HTML/CSS是现代互联网排版的基石。互联网中几乎所有能看到的界面都可以通过它们实现。模型输出HTML/CSS代码,可以生成极其丰富且定制化程度极高的可交互界面。自然,几乎所有在Word文档中能做到的排版内容也都可以使用HTML/CSS实现。

另一方面,如上所示,HTML实现简单的语法依赖大量而繁琐的前后闭合标签,CSS依赖大量重复的关键词,这对上下文有限的大语言模型的理解上是不利的。模型生成冗长而繁琐的代码会消耗大量的Token,导致响应速度变慢,且还容易因少写一个闭合标签而导致排版错乱。因此,在不需要复杂专业场景时,通常不会直接让模型输出原始的 HTML/CSS。

它们常被市场宣传统称为“HTML5 技术”,以至于你可以使用”H5”来简称它。这默认包含了HTML5+CSS3。

这个内容块完全由HTML+CSS呈现

确切来说,是在Markdown内容中嵌入的HTML。按钮没有实际功能。


2.3 LaTeX#

LaTeX 是一种基于 Plain TeX 的排版系统,广泛应用于学术界、科研机构以及出版业。它能够精准处理高质量的文档排版,特别是在复杂数学公式的呈现上具有不可替代的优势。对于有数学任务,模型经常主动在输出中使用LaTeX表达式来表达数学公式。它的表示类似于:

\begin{cases}
\dfrac{-b \pm \sqrt{b^2 - 4ac}}{2a} \\[6pt]
s(x)=\displaystyle\int_0^x\sqrt{1+\left[y'(t)\right]^2}\,dt
\end{cases}

以上代码将渲染为:

{−b±b2−4ac2as(x)=∫0x1+[y′(t)]2 dt\begin{cases} \dfrac{-b \pm \sqrt{b^2 - 4ac}}{2a} \\[6pt] s(x)=\displaystyle\int_0^x\sqrt{1+\left[y'(t)\right]^2}\,dt \end{cases}

大模型在解答数学题或撰写学术论文时,会自动将推导过程中的公式用 LaTeX 标记输出。Harness的渲染引擎(如有,如MathJax或KaTeX)会自动将其转化为美观的公式图形。


2.4 Markdown#

Markdown 是一种轻量级标记语言,它允许人们使用极为易读易写的纯文本格式编写文档,然后转换成有效HTML来显示。由于其语法简单、占用的 Token 少、对模型极度友好,Markdown 已成为大模型默认的富文本输出标准。顺带一提,本博客使用 Markdown 进行写作。

Markdown 语言创造者 John Gruber 说:

Markdown 不是 HTML 的替代品,甚至远远不是。它的语法只覆盖 HTML 的一个很小的子集。

对于 Markdown 没覆盖的标记,你直接写 HTML 就行。

Daring Fireball: Markdown Syntax Documentation

关于Markdown的基础语法,网上已有大量极为成熟、阅读时间不超过五分钟的教程,本文不再作冗长介绍。

Markdown在发展过程中,不同的平台和软件对其语法进行了扩充,形成了多种方言(Dialects)。大模型有时会自发地使用其中的一种或多种常见方言:

GFM (GitHub Flavored Markdown)#

这是目前最流行的方言标准。在基础语法上增加了删除线(~~内容~~)、任务列表(- [x] 已完成)、自动链接以及表格支持。

LaTeX 数学公式#

使用单个美元符号 $ 包裹以绘制行内公式。例如 $E = mc^2$ 渲染为 E=mc2E = mc^2。 使用双美元符号 $$ 包裹以绘制块级公式,独占一行并居中。例如:

$$
\frac{-b \pm \sqrt{b^2 - 4ac}}{2a}
$$

渲染为

−b±b2−4ac2a\frac{-b \pm \sqrt{b^2 - 4ac}}{2a}

Mermaid 图表#

Mermaid 是一种纯文本驱动的可视化图表生成器,Harness 将 Mermaid 语言的代码块转换为 Mermaid 图表。它的表示类似于:

```mermaid
graph LR
A-->B
```

渲染为

graph LR A-->B

第一章中部分图表就使用Mermaid渲染。


三、命令行#

2026年初“小龙虾”爆火。圈外人也不知道为什么火,我圈内人也不知道为什么火。它既不万能也不无能,本质上还是个工具。我们上面已有工具调用的基础,再谈它的底层原理就是一句话:

“AI直接使用一台完整独立服务器命令行作为工具调用。”

等等,什么是命令行?

相比基于人类手眼协调操作所制作的图形界面软件,大模型更适合使用简洁明确的文本化交互方式来进行工作。好在,这种交互模式早已成熟且仍然存在。

2025年2月,Anthropic 发布了 Claude Code,这是一个直接在终端中运行的研究预览版 AI 编程工具,能够自主读代码、改文件、运行命令(1)。随后,OpenAI 的 Codex CLI(2025年4月)和 Google 的 Gemini CLI(2025年6月)相继发布。这三大 AI 实验室的产品发布,标志着“大模型直接使用命令行”作为一种主流产品范式的正式确立。它们都属于 Harness。


3.1 操作系统的命令行#

命令行是通过输入文本指令来控制计算机操作系统的界面。

  • Windows 操作系统:常见的命令行环境有 cmd(命令提示符)和 PowerShell。其中 PowerShell(pwsh) 功能更为强大,支持复杂的自动化脚本。
  • macOS / Linux 操作系统:使用的是基于 Unix/Linux 架构的终端(Terminal),默认的 Shell 环境通常为 bash 或 zsh。
TIP

Deepseek V4 pro 0813发布后被社区批评效果依赖特定环境。有反馈指出,该模型在 Linux 环境下表现正常,但在 Windows 上效果差。这被归因于模型对 Bash 语法的高度依赖,在 Windows 的 PowerShell 环境中,其在处理引号、斜杠等语法时会出现困难,严重污染上下文,导致 Agent 能力下降。

此处的“控制计算机操作系统”要回到电脑没有图形界面的年代去理解,一切操作是基于电脑没有可视化操作实现的,我们使用命令来进行所有基本操作,这包括创建删除修改查看文件和文件夹内容、以及运行各种命令行软件。

命令行上以字符为单位。在命令行上除了纯粹使用计算机执行的办公任务,没有什么“能玩”的东西。你能在命令行中看到分辨率最高的东西很可能是ascii艺术画。

要让大模型对电脑进行操作(读取文件等),使用人类的方式阅读屏幕、进行屏幕点击等模拟鼠标操作是极为低效的。进入2026年后,大模型训练普遍提高了“智能体”能力的训练权重,其中就包括对命令行操作的能力。


3.2 基本结构与约定规范#

注意:本文中,我们不系统性地学习所有命令,此处只做基本的命令结构常识介绍

在命令行中,一条完整指令通常由命令名称、选项/参数 和操作对象组成。我们仍然不需要学习各种命令的完整用法,也不需要背诵所有命令,仅了解它的有限特性即可。以 Linux/macOS 列出目录文件的命令为例:

Terminal window
ls -l -a /home/user
  • 命令:ls(list,列出目录内容)。
  • 选项:
    • -l - 使用长格式显示详细信息.
    • -a - 显示包含隐藏文件在内的所有文件.
    • 单个字母的参数通常以连字符 - 开头.
    • 多个字母的参数以双连字符 -- 开头,如大多数应用都提供 --help.
    • 多个单字母参数通常可以简写连写,如 -la.
  • 操作对象(Argument):/home/user,指定要操作的目标路径。

命令的输出示例
命令的输出示例

ls 是bash中最基础的用于查看目录下文件的命令。它和大量其他命令包括:

  • pwd - 显示当前所在的绝对路径
  • cd - 切换目录
  • ls - 列出目录内容
  • touch - 创建空文件或更新文件时间戳
  • mkdir - 创建目录
  • cat/less/more/head/tail - 以各种方式查看文件
  • cp - 复制文件或目录
  • mv - 移动或重命名文件/目录
  • rm - 删除文件或目录
  • rmdir - 删除空目录
  • find - 在磁盘上查找文件或目录
  • grep - 在文件内容中搜索文本
  • chmod - 修改文件权限
  • chown - 修改文件属主

等一同组成一组控制电脑的基本文件系统操作,大模型会频繁大量使用这些命令来与文件系统交互,如阅读和修改文件代码。

除了文件系统,还有如ps以各种方式查看进程等命令操作,但涉及较深操作系统相关知识,此处不再介绍。


3.3 Shell#

单条命令通常只完成一个动作,实际任务则需要若干动作按顺序配合。为此,命令行提供了一套用于组合与控制的符号。这些符号由 Shell 解释,而不是由被调用的程序解释。

  1. Shell 允许把一条命令的输出直接交给另一条命令作为输入,这称为管道(|),中间结果不经过屏幕。管道可以连续使用,形成一条处理链,每一环只负责一件事,这也是命令行软件普遍遵循的设计方式。

  2. Shell 允许改变一条命令的输入来源与输出去向,称为重定向,包括 > 将输出写入文件,>> 将输出追加到文件末尾,< 从文件读取输入,以代替键盘输入等。

  3. Shell 允许把多条命令写在一行中,称为命令的连接,如; 依次执行,前一条失败也继续,&& 在前一条执行成功时才执行后一条,|| 在前一条执行失败时才执行后一条。

  4. Shell 中可以使用 * 匹配任意长度的任意字符。如 *.md 表示当前目录下所有 Markdown 文件。使用 ? 匹配单个字符。

  5. Shell 中表示字符串时,双引号 "AA$NAME" 中的变量会被正常替换 AAuser,单引号 'AA$NAME' 中的内容一律按字面处理 AA$NAME,反斜杠 \ 可以使其后的任意单个字符失去特殊含义,此反斜杠本身不会展示,可以使用 \\ 表示反斜杠本身(转义自身)。路径或文件名中含空格时需要用引号包裹。

  6. 变量替换与命令替换让一条命令的输出成为另一条命令的组成部分。$HOME、$PATH 等环境变量写在命令中,由 Shell 替换为具体值。$(命令) 先执行括号内的命令,再把输出拼接进当前位置。

  7. 以 # 开头的部分为注释,Shell 不会执行。

示例:

Terminal window
LOG=/var/log/nginx/access.log
OUT=$HOME/nginx_report
mkdir -p "$OUT" && # 创建目录;成功才继续
echo "开始 $(date)" > # 输出开始时间,重定向到
"$OUT/report.txt" || # 报告文件;如果前面失败
echo "创建目录失败" >> # 记录错误到
/tmp/nginx_report.err # 错误文件
grep ' 500 ' "$LOG" | # 筛选 500 错误
awk '{print $1}' | # 提取第一列 IP
sort | # 排序
uniq -c | # 去重并计数
sort -nr > # 按次数降序排序,并重定向到
"$OUT/500_ips.txt" # 结果文件
wc -l < # 从文件读取输入,统计行数
"$OUT/500_ips.txt" >> # 输入文件;追加到
"$OUT/report.txt" # 报告文件
cd "$OUT" || # 进入输出目录;失败则
exit 1; # 退出;然后依次执行
tar -czf 500_ips.tgz 500_ips.txt report.txt # 打包结果文件
echo "结束 $(date)" >> # 追加结束时间到
"$OUT/report.txt" # 报告文件

实际上模型更可能输出这样的命令:

Terminal window
DIR=/tmp/shell_demo; FILE="$DIR/report.txt"; mkdir -p "$DIR" && echo "开始 $(date)" > "$FILE" || echo "初始化失败 $(date)" >> /tmp/shell_demo_error.log; grep -v '^#' < /etc/hosts | sort | uniq > "$DIR/hosts.txt"; wc -l < "$DIR/hosts.txt" >> "$FILE"; echo "完成 $(date)" >> "$FILE"

用于极为复杂的单次自动化操作。

以上关于Shell语法的内容作为拓展掌握,掌握后我们可以基本识别模型对电脑进行的操作大意。

NOTE

以上符号只对 Shell 有意义。Harness 执行命令时,需要把整条命令交给 Shell 解释(通常写作 bash -c "..."),而不是把第一个词当作程序名直接启动;否则 |、> 会被当作普通参数传给程序。命令行之所以难以被单个工具调用替代,原因也在这里。


3.4 命令行软件#

除了操作系统自带的基础命令外,开发者和用户还会安装各种命令行软件来完成特定任务。

这些软件提供了复杂的功能,如 curl(网络请求工具)、git(代码版本控制工具)、ffmpeg(音视频处理工具)、markitdown(二进制文件转文本工具)、甚至 python 这种家喻户晓的编程语言本身,在没有外部封装的情况下也是需要使用命令行调用的。它们同样完全使用命令行进行操作,而且是相当一部分图形界面软件内部调用的基础组件。

大模型可以通过上一章提到的工具调用能力,将复杂的业务需求转化为一行具体的 CLI 工具命令并交给 Harness 执行。例如:

Terminal window
ffmpeg -i input.mp4 -vn -acodec libmp3lame output.mp3

模型通过输出上述命令,直接将一段视频文件中的音频提取为 MP3 格式。

NOTE

大多命令行应用的反馈是输出简单的一串文本,但有一部分命令行应用提供复杂的命令行界面。它们或是受复杂的功能所限,在运行时可能需要同时显示大量信息如 vim(常说的大神编辑器);或是专门提供特殊的功能,如 tail -f 用于动态跟踪文件更改;或是单纯用于提供图形化体验,如 cacaplay 用于使用ascii艺术播放视频。这些命令行界面应用对人类友好,但对大模型的交互并不友好,一般来说大模型也用不上这些工具。

命令行界面也有表述:

  • CLI (Command-Line Interface) - 命令行界面
  • TUI (Terminal User Interface) - 终端用户界面

3.5 命令输出与控制流#

任何软件在退出后都会输出一个退出状态码。退出状态码(Exit Code)是程序执行结束后向系统返回的一个整数数值。按通用约定,退出码为0表示执行成功,非 0 的值(如 1, 127 等)表示出现了某种异常或错误。

不考虑复杂的命令行控制,软件还可以以纯文本的形式向两个特殊的文件标准输出(stdout)和标准错误(stderr)去输出文本。一般地,程序正常运行产生的结果文本将输出到标准输出,也就是命令行所看到的标准输出。程序运行失败时返回的错误原因或警告日志会输出到标准错误。这两个输出也是 Harness 执行命令后向模型发送的主要内容。通常我们在编程语言中学习各种print,其本质就是向标准输出输出了文本。

大模型在调度命令行时,Harness 会捕获命令的标准输出、标准错误和退出状态码并拼接到上下文中。模型通过阅读这些输出文本,能够判断命令是否执行成功,若执行成功,模型继续推进下一步任务。若报错(Exit Code ≠\neq 0),模型会读取错误日志(stderr),在下一个回合中自主修改命令参数并重新尝试,实现自我纠错与自动化控制。


四、智能体 (Agent)#

让模型自动地完成所有任务的模糊概念在2023年就有出现,但由于当时及其后的模型的智能和上下文不足、Harness 的概念不够完善导致模型出现无法有效进行工具调用、无法有效循环等问题。

2026年2月5日,Mitchell Hashimoto 的博客My AI Adoption Journey,正式提出了 “Harness Engineering” 这一术语。其核心理念是“每当 AI 犯错,就工程化一个方案让它不再犯同样错”,即通过构建外部系统来引导和修正模型行为。这为后来“Harness”作为模型之外一切控制机制的总和奠定了概念基础。

 Agent = Model + Harness \text{ Agent = Model + Harness }将“Harness”定义为模型权重之外的一切,包括系统提示词、工具调度、上下文管理、权限控制、错误恢复等所有工程化组件。


4.1 工作循环#

智能体(Agent)是由大语言模型与具备工具执行能力的 Harness 组合而成、能够在无需人工干预的情况下连续完成多步任务的系统。

单次工具调用的具体过程已经在1.2节有所介绍:模型输出工具调用,Harness 执行该调用,执行结果被写入上下文,模型据此生成回答。智能体与这一过程的区别在于,目标未必是“回答用户的问题”,而是在修改、运行、测试的工具调用循环中得到一个目标完成的结果,工具调用过程会被反复执行,直到满足终止条件为止。

%%{init: {"themeVariables":{"actorBkg":"#70DBFF","actorBorder":"#33B5E5","actorTextColor":"#000000"}}}%% sequenceDiagram actor U as 用户 participant H as Harness participant M as 模型 Note over H: 创建空上下文 Note over H: 注入系统提示词 U->>H: 任务说明 Note over H: 注入用户任务说明 loop H->>+M: 上下文 Note over M: 模型决策输出 M->>-H: 输出文本或工具调用<br>包括阅读修改测试等 alt 进行任务时<br>返回工具调用 M->>H: 工具名与参数 Note over H: 执行工具调用 Note over H: 注入工具调用结果 else 完成任务时<br>输出文本 M->>H: 任务完成回答 Note over H: 结束 end end H->>U: 任务完成回答

单个循环由三个环节构成:

  1. 模型决策输出:模型读取 Harness 提供的上下文,模型运行,输出文本或工具调用。
  2. 执行工具调用:Harness 将工具调用格式识别为对文件系统、命令行或网络接口等的实际操作,运行并收集其输出。
  3. 注入工具调用结果:将执行结果作为新的上下文块(即工具调用结果上下文)追加到消息历史中,成为下一次决策的输入。

模型不保存状态。每次续写都是一次独立的调用,输入为上下文,输出为文本或工具调用。所谓“聊天记录”,实际来源是 Harness 每一轮重新提交的完整历史。上下文是系统中唯一的状态载体。

上下文长度是有限资源。随着轮次增加,历史消息不断累积,接近最大上下文的同时每轮的费用均会上升。为提高长线任务时长,主流 Harness 会采取窗口法或压缩法保证上下文不超过上下文最大长度。

  • 窗口法:直接丢弃最早的若干轮消息,可能造成模型上下文行为的混乱。窗口法下任务循环不会暂停,开销较为稳定,适合连续简单机械任务的场景。在连续稳定结构的上下文示例下,模型也会产出更稳定的输出。
  • 压缩法:将消息历史总结为摘要。总结过程由一次模型请求完成。总结时,Harness 对上下文附加一个总结要求,然后将当前的完整上下文和要求发给模型,获取模型对上下文的总结摘要,再挑选上下文中其余必要的部分,组成一个新的上下文作为新一轮的上下文。压缩法会产生一次额外的模型请求,但在有效的降低成本和流程接续效果下无疑是值得的。

正常情况下,当模型不再输出工具调用、用户主动中断、循环达到 Harness 预设的步数或时间上限时,循环将终止。但如模型 API 无响应这类可能导致工作运行异常,但有可能修复的问题,Harness 有责任进行处理(如限制重试次数地重试调用模型请求)。


4.2 能力边界#

智能体的能力由模型、Harness 和工具条件共同决定,任何一方不足都会导致任务无法完成。

模型能力不足时,智能体可能:

  • 无法理解工具调用,完全无法做到有效的事件循环。
  • 进行基础的工作,但缺乏测试甚至陷入循环无法交付。
  • 在遇到问题时,无法给出有效的解决方案,错误将问题归因后结束循环
  • 能完成测试等循环逻辑,但循环极长导致大量循环消耗。
  • 使用较差的方法解决问题,可能产生各种额外问题需要解决。
  • 能完成任务,但无法充分理解任务隐含情境导致结果不佳。

Harness 或工具能力不足时,智能体可能:

  • 没有有效的完成工作途径。目标在框架下未被提供转化为现实的充分根据和必要条件。
  • 因工具说明不足频繁导致问题,提供的工具被模型认为“不好用”。或花费大量时间测试 Harness 提供的工具是否有效。
  • 上下文管理不当导致模型遗忘初始任务、陷入死循环或超出 Token 限制。
  • 导致沙箱逃逸,向模型泄露隐私和不安全接口。
CAUTION

Agent 的可执行范围等同于其获得的权限。获得 shell 权限的 Agent 可以删除文件系统中的文件;获得浏览器控制权的 Agent 可以使用当前已登录的账号执行操作;持有 APIKey 的 Agent 可以产生费用。

Harness 通常会在系统提示词中写入限制性条款,但系统提示词属于文本约束,而非权限机制。对危险操作的约束应由沙箱、路径白名单、执行前确认等工程手段实现。


4.3 模型的接入#

接入一个模型需要三类信息:

  1. 接口地址(BaseUrl):模型服务的请求地址。每个服务商的每种格式接口地址通常固定。
  2. API 密钥(APIKey):调用者的身份凭证,通常为 sk- 开头的一串字符。
  3. 模型标识(model id):用于指定实际调用的模型。同一平台通常提供多个模型,其能力与价格各不相同。

模型接口目前主要有四种协议:Chat Completions API, Anthropic Messages API, Google API, Responses API

协议提出方说明
Chat Completions APIOpenAI出现最早,为绝大多数平台默认提供
Anthropic Messages APIAnthropicClaude 系列模型使用的协议,Claude Code 默认使用
Google Gemini APIGoogleGemini 系列模型使用的协议
Responses APIOpenAI较新的接口格式,Codex 默认使用

接口地址通常随协议而异。以 Deepseek 为例,官方提供Chat Completions API, Anthropic Messages API 和 Responses API. 三种接口均在官方文档中说明,分别为

https://api.deepseek.com/chat/completions
https://api.deepseek.com/anthropic
https://api.deepseek.com

首次调用 API, 使用 Anthropic API, 使用 Responses API

API 密钥的价值等同于账户的支付权限,不应写入公开的代码仓库、截图或聊天记录。密钥一旦泄露,应立即在服务方后台吊销并重新签发。

模型的提供方可分为三类:

  1. 官方直连:由模型所有者直接提供,稳定性最好,价格最高。
  2. 聚合与中转:转发请求或转售套餐额度。此类服务的价格可能高于或低于官方,使用前应确认其来源与计费方式。
  3. 来源不明的渠道:价格显著低于官方,存在额度来源不明、以低能力模型冒充高能力模型等风险,除非运营商可识别且可信,否则不建议在正式工作中使用。

模型按 token 计费,输入与输出分别定价,输出的单价通常高于输入。此外,上下文在每一轮循环中都会被重新提交,其中的重复部分会被重复计费。多数平台对前缀完全相同的重复请求提供缓存折扣,Harness 因此通常将系统提示词固定在上下文开头。

模型调用时,至少需要提供模型标识以指明本次将调用的具体模型。对于 Harness 而言,也需要提供上下文窗口和单次最大输出 token 用以对上下文进行控制。部分支持思考强度自定义的模型也可以选择输入此次回答的思考强度档位。


4.4 Harness#

Harness 位于用户界面与模型之间,负责模型没有做、用户也不应亲自去做的事。网页版对话界面对应的也是一种 Harness,其区别在于未向模型提供任何工具。

按交互形态,Harness 可分为三类:

  1. GUI(图形用户界面):以网页或桌面应用的形式提供,使用门槛最低。
  2. CLI / TUI(终端用户界面):在终端中运行,便于与命令行工具配合使用。
  3. IDE(集成开发环境):以编辑器插件的形式提供,面向代码相关工作。

部分产品同时提供多种形态,支持 TUI 的产品通常也可以嵌入 VSCode 等编辑器。常见 Harness 见于下表。

名称提供方说明
CursorAnysphereIDE形态,面向编程任务
Claude CodeAnthropicTUI为主要形态,面向编程任务
CodexOpenAITUI与GUI,面向通用任务
Cherry Studio上海千彗GUI,面向万能向的产品
Trae字节跳动IDE形态,国内较早期产品
OpenCode开源社区TUI与GUI,开源,可接入多家模型供应商
ZCode智谱GUI,国内较成熟产品
DSHDeepSeekGUI,仍在测试阶段,提供插件扩展机制

该表仅列出较有代表性的产品,同类产品仍在不断增加。各模型厂商大多会自行开发一款 Harness,其原因之一是模型的 Agent 能力训练本身就需要一个稳定的 Harness 环境。由于不同 Harness 在工具定义与上下文管理策略上存在差异,同一模型在不同 Harness 上的表现也会有所不同,一般匹配模型的厂商的 Harness 效果更好。选择 Harness 时应以使用场景为依据,上述和本表未列出的其他常见 Harness 绝大多数都具备完善的命令行、循环等机制,在考虑所有模型的情况下效果不分伯仲。本节不对具体产品作优劣评价。


4.5 工具、MCP 与 SKILL#

WIP…

NOTE

命令行是最通用的工具接口。绝大多数提供命令行调用方式的软件,模型都可以通过 shell 直接调用,无需专门适配,是“操作操作系统的工具”。这也是第三章先行介绍命令行的原因。


4.6 常见工作区约定#

特殊文件:AGENTS.md 与 CLAUDE.md 会自动进入上下文。

WIP…

结语#

本文原稿由AI生成,由人类大幅修改(修改部分大于50%)。

展示工作量.jpg
展示工作量.jpg

AI时代通识课: 大模型应用
https://blog.emumu.xyz/posts/2026-08-23-00/
作者
月宮絵夢
发布于
2026-08-24
许可协议
CC BY-NC-SA 4.0
Loading...