首页
/ 使用 Mistral 家族模型构建生成式 AI 应用:Mistral Large / Small / NeMo 选型与实战指南

使用 Mistral 家族模型构建生成式 AI 应用:Mistral Large / Small / NeMo 选型与实战指南

2026-09-06 18:17:39作者:江焘钦

导读

本指南对应开源课程《Generative AI for Beginners》第 20 课“Building with Mistral Models”,系统讲解 Mistral 旗下 Mistral Large(2)Mistral SmallMistral NeMo 三款代表性模型的定位差异、适用场景与调用方式。文中完整呈现了基于 Azure AI 推理端点(GitHub Models 风格)的三组可运行 Python 代码:基于 Mistral Large 的检索增强生成(RAG)流水线、Mistral Small 与 Mistral Large 的延迟对比实验、以及基于 Tekken 分词器的 Mistral NeMo 与 Mistral Large 分词数对比。读完你能够独立完成 Mistral 系列模型的选型判断,并在同一套推理接口下写出可复现的调用代码。本文内容以 translations/bn/20-mistral/README.md(孟加拉语译本)为核心主体,对应英文正本见 20-mistral/README.md

课程定位:三款模型,一次打通

本课是仓库 21 课课程体系中的一环,英文目录见 20-mistral/translations/en/20-mistral/。课程要解决三个核心问题:

  • 探索不同的 Mistral 模型:理解 Mistral Large、Mistral Small、Mistral NeMo 各自是什么、适合什么场景;
  • 理解每个模型的使用场景与边界:从上下文长度、延迟、成本、开源许可等维度做取舍;
  • 通过可运行代码验证每个模型的独特特性:包括 RAG、函数调用、分词效率、推理延迟等。

每款模型在该课程所用的推理市场中均可免费获取,课程配套 Notebook 中的代码即直接调用这些模型。可运行示例位于 20-mistral/python/githubmodels-assignment.ipynb(英文版)及 translations/bn/20-mistral/python/githubmodels-assignment.ipynb(孟加拉语版)。

关于推理端点的版本说明:本文所依据的译文文档仍采用 GitHub Models 风格接入(端点 https://models.inference.ai.azure.com + GITHUB_TOKEN)。而仓库根目录的英文课文 20-mistral/README.md 已在更新中说明 GitHub Models 计划于 2026 年 7 月底退役,并将代码迁移到 Microsoft Foundry Models 的模型推理服务,改用 AZURE_INFERENCE_ENDPOINTAZURE_INFERENCE_CREDENTIAL 两个环境变量。两套接入方式共用 azure-ai-inference SDK 的 ChatCompletionsClient / EmbeddingsClient,仅是 endpoint 与凭据来源不同,下文将分别给出两种写法。

Mistral 三款模型快速一览

模型 定位 许可 核心卖点 首选场景
Mistral Large 2 (2407) Mistral 旗舰模型,面向企业级使用 商业授权 128k 上下文窗口、原生函数调用、强代码生成 RAG、函数调用、Python/Java/TypeScript/C++ 代码生成
Mistral Small 小型语言模型(SLM),premier/enterprise 系列 商业授权 相比 Large/NeMo 约 80% 的成本下降、低延迟、部署灵活 摘要、情感分析、翻译等文本任务与高频低延迟调用
Mistral NeMo 开源模型,Mistral 7B 的升级继任者 Apache 2.0(免费) Tekken 高效分词器、可微调基座、原生函数调用 开源部署、需要定制微调或研究使用的场景

下表浓缩了本课最核心的选型结论,随后各节结合代码逐一展开。

Mistral Large 2 (2407):面向企业的旗舰模型

Mistral Large 2 是当前 Mistral 的旗舰模型,专为企业级使用设计。相对于原版 Mistral Large,它的升级体现在三个维度:

  • 更大的上下文窗口:128k(Large 2)对比 32k(原版 Large),意味着单次可容纳更长的文档与对话历史;
  • 数学与编码任务性能提升:平均准确率 76.9% 对比 60.4%;
  • 更强的多语言能力:覆盖英语、法语、德语、西班牙语、意大利语、葡萄牙语、荷兰语、俄语、中文、日语、韩语、阿拉伯语和印地语等语言。

正是这些特性,让 Mistral Large 2 在三类任务上表现出色:

  • 检索增强生成(RAG)——得益于更大的上下文窗口,可以一次性携带更多检索片段并给出有依据的回答;
  • 函数调用(Function Calling)——模型原生支持函数调用,能与外部工具和 API 集成,且调用既支持并行执行,也支持按顺序逐个串联执行;
  • 代码生成——在 Python、Java、TypeScript 与 C++ 的代码生成上表现突出。

端到端示例:用 Mistral Large 2 在文本文档上跑一个 RAG

本示例用 Mistral Large 2 在一篇英文长文上执行 RAG 模式。注意提问本身是韩语写的,询问的是作者上大学之前的主要活动,用来直观展示模型的多语言理解与“基于检索上下文而非先验知识”作答的能力。

流水线的数据流如下:

  1. 通过 requests 下载一篇纯文本长文,按 chunk_size = 2048 字符切分成块;
  2. 使用 Cohere Embeddings 模型cohere-embed-v3-multilingual)对每个文本块做向量化;
  3. 使用 Python 的 faiss 包构建向量存储(IndexFlatL2)并写入全部文本块向量;
  4. 对韩语问题同样做向量化,在 faiss 中做最近邻检索,取回 k=2 个最相似的文本块;
  5. 将“问题 + 检索块”组装成提示词发给 Mistral Large 2,由模型生成自然语言答案。

