DLAI-Llama4-应用构建笔记-全-

DLAI Llama4 应用构建笔记(全)

001:课程介绍与概述 🚀

在本节课中,我们将学习吴恩达《基于 Llama 4 的应用构建》课程的第一部分。我们将了解 Llama 4 模型家族的核心特性、新发布的工具,以及本课程的学习目标。

欢迎来到《基于 Llama 4 的应用构建》课程。本课程由 Meta 的 AI 团队工程总监 Amin Sanghani 与 Meer 和 Toy 合作创建。Llama 系列开源模型已经帮助全球众多开发者构建了 AI 应用。

现在,借助 Llama 4 的专家混合模型,您会发现部署比以往更加容易。您还可以通过处理多张图像来实现更先进的多模态理解,甚至执行图像定位任务。新的 Llama 4 模型还拥有更大的上下文窗口,例如 Maverick 模型支持 100 万令牌,而 Scout 模型则支持高达 1000 万令牌,这对于分析大型代码库等任务非常有用。

最后,您将了解随 Llama 4 一同发布的新软件工具,即用于优化提示词和生成合成数据的工具。

确实如此,Andrew。Llama 4 现在提供了原生多模态模型,并在我们的 Scout 模型中支持真正长达 1000 万令牌的上下文。

在本课程中,您将通过 Meta 的官方 API 以及其他推理提供商,获得使用 Llama 4 的实践经验。您将构建能够推理视觉内容、检测物体并精确回答图像定位问题的应用程序。

接下来,您将学习如何利用长上下文处理整本书籍和研究论文,而无需对数据进行分块处理。Meta 还推出了 Llama Tools,这是一个不断增长的开源工具集合,旨在帮助开发者利用 Llama 模型构建更强大的应用。

在本课程中,您还将使用两个最新的 Llama 工具进行构建。首先是 Llama 提示优化器,它能自动改进您的提示词。其底层使用了 DSPy 优化器。您需要在包含问题和期望回答的数据集上指定一个评估指标,提示优化器将根据该指标自动优化您的提示词。

其次将是 Llama 合成数据工具包,它允许您以多种格式摄取、创建、整理和保存高质量的训练数据。在此版本中,它简化了为微调创建数据集所需的手动工作。

许多人共同努力制作了本课程。我要感谢 Meta 的 Jeff Tang、Justin、Sanen Bhutanni 和 Shati Malik,以及 DeepLearning.AI 的 Esmal Gegari 和 Brendan Brown。

下一节课是 Llama 4 和 Llama API 的概述。Meta AI 研究团队的 Shati Malik 将加入我们,解释 Llama 4 的架构。特别是,下一课将技术性地描述 Llama 4 的专家混合架构,并解释为何对于任何输入,只有一小部分参数是活跃的,这也是其服务效率极高的原因。我们将在下一个视频中学习这些内容。


本节课中,我们一起学习了《基于 Llama 4 的应用构建》课程的介绍部分。我们了解了 Llama 4 在多模态理解长上下文处理(如 context_window = 10M tokens)以及新工具(如提示优化器和合成数据工具包)方面的核心优势,并明确了本课程将通过实践项目帮助您掌握这些能力。下一节,我们将深入探讨 Llama 4 的模型架构。

002:Llama 4 模型概览 🚀

在本节课中,我们将学习 Llama 模型如何从 Llama 2 演进到最新发布的 Llama 4 模型。我们还将邀请 Meta AI 研究团队的一名成员来深入解释 Llama 4 的架构。

概述:Llama 模型的演进之路

Llama 最初是 Meta 旗下 FAIR 实验室的一个快速推进的研究项目,早期专注于形式数学。但团队很快发现了经过良好训练的小型模型的潜力,这直接促成了 Llama 模型的发布,并自此在研究和工业界推动了显著的创新。

上一节我们回顾了 Llama 的起源,本节中我们来看看其后续发展。

Llama 3 与多模态能力

Llama 模型的下一代在行业基准测试中表现出色,并通过 Llama 3 引入了强大的新能力。Meta 增加了用于图像推理的多模态模型,以及可以在边缘设备上运行的轻量级模型。这些模型包括视觉模型(11B 和 90B 参数版本)以及更小的纯文本模型(1B 和 3B 参数版本)。

Llama 3.3 带来了更高的效率,其 70B 参数的指令微调模型在质量上已经能够与 Llama 3.1 中参数大得多的 405B 模型相媲美。

进入 Llama 4 新时代

现在,随着 Llama 4 的发布,我们进入了一个新阶段。它包含两个强大的专家混合模型:

  • Llama 4 Scout:一个 170 亿参数的模型,拥有 16 个专家,针对速度和成本进行了优化。
  • Llama 4 Maverick:一个 170 亿参数的模型,拥有 128 个专家,提供顶级的性能。

Llama 4 模型通过早期融合设计实现了原生多模态能力。这意味着它从一开始就可以在单个统一模型中接受文本和视觉输入。

在实践中,这意味着文本标记和视觉派生的标记在输入层就被结合起来,并由同一个 Transformer 主干网络联合处理,而不是拥有独立的编码器-解码器路径。早期融合是一个重大进步,因为它使我们能够利用大量未标记的文本、图像和视频数据对模型进行联合预训练。此外,Llama 4 中的视觉编码器也得到了改进。

Llama 3 与 Llama 4 模型对比

以下是一页 Llama 3 与 Llama 4 模型的对比。Llama 4 的主要改进包括:

  • 上下文长度:Llama 4 Maverick 支持 100 万令牌,Llama 4 Scout 支持 1000 万令牌,而 Llama 3.1 及后续 Llama 3 模型为 128K。
  • 支持语言:官方支持的语言从 Llama 3 的 8 种扩展到 Llama 4 的 12 种。

