首页
/ generative-ai-for-beginners 第 21 课实战:用 Meta Llama 3.1 / 3.2 实现原生函数调用与多模态推理

generative-ai-for-beginners 第 21 课实战:用 Meta Llama 3.1 / 3.2 实现原生函数调用与多模态推理

2026-09-04 13:30:24作者:庞眉杨Will

本篇基于 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 代码示例。

Llama 3.2 多模态示例中使用的输入图片 sample.jpg,内容为模型目录(Model Catalog)界面

Meta 模型家族概览与变体选型

本课覆盖 Meta 模型家族(又称 "Llama Herd")中的两款主力模型:Llama 3.1Llama 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_CREDENTIALAZURE_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):

  1. 在 system prompt 中声明可用工具(brave_searchwolfram_alpha);
  2. 发送一条询问某城市天气的用户提示;
  3. 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)

几个值得注意的实现细节:

  • UserMessagecontent 是一个列表,TextContentItemImageContentItem 并列其中,模型会结合两者生成回答;
  • ImageUrl.load() 负责把本地文件 sample.jpg(见 21-meta/python/sample.jpg)编码并加载,image_format 需与实际格式一致;
  • detail=ImageDetailLevel.LOW 使用低细节档位,在满足「图中有什么」这类粗粒度问题的同时降低 token 消耗;若需要读取图中文字等细节,可提高到更高档位。

运行环境与依赖准备

两个示例共用的依赖与配置如下:

  1. 安装依赖:课程 requirements.txt 已包含 azure-ai-inference;若单独运行本课后代码,按 githubmodels-assignment.ipynb 中的安装单元执行即可:

    pip install azure-core azure-ai-inference
    
  2. 配置环境变量:在 Microsoft Foundry 项目的「Overview」页面找到推理端点与密钥,并设置:

    export AZURE_INFERENCE_CREDENTIAL="<你的密钥>"
    export AZURE_INFERENCE_ENDPOINT="<你的端点>"
    
  3. 模型名:调用 client.complete() 时使用的 model 参数必须与目录中登记的名字完全一致,本课使用 Meta-Llama-3.1-405B-InstructLlama-3.2-90B-Vision-Instruct;若你的项目开通的是其他变体(如 70B 或 11B Vision),替换 model_name 即可,代码结构无需改动。

  4. 运行方式:既可以复制 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-inferenceChatCompletionsClient 之上,与课程其他章节(如第 20 课 Mistral 模型实战)采用同一套客户端与凭证体系,因此本节的函数调用与多模态代码模式可以直接迁移到其他 Foundry 模型上复用。

登录后查看全文
热门项目推荐
相关项目推荐

项目优选

收起
kernelkernel
deepin linux kernel
C
33
18
ops-transformerops-transformer
本项目是CANN提供的transformer类大模型算子库,实现网络在NPU上加速计算。
C++
1.12 K
2.72 K
kernelkernel
openEuler内核是openEuler操作系统的核心,既是系统性能与稳定性的基石,也是连接处理器、设备与服务的桥梁。
C
527
590
ops-nnops-nn
本项目是CANN提供的神经网络类计算算子库,实现网络在NPU上加速计算。
C++
904
1.82 K
pytorchpytorch
作为 Ascend for PyTorch 社区的核心组件,TorchNPU 是昇腾专为 PyTorch 打造的深度学习适配插件,使 PyTorch 框架能够直接调用昇腾 NPU,为开发者提供昇腾 AI 处理器的超强算力。
Python
854
1.34 K
docsdocs
暂无描述
Markdown
889
5.78 K
jiuwenswarmjiuwenswarm
JiuwenSwarm 是一款基于openJiuwen开发的智能AI Agent,它能够将大语言模型的强大能力,通过你日常使用的各类通讯应用,直接延伸至你的指尖。
Python
3.52 K
1.01 K
ops-mathops-math
本项目是CANN提供的数学类基础计算算子库,实现网络在NPU上加速计算。
C++
1.33 K
1.45 K
cann-learning-hubcann-learning-hub
CANN 学习中心仓,支持在线互动运行、边学边练,提供教程、示例与优化方案,一站式助力昇腾开发者快速上手。
Jupyter Notebook
980
502
AscendNPU-IRAscendNPU-IR
AscendNPU-IR是基于MLIR(Multi-Level Intermediate Representation)构建的,面向昇腾亲和算子编译时使用的中间表示,提供昇腾完备表达能力,通过编译优化提升昇腾AI处理器计算效率,支持通过生态框架使能昇腾AI处理器与深度调优
C++
540
384