依赖安装与完整代码(与课文 translations/bn/20-mistral/README.md 一致):

pip install faiss-cpu
import requests
import numpy as np
import faiss
import os

from azure.ai.inference import ChatCompletionsClient
from azure.ai.inference.models import SystemMessage, UserMessage
from azure.core.credentials import AzureKeyCredential
from azure.ai.inference import EmbeddingsClient

endpoint = "https://models.inference.ai.azure.com"
model_name = "Mistral-large"
token = os.environ["GITHUB_TOKEN"]

client = ChatCompletionsClient(
    endpoint=endpoint,
    credential=AzureKeyCredential(token),
)

response = requests.get('https://raw.githubusercontent.com/run-llama/llama_index/main/docs/docs/examples/data/paul_graham/paul_graham_essay.txt')
text = response.text

chunk_size = 2048
chunks = [text[i:i + chunk_size] for i in range(0, len(text), chunk_size)]
len(chunks)

embed_model_name = "cohere-embed-v3-multilingual"

embed_client = EmbeddingsClient(
        endpoint=endpoint,
        credential=AzureKeyCredential(token)
)

embed_response = embed_client.embed(
    input=chunks,
    model=embed_model_name
)



text_embeddings = []
for item in embed_response.data:
    length = len(item.embedding)
    text_embeddings.append(item.embedding)
text_embeddings = np.array(text_embeddings)


d = text_embeddings.shape[1]
index = faiss.IndexFlatL2(d)
index.add(text_embeddings)

question = "저자가 대학에 오기 전에 주로 했던 두 가지 일은 무엇이었나요?"

question_embedding = embed_client.embed(
    input=[question],
    model=embed_model_name
)

question_embeddings = np.array(question_embedding.data[0].embedding)


D, I = index.search(question_embeddings.reshape(1, -1), k=2) # distance, index
retrieved_chunks = [chunks[i] for i in I.tolist()[0]]

prompt = f"""
Context information is below.
---------------------
{retrieved_chunks}
---------------------
Given the context information and not prior knowledge, answer the query.
Query: {question}
Answer:
"""


chat_response = client.complete(
    messages=[
        SystemMessage(content="You are a helpful assistant."),
        UserMessage(content=prompt),
    ],
    temperature=1.0,
    top_p=1.0,
    max_tokens=1000,
    model=model_name
)

print(chat_response.choices[0].message.content)