这里你可以看到 Llama 4 的模型卡片,显示了其 12 种官方支持的语言、170 亿激活参数、激活与非激活专家的总参数量以及最大上下文长度。

接下来,Sha 将更深入地讲解 Llama 4 的架构。

Llama 4 架构深入解析

感谢 Amit。Llama 4 是一个专家混合模型。MoE 是大语言模型中常用的一种架构。

随着我们增加模型的参数数量或容量,通常会看到更好的性能,因为模型可以对标记执行更复杂的转换。然而,在密集模型中,更多的参数也意味着训练和推理期间的成本更高。

MoE 模型通过使用条件计算来帮助解决这个问题,它能在保持计算成本可控的同时提升模型质量。它们仅为每个标记激活总参数中的一小部分,这减少了一个标记所需的计算量,同时仍保留了模型容量。

任何 MoE 模型的一个关键部分是门控网络,也称为路由器。路由器决定给定标记激活哪些专家。路由机制的选择对模型性能起着核心作用。

一个 Transformer 有两种主要的层类型:注意力层前馈网络层。计算成本通常由 FFN 层主导。按照惯例,Llama 4 的 MoE 架构仅在 FFN 层中使用条件计算,注意力层则与密集模型保持一致。

Llama 4 中的 MoE 层包含几个路由专家和一个共享专家。所有标记都会经过共享专家。每个标记也恰好会经过一个路由专家。Scout 有 16 个路由专家,而 Maverick 有 128 个。在 Scout 中,所有 FFN 层都是 MoE 层;而 Maverick 则在密集层和 MoE 层之间交替,以减少模型中的总参数量。

让我们通过一个例子来看看一个标记序列是如何被 Llama 4 中的 MoE 层处理的。假设我们有一个共享专家和两个路由专家,序列包含四个标记:“The”、“quick”、“brown”、“fox”。

  1. 路由:标记首先进入路由器,决定哪个标记将被分配给哪个路由专家。我们为每个标记和路由专家的组合计算一个路由器亲和度分数。标记被发送到路由器分数最高的路由专家,并且该标记的激活值也会乘以路由器亲和度分数。在示例中,标记“The”、“brown”和“fox”前往路由专家 1,而标记“quick”前往路由专家 0。
  2. 共享路径:所有标记也都会经过共享专家。
  3. 合并输出:最后,共享专家和路由专家的输出被加在一起,产生 MoE 层的最终输出。

以上是对 Llama 4 架构的简要概述。如果你有兴趣了解更多,可以查看我们的博客。现在交回给 Amit。

Llama API 与开发工具

感谢 Sha 的讲解。Llama API 提供了一种简单快捷的方式来使用 Llama 模型并进行构建。为了便于集成,我们提供了轻量级的 Python 和 TypeScript SDK。这些 SDK 允许开发者快速将 API 连接到他们的应用程序。

使用 Llama API,你可以基于最新的 Llama 模型进行构建,包括 Llama 4 Scout、Llama 3 的 8B、70B 模型等。我们还引入了两个新的 Llama 工具。

以下是两个核心工具的介绍:

  • 提示词优化工具:这是一个能自动为 Llama 模型优化提示词的工具。它能将适用于其他大语言模型的提示词,转化为针对 Llama 模型在性能和可靠性上进行优化的提示词。你将在第 6 课中看到它的工作原理。
  • Meta Synthetic Data Kit:你将在本课程中使用的另一个工具。你将学习如何使用此工具创建自己的高质量数据。当你正在进行模型微调或测试,但手头没有完美的数据集时,这尤其有用。在课程后期,你将能够生成问答对、推理步骤和其他格式的数据。

在下一课中,你将开始使用 Llama API 进行构建。我们下节课见。

总结

本节课中,我们一起学习了 Llama 模型从研究项目到行业领先模型的演进历程,重点剖析了 Llama 4 引入的专家混合架构及其原生多模态的早期融合设计。我们还了解了 Llama API 及其配套的提示词优化与合成数据工具,为后续的实际应用开发奠定了基础。

003:Llama 4 与 API 快速入门 🚀

在本节课中,我们将学习如何通过 Meta 的官方 API 快速开始使用 Llama 4。我们将了解如何设置 API 客户端、发送提示词、处理文本和图像输入,并构建一个支持多语言的翻译聊天机器人。

导入密钥与库

首先,我们需要导入 API 密钥和必要的库。使用 Llama API 需要一个 API 密钥和一个基础 URL。在本课程环境中,这些密钥已预先设置好,无需额外操作。

我们需要导入 Llama API 客户端。为了便于后续多次调用,我们将创建一个辅助函数。

def llama_4_function(prompt, image_urls=None, model="llama-4-sc"):
    # 根据提示词和图像URL构建内容
    content = [{"type": "text", "text": prompt}]
    if image_urls:
        for url in image_urls:
            content.append({"type": "image_url", "image_url": {"url": url}})

    # 创建 Llama API 客户端
    client = LlamaClient(api_key=API_KEY, base_url=BASE_URL)

    # 构建并发送消息
    messages = [{"role": "user", "content": content}]
    response = client.chat.completions.create(model=model, messages=messages, temperature=0)

    # 返回响应
    return response.choices[0].message.content

首次调用 API

现在,让我们调用这个函数,要求 Llama 4 用三句话简要介绍 AI 的历史。

response = llama_4_function("Give me a brief history of AI in three sentences.")
print(response)

以下是得到的响应:

人工智能的历史可以追溯到20世纪50年代,当时艾伦·图灵提出了“图灵测试”的概念。随后,专家系统和机器学习在80年代和90年代兴起。进入21世纪后,深度学习和大数据的结合推动了AI技术的飞速发展,催生了像Llama这样的大型语言模型。

与 OpenAI 客户端库的兼容性

