generative-ai-for-beginners 第 21 课实战:基于 Meta 家族模型 Llama 3.1 / 3.2 构建生成式 AI 应用
本篇文章围绕开源课程 generative-ai-for-beginners 的第 21 课(仓库内正文见 translations/de/21-meta/README.md,英文主版见 21-meta/README.md)展开,系统讲解 Meta 家族("Llama 羊群")中两大主力模型 Llama 3.1 与 Llama 3.2 的定位、适用场景与编码方式。读完本文,你将掌握:如何在模型推理 API 上选用 Llama 3.1 变体触发原生函数调用,以及如何调用 Llama 3.2 视觉模型同时处理"文本 + 图片"两类输入,把开源模型能力真正落到可运行的生成式 AI 应用里。
课程导读:本节学什么
第 21 课的核心学习目标非常聚焦,共三条:
- 认识 Meta 家族两大主模型——Llama 3.1 与 Llama 3.2;
- 理解每个模型的典型应用场景(use-case);
- 通过代码示例演示每个模型独有的能力。
课程配套的动手练习以 Notebook 形式提供:英文源 21-meta/python/githubmodels-assignment.ipynb,德文翻译版 translations/de/21-meta/python/githubmodels-assignment.ipynb。Notebook 中的环境准备单元会先执行两条安装命令:
%pip install azure-core
%pip install azure-ai-inference
也就是说,本课示例依赖 azure-ai-inference(推理客户端)与 azure-core(凭据与传输基础库)两个 Python 包。
Meta 家族模型概览:Llama "羊群"中的两大主力
本课挑选了 Meta 家族中发布时序相邻的两个代表——Llama 3.1 与 Llama 3.2。它们以多种参数规模变体出现,可从模型市场(GitHub Models)直接选用。课程中可用的变体清单如下:
| 模型 | 变体 | 定位(按课程描述) |
|---|---|---|
| Llama 3.1 | 70B Instruct | 文本指令模型,体量相对轻量 |
| Llama 3.1 | 405B Instruct | 旗舰级开源参数规模,函数调用 / RAG 场景主力 |
| Llama 3.2 | 11B Vision Instruct | 中等规模的视觉-语言多模态模型 |
| Llama 3.2 | 90B Vision Instruct | 大参数多模态模型,图像理解能力更强 |
需要说明:Llama 3 同样存在于模型市场,但本课不将其作为讲解对象,示例代码均围绕 Llama 3.1 / 3.2 展开。
要理解两个模型的差异,关键线索在于"代际分工":Llama 3.1 把文本大模型的上下文与工具调用推向新高度,Llama 3.2 则在保持文本能力的同时补齐多模态输入。下文分别深入。
Llama 3.1:以 405B 开源参数支撑复杂应用场景
Llama 3.1 405B Instruct 拥有约 4050 亿参数,属于典型的开源大型语言模型(open-source LLM)阵营。课程明确把它定位为 Llama 3 的一次代际升级,升级体现在三个可量化的维度上:
- 更大的上下文窗口:128k Tokens(Llama 3 为 8k Tokens),可一次性容纳长文档、长对话或大批检索片段;
- 更大的最大输出长度:4096 Tokens(Llama 3 为 2048 Tokens),单次生成的文本量上限翻倍;
- 更好的多语言支持:得益于训练语料 token 数量的增加,跨语言能力随之增强。
上下文窗口扩大并非只是"能读更多字",它直接解锁了三类更具工程价值的复杂用例:
- 原生函数调用(Native Function Calling)——模型可以判断"何时需要调用外部工具",并发出调用外部函数/工具的指令,把流程延伸到 LLM 工作流之外;
- 更强的 RAG 效果——更大的上下文窗口允许把更多检索到的资料一次性注入提示词,从而改善检索增强生成的质量;
- 合成数据生成——模型可为微调(fine-tuning)等任务批量构造高质量训练数据。
这三类能力在本课程体系中均有后续纵深。函数调用的完整工程范式见第 11 课 11-integrating-with-function-calling/README.md;RAG 检索与向量数据库在第 15 课 15-rag-and-vector-databases/README.md 有系统讲解;微调(含数据准备)则在第 18 课 18-fine-tuning/README.md。
原生函数调用实战:让 Llama 3.1 自己决定"调什么工具"
Llama 3.1 经过针对性微调,在执行函数/工具调用时更加可靠。特别地,它内置了两个开箱即用的工具,模型会根据用户提示词自行判断是否需要触发:
- Brave Search——通过网页搜索获取实时信息(例如天气这类对时效性敏感的数据);
- Wolfram Alpha——处理复杂数学计算,免去自行编写数学函数的成本。
除了内置工具,开发者也可以自定义工具交给 LLM 调用。课程给出的示例演示了一个完整链路:先在系统提示词中声明可用工具集(brave_search、wolfram_alpha),随后发送一条询问"斯德哥尔摩天气"的用户消息,模型将返回对 Brave Search 的工具调用,其文本形态为 <|python_tag|>brave_search.call(query="Stockholm weather")。
import os
from azure.ai.inference import ChatCompletionsClient
from azure.ai.inference.models import AssistantMessage, SystemMessage, UserMessage
from azure.core.credentials import AzureKeyCredential
token = os.environ["GITHUB_TOKEN"]
endpoint = "https://models.inference.ai.azure.com"
model_name = "meta-llama-3.1-405b-instruct"
client = ChatCompletionsClient(
endpoint=endpoint,
credential=AzureKeyCredential(token),
)
# 在系统提示词中声明可用工具,并给出运行环境约束
tool_prompt = f"""
<|begin_of_text|><|start_header_id|>system<|end_header_id|>
Environment: ipython
Tools: brave_search, wolfram_alpha
Cutting Knowledge Date: December 2023
Today Date: 23 July 2024
You are a helpful assistant<|eot_id|>
"""
messages = [
SystemMessage(content=tool_prompt),
UserMessage(content="What is the weather in Stockholm?"),
]
response = client.complete(messages=messages, model=model_name)
print(response.choices[0].message.content)
从代码可以拆解出几个关键实现细节:
- 提示词模板:系统提示词以
<|begin_of_text|>开头,用<|start_header_id|>system<|end_header_id|> ... <|eot_id|>界定系统消息段,<|python_tag|>则用于标记模型返回的 Python 风格工具调用,这些特殊标记是 Llama 模型约定格式的一部分,需要照原文保留; - 工具声明:
Tools: brave_search, wolfram_alpha一行把可用工具集合告知模型,这是"模型自行决定调用哪个工具"的前提; - 客户端构造:通过
ChatCompletionsClient(endpoint=..., credential=AzureKeyCredential(token))建立会话,其中GITHUB_TOKEN从环境变量读取; - 一次补全:
client.complete(messages=messages, model=model_name)完成单轮调用,结果从response.choices[0].message.content取出打印。
需要特别提醒(课程原注):上述示例仅演示"模型做出工具调用"这一决策动作,并不会真正执行搜索。若想拿到真实搜索结果,还需要在 Brave API 平台注册免费账号,自行实现该函数并把工具调用分发到函数执行逻辑上。
Llama 3.2:开源模型补上多模态短板
Llama 3.1 虽然强大,但本质上仍是纯文本 LLM——它无法把图片等异质输入当作提示词理解并作出回应。这正是 Llama 3.2 的核心卖点,其特性可归纳为三点:
- 多模态能力——可同时评估文本与图像提示词,是开源模型世界迈出的一大步;
- 中大规模变体(11B / 90B)——在能力与部署成本之间提供灵活选项;
- 纯文本轻量变体(1B / 3B)——面向边缘设备 / 移动端部署,可提供低延迟推理。
其中 1B/3B 这类小参数纯文本模型,与课程第 19 课对小型语言模型(SLM)的讨论相呼应(见 19-slm/README.md):小体量换来了端侧可部署性与低延迟。而视觉能力让 Llama 3.2 补上了 Meta 家族此前缺失的"看图说话"链路。
图文双模态实战:用 Llama 3.2 90B 做图像分析
下面的示例同时携带"文本问题 + 本地图片"两类内容请求模型分析:系统消息要求助手"详细描述图像",用户消息则由文本 What's in this image? 与一张本地图片组成。
代码中图片正是仓库内的 21-meta/python/sample.jpg:一幅生成式 AI 教学场景的截图,画面左侧是戴着耳机的讲解者,右侧展示了一个 AI 模型目录(MODEL CATALOG)页面,可用于直观验证"模型是否真的看懂了画面中的人与界面元素"。
示例代码(节选自课程正文)如下:
import os
from azure.ai.inference import ChatCompletionsClient
from azure.ai.inference.models import (
SystemMessage,
UserMessage,
TextContentItem,
ImageContentItem,
ImageUrl,
ImageDetailLevel,
)
from azure.core.credentials import AzureKeyCredential
token = os.environ["GITHUB_TOKEN"]
endpoint = "https://models.inference.ai.azure.com"
model_name = "Llama-3.2-90B-Vision-Instruct"
client = ChatCompletionsClient(
endpoint=endpoint,
credential=AzureKeyCredential(token),
)
response = client.complete(
messages=[
SystemMessage(
content="You are a helpful assistant that describes images in details."
),
UserMessage(
content=[
TextContentItem(text="What's in this image?"),
ImageContentItem(
image_url=ImageUrl.load(
image_file="sample.jpg",
image_format="jpg",
detail=ImageDetailLevel.LOW)
),
],
),
],
model=model_name,
)
print(response.choices[0].message.content)
这段代码相较纯文本调用,有四处结构差异值得关注:
- 模型名切换:
model_name指向视觉模型Llama-3.2-90B-Vision-Instruct; - 用户消息多模态化:
UserMessage的content不再是一个字符串,而是一个内容项列表,由TextContentItem(文本)与ImageContentItem(图片)拼装而成; - 本地图片装载:
ImageUrl.load(image_file="sample.jpg", image_format="jpg")负责从本地文件读取并上传图片,image_format显式声明格式为jpg; - 细节等级参数:
detail=ImageDetailLevel.LOW指定请求图片时采用的细节档位,示例选择较低档以控制传输开销。
运行前提是示例图片文件 sample.jpg 位于代码执行目录下(仓库内对应文件为 21-meta/python/sample.jpg);若在其他目录执行,可把 image_file 改为指向该文件的完整或相对路径。模型返回的 response.choices[0].message.content 即为对画面内容的文字描述,可直接打印查看。
运行环境与仓库实操提示
在动手前,请先确认以下几点(均与本仓库第 21 课相关文件的描述一致):
- 依赖安装:先执行
pip install azure-core azure-ai-inference(Notebook 环境中写作%pip install); - 凭据注入:两个示例都通过
os.environ["GITHUB_TOKEN"]读取访问令牌,请确保运行前已设置GITHUB_TOKEN环境变量,例如在终端执行export GITHUB_TOKEN=<你的令牌>,或在 Notebook 中先写入该变量; - 默认端点:两个示例均指向公共推理端点
https://models.inference.ai.azure.com,模型名称按变体区分(meta-llama-3.1-405b-instruct与Llama-3.2-90B-Vision-Instruct); - 可用代码载体:上述两段代码都已完整收录于课程 Notebook 21-meta/python/githubmodels-assignment.ipynb,逐格运行即可复现。
关于平台的版本演进提示:仓库当前英文主版 21-meta/README.md 指出,GitHub Models 将于 2026 年 7 月底停用,推荐迁移至 Microsoft Foundry Models 目录进行 AI 模型原型验证;迁移后代码中对应改为从 AZURE_INFERENCE_ENDPOINT / AZURE_INFERENCE_CREDENTIAL 读取端点与凭据,模型名也调整为 Foundry 目录中的规范名(如 Meta-Llama-3.1-405B-Instruct)。本课德文翻译 translations/de/21-meta/README.md 仍保留旧版调用形态,对照英文版 translations/en/21-meta/README.md 可以清晰看到这一迁移路径。因此在实际运行时,请以你所用平台当前支持的端点、凭据变量名与模型标识为准。
学完本课之后:把 Llama 放进更大的课程拼图
本课聚焦"选对 Meta 模型并调用其独有能力",是整条 21 课学习路径的收尾一环,可与邻近主题串联成完整能力链:
- 想深入函数调用(tool calling)全流程,可回到第 11 课 11-integrating-with-function-calling/README.md;
- 想在应用中落地检索增强,参考第 08 课 08-building-search-applications/README.md 与第 15 课 15-rag-and-vector-databases/README.md;
- 想让模型更贴合自身业务,可在掌握 Llama 3.1 合成数据能力后进入第 18 课 18-fine-tuning/README.md;
- 对照第 20 课 Mistral 家族 20-mistral/README.md,可以横向比较不同开源模型家族"小体量 + 强能力"的实现路线。
回到本课本身:一句话总结就是——文本大任务交给 Llama 3.1 的长上下文与工具调用,图文混合理解交给 Llama 3.2 的多模态变体,再按部署端(云端大模型 / 端侧小模型)选取合适的参数规模,即可把 Meta 家族模型快速接入你的生成式 AI 应用。
atomcodeClaude Code 的开源替代方案。连接任意大模型,编辑代码,运行命令,自动验证 — 全自动执行。用 Rust 构建,极致性能。 | An open-source alternative to Claude Code. Connect any LLM, edit code, run commands, and verify changes — autonomously. Built in Rust for speed. Get StartedRust0627
Hy4-previewHy4 preview 是由腾讯混元团队研发的新一代混合专家(MoE)旗舰模型。模型总参数量 770B,每个 token 激活 49B,主干共包含78层,第一层采用标准 FFN,其余 77 层均为 MoE 结构,每层包含 256 个路由专家与 1 个共享专家,每个 token 激活 top-8 路由专家及共享专家。主干之外原生内置 1 层 MTP(总参数量 10B,激活 0.7B)以支持投机解码。Python00
GLM-5.3GLM-5.3 与 GLM-5.2 使用相同的基座模型——所有提升均来自后训练。与 GLM-5.2 相比,它在复杂编程和长程任务上的表现显著提升。Jinja00
GLM-5.3-FlashGLM-5.3-Flash (320B-A18B),是GLM-5系列的首个原生多模态模型。320B总参数,能力超过GLM-5.2Jinja00
Spark-X2.5-4BSpark-X2.5-4B 旨在让强大的 AI 更实用、更高效、更易获得。在广泛日常任务中表现强劲,涵盖对话、写作、翻译、推理、编码、工具调用以及智能体工作流,并在同等规模的开源模型中取得领先成绩。Spark-X2.5 将面向效率的架构与最高 1M tokens 的原生上下文窗口相结合,并支持 200 多种语言。Python00
Spark-X2.5-1.7BSpark-X2.5-1.7B 旨在让强大的 AI 更加实用、高效且易于获取。这些模型在广泛的日常任务中表现出色,涵盖对话、写作、翻译、推理、编程、工具调用和智能体工作流,并在同等规模的开源模型中取得领先结果。Spark-X2.5 将面向效率的架构与最高 1M tokens 的原生上下文窗口相结合,并支持 200 多种语言。Python00