代码中的关键设计值得单独强调:

  • 提示词即“检索后拼接”范式:送入模型的 prompt 同时包含用户问题和与问题语义最相近的检索片段,并显式约束模型“仅依据给出的上下文、而非已有先验知识”作答——这是 RAG 场景下抑制幻觉、提升答案可溯源性的通用做法,与本仓库 15-rag-and-vector-databases/README.md 讲解的 RAG 原理一脉相承;
  • 一个端点两个客户端ChatCompletionsClient 负责对话补全,EmbeddingsClient 负责向量化,两者共用同一 endpoint 与凭据,来自 azure-ai-inference SDK;
  • 128k 上下文的价值在此体现:检索回的 top-2 块(每块 2048 字符)加上 prompt 模板仅占很小额度,模型有充足余量处理更长的上下文,这也是该模型被定位为 RAG 首选的原因之一。

Mistral Small:低成本、低延迟的小型语言模型

Mistral Small 是 Mistral 家族中归属于 premier/enterprise 类别的另一款模型。正如其名,它是一个小型语言模型(SLM),优势体现在:

  • 成本节省:与 Mistral Large、Mistral NeMo 等 Mistral 大模型相比价格下降约 80%
  • 低延迟:相比 Mistral 的 LLM 响应更快;
  • 部署灵活:可在不同环境中部署,对所需算力资源的限制更小。

由此,Mistral Small 特别适合以下工作负载:

  • 文本类任务:摘要生成、情感分析、翻译;
  • 高频请求型应用:因为成本效益显著,适合请求量非常大、单价敏感的场景;
  • 低延迟代码类任务:如代码审查(code review)与代码建议(code suggestions)。

从课程体系看,这类“小模型何时够用”的判断同样呼应了 19-slm/README.md 中对小型语言模型选型的讲解:当任务不需要超大上下文与极致推理能力时,SLM 的成本与速度优势会明显放大。

动手对比:Mistral Small 与 Mistral Large 的延迟差异

为了直观展示 Small 与 Large 在延迟上的差异,课文提供了两个几乎完全一致、仅 model_name 不同的单元格,向模型提出同一个请求:“Can you write a Python function to the fizz buzz test?”(用 Python 实现 fizz buzz)。预期可以在同一提示词的响应时间上观察到 3~5 秒的差距,同时注意比较两段回复的长度与文风差异。

Mistral Small 版本:

import os
endpoint = "https://models.inference.ai.azure.com"
model_name = "Mistral-small"
token = os.environ["GITHUB_TOKEN"]

client = ChatCompletionsClient(
    endpoint=endpoint,
    credential=AzureKeyCredential(token),
)

response = client.complete(
    messages=[
        SystemMessage(content="You are a helpful coding assistant."),
        UserMessage(content="Can you write a Python function to the fizz buzz test?"),
    ],
    temperature=1.0,
    top_p=1.0,
    max_tokens=1000,
    model=model_name
)

print(response.choices[0].message.content)

Mistral Large 版本:

import os
from azure.ai.inference import ChatCompletionsClient
from azure.ai.inference.models import SystemMessage, UserMessage
from azure.core.credentials import AzureKeyCredential

endpoint = "https://models.inference.ai.azure.com"
model_name = "Mistral-large"
token = os.environ["GITHUB_TOKEN"]

client = ChatCompletionsClient(
    endpoint=endpoint,
    credential=AzureKeyCredential(token),
)

response = client.complete(
    messages=[
        SystemMessage(content="You are a helpful coding assistant."),
        UserMessage(content="Can you write a Python function to the fizz buzz test?"),
    ],
    temperature=1.0,
    top_p=1.0,
    max_tokens=1000,
    model=model_name
)

print(response.choices[0].message.content)

对比实验的观察要点:响应的速度差异随服务端负载等因素会有波动,3~5 秒是本课在实验环境下观察到的典型区间;相比只跑一次,更稳健的做法是同一提示词多次调用后对比平均耗时。另外要同时关注“答案质量是否可接受”——延迟低的模型如果回答满足需求,就说明该场景不需要升级到 Large。

Mistral NeMo:Apache 2.0 开源模型