Llama API 也兼容 OpenAI 客户端库,这使得在不同 API 之间切换非常顺畅。让我们使用 OpenAI 兼容库重新创建上述函数。

import openai

def llama_4_function_openai(prompt, image_urls=None, model="llama-4-sc"):
    # 配置 OpenAI 客户端以使用 Llama API
    client = openai.OpenAI(api_key=API_KEY, base_url=BASE_URL)

    # 构建内容(与之前相同)
    content = [{"type": "text", "text": prompt}]
    if image_urls:
        for url in image_urls:
            content.append({"type": "image_url", "image_url": {"url": url}})

    # 发送请求
    response = client.chat.completions.create(model=model, messages=[{"role": "user", "content": content}], temperature=0)
    return response.choices[0].message.content

使用相同的提示词调用此函数,由于温度设置为 0,我们将得到完全相同的确定性响应。

图像理解能力

上一节我们介绍了纯文本交互,本节中我们来看看 Llama 4 的图像理解能力。你可以向 llama_4_function 传递图像 URL 并询问关于图像的问题。

首先,创建一个显示图像的函数。

from IPython.display import Image, display

def display_image(url):
    display(Image(url=url))

让我们使用一张羊驼(Llama)的图片进行测试。

image_url = "https://example.com/llama_image.jpg"
display_image(image_url)

prompt = "What's in this image?"
response = llama_4_function(prompt, image_urls=[image_url])
print(response)

响应描述了图像中有三只羊驼以及图像的其他内容。

多图像处理

与 Llama 3.2 不同,Llama 4 原生支持处理多张图像,在最多五张图像的评估中表现良好。让我们使用两张不同的羊驼图片。

image_url_1 = "https://example.com/llama1.jpg"
image_url_2 = "https://example.com/llama2.jpg"
display_image(image_url_1)
display_image(image_url_2)

prompt = "Compare these two images."
response = llama_4_function(prompt, image_urls=[image_url_1, image_url_2])
print(response)

响应会指出两张图片都描绘了羊驼,并列出关键差异和一些相似之处。在下一课中,我们将探索更多图像用例。

超长上下文处理

Llama 4 Maverick 和 Sc 模型分别支持高达 100 万和 1000 万 tokens 的上下文长度,这比之前的 Llama 模型有巨大提升。让我们用一本约 19.3 万 tokens 的免费电子书《双城记》来测试。

以下是我们的问题:“这本书结尾的最后一句台词是什么?它前面的一段是什么?”

我们将使用 Llama 4 Maverick 模型,并传入书籍的最后 30 万个字符。

# 假设 `long_text` 包含了书籍最后30万个字符
long_text = get_last_300k_chars("tale_of_two_cities.txt")
prompt = f"{long_text}\n\nQuestion: What is the last utterance at the end of the book and also the paragraph before that?"
response = llama_4_function(prompt, model="llama-4-maverick")
print(response)

模型能够从超长上下文中准确找到并回答这个问题。在后面的课程中,我们将处理更多长上下文用例。

多语言理解与翻译

Llama 4 的另一项主要能力是其在 12 种语言间的文本理解。让我们先问问它懂多少种语言,并要求它用所有掌握的语言回答。

prompt = "How many languages do you understand? Please answer in all the languages you speak."
response = llama_4_function(prompt)
print(response)

响应列出了 Llama 4 能够理解的 12 种语言。

现在,让我们利用这个能力构建一个快速的多语言翻译聊天机器人。

以下是构建多语言聊天机器人的代码。它接收源语言和目标语言,并构建相应的系统指令。

def polyglot_chatbot(source_lang, target_lang):
    # 构建系统提示词
    system_message = f"""
    You are a real-time translator.
    1. Recognize the language of the user's input. The source language is {source_lang}.
    2. Translate the user's input to {target_lang}.
    3. Respond to the user's query in the recognized source language ({source_lang}).
    Always format your response as:
    Recognized Language: [Language]
    Translation: [Translated text in {target_lang}]
    Response: [Your response in {source_lang}]
    """

    # 使用 OpenAI 兼容客户端
    client = openai.OpenAI(api_key=API_KEY, base_url=BASE_URL)

    def chat(user_input):
        messages = [
            {"role": "system", "content": system_message},
            {"role": "user", "content": user_input}
        ]
        response = client.chat.completions.create(model="llama-4-sc", messages=messages, temperature=0.7)
        return response.choices[0].message.content

    return chat

让我们以英语为源语言、法语为目标语言来使用这个翻译器。

translator = polyglot_chatbot("English", "French")
print(translator("Hello!"))

输出可能类似于:

Recognized Language: English
Translation: Bonjour !
Response: Hello to you too!

让我们再问一个问题。

print(translator("What is the weather like today?"))

输出:

Recognized Language: English
Translation: Quel temps fait-il aujourd'hui ?
Response: I am an AI and cannot access real-time weather data. You might want to check a weather website or app.

你可以自由尝试使用其他语言组合来测试这个翻译聊天机器人。

总结

本节课中,我们一起学习了如何快速入门 Llama 4 API。我们涵盖了设置客户端、进行文本和图像对话、利用其超长上下文能力以及构建多语言翻译应用。在下一课中,我们将深入探讨几个关于图像理解和图像接地的精彩用例。

004:图像理解与推理 🖼️

在本节课中,我们将学习如何使用 Llama 4 进行图像理解与推理。我们将通过多个实际案例,从识别图像中的物体到根据界面截图生成代码,全面探索 Llama 4 的多模态能力。

概述:Llama 4 的多模态能力

上一节我们介绍了 Llama 4 的基本文本处理功能。本节中,我们来看看它如何处理视觉信息。

Llama 4、Sc 和 Maverick 模型被设计为能够同时处理语言和视觉输入。这意味着它们可以像理解文本一样,理解和推理图像内容。这解锁了广泛的应用场景,从回答关于图像的问题,到描述场景或识别物体。

