Ollama 导入自定义模型
在前面 Spring AI 使用本地 Ollama Embeddings 中查找 Embedding 模型的时候,首先看到了 mofanke/dmeta-embedding-zh 模型,这才发现 Ollama 中除了官方模型外还有用户自己上传的其他模型,搜索 dmeta-embedding-zh 找到了抱脸网上的对应模型:
https://huggingface.co/DMetaSoul/Dmeta-embedding-zh
探索发现
模型介绍有 MTEB Chinese list 评分排名,打开该地址可以看到排名:
https://huggingface.co/spaces/mteb/leaderboard
在最新排名中第一的 acge_text_embedding 能不能在 Spring AI 中使用呢?在 Ollama 中搜索这个模型没有找到,然后就开始搜索如何在 Ollama 中使用自定义模型,然后找到了官方文档。
查找资料
Ollama 官方的文档都在 github 仓库中,有一篇 Import a model 文档介绍如何导入自定义的模型:
https://github.com/ollama/ollama/blob/main/docs/import.md
在 [[👌002.谷歌 Colab:学习 Python 和大模型的利器]] 中介绍了谷歌 Colab,使用 Colab 非常方便,可以很快速的下载模型和执行代码(如果无法访问也可以调整命令在本地执行)。
我使用谷歌在线的 Gemini,让他根据 Import a model 文档给我生成 python 的 notebook 代码。
生成如下结果:
在分享和导出按钮中可以选择【导出到Colab】:
经过一番操作之后,遇到了各种错误,最终失败。
寻求帮助
既然有人可以将类似 pytorch_model.bin 转换成功,说明路是通的,遇到的具体的 python 问题 AI 也无法帮我解决,因此从 mofanke/dmeta-embedding-zh 模型入手,搜索作者的信息找到了 github,找到了作者 2018 年还在更新的博客: https://mofanke.github.io/ ,在博客关于我中找到了作者的邮箱,然后给作者发邮件寻求帮助:
同时还添加了 huggingface 上原模型作者的微信,寻求作者的帮助。
很幸运的是我收到了他们的回应,和原作者沟通时可能是我表达的不准确,原作者最终也提供了一份支持 Ollama 使用的模型:
https://ollama.com/shaw/dmeta-embedding-zh
大家也可以试试上面的模型。
mofanke 在回复的邮件中指出要修改一处代码,修改代码如下:
除此之外我还遇到了依赖版本的问题,修改了几处版本号,然后就转换成功了,下载到本地进行测试也很顺利。
Colab 转换模型
在写转换代码时,一开始以 Google Gemini 生成的为基础来写,发现要改的地方太多,脚本也写的很复杂,所以我就从源头出发,直接 Fork https://github.com/ggerganov/llama.cpp 进行了修改。可以从 https://github.com/abel533/llama.cpp/tree/b2581 (b2581分支)下载修改后的版本,改动可以查看提交历史。
这样改动之后的最终脚本从满满的几页变成了短短的几行:
1 |
|
上面代码是准备环境,执行过程中会出现如下提示,选择【取消】:
下面是下载模型并进行转换,这部分可以多次执行:
1 |
|
上面代码是转换 acge_text_embedding,后来看到 Dmeta 模型作者又发布了新的轻量版本:
我又针对这个版本转换进行测试:
1 |
|
Ollama 导入模型
上面转换后的模型可以从 Colab 下载下来,下载后放到一个任意目录中,在目录中创建 Modelfile,编写内容如下:
1 |
|
由于 Embedding 模型无法进行对话,这里 TEMPLATE 的内容对使用没有任何影响。
在模型和 Modelfile 的目录下面打开终端,输入下面的命令创建模型:
1 |
|
默认会自动添加到 .ollama
目录下面,后续就可以参考 Spring AI 使用本地 Ollama Embeddings 中介绍的方式进行使用了。
本文内容经历一番波折,最终得到了这8,9行代码,越少越难得。