# 教程：如何微调 Llama-3 并在 Ollama 中使用

在本教程结束时，你将通过以下方式创建一个自定义聊天机器人： **微调 Llama-3** 使用 [**Unsloth**](https://github.com/unslothai/unsloth) ，而且完全免费。它可以通过以下方式在本地运行： [**Ollama**](https://github.com/ollama/ollama) 在你的电脑上，或者通过以下方式在免费的 GPU 实例中运行： [**Google Colab**](https://colab.research.google.com/github/unslothai/notebooks/blob/main/nb/Llama3_\(8B\)-Ollama.ipynb)。你将能够像下面这样与聊天机器人进行交互：

<figure><img src="/files/34a358ac9b8b41054f781bec9c49c9f0bc2a3b77" alt=""><figcaption></figcaption></figure>

**Unsloth** 使微调变得容易得多，并且可以自动将微调后的模型导出到 **Ollama** 并集成自动 `Modelfile` 创建！如果你需要帮助，可以加入我们的 Discord 服务器： <https://discord.com/invite/unsloth>

{% hint style="warning" %}
**如果你想复制或保存代码，全部内容都可以在我们的** [**Ollama Colab 笔记本**](https://colab.research.google.com/github/unslothai/notebooks/blob/main/nb/Llama3_\(8B\)-Ollama.ipynb)**中找到。你可以直接在那里使用，或者将其改造成适合你本地环境的版本：** [**https://colab.research.google.com/github/unslothai/notebooks/blob/main/nb/Llama3\_(8B)-Ollama.ipynb**](https://colab.research.google.com/github/unslothai/notebooks/blob/main/nb/Llama3_\(8B\)-Ollama.ipynb)
{% endhint %}

## 1. 什么是 Unsloth？

[Unsloth](https://github.com/unslothai/unsloth) 使像 Llama-3、Mistral、Phi-3 和 Gemma 这样的 LLM 微调速度快 2 倍，内存占用减少 70%，而且准确率没有下降！在本教程中，我们将使用 Google Colab，它会提供免费的 GPU。你可以在下面访问我们的免费笔记本：

* [Ollama Llama-3 Alpaca](https://colab.research.google.com/github/unslothai/notebooks/blob/main/nb/Llama3_\(8B\)-Ollama.ipynb) （我们将使用的笔记本）
* [CSV/Excel Ollama 指南](https://colab.research.google.com/drive/1VYkncZMfGFkeCEgN2IzbZIKEDkyQuJAS?usp=sharing)

#### ***你还需要登录你的 Google 账号！***

<figure><img src="/files/8be2dcb52d3d5a97fef2a89b388ea0864348308a" alt=""><figcaption></figcaption></figure>

## 2. 什么是 Ollama？

[Ollama ](https://github.com/ollama/ollama)让你能够以快速而简单的方式在自己的电脑上运行语言模型！它会悄悄启动一个程序，在后台运行像 Llama-3 这样的语言模型。如果你突然想向语言模型提问，只需向 Ollama 提交请求，它就会很快把结果返回给你！我们将使用 Ollama 作为推理引擎！

<figure><img src="/files/f0adddf20d2ed9c9b03bb64466a309e117dc5bed" alt=""><figcaption></figcaption></figure>

## 3. 安装 Unsloth

<figure><img src="/files/f9d31188e8906c978f32d8a7663ae58fd9d3950b" alt=""><figcaption></figcaption></figure>

如果你从未使用过 Colab 笔记本，先快速了解一下笔记本本身：

1. **每个“单元格”上的播放按钮。** 点击它即可运行该单元格的代码。你不能跳过任何单元格，并且必须按时间顺序运行每个单元格。如果遇到任何错误，只需重新运行之前没有运行过的单元格。另一个选择是如果你不想点击播放按钮，可以按 CTRL + ENTER。
2. **顶部工具栏中的 Runtime 按钮。** 你也可以使用这个按钮并点击“Run all”一次运行整个笔记本。这会跳过所有自定义步骤，适合作为第一次尝试。
3. **Connect / Reconnect T4 按钮。** 你可以点击这里查看更多高级系统统计信息。

第一个安装单元格看起来如下：记得点击方括号 \[ ] 中的 PLAY 按钮。我们会获取开源的 Github 包，并安装一些其他包。

<figure><img src="/files/c2ce5571ac44c680f70caebd2a9efcbc8850a0ba" alt=""><figcaption></figcaption></figure>

## 4. 选择要微调的模型

现在让我们选择一个用于微调的模型！我们默认选择 Meta / Facebook 的 Llama-3，它在多达 15 万亿个“tokens”上训练而成。可以把 token 理解为一个英文单词。大约相当于 35 万本厚百科全书的内容！其他流行模型还包括 Mistral、Phi-3（使用 GPT-4 输出训练）以及 Google 的 Gemma（13 万亿 tokens！）。

Unsloth 支持这些模型以及更多模型！实际上，只要输入 Hugging Face 模型库中的模型名称，就能看看它是否可用！如果不可用，我们会报错。

<figure><img src="/files/709e91afa5480cf82d31df9e40cd9a67cbd3ea3d" alt=""><figcaption></figcaption></figure>

还有 3 个你可以切换的设置：

1. ```python
   max_seq_length = 2048
   ```

   这决定了模型的上下文长度。例如 Gemini 的上下文长度超过 100 万，而 Llama-3 的上下文长度是 8192。我们允许你选择任意数值——但出于测试目的，我们建议设置为 2048。Unsloth 也支持超长上下文微调，我们展示了我们能提供比最佳方案长 4 倍的上下文长度。
2. ```python
   dtype = None
   ```

   保持为 None，但你可以为较新的 GPU 选择 torch.float16 或 torch.bfloat16。
3. ```python
   load_in_4bit = True
   ```

   我们采用 4 位量化进行微调。这会将内存使用量减少 4 倍，使我们实际上可以在免费的 16GB 显存 GPU 上进行微调。4 位量化本质上是把权重转换成一组有限的数字，以减少内存使用。它的缺点是准确率会下降 1% 到 2%。如果你使用 H100 这类更大的 GPU，并且想要那一点点额外准确率，可以将其设为 False。

<figure><img src="/files/0a7bf676819eb3c7e9620a9eba9bc2d325f6dace" alt=""><figcaption></figcaption></figure>

如果你运行该单元格，你会看到一些关于 Unsloth 版本、你正在使用的模型、GPU 有多少内存以及其他一些统计信息的输出。现在先忽略这些。

## 5. 微调参数

<figure><img src="/files/1a348b9e166dcf21380c7ff6cddac185115ffcb1" alt=""><figcaption></figcaption></figure>

现在要自定义你的微调，你可以编辑上面的数字，但也可以忽略它，因为我们已经选择了相当合理的数值。

目标是修改这些数字来提高准确率，同时也要 **抑制过拟合**。过拟合是指你让语言模型记住一个数据集，而无法回答新的问题。我们希望最终模型能够回答未见过的问题，而不是死记硬背。

1. ```python
   r = 16, # 选择任意 > 0 的数字！建议 8、16、32、64、128
   ```

   微调过程的秩（rank）。数字越大，占用内存越多，速度越慢，但在更难的任务上可以提高准确率。我们通常建议使用 8（用于快速微调），最高可到 128。数字过大可能导致过拟合，损害模型质量。
2. ```python
   target_modules = ["q_proj", "k_proj", "v_proj", "o_proj",
                     "gate_proj", "up_proj", "down_proj",],
   ```

   我们选择所有模块进行微调。你可以移除一些模块来减少内存占用并加快训练速度，但我们强烈不建议这样做。直接对所有模块训练！
3. ```python
   lora_alpha = 16,
   ```

   微调的缩放因子。数字越大，微调越能学习你的数据集，但也更容易过拟合。我们建议将其设置为与秩 `r`相等，或者设为其两倍。
4. ```python
   lora_dropout = 0, # 支持任意值，但 = 0 已优化
   ```

   保持为 0 可以加快训练！可以减少过拟合，但作用不大。
5. ```python
   bias = "none",    # 支持任意值，但 = "none" 已优化
   ```

   保持为 0 可以让训练更快、过拟合更少！
6. ```python
   use_gradient_checkpointing = "unsloth", # 对于超长上下文，设为 True 或 "unsloth"
   ```

   可选项包括 `True`, `False` 和 `"unsloth"`。我们建议 `"unsloth"` 因为我们会额外减少 30% 的内存使用，并支持极长上下文的微调。你可以在这里了解更多： <https://unsloth.ai/blog/long-context> 了解更多细节。
7. ```python
   random_state = 3407,
   ```

   用于决定确定性运行的数字。训练和微调需要随机数，因此设置这个数字可以使实验可复现。
8. ```python
   use_rslora = False,  # 我们支持秩稳定 LoRA
   ```

   用于自动设置 `lora_alpha = 16` 的高级功能。如果你愿意可以使用它！
9. ```python
   loftq_config = None, # 以及 LoftQ
   ```

   将 LoRA 矩阵初始化为权重的前 r 个奇异向量的高级功能。能在一定程度上提高准确率，但会导致一开始内存使用激增。

## 6. Alpaca 数据集

<figure><img src="/files/6bd7211a584e8e186a35e687888a7d41336816d3" alt=""><figcaption></figcaption></figure>

我们现在将使用通过 GPT-4 自身生成的 Alpaca 数据集。它包含 52,000 条指令和输出，在 Llama-1 发布时非常受欢迎，因为它让基础 LLM 的微调能够与 ChatGPT 本身相竞争。

你可以在这里访问 GPT4 版本的 Alpaca 数据集： <https://huggingface.co/datasets/vicgalle/alpaca-gpt4>。更早的第一个版本数据集在这里： <https://github.com/tatsu-lab/stanford_alpaca>。下面展示了数据集的一些示例：

<figure><img src="/files/18ab8cf1c142db8d4ae4237b715b4af08ee5f629" alt=""><figcaption></figcaption></figure>

你可以看到每一行有 3 列——指令、输入和输出。我们基本上会把每一行合并成如下所示的一个大提示词。然后我们用它来微调语言模型，这使它变得非常像 ChatGPT。我们把这个过程称为 **监督式指令微调**.

<figure><img src="/files/c0b5a28a20ff7ae93f2c84d93c1f0f1843c402cf" alt=""><figcaption></figcaption></figure>

## 7. 用于微调的多列

但一个大问题是，对于 ChatGPT 风格的助手，我们只允许 1 条指令 / 1 个提示词，而不是多列 / 多个输入。例如在 ChatGPT 中，你可以看到我们必须提交 1 个提示词，而不是多个提示词。

<figure><img src="/files/27ef926c80bbe911b2a6a03ea4cb3e51388853a4" alt=""><figcaption></figcaption></figure>

这实际上意味着，为了让微调真正生效，我们必须把多列“合并”成 1 个大提示词！

例如，著名的 Titanic 数据集有很多很多列。你的任务是根据乘客年龄、舱位、票价等信息预测乘客是生还还是死亡。我们不能直接把这些信息传给 ChatGPT，而是必须把这些信息“合并”成 1 个大提示词。

<figure><img src="/files/51237682d24fcdd7f522c9264e74e906ecce8881" alt=""><figcaption></figcaption></figure>

例如，如果我们用包含该乘客所有信息的“合并后”单个提示词去询问 ChatGPT，我们就可以让它猜测或预测该乘客是死亡还是生还。

<figure><img src="/files/988e3dabf006d4e98a3b064c888c3db5ece2ee14" alt=""><figcaption></figcaption></figure>

其他微调库要求你手动准备用于微调的数据集，把所有列合并成 1 个提示词。在 Unsloth 中，我们只需提供一个名为 `to_sharegpt` 的函数，它可以一次性完成这件事！

要访问 Titanic 微调笔记本，或者如果你想上传 CSV 或 Excel 文件，请前往这里： <https://colab.research.google.com/drive/1VYkncZMfGFkeCEgN2IzbZIKEDkyQuJAS?usp=sharing>

<figure><img src="/files/e817fa08b58a208b6effb272b63172d38cfab498" alt=""><figcaption></figcaption></figure>

现在这会稍微复杂一些，因为我们允许很多自定义，但有几个要点：

* 你必须用大括号包住所有列 `{}`。这些是实际 CSV / Excel 文件中的列名。
* 可选文本组件必须包裹在 `[[]]`中。例如如果列“input”为空，合并函数将不会显示这段文本并跳过它。这对存在缺失值的数据集很有用。
* 在 `output_column_name`中选择输出或目标 / 预测列。对于 Alpaca 数据集，这将是 `output`.

例如在 Titanic 数据集中，我们可以创建如下所示的大型合并提示词格式，其中每一列 / 每段文本都是可选的。

<figure><img src="/files/c97fec182823138023625a74acd8bf72566768a0" alt=""><figcaption></figcaption></figure>

例如，假设数据集长这样，并且有很多缺失数据：

| Embarked | Age | Fare |
| -------- | --- | ---- |
| S        | 23  |      |
|          | 18  | 7.25 |

那么，我们不希望结果是：

1. 乘客从 S 登船。他们的年龄是 23。他们的票价是 **空白**.
2. 乘客从 **空白**登船。他们的年龄是 18。他们的票价是 $7.25。

相反，通过使用 `[[]]`将列设为可选，我们可以完全排除这些信息。

1. \[\[The passenger embarked from S.]] \[\[Their age is 23.]] \[\[Their fare is **空白**.]]
2. \[\[The passenger embarked from **空白**.]] \[\[Their age is 18.]] \[\[Their fare is $7.25.]]

会变成：

1. 乘客从 S 登船。他们的年龄是 23。
2. 他们的年龄是 18。他们的票价是 $7.25。

## 8. 多轮对话

如果你没注意到，一个问题是 Alpaca 数据集是单轮对话，而你还记得 ChatGPT 是交互式的，你可以和它进行多轮对话。例如，左边是我们想要的，而右边的 Alpaca 数据集只提供单次对话。我们希望微调后的语言模型能够以某种方式学会像 ChatGPT 一样进行多轮对话。

<figure><img src="/files/02f83b44488171e282ef1bf51fde26acb96a6a7b" alt=""><figcaption></figcaption></figure>

因此我们引入了 `conversation_extension` 参数，它本质上会在你的单轮数据集中随机选择一些行，并把它们合并成 1 段对话！例如，如果你把它设为 3，我们会随机选择 3 行并把它们合并成 1 行！设置得太长会使训练变慢，但可能会让你的聊天机器人和最终微调效果好很多！

<figure><img src="/files/4849fe401f1d094fbfcce60d2dcb75189316c9ac" alt=""><figcaption></figcaption></figure>

然后把 `output_column_name` 设为预测 / 输出列。对于 Alpaca 数据集来说，它就是 output 列。

然后我们使用 `standardize_sharegpt` 函数把数据集整理成适合微调的正确格式！一定要调用这个！

<figure><img src="/files/1e924f8e8f23e8ce40da2876066b9340c6f25e0a" alt=""><figcaption></figcaption></figure>

## 9. 可自定义聊天模板

现在我们可以为微调本身指定聊天模板。著名的 Alpaca 格式如下：

<figure><img src="/files/8d184b103a71fb233f5ef9220eb1ef3481088a49" alt=""><figcaption></figcaption></figure>

但还记得我们说过这是个坏主意吗？因为 ChatGPT 风格的微调只需要 1 个提示词？由于我们已经用 Unsloth 成功把所有数据集列合并成 1 列，所以我们实际上可以创建下面这种聊天模板：包含 1 个输入列（instruction）和 1 个输出：

<figure><img src="/files/c04db09684c17f35ff66b1a7f66ddbe944bdf3ca" alt=""><figcaption></figcaption></figure>

我们只要求你必须放入一个 `{INPUT}` 字段作为指令，以及一个 `{OUTPUT}` 字段作为模型输出字段。实际上我们还允许一个可选的 `{SYSTEM}` 字段，这对像 ChatGPT 那样自定义系统提示词很有用。例如，下面是一些很酷的示例，你可以把聊天模板自定义成：

<figure><img src="/files/cb48c9db509de3aa7c0e7358e9171c7f513a4de2" alt=""><figcaption></figcaption></figure>

对于 OpenAI 模型中使用的 ChatML 格式：

<figure><img src="/files/bda510272aaa6c9b37a557f137852d0f6de7f71b" alt=""><figcaption></figcaption></figure>

或者你可以直接使用 Llama-3 模板本身（它只能通过使用 Llama-3 的 instruct 版本来发挥作用）：实际上我们还允许一个可选的 `{SYSTEM}` 字段，这对像 ChatGPT 那样自定义系统提示词很有用。

<figure><img src="/files/f2654913d520ecaca3e63b3aaffa3bd697d31a26" alt=""><figcaption></figcaption></figure>

或者在 Titanic 预测任务中，你需要在这个包含 CSV 和 Excel 上传功能的 Colab 笔记本里预测乘客是死亡还是生还： <https://colab.research.google.com/drive/1VYkncZMfGFkeCEgN2IzbZIKEDkyQuJAS?usp=sharing>

<figure><img src="/files/d321b3aebceac495259213dd50100d3d3df339cf" alt=""><figcaption></figcaption></figure>

## 10. 训练模型

现在让我们训练模型吧！我们通常建议大家不要修改下面的内容，除非你想进行更长步数的微调，或者想用更大的批量大小训练。

<figure><img src="/files/8409ec242c3bc95c51bda0070d000262879506ca" alt=""><figcaption></figcaption></figure>

我们通常不建议更改上面的参数，但为了说明其中的一些参数：

1. ```python
   per_device_train_batch_size = 2,
   ```

   如果你想更充分利用 GPU 的内存，可以增加 batch size。也可以增加它来让训练更平滑，并减少过拟合。我们通常不建议这样做，因为由于 padding 问题，这样可能会让训练实际上更慢。我们通常建议你改为增加 `gradient_accumulation_steps` ，它只是对数据集进行更多次遍历。
2. ```python
   gradient_accumulation_steps = 4,
   ```

   这相当于增加上面的 batch size，但不会影响内存消耗！如果你想要更平滑的训练损失曲线，我们通常建议增加这个值。
3. ```python
   max_steps = 60, # num_train_epochs = 1,
   ```

   我们将步数设为 60 以加快训练。对于完整训练过程，可能需要数小时，你可以注释掉 `max_steps`，并将其替换为 `num_train_epochs = 1`。将其设为 1 表示完整遍历数据集 1 次。我们通常建议遍历 1 到 3 次，不要更多，否则你的微调会过拟合。
4. ```python
   learning_rate = 2e-4,
   ```

   如果你想让微调过程更慢一些，但更有可能收敛到更高准确率的结果，可以降低学习率。我们通常建议尝试 2e-4、1e-4、5e-5、2e-5 这些数值。

<figure><img src="/files/3a422308dff4338d8b4fad79a59cd5e82bb3ef0b" alt=""><figcaption></figcaption></figure>

你会在训练过程中看到一串日志数字。这就是训练损失，表示模型从你的数据集中学习得有多好。很多情况下，损失在 0.5 到 1.0 左右是个好迹象，但这取决于你的数据集和任务。如果损失没有下降，你可能需要调整设置。如果损失降到 0，那可能意味着过拟合，所以同时检查验证集也很重要。

## 11. 推理 / 运行模型

<figure><img src="/files/ebcdd7b986c2b1cd0efdb5932bddec66236f792d" alt=""><figcaption></figcaption></figure>

现在让我们在训练完成后运行模型！你可以编辑黄色下划线部分！实际上，因为我们创建了一个多轮聊天机器人，我们现在也可以像下面这样把模型当作它之前见过一些对话一样来调用：

<figure><img src="/files/ad70695865909fce24a460b51d98211b25d33042" alt=""><figcaption></figcaption></figure>

提醒一下，Unsloth 本身也原生提供 **2 倍更快的推理** ，所以一定不要忘记调用 `FastLanguageModel.for_inference(model)`。如果你想让模型输出更长的回复，把 `max_new_tokens = 128` 设成更大的数，比如 256 或 1024。注意你也需要等待更长时间才能得到结果！

## 12. 保存模型

我们现在可以把微调后的模型保存为一个小小的 100MB 文件，称为 LoRA adapter，如下所示。如果你愿意，你也可以推送到 Hugging Face hub 来上传你的模型！记得通过以下方式获取 Hugging Face token： <https://huggingface.co/settings/tokens> 并添加你的令牌！

<figure><img src="/files/7c6e34b765ee1f0a0d11209255b9e7a2e5113969" alt=""><figcaption></figcaption></figure>

保存模型后，我们还可以再次使用 Unsloth 来运行模型本身！使用 `FastLanguageModel` 再次调用它进行推理！

<figure><img src="/files/9c38aab1b9ea11738f53059f0eaacd10abf6d812" alt=""><figcaption></figcaption></figure>

## 13. 导出到 Ollama

最后，我们可以将微调后的模型导出到 Ollama 本身！首先，我们必须在 Colab 笔记本中安装 Ollama：

<figure><img src="/files/432481c1f5c6132c190138e8ba1e2aa18914d461" alt=""><figcaption></figcaption></figure>

然后，我们将已有的微调模型导出为 llama.cpp 的 GGUF 格式，如下所示：

<figure><img src="/files/24e6747676d34ff6eda23b05bf9bf44912fb2894" alt=""><figcaption></figcaption></figure>

提醒：将 `False` 到 `True` ，仅用于 1 行，而不要把每一行都改成 `True`，否则你会等很久！我们通常建议将第一行设为 `True`，这样我们就可以快速将微调模型导出为 `Q8_0` 格式（8 位量化）。我们也允许你导出为一整列量化方法，其中常见的一种是 `q4_k_m`.

前往 <https://github.com/ggml-org/llama.cpp> 了解更多关于 GGUF 的信息。如果你愿意，我们这里也提供了如何手动导出到 GGUF 的说明： <https://github.com/unslothai/unsloth/wiki#manually-saving-to-gguf>

你会看到如下所示的一长串文本——请等待 5 到 10 分钟！！

<figure><img src="/files/d84bb2761ba41da695367ff66d58fe3577e9a1a7" alt=""><figcaption></figcaption></figure>

最后，在最末尾，它会像下面这样：

<figure><img src="/files/8232f8de77c4511fc97b6227faa5f6a7fff12d00" alt=""><figcaption></figcaption></figure>

然后，我们需要在后台运行 Ollama 本身。我们使用 `subprocess` ，因为 Colab 不喜欢异步调用，但通常只需在 `ollama serve` 中运行即可。

<figure><img src="/files/09e001f03f0a7fb496659ad1ddbf7b0891fe5334" alt=""><figcaption></figcaption></figure>

## 14. 自动 `Modelfile` 创建

Unsloth 提供的技巧是，我们会自动创建一个 `Modelfile` ，而这是 Ollama 所必需的！这只是一组设置，并包含我们在微调过程中使用的聊天模板！你也可以像下面这样打印 `Modelfile` 生成的

<figure><img src="/files/56b139991dc0374a500c2d51cfcbc3d30d2e92a7" alt=""><figcaption></figcaption></figure>

然后，我们通过使用 `Modelfile`

<figure><img src="/files/82c1d79d292a346acd7d8886d4f4441db8876f48" alt=""><figcaption></figcaption></figure>

## 15. Ollama 推理

来让 Ollama 创建一个与 Ollama 兼容的模型。现在，如果你愿意，也可以调用模型进行推理，直接调用正在你自己的本地机器上运行 / 在免费的 Colab 笔记本后台运行的 Ollama 服务器。记住，你可以编辑黄色下划线部分。

<figure><img src="/files/3d2ce2e2bc1324f259d074cf927d6f93eaa4f5bc" alt=""><figcaption></figcaption></figure>

## 16. 交互式 ChatGPT 风格

但要真正像 ChatGPT 一样运行微调后的模型，我们还需要多做一点！首先点击终端图标![](/files/0e6eaa1fc534d0e830112584accec256ee36eee5) ，终端就会弹出。它在左侧边栏。

<figure><img src="/files/6d16cd63cb4e8f80c926bf1861aef87405c2e7d8" alt=""><figcaption></figcaption></figure>

然后，你可能需要按两次 ENTER 来移除终端窗口里一些奇怪的输出。等几秒钟，然后输入 `ollama run unsloth_model` 然后按 ENTER。

<figure><img src="/files/e3ec5bd3bf47c6d1a190bc04ab81abdaad77ae17" alt=""><figcaption></figcaption></figure>

最后，你就可以像真正的 ChatGPT 一样与微调后的模型交互了！按 CTRL + D 退出系统，并按 ENTER 与聊天机器人对话！

<figure><img src="/files/0da1eaf7ca099ae623dd709241c2375e094f98f8" alt=""><figcaption></figcaption></figure>

## 你成功了！

你已经成功微调了一个语言模型，并用 Unsloth 以快 2 倍的速度、减少 70% 的 VRAM 将其导出到 Ollama！而这一切都可以在 Google Colab 笔记本中免费完成！

如果你想学习如何进行奖励建模、继续预训练、导出到 vLLM 或 GGUF、做文本补全，或者了解更多微调技巧，请前往我们的 [Github](https://github.com/unslothai/unsloth#-finetune-for-free).

如果你在微调方面需要任何帮助，也可以加入我们的 Discord 服务器 [这里](https://discord.gg/unsloth)。如果你想获得关于 Ollama 的帮助，也可以加入他们的服务器 [这里](https://discord.gg/ollama).

最后，感谢你读到这里并一路跟随！我们希望这让你理解了语言模型微调背后的一些核心原理，也希望这对你有帮助！

要访问我们的 Alpaca 数据集示例，请点击 [这里](https://colab.research.google.com/drive/1WZDi7APtQ9VsvOrQSSC5DDtxq159j8iZ?usp=sharing)，而我们的 CSV / Excel 微调指南是 [这里](https://colab.research.google.com/drive/1VYkncZMfGFkeCEgN2IzbZIKEDkyQuJAS?usp=sharing).


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://unsloth.ai/docs/zh/kai-shi-shi-yong/fine-tuning-llms-guide/tutorial-how-to-finetune-llama-3-and-use-in-ollama.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
