AI 基础概念介绍
总览
- 人工智能系统分为三个级别:大型语言模型 (LLM)、人工智能工作流(AI Workflows)和人工智能代理(AI Agents),每个级别代表着不断增加的自主性和复杂性。
- LLMs: 这些模型根据用户提示生成响应(Input → Output),但缺乏自主性或独立行动的能力。
- AI Workflows: AI Workflow 使用预定义逻辑自动执行重复性任务(Input → Predefined Path → Output),虽然提高了效率,但缺乏针对创造性或动态场景的灵活性和适应性。
- AI Agents 是最先进的,能够独立推理、行动和迭代以实现复杂的目标(Goal → Reason → Act → Iterate → Final Output),并且有检索增强生成 (RAG) 和 ReAct 等框架加持。
基础概念
AI 中的流式响应
流式响应允许 AI 系统在计算响应的同时逐步生成并显示输出。系统无需等待整个响应生成后再显示,而是在 chunks 数据(tokens)准备就绪时发送它们。此功能使交互感觉更流畅、更自然,就像进行真实的对话一样。
流式响应是如何工作的
Token-by-Token Generation
LLM 每次生成一个 token。一个 token 是文本的一个单位,可以是:
- 一个词(例如“happy”)
- 单词的一部分(例如“happiness”中的“happ-”)
- 单个字符(例如“a”或标点符号“,”)。
当用户提交查询时,LLM 会开始按顺序生成tokens。第一个 token 生成后,会立即发送到客户端界面,并持续执行该过程,直到完整响应完成。这种 token 的增量交付构成了流式响应的基础。
Streaming APIs
大多数 LLM 支持通过专用 API 进行流式传输。例如,OpenAI 的 API 包含一个stream
参数,允许客户端接收实时 tokens 流,而无需等待完整的响应。具体流程如下:
- 步骤 1:客户端向启用流式传输的服务器发送查询。
- 第 2 步:服务器处理输入并开始生成 token。
- 步骤 3:tokens 准备好后,会以 chunks 的形式逐个发送给客户端。
- 步骤4:客户端实时将每个块附加到显示屏。
这让用户产生了人工智能正在“输入”回应的错觉。
客户端实时渲染
在客户端,应用程序被设计为立即渲染接收到的 tokens 或 chunks。例如:
- 一旦收到新的 tokens,Web 应用程序可能会立即更新用户界面。
- 基于终端的程序可能会将每个标记直接刷新到输出流,以实现实时“打字”效果。
支持流媒体的关键技术
多种核心技术共同作用,使流式响应成为可能:
服务器发送事件(SSE)
服务器发送事件 (SSE) 是一种协议,允许服务器通过单个 HTTP 连接实时向客户端推送更新。每块数据都作为单独的事件发送。
以下是 SSE 实际运行的一个示例:
data: Hello |
每个data
字段代表客户端可以立即显示的响应块。
WebSockets
WebSocket 在客户端和服务器之间提供双向通信通道,这对于流式传输尤其有用。虽然 WebSocket 在简单的文本流式传输中并不常见,但它们通常用于更复杂的实时应用程序,例如协作编辑器或实时仪表板。
异步编程
像 Pythonasyncio
或 JavaScript 这样的异步编程框架Node.js
对于高效处理流式传输至关重要。这些框架使服务器能够:
- 同时处理多个客户端请求。
- 将令牌发送给客户端,而不会阻止后续令牌的生成。
LLM 中的流程优化
通过 LLM 中高度优化的架构和解码策略,可以实现流式传输:
Transformer 架构
LLM 采用 Transformer 架构,该架构并行处理输入,但按顺序生成输出。每个 token 都根据前一个 token 的上下文进行预测,从而实现流畅的生成流程。
解码策略
LLM 依赖以下策略:
- 定向搜索:生成多个潜在序列并选择最可能的序列。
- 采样:引入随机性以产生不同的响应。
- Top-k 采样或核心采样:通过将标记选择限制在最有可能的候选范围内来平衡质量和创造力。
这些策略确保有效生成标记,同时保持一致性和相关性。
代码示例
以下是如何使用 Python和 Java 实现流式响应的示例:
Python 示例
import openai |
Java 示例
import java.io.BufferedReader; |
流式响应的好处
更快的感知响应时间
即使响应时间较长,用户也能立即看到结果,从而创造更流畅的体验。
增强互动性
实时反馈使互动更具活力,更具对话性。用户可以在回复过程中中断或调整查询。
高效的资源利用
流式传输避免了将整个响应保存在服务器或客户端的内存中,从而减少了资源使用。
流式响应的挑战
- 网络延迟:缓慢或不稳定的连接可能会破坏实时体验。
- 错误处理:确保从中断或 tokens 生成失败中正常恢复需要谨慎实施。
- 复杂性:实现流式响应会增加服务器端和客户端代码的复杂性。
Reasoning vs Standard Models
推理模型将任务分解为清晰的步骤并遵循逻辑线进行,而标准模型则倾向于一步快速给出答案。推理模型可能会写下简短笔记、检查每一条笔记,然后将它们组合起来以得出最终回复。这种方法有助于解决数学问题、规划行动,并能发现简单的模式匹配可能会错过的错误。标准模型依赖于其在训练期间学到的模式,并经常猜测下一个最可能的词语。这在日常聊天、总结或常见事实查询上表现良好,但在处理复杂谜题或多环节关联的任务时可能会失败。虽然推理需要更多时间和计算资源,但它带来了更高的准确性,并使得智能体更易于调试,因为可以看到它的思考步骤。许多新型AI智能体结合了这两种方式:对于简单部分使用快速模式回忆,而在需要深入思考的目标上切换到逐步推理。
ReAct 是什么?
ReAct(Reason + Act) 是一种范式,它使大型语言模型 (LLM)能够通过自然语言推理和操作来解决复杂任务。它允许LLM执行某些操作,例如检索外部信息,然后基于检索到的数据进行推理。将推理和行动的进展相结合,使语言模型能够解决各种语言推理和决策任务。在推动更大规模的语言模型和微调更小型的语言模型时, Reason+Act(ReAct)范式系统性地优于单纯的推理和行动范式。推理与行动的紧密结合也呈现出与人类一致的任务解决轨迹,从而提高了可解释性、可诊断性和可控制性。
ReAct 概述
ReAct 使语言模型能够以交错的方式生成言语推理轨迹和文本动作。虽然动作会引发来自外部环境(下图中的“Env”)的观察反馈,但推理轨迹不会影响外部环境。相反,它们会通过推理上下文并使用有用的信息更新模型来影响模型的内部状态,以支持未来的推理和行动。
ReAct 效果
比较四种提示方法:(a) 标准提示法、(b) 思路链(CoT,仅推理)、(c) 仅行动提示法和 (d) ReAct 提示法,用于解决HotpotQA问题。图中省略了上下文示例,仅显示任务轨迹。ReAct 能够检索信息以支持推理,同时还能利用推理来确定下一步检索的内容,展现了推理与行动的协同作用。
相关资源
Fine-tuning vs Prompt Engineering
微调和提示词工程是从语言模型中获得更佳输出的两种方法。微调意味着使用特定领域数据进一步训练现有模型,使其适应特定任务。需要额外的数据、计算能力和时间,但可以创建深度专业化的模型。相比之下,提示词工程保持模型不变,专注于在提示本身中设计更好的指令或示例。当没有可用的自定义数据时,它更快、更便宜、更安全。微调适用于深度领域需求;提示词工程适用于快速控制和原型设计。
Embeddings and Vector Search
向量嵌入(Vector Embeddings)是机器学习中的概念之一。它们在许多自然语言处理(NLP)、推荐系统和搜索算法中都处于核心地位。
机器学习算法与大多数软件算法一样,需要以数字作为输入来进行工作。有时候我们的数据集包含可以直接使用的数值列,或者可以转换为数值的字段(例如序数型、类别型等)。而另一些时候,我们则会遇到像整篇文本这样的抽象信息。对于这类数据,我们会创建向量嵌入——即一组数字列表,以便对这些数据执行各种操作。一个完整的段落,甚至是任何其他对象,都可以被压缩成一个向量表示。即使是原本就是数值类型的数据,也可以转化为向量形式,从而更便于后续操作。
但向量之所以如此有用,还在于它们具有一些特殊的特性。这种表示方式使得我们可以将人类感知到的语义相似性转化为向量空间中的接近程度。换句话说,当我们把现实世界中的物体和概念——例如图像、音频录音、新闻文章、用户画像、天气模式——表示为向量嵌入时,这些物体和概念之间的语义相似性就可以通过它们在向量空间中作为点的接近程度来量化。因此,向量嵌入表示非常适合用于聚类、推荐和分类等常见的机器学习任务。
例如,在聚类任务中,聚类算法会将相似的点分配到同一个簇中,同时尽可能让不同簇中的点保持不相似。在推荐任务中,当需要为一个未见过的对象做推荐时,推荐系统会寻找与该对象最相似的对象,这种相似性是通过它们在向量嵌入空间中的相似性来衡量的。在分类任务中,我们会根据与该未知对象最相似的那些对象的标签进行多数投票,从而确定其类别。
- 相似性(Similarity):通过计算两个向量之间的距离,我们可以衡量两个单词(或图像或任何其他嵌入项目)的相似程度。向量越接近,项目越相似。
- 类比(Analogy):向量嵌入可以捕捉复杂的关系。经典的例子是:”国王”-“男人 “+”女人”≈”王后”。 这是因为 “king”(国王)和 “man”(男人)之间的向量差异大致代表了 “royalty”(王室)的概念,而 “man”(男人)和 “king”(国王)之间的向量差异则使我们接近 “queen”(王后)。
- 聚类(Clustering):具有相似含义的单词(或其他项目)自然会在嵌入空间中形成聚类。 这一特性对于主题建模或文档分类等任务非常有用。
- 维度(Dimensionality):虽然我们无法将高维空间可视化,但向量嵌入的多个维度使其能够同时捕捉意义的多个方面。 一个维度可能与大小有关,另一个维度可能与灵性有关,还有一个维度可能与积极性有关,等等。
Creating Vector Embeddings
创建向量嵌入的一种方法是使用领域知识来设计向量的数值,这种方法被称为特征工程(feature engineering)。例如,在医学影像中,我们会利用医学专业知识来量化图像中的一组特征,如形状、颜色和区域等,以捕捉其语义信息。然而,进行向量嵌入的特征工程需要特定领域的知识,并且在大规模数据上实施起来成本过高。因此,我们通常不会手动设计向量嵌入,而是训练模型来自动生成对象的向量表示。深度神经网络(Deep Neural Networks)是一种常用的工具,用于训练这类生成嵌入的模型。所生成的嵌入通常是高维(最高可达两千维)且稠密(所有值都不为零)的向量。
对于文本数据,像 Word2Vec、GLoVE 和 BERT 这样的模型可以将词语、句子或段落转化为向量嵌入。
Word2Vec
使用浅层神经网络学习单词嵌入。 它有两种风格:
跳格(Skip- gram):根据目标词预测上下文词。
连续词袋 (Continuous Bag of Words, CBOW): 根据上下文预测目标词
Word2Vec 在大型文本库中进行训练,学会根据上下文预测单词。通过这一过程,它可以开发出向量表征,捕捉词与词之间的语义关系。
GloVe (Global Vectors for Word Representation)
与预测模型 Word2Vec 不同,GloVe 是一种基于计数的模型。它通过对词语的共现矩阵进行降维处理来创建词语嵌入。GloVe 可捕捉本地上下文(如 Word2Vec)和全局语料库统计数据。
BERT(来自变换器的双向编码器表示法
BERT 代表了 NLP 领域的一大进步。它使用转换器架构来生成上下文关联的单词和文档嵌入。这意味着一个单词的嵌入可以根据周围的语境发生变化,从而实现更细致入微的表述。
这些模型是在海量文本语料库中训练出来的,通常包含数十亿个单词。通过训练过程,它们学会预测单词或上下文,并在此过程中开发出丰富的语言表征,以捕捉语义和句法关系。
流行的 ChatGPT 聊天界面(由 GPT-4 支持)使用的嵌入与 BERT 等模型产生的嵌入类似,这意味着它可以创建上下文化的单词和文本表示。
对于图像数据,可以通过卷积神经网络(CNNs)来生成嵌入,例如 VGG 和 Inception 等模型。
- VGG、ResNet、Inception:这些都是用于图像分类的流行 CNN 架构。虽然这些网络的主要用途是分类,但其倒数第二层也可用作嵌入。这一层通常捕捉图像的高级特征。
- 连体网络(Siamese Networks):用于生成专门用于比较图像的嵌入。它们在成对图像上进行训练,学习为相似图像生成相似的嵌入,为不同图像生成不同的嵌入。
对于音频数据,可以通过对音频频率的可视化表示(例如频谱图 Spectrogram)应用图像嵌入技术,将其转换为向量形式。
Example: Image Embedding with a Convolutional Neural Network
考虑以下示例:原始图像以灰度像素的形式表示。这相当于一个由 0 到 255 范围内的整数组成的矩阵(或表格),其中值 0 表示黑色,255 表示白色。下图展示了一张灰度图像及其对应的矩阵。
左侧子图描绘了灰度像素,中间子图包含了像素的灰度值,最右侧子图定义了矩阵。请注意,矩阵中的值定义了一个向量嵌入,其第一个坐标是矩阵的左上角单元格,然后从左到右排列,直到最后一个坐标对应于矩阵的右下角单元格。这种嵌入方式在保持图像中像素邻域的语义信息方面表现出色。然而,它们对诸如平移、缩放、裁剪和其他图像处理操作等变换非常敏感。因此,这些原始嵌入通常被用作输入,用于学习更鲁棒的嵌入表示。
卷积神经网络(CNN 或 ConvNet)是一类常用于视觉数据处理的深度学习架构,可以将图像转换为嵌入。CNN 通过分层的小型局部输入(称为“感受野”)来处理输入数据。每一层中的每个神经元都会处理前一层的一个特定感受野。每层要么对感受野进行卷积操作,要么执行缩小输入尺寸的操作,即所谓的“下采样”。
下图展示了一个典型的 CNN 结构。注意每层中以小方块形式展示的感受野作为前一层中单个神经元的输入。同时注意到,下采样操作会减小层的大小,而卷积操作则会扩展层的大小。最终的向量嵌入是通过全连接层获得的。
训练网络权重(即嵌入模型)需要大量带标签的图像。在训练过程中,权重会被优化,使得具有相同标签的图像在嵌入空间中彼此更接近,而不同标签的图像则尽可能远离。
一旦我们训练好了 CNN 嵌入模型,就可以将图像转换为向量,并使用K-近邻索引(K-Nearest Neighbor Index)进行存储。现在,当遇到一张新的、未见过的图像时,我们可以用 CNN 模型将其转换为向量,然后检索出与其最相似的 k 个向量,从而找到对应的相似图像。
虽然我们以上面的例子说明了图像和 CNN 的应用,但事实上,向量嵌入可以为任何类型的数据创建,并且有多种模型或方法可用于生成这些嵌入。
Using Vector Embeddings
嵌入之所以非常有用,是因为它们可以将一个对象表示为包含其语义信息的稠密向量,这使得嵌入在各种机器学习应用中都具有广泛的适用性。
相似性搜索是向量嵌入最流行的应用之一。像 KNN(K-最近邻)和 ANN(近似最近邻)这样的搜索算法需要我们计算向量之间的距离来判断它们的相似性,而向量嵌入正好适合用于这类距离计算。反过来,最近邻搜索又可以应用于诸如去重、推荐、异常检测、反向图像搜索等任务。
即使我们在某个应用中没有直接使用嵌入向量,许多流行的机器学习模型和方法在其内部也依赖于嵌入。例如,在编码器-解码器架构中,编码器生成的嵌入包含了供解码器生成输出结果所需的全部信息。这种架构被广泛应用于机器翻译、图像描述生成等场景中。
相关资源
Understand the Basics of RAG
RAG 是 Retrieval-Augmented Generation(检索增强生成)的缩写,它是一种通过让语言模型在回答前先进行信息检索,从而提供更准确答案的方法。首先,系统会将用户的提问转化为搜索查询,并扫描知识源(例如一组文档或数据库)。然后,系统会返回最相关的段落,这些段落被称为“检索结果”。接下来,语言模型会阅读这些检索结果,并结合自身的训练知识来生成最终答案。这种搜索与生成相结合的方式,有助于模型保持信息的及时性,减少猜测,并引用真实的事实。由于可以根据需要添加外部信息,RAG 通常不需要大量微调,就能处理基础模型在训练时从未接触过的话题。
RAG 的工作原理
Model Context Protocol (MCP)
Function Calling、AI Agent、MCP 这三者之间有什么区别?
Function Calling
- Function Calling 指的是 AI 模型根据上下文自动执行函数的机制。
- Function Calling 充当了 AI 模型与外部系统之间的桥梁,不同的模型有不同的 Function Calling 实现,代码集成的方式也不一样。由不同的 AI 模型平台来定义和实现。
如果我们使用 Function Calling,那么需要通过代码给 LLM 提供一组 functions,并且提供清晰的函数描述、函数输入和输出,那么 LLM 就可以根据清晰的结构化数据进行推理,执行函数。
Function Calling 的缺点在于处理不好多轮对话和复杂需求,适合边界清晰、描述明确的任务。如果需要处理很多的任务,那么 Function Calling 的代码比较难维护。
Model Context Protocol (MCP)
- MCP 是一个标准协议,如同电子设备的 Type C 协议(可以充电也可以传输数据),使 AI 模型能够与不同的 API 和数据源无缝交互。
- MCP 旨在替换碎片化的 Agent 代码集成,从而使 AI 系统更可靠,更有效。通过建立通用标准,服务商可以基于协议来推出它们自己服务的 AI 能力,从而支持开发者更快的构建更强大的 AI 应用。开发者也不需要重复造轮子,通过开源项目可以建立强大的 AI Agent 生态。
- MCP 可以在不同的应用/服务之间保持上下文,从而增强整体自主执行任务的能力。
可以理解为 MCP 是将不同任务进行分层处理,每一层都提供特定的能力、描述和限制。而 MCP Client 端根据不同的任务判断,选择是否需要调用某个能力,然后通过每层的输入和输出,构建一个可以处理复杂、多步对话和统一上下文的 Agent。
AI Agent
- AI Agent 是一个智能系统,它可以自主运行以实现特定目标。传统的 AI 聊天仅提供建议或者需要手动执行任务,AI Agent 则可以分析具体情况,做出决策,并自行采取行动。
- AI Agent 可以利用 MCP 提供的功能描述来理解更多的上下文,并在各种平台/服务自动执行任务。
MCP Server 的工作原理
MCP 的主要工作是描述 Server 提供了哪些能力(给 LLM 提供),需要哪些参数(参数具体的功能是什么),最后返回的结果是什么。只是一个具有共识的协议