图像定位是 Llama 4 的一个突出特性。它指的是将提示词的部分内容与图像中的特定区域关联起来。这允许模型提供更精确的答案,尤其是在问题涉及空间关系时,例如询问“右上角有什么”或“在有许多工具的图片中,测量工具在哪里”。Llama 4 可以找到物体并返回其边界框的坐标。

在本次实践中,我们将探索几个图像推理的应用场景:

  • 对一张有许多工具的图片进行图像定位。
  • 分析 PDF 文件中的表格。
  • 根据用户界面截图生成代码。
  • 解决一个数学谜题。
  • 分析计算机屏幕。

准备工作:加载 API 与辅助函数

首先,我们需要加载 API 密钥并设置环境。在本实验中,除了 Llama API,我们还将通过 Together AI 使用 Llama 4。为此,你需要 Llama 的基础 URL 和 Together AI 的 API 密钥。这些在 DeepLearning.AI 平台上已经为你预先配置好了,因此你无需额外申请密钥即可运行这些笔记本。

现在,让我们加载两个函数:llama4_apillama4_togetherllama4_together 函数与你之前课程中实现的 llama4 函数非常相似。区别在于,它导入的是 together 库,并创建 Together AI 客户端,传入你的 Together AI API 密钥,其余部分保持不变。

大多数推理服务提供商(如 Together AI)通常期望图像数据以 Base64 字符串的形式嵌入,而不是直接放在请求负载中。因此,我们使用一个辅助函数来获取图像路径并返回其 Base64 编码。

# 示例:将图像转换为 Base64
import base64

def image_to_base64(image_path):
    with open(image_path, "rb") as image_file:
        return base64.b64encode(image_file.read()).decode('utf-8')

应用一:图像定位与物体识别 🧰

图像定位是计算机视觉和自然语言处理中的一项基本任务,涉及识别图像中与给定文本描述相对应的特定物体或区域。让我们看看 Llama 4 如何对这张有许多工具的图片进行图像定位。

以下是我们的提示词:“图片中哪些工具可以用来测量长度?为每个识别出的物品提供边界框。”

你可以将工具的 PNG 图像转换为 Base64,并将其与提示词一起传递给 llama4 函数。模型返回了两个用于测量长度的物品,以及每个物品的边界框坐标。

需要注意的是,边界框值代表的是图像中边界框的归一化坐标。要获得实际的像素坐标,你需要将这些归一化值乘以图像的宽度和高度。

在工具文件中,我们有两个辅助函数:parse_outputdraw_bounding_boxes。第一个函数解析 Llama 的输出,提取边界框坐标;第二个函数在图像上绘制边界框,以便可视化结果。

让我们再次将图像和提示词传递给 Llama,保存结果,然后将模型输出传递给 parse_output 函数以获取工具坐标和描述。最后,将其与原始图像一起传递给 draw_bounding_boxes 函数查看结果。这是我们的图像,两个用于测量的工具周围绘制了边界框,并标注了每个工具的名称及其边界框坐标。

应用二:分析 PDF 文档中的表格 📊

接下来,我们将使用 Llama 分析 PDF 文档中的表格。我们可以通过两种方式实现:一是将表格转换为文本,然后基于文本向 Llama 提问;二是直接使用表格的图像来提示 Llama。让我们看看这两种方法并进行比较。

这是一个 PDF 文件,其中包含我们想要提问的表格。为了将 PDF 转换为文本,我们可以使用一个辅助函数,它接收文件并提取返回其文本内容。让我们将 PDF 文件传递给 pdf_to_text 函数以获取其文本。

让我们查看报告中这个表格转换后的文本。

我们可以在文本中搜索“第四季度和2024全年财务”,定位到相关段落。

这就是包含表格的文本。

现在,让我们使用报告文本来询问 Llama 关于 2024 年运营利润率的问题。得到的回答是:“2024年的运营利润率为42%”,这是正确的。

现在,让我们使用保存为图像的表格来重复这个操作。


我们已将其保存在这个文件中。这就是图像。我们可以将图像转换为 Base64,并将其与提示词一起传递给 Llama 4。得到的回答同样是“42%”,与使用报告文本得到的结果一致。

请注意,尽管这两种情况下答案相同,但推理过程是不同的。在一些复杂的情况下,使用图像可能会得到更好、更准确的结果,因为与纯文本版本相比,Llama 能更好地理解表格的整体结构。

应用三:从截图生成用户界面代码 💻

现在,让我们使用 Llama 根据界面图像来编写代码。为此,我们将从 Meta 网站的一个视频中截取这一帧画面,并使用 Llama 4 为其生成代码。


这是该截图的图像。首先,让我们提一个问题,看看 Llama 是否理解这张图像:“如果我想改变图像中的温度,应该点击哪里?”温度是这里的滑块,当前设置为 0.6。这是 Llama 的回答:“要更改图像中的温度,您应该点击温度旁边的滑块。”并且也给出了当前值。很好。

现在,让我们看看 Llama 能否为我们编写这个界面的代码。

我们提示它:“编写一个使用 Gradio 实现图像中聊天机器人用户界面的 Python 脚本。”

这是模型的回复,包含了需要安装的指令以及最终的 Python 代码。

让我们复制并运行这段代码。这是我们从 Llama 得到的代码。

运行后,我们得到了这个界面,所有滑块都已实现,甚至包括可以输入消息并与之交互的聊天框。请注意,这只是我们要求 Llama 实现的界面,并不包含后期需要添加的、使其完全工作的所有功能。

应用四:解决数学问题 ➗

现在,让我们使用 Llama 解决一个数学问题。

这是我们想要解决的问题。要解决它,Llama 需要理解问题及其解法。这是我们的提示词:“回答图像中的问题。”

