写点什么

Ollama + Python 极简工作流

作者:测试人
  • 2025-09-17
    北京
  • 本文字数:2143 字

    阅读完需:约 7 分钟

你是否曾想过让强大的开源大模型更懂你的专业领域,或者更能模仿你的写作风格?微调就是实现这一目标的钥匙。过去,微调是资源雄厚的大公司的专利,动辄需要数十张 GPU 和复杂的分布式训练知识。

但现在,感谢 Ollama 和 Python 生态的强大工具,这一切变得前所未有的简单。本文将手把手带你,用一个消费级 GPU(甚至 CPU!),在 1 小时内完成属于你自己的模型微调。

准备工作:安装核心工具

在开始之前,我们需要准备好两样核心工具:

  1. Ollama: 用于本地拉取、运行和管理大模型。

  2. Python 环境: 用于准备微调数据和执行微调脚本。

步骤一:安装 Ollama 访问 Ollama 官网 (https://ollama.com),根据你的操作系统 (Windows/macOS/Linux) 下载并安装。安装完成后,打开终端/命令提示符,拉取一个我们要微调的基础模型,例如小巧高效的 Llama 2:

ollama pull llama2
复制代码

步骤二:创建 Python 环境并安装库创建一个新的项目目录,然后建立一个 Python 虚拟环境(推荐),并安装必要的库。

# 创建项目目录mkdir ollama-finetune-tutorialcd ollama-finetune-tutorial
# 创建虚拟环境 (可选但推荐)python -m venv .venv# 激活虚拟环境# On Windows: .venv\Scripts\activate# On macOS/Linux: source .venv/bin/activate
# 安装核心库pip install transformers datasets peft huggingface_hub# 用于后续格式转换和推送pip install ollama
复制代码

第一步:准备微调数据

微调的成功很大程度上取决于数据。数据不需要多,但需要“精”和“相关”。我们以“让模型学会用莎士比亚的风格写作”为例。

创建一个名为 data.jsonl 的文件,每行是一个 JSON 对象,包含 prompt(指令)和 completion(期望的回复)。

{"prompt": "Write a poem about the sun:", "completion": "Hark! The golden eye of heaven doth rise,"}{"prompt": "What is love?", "completion": "Love is a smoke made with the fume of sighs,"}{"prompt": "Describe the sea.", "completion": "The vasty deep, a restless field of salt and sorrow,"}
复制代码

提示:对于实际任务,你可以准备问答对、指令-回复对,或者任何你希望模型学习的文本格式。数据量从几十条到几千条均可。

第二步:转换数据格式

Ollama 的微调需要一种特定的格式。我们需要将上面的 data.jsonl 转换为一个 .parquet 文件。创建一个名为 convert_to_parquet.py 的脚本:

import jsonimport pandas as pdfrom datasets import Dataset
# 读取我们准备的 jsonl 文件data = []with open('data.jsonl', 'r') as f: for line in f: data.append(json.loads(line))
# 转换为 Hugging Face Dataset 格式df = pd.DataFrame(data)dataset = Dataset.from_pandas(df)
# 保存为 Parquet 格式,这是 Ollama 微调所需的dataset.to_parquet('fine_tuning_data.parquet')
复制代码

运行这个脚本:

python convert_to_parquet.py
复制代码

现在你的目录下会生成一个 fine_tuning_data.parquet 文件。

第三步:执行微调!

这是最激动人心的一步。Ollama 的命令行工具直接支持微调。打开终端,确保你在项目根目录下,然后运行以下命令:

ollama create my-shakespeare-model -f Modelfile
复制代码

这里的 my-shakespeare-model 是你自定义的新模型名字,Modelfile 是一个配置文件。我们需要先创建这个 Modelfile。

创建一个名为 Modelfile 的文件(无后缀),内容如下:

FROM llama2 # 指定基础模型
TEMPLATE """[INST] {{ .Prompt }} [/INST] {{ .Response }} </s>""" # 使用与Llama2匹配的对话模板
PARAMETER stop "[INST]"PARAMETER stop "[/INST]"
SYSTEM """You are William Shakespeare. Respond to all prompts in the style of the Bard of Avon."""
ADAPTER ./fine_tuning_data.parquet # 指向我们的微调数据
复制代码

关键解释:

  • FROM: 指定从我们之前拉取的 llama2 模型开始微调。

  • TEMPLATE: 定义了模型如何理解输入和输出。这里的格式与 Llama 2 的指令格式保持一致。

  • SYSTEM: 给模型一个系统级别的角色设定。

  • ADAPTER: 这是核心,它告诉 Ollama 使用我们准备好的 fine_tuning_data.parquet 文件来进行微调。

现在,再次运行微调命令:

ollama create my-shakespeare-model -f Modelfile
复制代码

终端会开始输出日志。你会看到模型正在被训练。这个过程的速度取决于你的数据大小和电脑硬件(GPU/CPU)。对于示例中的几条数据,几乎是瞬间完成的。

第四步:测试你的微调模型

微调完成后,你就可以像使用任何其他 Ollama 模型一样使用它了!

在终端中直接运行:

ollama run my-shakespeare-model>>> Write a poem about Python code.
复制代码

或者,用 Python 代码来调用:

import requestsimport json
# 设置 Ollama 服务器的本地 API 地址url = 'http://localhost:11434/api/generate'
# 准备请求数据data = { "model": "my-shakespeare-model", # 使用你刚创建的模型名 "prompt": "What is the meaning of life?", "stream": False}
# 发送 POST 请求response = requests.post(url, json=data)
# 解析并打印结果result = response.json()print(result['response'])
复制代码

预期效果: 此时,模型回答“生命的意义是什么?”这个问题时,不再是用它原本的风格,而是会尝试模仿莎士比亚的戏剧性、诗歌化的语言风格。

用户头像

测试人

关注

专注于软件测试开发 2022-08-29 加入

霍格沃兹测试开发学社,测试人社区:https://ceshiren.com/t/topic/22284

评论

发布
暂无评论
Ollama + Python 极简工作流_人工智能_测试人_InfoQ写作社区