与前两款企业级商业模型不同,Mistral NeMo 是唯一的免费开源模型,采用 Apache 2.0 许可,被视作 Mistral 早期开源 LLM —— Mistral 7B 的升级继任者。它的独特特性包括:

  • 更高效率的分词(Tokenization):使用 Tekken 分词器替代更常见的 tiktoken,在更多语言和代码上的表现更好;
  • 可微调(Finetuning):基座模型开放微调,为需要针对特定业务场景做定制化的用例提供更大灵活性;
  • 原生函数调用:与 Mistral Large 类似,NeMo 也经过函数调用训练,是最早一批具备该能力的开源模型之一。

关于函数调用在应用层的用法,可结合 11-integrating-with-function-calling/README.md 一起阅读,那里展示了工具(Tool)定义如何在实际应用中驱动模型发起外部 API 调用。

分词器对比实验:Tekken 为什么更省 token

课文提供了一个非常直观的实验:用 mistral-common 包分别加载 NeMo(open-mistral-nemo)与 Large(mistral-large-latest)的分词器,对完全相同的对话请求(消息中包含一个 get_current_weather 天气查询工具的函数定义)做分词,然后打印 token 总数。预期结果是:同样的输入,NeMo 返回的 token 数比 Mistral Large 更少

先安装依赖:

pip install mistral-common

NeMo(open-mistral-nemo)版本:

# Import needed packages:
from mistral_common.protocol.instruct.messages import (
    UserMessage,
)
from mistral_common.protocol.instruct.request import ChatCompletionRequest
from mistral_common.protocol.instruct.tool_calls import (
    Function,
    Tool,
)
from mistral_common.tokens.tokenizers.mistral import MistralTokenizer

# Load Mistral tokenizer

model_name = "open-mistral-nemo"

tokenizer = MistralTokenizer.from_model(model_name)

# Tokenize a list of messages
tokenized = tokenizer.encode_chat_completion(
    ChatCompletionRequest(
        tools=[
            Tool(
                function=Function(
                    name="get_current_weather",
                    description="Get the current weather",
                    parameters={
                        "type": "object",
                        "properties": {
                            "location": {
                                "type": "string",
                                "description": "The city and state, e.g. San Francisco, CA",
                            },
                            "format": {
                                "type": "string",
                                "enum": ["celsius", "fahrenheit"],
                                "description": "The temperature unit to use. Infer this from the user's location.",
                            },
                        },
                        "required": ["location", "format"],
                    },
                )
            )
        ],
        messages=[
            UserMessage(content="What's the weather like today in Paris"),
        ],
        model=model_name,
    )
)
tokens, text = tokenized.tokens, tokenized.text

# Count the number of tokens
print(len(tokens))

Mistral Large(mistral-large-latest)版本:

# Import needed packages:
from mistral_common.protocol.instruct.messages import (
    UserMessage,
)
from mistral_common.protocol.instruct.request import ChatCompletionRequest
from mistral_common.protocol.instruct.tool_calls import (
    Function,
    Tool,
)
from mistral_common.tokens.tokenizers.mistral import MistralTokenizer

# Load Mistral tokenizer

model_name = "mistral-large-latest"

tokenizer = MistralTokenizer.from_model(model_name)

# Tokenize a list of messages
tokenized = tokenizer.encode_chat_completion(
    ChatCompletionRequest(
        tools=[
            Tool(
                function=Function(
                    name="get_current_weather",
                    description="Get the current weather",
                    parameters={
                        "type": "object",
                        "properties": {
                            "location": {
                                "type": "string",
                                "description": "The city and state, e.g. San Francisco, CA",
                            },
                            "format": {
                                "type": "string",
                                "enum": ["celsius", "fahrenheit"],
                                "description": "The temperature unit to use. Infer this from the user's location.",
                            },
                        },
                        "required": ["location", "format"],
                    },
                )
            )
        ],
        messages=[
            UserMessage(content="What's the weather like today in Paris"),
        ],
        model=model_name,
    )
)
tokens, text = tokenized.tokens, tokenized.text