我们将 Base64 编码的数学图像与提示词一起传递给 Llama。这是回复。Llama 给出了解决这个问题的所有步骤,最终计算出的答案是 40,这是正确的。

应用五:分析计算机屏幕 🖥️

让我们处理另一个用例:使用 Llama 分析计算机屏幕。这是你将使用的图像。这可能看起来很熟悉,因为这是我们之前在 DeepLearning.AI 平台上关于 Llama 3.2 课程的图像。

让我们要求 Llama 详细描述此截图,包括浏览器、URL 和标签页。模型给出了对此图像的详细分析,甚至列出了屏幕底部的所有图标。

假设你有一个浏览器代理,想要自动进入下一课。让我们问 Llama 这个问题:“如果我想进入下一课,应该怎么做?”

我们再次显示图像,以便将结果和图像放在一起。这是回复:“要继续下一课,请点击标有‘下一课’的红色按钮,它位于屏幕的右下角。”这个用例展示了如何在计算机使用应用程序和构建浏览器 AI 代理中使用 Llama。

总结

在本节课中,我们在多个图像推理和定位的用例与应用中使用了 Llama 4。我们一起学习了:

  1. 图像定位:识别图片中的特定物体并获取其坐标。
  2. 文档分析:通过文本和图像两种方式解析 PDF 中的表格信息。
  3. 代码生成:根据用户界面截图自动生成可运行的界面代码。
  4. 问题求解:理解并解答图像中的数学问题。
  5. 屏幕理解:分析计算机屏幕内容以指导自动化操作。

这些实践展示了 Llama 4 强大的多模态理解能力,为构建智能视觉应用奠定了基础。在下一节课中,我们将深入探讨 Llama 4 的提示工程与格式化。

我们下节课见。

005:Llama 4 提示词格式详解 🧩

在本节课中,我们将学习 Llama 4 模型如何解析提示词,包括纯文本和多模态提示中的特殊标记。理解这些格式有助于我们更好地构建基于 Llama 4 的应用。


模型与特殊标记概述

Llama 4 SC 和 Maverick 是多模态模型,在文本和图像理解方面表现出色。首先,我们将快速了解 Llama 4 的特殊标记和提示词格式,从纯文本输入开始,然后探讨文本加图像输入的工作原理。

核心概念:虽然构建应用时无需直接处理这些特殊标记,但了解模型如何处理你的文本和图像提示词总是有益的。


文本特殊标记

Llama 4 支持以下通用特殊标记:

  • <|begin_of_text|>:指定提示词开始。
  • <|start_header_id|>:特定消息角色的开始。
  • <|end_header_id|>:特定消息角色的结束。
  • <|eot_id|>:表示模型已完成交互的“回合结束”标记。

图像特殊标记

对于图像输入,Llama 4 使用以下图像标记:

  • <|image_start|>:提示词中图像数据的开始。
  • <|image_end|>:提示词中图像数据的结束。
  • <|patch|>:代表输入图像子集的“补丁”。
  • <|tile_x_separator|>:分隔图像的 X 方向图块。
  • <|tile_y_separator|>:分隔图像的 Y 方向图块。
  • <|image|>:将常规尺寸的图像标记与适合单个图块的缩小版本分隔开。

消息角色

Llama 4 支持与 Llama 3 相同的四种角色:

  • system:设置与 Llama 交互的上下文。系统提示通常包含帮助模型有效响应的规则和指南。
  • user:代表与 Llama 交互的人类。用户提示包含具体的用户输入、命令或问题。
  • assistant:代表 Llama 对用户的响应。
  • ipython:代表工具调用的输出,该输出被发送回 Llama。

代码实践:对比提示词格式

上一节我们介绍了 Llama 4 的特殊标记和角色,本节中我们来看看如何在代码中观察和对比 Llama 4 与 Llama 3 的原始提示词格式。

首先,我们需要加载 API 密钥。本节课需要 Llama API 密钥和 Hugging Face 访问令牌,它们已预先设置好。

我们将使用 Hugging Face Transformers 库的 AutoProcessor 来查看输入消息的原始提示词格式,并比较 Llama 4 和 Llama 3 模型的差异。

# 定义两个模型的处理器
processor_llama4 = AutoProcessor.from_pretrained("meta-llama/Llama-4-SC")
processor_llama33 = AutoProcessor.from_pretrained("meta-llama/Llama-3-3B")

现在,让我们使用以下示例消息来比较两个模型的原始提示词:

sample_message = [{"role": "user", "content": "Hello, how are you?"}]

使用 processor_llama4 并将其 apply_chat_template 方法的 tokenize 参数设为 Falseadd_generation_prompt 设为 True,我们可以看到 Llama 4 的原始提示词格式。将 add_generation_prompt 设为 True 会在原始提示词末尾添加 <|start_header_id|>assistant<|end_header_id|>,提示模型开始生成。

raw_prompt_llama4 = processor_llama4.apply_chat_template(sample_message, tokenize=False, add_generation_prompt=True)
print(raw_prompt_llama4)

现在,让我们对 Llama 3.3 处理器进行同样的操作:

raw_prompt_llama33 = processor_llama33.apply_chat_template(sample_message, tokenize=False, add_generation_prompt=True)
print(raw_prompt_llama33)

这两个原始提示词有两个主要区别:

  1. 特殊标记的变化:Llama 4 中,部分特殊标记的名称发生了变化。例如,Llama 3 中的 <|start_header_id|><|end_header_id|> 在 Llama 4 中保持不变,但 <|eot_id|> 在 Llama 3 中可能是其他形式。
  2. 默认系统提示词:在 Llama 3 模型中,默认情况下会有一个系统消息被添加到原始提示词中。而 Llama 4 的原始提示词默认不包含系统提示词。

为了验证第二点,让我们在提示词中添加一个系统规则:“用法语回答”,然后再次查看原始提示词。

