generative-ai-for-beginners 第 21 课实战:用 Meta Llama 3.1 / 3.2 实现原生函数调用与多模态推理
本篇基于 generative-ai-for-beginners 课程第 21 课 Building With the Meta Family Models 展开,聚焦 Meta「Llama Herd」模型家族中的两个核心成员——Llama 3.1 与 Llama 3.2。你将学会如何在 Microsoft Foundry Models 上通过 azure-ai-inference SDK 调用这两个模型:前者演示 Llama 3.1 的原生函数调用(Brave Search / Wolfram Alpha 内置工具),后者演示 Llama 3.2 的图文多模态理解,并完整覆盖模型选型、环境变量配置与可运行的 Python 代码示例。
Meta 模型家族概览与变体选型
本课覆盖 Meta 模型家族(又称 "Llama Herd")中的两款主力模型:Llama 3.1 与 Llama 3.2。两者均已在 Microsoft Foundry Models 模型目录中提供,可按不同参数规模与能力选择变体(Llama 3 也仍在目录中可用,但本课不涉及):
| 模型 | 变体 | 定位 |
|---|---|---|
| Llama 3.1 | 70B Instruct | 大参数规模开源 LLM,纯文本 |
| Llama 3.1 | 405B Instruct | 旗舰级大参数规模开源 LLM,纯文本 |
| Llama 3.2 | 11B Vision Instruct | 中小规模多模态(文本 + 图像) |
| Llama 3.2 | 90B Vision Instruct | 大规模多模态(文本 + 图像) |
注意:根据 21-meta/README.md 中的说明,GitHub Models 将于 2026 年 7 月底退役,本课代码已迁移到使用 Microsoft Foundry Models 进行 AI 模型原型验证。因此示例中使用的推理凭证与端点均为 Foundry 项目「Overview」页面提供的
AZURE_INFERENCE_CREDENTIAL与AZURE_INFERENCE_ENDPOINT。
选择思路可以概括为:要工具调用、超长上下文、强多语言能力,选 Llama 3.1;要图像理解能力,或需要部署到边缘/移动设备的轻量文本模型,选 Llama 3.2。
Llama 3.1:能力升级点与适用场景
以 4050 亿参数计的 Llama 3.1 属于开源 LLM 范畴。相比上一代 Llama 3,它的核心升级点(引自 21-meta/README.md):
| 维度 | Llama 3 | Llama 3.1 |
|---|---|---|
| 上下文窗口 | 8k tokens | 128k tokens |
| 最大输出 tokens | 2048 | 4096 |
| 多语言支持 | 一般 | 因训练 tokens 增加而显著增强 |
这些升级使 Llama 3.1 能够承载更复杂的 GenAI 应用场景,文档中总结了三个典型方向:
- 原生函数调用(Native Function Calling):模型经过微调,能够调用 LLM 工作流之外的外部工具与函数;
- 更好的 RAG 性能:得益于 128k 的更大上下文窗口,可以在一次请求中放入更多检索到的文档分块;
- 合成数据生成:为微调(fine-tuning)等任务批量生成有效训练数据。
实战一:Llama 3.1 的原生函数调用
Llama 3.1 被微调为更擅长发起函数/工具调用,并内置了两个模型可根据用户提示自动判断使用的工具:
- Brave Search——通过网页搜索获取天气等实时信息;
- Wolfram Alpha——执行更复杂的数学计算,无需自己编写计算函数。
除了内置工具,你也可以创建自定义工具供 LLM 调用。下面的示例演示完整流程(源码见 21-meta/README.md,交互式版本为 githubmodels-assignment.ipynb):
- 在 system prompt 中声明可用工具(
brave_search、wolfram_alpha); - 发送一条询问某城市天气的用户提示;
- LLM 会返回一个对 Brave Search 的工具调用(注意:本例只产生调用指令,若要拿到真实搜索结果,需要自行注册 Brave API 账号并实现该函数)。
import os
from azure.ai.inference import ChatCompletionsClient
from azure.ai.inference.models import AssistantMessage, SystemMessage, UserMessage
from azure.core.credentials import AzureKeyCredential
# 从 Microsoft Foundry 项目 "Overview" 页面获取这两个值
token = os.environ["AZURE_INFERENCE_CREDENTIAL"]
endpoint = os.environ["AZURE_INFERENCE_ENDPOINT"]
model_name = "Meta-Llama-3.1-405B-Instruct"
client = ChatCompletionsClient(
endpoint=endpoint,
credential=AzureKeyCredential(token),
)
# Llama 3.1 的 ChatML 风格提示词模板:
# 在 system 段中声明运行环境与可用工具列表,
# 模型据此决定何时以工具调用形式应答
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)
从源码结构看,这个示例的关键在于 tool_prompt:它使用了 Llama 的对话标记(<|begin_of_text|>、<|start_header_id|>system<|end_header_id|>、<|eot_id|>),并在 Tools: 一行中显式列出 brave_search, wolfram_alpha。当用户询问实时天气这类超出模型知识截止日期(2023 年 12 月)的问题时,模型预期会输出形如以下形式的工具调用指令,而非直接编造答案:
<|python_tag|>brave_search.call(query="Stockholm weather")
这展示了「模型负责决策调用哪个工具、应用层负责真正执行函数」的典型分工——这正是第 11 课 Function Calling 所讲模式在 Llama 3.1 上的落地形态。
实战二:Llama 3.2 的多模态(图文)推理
Llama 3.1 的一个重要局限是缺乏多模态能力——无法把图像作为输入。而多模态正是 Llama 3.2 的主打特性(引自 21-meta/README.md):
- 多模态:能够同时理解文本与图像提示;
- 小中规模变体(11B / 90B):提供灵活的部署选项;
- 纯文本变体(1B / 3B):可部署到边缘/移动设备,延迟更低。
对开源模型生态而言,多模态支持是一个重要进展。下面的示例使用 Llama-3.2-90B-Vision-Instruct,同时传入一张图片和一句文本提示,让模型分析图片内容(源码见 21-meta/README.md):
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
# 从 Microsoft Foundry 项目 "Overview" 页面获取这两个值
token = os.environ["AZURE_INFERENCE_CREDENTIAL"]
endpoint = os.environ["AZURE_INFERENCE_ENDPOINT"]
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=[
# 文本部分与图像部分同属一条 UserMessage 的 content 列表,
# 这是多模态请求的标准构造方式
TextContentItem(text="What's in this image?"),
ImageContentItem(
image_url=ImageUrl.load(
image_file="sample.jpg", # 仓库中随课提供的示例图片
image_format="jpg",
detail=ImageDetailLevel.LOW) # 降低细节档位可省 token
),
],
),
],
model=model_name,
)
print(response.choices[0].message.content)
几个值得注意的实现细节:
UserMessage的content是一个列表,TextContentItem与ImageContentItem并列其中,模型会结合两者生成回答;ImageUrl.load()负责把本地文件sample.jpg(见 21-meta/python/sample.jpg)编码并加载,image_format需与实际格式一致;detail=ImageDetailLevel.LOW使用低细节档位,在满足「图中有什么」这类粗粒度问题的同时降低 token 消耗;若需要读取图中文字等细节,可提高到更高档位。
运行环境与依赖准备
两个示例共用的依赖与配置如下:
-
安装依赖:课程 requirements.txt 已包含
azure-ai-inference;若单独运行本课后代码,按 githubmodels-assignment.ipynb 中的安装单元执行即可:pip install azure-core azure-ai-inference -
配置环境变量:在 Microsoft Foundry 项目的「Overview」页面找到推理端点与密钥,并设置:
export AZURE_INFERENCE_CREDENTIAL="<你的密钥>" export AZURE_INFERENCE_ENDPOINT="<你的端点>" -
模型名:调用
client.complete()时使用的model参数必须与目录中登记的名字完全一致,本课使用Meta-Llama-3.1-405B-Instruct与Llama-3.2-90B-Vision-Instruct;若你的项目开通的是其他变体(如 70B 或 11B Vision),替换model_name即可,代码结构无需改动。 -
运行方式:既可以复制 README 中的 Python 片段直接执行,也可以在 Jupyter 中打开 21-meta/python/githubmodels-assignment.ipynb 逐单元运行;该 notebook 与 README 的代码完全对应,并额外内置了
%pip install安装单元,适合首次实验。
小结:如何在这两个模型间做技术决策
结合本课 21-meta/README.md 的内容与示例代码,选型可以归纳为:
- 需要超长上下文(128k)、大输出(4096 tokens)、强多语言,并依赖工具调用/函数调用完成 RAG、合成数据、实时信息获取 → 选 Llama 3.1(70B / 405B Instruct);
- 输入包含图像,需要「看图说话」、图像分析等视觉理解能力 → 选 Llama 3.2 Vision(11B / 90B);
- 资源受限的边缘、移动或低延迟场景 → 关注 Llama 3.2 的 1B / 3B 纯文本变体。
两个示例都建立在 azure-ai-inference 的 ChatCompletionsClient 之上,与课程其他章节(如第 20 课 Mistral 模型实战)采用同一套客户端与凭证体系,因此本节的函数调用与多模态代码模式可以直接迁移到其他 Foundry 模型上复用。
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 StartedRust0622
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