# Count the number of tokens
print(len(tokens))

实验的两个注意点:

  • 这里分词的对象是包含 Tool 定义的完整 ChatCompletion 请求,而非纯文本,这样才能体现真实对话场景(尤其是函数调用)下的 token 开销;Function 的 JSON Schema 结构(含 enumrequired 等)会在后续调用中约束模型按格式输出;
  • 分词数量直接影响成本与延迟:NeMo 用更少 token 表达同样的语义,意味着在按 token 计费的推理服务中同等输入的开销更低,也侧面印证了 Tekken 分词器在多语言与代码场景下的效率优势。更小的 token 数还意味着同样的 max_tokens 预算内可以容纳更多有效输出。

运行前提与环境配置

要让上述代码在你的机器上跑通,需要准备:

  1. Python 环境与依赖包

    • azure-ai-inference(提供 ChatCompletionsClientEmbeddingsClient,与 azure.core.credentials.AzureKeyCredential 配合鉴权);
    • faiss-cpu(RAG 示例的本地向量存储);
    • mistral-common(分词器对比实验);
    • numpyrequests(数据下载与向量数组处理)。
  2. 推理端点与凭据(两种风格任选其一)

    • 译文文档与配套 Notebook 使用 GitHub Models 风格:endpoint 固定为 https://models.inference.ai.azure.com,凭据读取环境变量 GITHUB_TOKEN,即 token = os.environ["GITHUB_TOKEN"]
    • 英文根目录 20-mistral/README.md 已更新为 Microsoft Foundry 风格:endpoint 与凭据分别来自环境变量 AZURE_INFERENCE_ENDPOINTAZURE_INFERENCE_CREDENTIAL,两者取自你 Foundry 项目页面的 “Overview”。仅需将示例中 endpoint/token 两行的取值来源替换即可,其余代码保持不变。

    无论哪种风格,请务必不要把令牌明文写入代码,运行时从环境变量注入,参考仓库 shared/python/env_utils.py 的约定可看到这种环境变量管理方式被广泛用于课程各处示例。

  3. 模型标识(deployment/model name):代码中的 model_name 使用 Mistral-largeMistral-small 等平台侧名称;在按部署名(deployment name)调用的服务中需要改为你实际创建的部署名。

采样参数说明

三组示例的推理调用都传了三个采样参数,含义如下:

参数 示例值 作用
temperature 1.0 控制输出的随机性/创造性,值越高越发散,越低越确定
top_p 1.0 核采样(nucleus sampling)的累积概率阈值,配合 temperature 控制采样分布
max_tokens 1000 限制本次生成的最大输出 token 数,防止长回复超额

在做“Small 与 Large 对比”这类实验时保持两组参数一致,才能让延迟与输出差异真正归因于模型本身;在正式产品中通常需要调低 temperature 换取更稳定的输出。

小结:如何把三款模型放进你的技术选型

围绕本课的技术内容可以形成一条清晰的决策路径:

  1. 需要最大上下文、复杂函数调用或高质量代码生成(尤其 Python/Java/TypeScript/C++),选 Mistral Large 2;RAG 场景可参照 15-rag-and-vector-databases/README.md 与本课示例搭建完整链路,函数调用集成进一步参考 11-integrating-with-function-calling/README.md
  2. 对延迟和单价敏感、请求高频,且任务以摘要、情感分析、翻译等中低难度为主,选 Mistral Small,并先用对比实验验证质量是否达标;
  3. 需要开源、可自托管、可微调,或想用更省 token 的开源模型,选 Mistral NeMo(Apache 2.0);用 Tekken 分词器的对比脚本能帮你量化其在 token 效率上的收益。

本课配套的可执行 Notebook(含全部代码单元与说明)位于 20-mistral/python/githubmodels-assignment.ipynb,孟加拉语译本见 translations/bn/20-mistral/python/githubmodels-assignment.ipynb;英文正本课文见 20-mistral/README.md,本文所依的译本见 translations/bn/20-mistral/README.md。课程总览中的第 20 课入口可参考根目录 README.md

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