message_with_system = [
    {"role": "system", "content": "Respond in French."},
    {"role": "user", "content": "Hello, how are you?"}
]
raw_prompt_llama4_sys = processor_llama4.apply_chat_template(message_with_system, tokenize=False, add_generation_prompt=True)
raw_prompt_llama33_sys = processor_llama33.apply_chat_template(message_with_system, tokenize=False, add_generation_prompt=True)

现在,包含系统提示词后,它会添加到 Llama 4 的原始提示词中,同时也会添加到 Llama 3 的默认系统提示词之上。


图像输入提示词格式

了解了文本格式后,我们接下来看看图像输入的提示词是如何构造的。

让我们加载并显示一张在前几节课中见过的图片。

image_url = "https://example.com/path/to/your/image.jpg" # 替换为实际图片URL
image = Image.open(requests.get(image_url, stream=True).raw)
display(image)

构建一个包含用户角色和内容的消息,内容为文本提示“描述下面的图片”并传递图片URL。

messages = [
    {
        "role": "user",
        "content": [
            {"type": "text", "text": "Describe the image below."},
            {"type": "image_url", "image_url": {"url": image_url}},
        ],
    }
]

现在,使用 processor_llama4 处理我们的消息,将 add_generation_prompttokenize 设为 True,获取结果字典,并将 return_tensors 设置为 "pt"(PyTorch 张量)。

inputs = processor_llama4(messages, add_generation_prompt=True, tokenize=True, return_tensors="pt")
print(inputs.keys()) # 查看输入字典的键

input_ids 键包含了消息编码后的原始提示词。让我们查看 pixel_values 的大小。

print(inputs["pixel_values"].shape)

Llama 4 使用尺寸为 336x336 像素、包含红绿蓝三个通道的“图块”来处理图像。我们的图片会被分割成多个这样的图块。

为了理解这些图块是如何形成的,我们有一个函数 plot_tile_image。如果你调用这个函数,传入图片的宽度和高度(例如 768)、Llama 4 的图块大小(336x336),并指定补丁大小为 28x28 像素(意味着每个图块将有 12x12 = 144 个补丁),你将看到可视化结果。

图像处理逻辑

  • 每个小方块是一个 28x28 像素的补丁。
  • 由 12x12 个补丁(即 336x336 像素)组成的更大方块形成一个图块。
  • 对于一张图片,Llama 会创建多个这样的图块(例如9个)。
  • 此外,Llama 还会通过将整个图像缩放到 336x336 像素来创建一个“全局图块”,以提供输入图像的全局视图。
  • 总共,我们将有 N 个图像图块加上一个全局图块。

为了分隔这些图块,Llama 4 使用了特殊的 tile_x_separatortile_y_separator 标记。例如,在第一行图块之后,会添加一个 tile_y_separator 来开始下一行。在同一行的图块之间,则使用 tile_x_separator 进行分隔。

Llama 4 将使用特殊的 <|patch|> 标记来表示图块中的每个补丁。

现在,让我们看看这张图片的原始提示词格式。batch_decode 方法可以解码 input_ids 得到原始提示词字符串。

raw_prompt_with_image = processor_llama4.batch_decode(inputs["input_ids"])[0]
# 由于每个图块有144个补丁标记,字符串会非常长。我们可以进行简化显示:
import re
simplified_prompt = re.sub(r'(<\|patch\|>){144}', r'<|patch|>...<|patch|>', raw_prompt_with_image)
print(simplified_prompt)

结果将类似于:
<|begin_of_text|><|start_header_id|>user<|end_header_id|>Describe the image below.<|image_start|><|patch|>...<|patch|><|tile_x_separator|><|patch|>...<|patch|><|tile_y_separator|>...<|image_end|><|eot_id|><|start_header_id|>assistant<|end_header_id|>

它显示了文本开始、用户角色、文本消息“描述下面的图片”,然后是图像开始标记、代表第一个图块的144个补丁(已简化)、图块X分隔符、第二个图块的补丁,接着是图块Y分隔符,如此继续,直到图像结束标记。


总结

在本节课中,我们一起学习了 Llama 4 的提示词格式,包括文本和图像输入的处理方式。我们了解了其特殊的标记系统、消息角色,并通过代码对比了与 Llama 3 的差异,还深入探讨了图像如何被分割成图块和补丁并编码到提示词中。理解这些底层机制将帮助我们更有效地构建和调试基于 Llama 4 的多模态应用。

在下一节课中,你将学习如何在长文本文件和代码仓库上使用 Llama 4。

006:Prompt 优化工具 🛠️

在本节课中,我们将学习如何使用 Llama 的 Prompt 优化工具来自动改进你的提示词。我们将通过一个具体的例子,演示如何优化一个用于客户消息分类的提示词,并比较优化前后的性能差异。

概述

提示词对模型的行为有巨大影响。即使是微小的措辞变化也可能完全改变模型的输出。然而,手动设计提示词既耗时又常常不一致。Meta 的开源 Prompt 优化工具可以帮助我们自动化提示词改进的过程,使你的 Llama 应用更加可靠和高效。

该工具是一个 Python 包,名为 llama-prompts-rs。你只需向工具提供当前的提示词和一些示例任务,在 YAML 配置文件中选择一个评估指标并设置其他参数。它会使用 Llama 模型本身来建议改进版本、运行比较,并最终给出一个优化后的版本。这在从其他模型迁移提示词或针对边缘情况进行调整时尤其有用。

项目设置与配置

上一节我们介绍了工具的基本原理,本节中我们来看看如何设置一个具体的优化项目。

首先,我们需要加载 API 密钥。你还需要通过 pip install llama-prompts-ops 安装工具包。由于在演示平台上已经安装,所以代码中已注释。

你可以创建一个示例项目。该工具创建的示例项目是一个设施管理分类任务,旨在根据紧急程度、客户情绪和相关服务类别对客户服务消息进行分类。

项目创建后,会添加以下文件:

  • config.yaml 配置文件
  • prompt.txt 原始提示词文件
  • 一个数据集文件
  • 一个 README.md 文件

让我们查看 prompt.txt 文件中的系统提示词:

你是一个乐于助人的助手。提取并返回一个包含以下键和值的 JSON。

以下是 JSON 的键:

{
  "urgency": "...",
  "sentiment": "...",
  "category": "..."
}

对于收到的每条消息,都应提取并返回紧急程度、情绪和类别。这就是我们想要优化的提示词。

接下来,我们查看配置文件 config.yaml。这个文件包含影响优化过程的不同参数。其中定义了初始系统提示词的位置、数据集路径,以及任务模型和提案模型。任务模型默认设置为 llama-3-3,它使用 prompt.txt 中的系统提示词来处理所有输入消息并返回结果。提案模型也默认设置为 llama-3-3,它将提出新的系统提示词,以提升任务模型在给定数据集上的整体性能。

我们将修改这个配置文件,将任务模型设置为 llama-4-sc,提案模型设置为 llama-4-maverick。同时,优化策略设置为 llama。你可以将其改为 basic 以获得快速结果,或改为 advance 以进行更广泛的提示词修改和更多轮次的评估。llama 是我们为 Llama 模型优化提示词的推荐策略。

此外,提示词优化工具支持两种内置评估指标:用于简单字符串匹配的 exact_match 指标,以及用于特定字段评估的 standard_json 指标。默认示例任务使用的指标是为客户服务消息分类设计的自定义指标,它评估预测在三个关键维度(紧急程度、情绪和服务类别)上的准确性。

运行优化过程

现在我们的示例项目已设置好,我们可以使用 migrate 命令来运行提示词优化过程。

优化过程涉及几个步骤:

  1. 加载系统提示词和数据集。
  2. 分析提示词的结构和内容。
  3. 应用优化策略。
  4. 将优化后的提示词与原始提示词进行评估比较。
  5. 将优化后的提示词保存到结果目录。

运行此命令需要一些时间。优化完成后,我们可以比较优化后的提示词和原始提示词。

比较优化结果

优化后的提示词存储在结果目录的 JSON 文件中。我们可以通过几行代码获取它。为了更直观地比较,我们也可以读取 prompt.txt 文件中的原始提示词,并使用代码块将两者并排显示。

除了优化后的提示词,优化器还会生成一些少样本示例。优化后的提示词与生成的少样本示例结合使用,将带来更好的评估结果。少样本示例是问答对。

现在,让我们使用评估函数来比较优化后和原始的提示词。首先加载数据集中最后 30% 的数据作为测试集。然后,我们分别使用原始提示词以及“优化后提示词 + 少样本示例”在测试数据上进行评估,并收集结果。

以下是评估结果的关键指标对比:

  • 原始提示词平均得分:

    • 正确分类: 0.92
    • 正确情绪: 0.50
    • 正确紧急程度: 0.86
    • 总分(前三项平均值): 0.76
  • 优化后提示词 + 少样本示例平均得分:

    • 正确分类: 0.94
    • 正确情绪: 0.60
    • 正确紧急程度: 0.91
    • 总分(前三项平均值): 0.84

可以看到,优化后,正确情绪识别的分数从 0.50 提升到了 0.60,正确紧急程度识别的分数从 0.86 提升到了 0.91。正确分类的分数也有小幅提升。总体平均分从 0.76 提高到了 0.84

总结

在本节课中,我们使用了 Llama 的 Prompt 优化工具来优化一个用于情绪分析和分类用例的系统提示词。我们比较了优化后的提示词(连同优化器生成的少样本示例)与原始提示词的性能。结果显示,优化后的提示词在多个评估维度上均有显著提升。

在下一节课中,我们将使用合成数据工具包来生成、整理和保存合成数据。

007:使用合成数据工具包

在本节课中,我们将学习如何使用 Llama 合成数据工具包来创建高质量的数据集,用于训练和微调模型。我们将了解如何通过几个简单的步骤来摄取创建筛选保存数据。

概述:为何需要合成数据? 🤔

在构建大语言模型应用时,我们常常会遇到数据问题。真实世界的数据通常杂乱、非结构化,或者数量不足。合成数据提供了一个灵活的替代方案,它允许我们生成恰好符合需求的示例数据。合成数据对于模型蒸馏、微调,甚至在特定边缘案例上对模型进行压力测试都非常重要。

Llama 合成数据工具包是一个命令行工具,它使得利用 Llama 模型本身生成高质量训练数据变得非常容易。使用这个工具,你可以生成不同类型的数据集,从问答对到思维链和摘要数据。

接下来,我们将通过一个完整流程来学习其工作原理:首先摄取一个 PDF 文件,从中创建数据,然后通过移除低质量数据进行筛选,最后以不同格式保存数据。

第一步:环境设置与安装 ⚙️

我们将从导入 API 密钥开始。要使用合成数据工具包,你需要设置一个名为 API_KEY 的环境变量,其值应为你的 Llama API 密钥或其他 Llama 云服务提供商的 API 密钥。

此外,你需要安装 synthetic-data-kit 包。由于在本教学平台中已经预装,所以安装命令在此被注释掉了。

# 设置环境变量(示例)
# export API_KEY="your_api_key_here"

# 安装工具包(如果尚未安装)
# pip install synthetic-data-kit

第二步:从文档中摄取数据 📄

从 PDF、网页和视频等真实世界文档中提取相关数据是复杂且容易出错的。合成数据工具包可以帮助你摄取不同类型的文件,包括 PDF 和网页,并从中提取纯文本数据。

这里,我们有一篇 27 页的论文。只需运行下面这一行代码,合成数据工具包就会提取文本并保存它。

synthetic-data-kit ingest --input paper.pdf --output extracted_text.txt

让我们查看提取文本的前 50 行中的最后 10 行,结果如下所示。

合成数据工具包也可以从网页提取文本。这里我们有一个 Meta 官网上的网页。让我们使用工具包来提取该网页的文本。

synthetic-data-kit ingest --input https://ai.meta.com/ --output webpage_text.txt

提取完成后,结果被保存在这里。我们来看几行提取的文本。

第三步:创建问答数据集 ❓➡️💬

现在,让我们基于刚才摄取并提取了文本的论文,创建一个问答数据集。这就像运行下面这一行命令一样简单:使用 create 命令,传入提取文本的地址,并选择我们想要创建的数据类型为 Q&A

synthetic-data-kit create --input extracted_text.txt --type Q&A --output qa_dataset.json

你还可以选择其他数据类型,包括思维链和摘要。通过将 Q&A 改为 COT,你可以创建思维链数据。

运行此命令,过程将持续到所有数据生成完毕。最后,你会看到数据保存的位置。让我们查看这个 JSON 文件,结果如下:文档的摘要被给出,并且生成了问答对。

第四步:筛选与清理数据 🧹

在某些用例中,你需要过滤数据,从数据集中移除低质量的数据。你可以使用合成数据工具包的 curate 命令来完成此操作。你可以传入创建好的数据,以及一个质量阈值(1到10之间的数字)。阈值越高,保留数据的质量就越高,但保留率会降低。

让我们尝试对我们创建的数据使用阈值 8。

synthetic-data-kit curate --input qa_dataset.json --threshold 8 --output clean_qa_dataset.json

现在,清理过程正在进行。如你所见,创建的 48 对数据被评估和评分,其中 45 对评分达到或超过阈值 8 的数据被保留。清理后的数据被保存在这里。

让我们查看一下:现在为每个问答对计算了一个评分,只有评分大于或等于 8 的对被保留。你还拥有每个问题对的对话记录,包含系统、用户和助手消息。最后,你还会看到一个统计矩阵,包括问题总数、通过给定评分阈值的问题数量、保留率以及保留问题的平均分数。

第五步:保存为不同格式 💾

saves 命令将筛选后的数据集转换为不同的文件格式。它支持四种流行的输出格式:JsonAlpacaFTChatML,以及两种存储格式:JsonHugging FaceHF4

让我们将上一步得到的干净问答对,使用 Json 存储格式保存为 JSon 格式。

synthetic-data-kit saves --input clean_qa_dataset.json --format Json --storage Json --output final_dataset.json

运行后,以 JSon 格式和 JSon 存储格式的文件被保存在这里。让我们看看这个文件中的前 10 个问题。

通过将格式更改为其他选项,例如 FT,你可以将数据保存为不同格式。运行后,数据的 FT 格式被保存在这个 JSon 文件中。让我们从这个文件中看几行,这就是我们问答数据集的 FT 格式。

我鼓励你将格式改为 AlpacaChatML 并比较结果。

第六步:了解配置文件 ⚙️📁

合成数据工具包有一个默认的配置文件。让我们快速浏览一下这个文件。

这个合成数据的配置文件包含了合成数据生成所需的所有配置。例如,当使用 create 命令生成数据时,它会自动存储在 data/generated 路径下。你可以控制从传入到最终保存所有阶段的路径。

这里还有更多设置。我鼓励你查看这个配置文件,并更改任何设置以优化你的合成数据创建过程。例如,这些是控制创建步骤的参数,而这些是控制筛选过程的参数。

总结 🎯

在本节课中,我们一起学习了如何使用合成数据工具包生成合成数据。我们走完了从设置环境、摄取文档、创建问答数据集、筛选清理数据到最终保存为多种格式的完整流程。

我鼓励你尝试其他数据类型,如思维链,并尝试保存为不同的格式,以更好地掌握这个强大工具的使用。

008:9. 总结 🎯

在本课程中,我们学习了如何利用最新的 Llama 4 模型进行应用开发。现在,让我们对所学内容进行回顾与总结。

课程概述 📖

在本节课中,我们将要学习并总结整个课程的核心内容。我们回顾了如何利用 MeAs API 构建应用、进行图像推理、处理长文本与代码库,以及使用新工具优化提示词和生成合成数据。

核心内容回顾

上一节我们介绍了课程的各项实践内容,本节中我们来看看整体的知识框架。

1. 使用 MeAs API 构建应用

你已学会如何使用 MeAs API 与最新的 Llama 4 模型进行交互和构建应用。其核心调用方式通常遵循以下模式:

response = mea_api.call(model="llama-4", prompt=user_input)

2. 图像推理

课程涵盖了如何让 Llama 4 模型理解和推理图像内容。这通常涉及将图像编码为模型可理解的格式。

3. 长上下文与代码库提示

你探索了如何针对长文本文件和代码仓库进行有效的提示(Prompting)。处理长上下文的关键在于有效的信息分块与检索

4. 新工具的应用

你还接触了来自 Error 的新工具,用于:
以下是两个主要应用方向:

  • 提示词优化:系统化地改进提示以获得更佳模型输出。
  • 合成数据生成:自动创建训练或测试数据,以扩展数据集。

总结与展望

本节课中我们一起学习了利用 Llama 4 模型进行应用开发的全流程。从基础的 API 调用,到复杂的图像推理和长上下文处理,再到利用先进工具优化工作流,你已掌握了构建智能应用的关键技能。

我们希望本课程能帮助你迈出使用 Llama 4 进行开发的重要一步。

期待看到你构建出的精彩作品。

posted @ 2026-03-26 08:11  绝不原创的飞龙  阅读(4)  评论(0)    收藏  举报