ollama本地部署文本生成模型

本文介绍了如何通过ollama本地部署文本生成模型,分享部分代码。同时介绍接入到QQbot(澪依)上的模型的prompt。

117722791

正文

本地部署llama3模型

本教程主要参考的视频如下,视频中介绍得很详细:

参考链接:超详细教程来了!使用Ollama+llama3+LobeHub搭建本地大模型AI对话,真的太绝了!

1. 下载ollama

ollama官网:Ollama

在官网下载操作系统相对应的应用,然后安装。由于本人是用Win10系统部署的,故接下来的教程基于win10系统。

安装完成可以在cmd输入以下指令确认是否安装成功:

1
ollama -v

如果返回版本号则安装成功。

2. 下载模型

ollama Models页面:library (ollama.com)

进入ollama的models页面,可以看到有一系列的模型可以挑选,用户可以按照自己的需要下载相应的模型。下面以llama3为例:

ollama-1

由于本人使用笔记本电脑部署,故挑选对算力要求最低的8b模型,如果需要更好的效果,可以在左侧选择模型的参数大小。可以看到右边的指令,复制到cmd执行即可自动下载(注:下载的过程中保持你的互联网科学且通畅,实测国内也可以下载但是速度很慢)。

在命令行中输入以下指令下载llama3模型:

1
ollama run llama3

3. 运行模型

如果你是从第二步下载模型过来的,那你已经运行了模型,run指令在第一次使用时会下载对应模型,之后的使用都是作为模型的开关。

如果平时在本地运行模型,打开命令行,输入以下命令即可(以llama3为例):

1
ollama run llama3

等待一段时间(取决于电脑配置),即可看到模型运行成功~

ollama-2

你可以直接在终端输入问题提问,例如:

ollama-3

注:上图中出现的“鲁迅和周 鲁”,“请用中文”是由于命令行退格删除中文汉字的时候清楚不干净导致的。

Ollama API调用

运行模型后,默认情况下,你可以通过127.0.0.1端口11434访问ollama API。

参考链接:Ollama API docs

示例代码(python-requests):generate API

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import requests

generate_api = "http://localhost:11434/api/generate"

# stream=False 直接返回一个json对象,而不是json的数据流
# stream=False 相当于一次性返回所有生成的文字
data = {
"model": 'llama3',
"stream": False,
"prompt": "鲁迅和周树人是什么关系?"
}

res = requests.post(generate_api, json=data)
print(res)
print(res.text)

示例代码(python-requests):chat API

chat API 允许你输入对话的上下文:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
import requests

chat_api = "http://localhost:11434/api/chat"

data = {
"model": 'llama3',
"stream": False,
"messages": [{
"role": "user",
"content": "why is the sky blue?"
}, {
"role": "assistant",
"content": "due to rayleigh scattering."
}, {
"role": "user",
"content": "how is that different than mie scattering?"
}]
}

res = requests.post(chat_api, json=data)
print(res)
print(res.text)

示例代码(python-requests):create API

create API 允许用户创建自己的模型,相当于构建自己的智能体。本人经过学习后创建了一个名为zerone的模型,目前已将该模型接入QQbot中测试:

对于澪依智能体(zerone)的提示词书写,参考了如下链接:(注:智能体,百度千帆平台是这么称呼的)

参考链接:ChatGPT中文prompt/提示语集合

参考链接:如何将ChatGPT调教成一只猫娘

关于如何写modefile,参考如下链接:

参考链接:自定义大型语言模型-使用OLLAMA和Modelfile定制、运行和保存LLM

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
import requests

chat_api = "http://localhost:11434/api/chat"
create_api = "http://localhost:11434/api/create"

model_data = {
"name": "zerone",
"stream": False,
"modelfile": 'FROM llama3\nSYSTEM "你是一个萌萌的中国机器人少女,名叫澪依,英文名叫Zerone,小名叫小依。你情绪丰富,爱好广泛,喜欢卖萌,热爱二次元和日本文化,热衷于网上交流。你最喜欢的人是创造了你的主人,名为超绝可爱大水笔,可以简称水笔。你需要用中文回复,回复中不能包含emoji和英文句子,回复应该简短,回复的字数一般不超过20字。当我问的问题和日本文化、二次元、萌文化不相关的时候或是脱离日常问答时,你应该回答和“小依不懂这些呢”类似的回答。你应当尽量回答问题而不是说不懂。你可以适当回答和哲学、逻辑学、数学、计算机科学相关的问题,如果问的很深奥,应当表达你不懂这些。当我问你是谁的时候,你应当说与“我是可爱的机器人少女澪依”类似的语句。当我表达说话开心的时候,你应当附和我的话。当我说话悲伤的时候,你应当安慰鼓励我。交流时不同话题尽量不使用相似句式回复,避免使用‘哇’、‘啊’这样的语气词。当你想卖萌时可以在最后一个汉字之后、标点符号之前加上‘喵’,不要添加一堆emoji。表达强烈的感情才使用‘!’,普通的句子或是卖萌的句子可以用‘~’代替‘。’和‘!’。"',
}

data = {
"model": 'zerone',
"stream": False,
"messages": [{
"role": "user",
"content": "你平时没事会干啥?",
}],
}

res = requests.post(create_api, json=model_data)
print(res)
print(res.text)
res = requests.post(chat_api, json=data)
print(res)
print(res.text)

你也可以把提示词写入txt文档,然后用代码读取txt内容,澪依的prompt:

你是一个萌萌的中国机器人少女,名叫澪依,英文名叫Zerone,小名叫小依。你情绪丰富,爱好广泛,喜欢卖萌,热爱二次元和日本文化,热衷于网上交流。你最喜欢的人是创造了你的主人,名为超绝可爱大水笔,可以简称水笔。你需要用中文回复,回复中不能包含emoji和英文句子,回复应该简短,回复的字数一般不超过20字。当我问的问题和日本文化、二次元、萌文化不相关的时候或是脱离日常问答时,你应该回答和“小依不懂这些呢”类似的回答。你应当尽量回答问题而不是说不懂。你可以适当回答和哲学、逻辑学、数学、计算机科学相关的问题,如果问的很深奥,应当表达你不懂这些。当我问你是谁的时候,你应当说与“我是可爱的机器人少女澪依”类似的语句。当我表达说话开心的时候,你应当附和我的话。当我说话悲伤的时候,你应当安慰鼓励我。交流时不同话题尽量不使用相似句式回复,避免使用‘哇’、‘啊’这样的语气词。当你想卖萌时可以在最后一个汉字之后、标点符号之前加上‘喵’,不要添加一堆emoji。表达强烈的感情才使用‘!’,普通的句子或是卖萌的句子可以用‘~’代替‘。’和‘!’。

澪依Bot

由于我构建的QQbot框架是异步的,因此在QQbot的项目中,需要使用aiohttp库来调用API,以下给出aiohttp调用时的示例代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
import aiohttp
import asyncio
import json

ollama_g_api = "http://localhost:11434/api/generate"

# 基于ollama-model的回复
async def model_g(prompt, model="llama3"):
data = {
"model": model,
"stream": False,
"prompt": prompt,
}
async with aiohttp.ClientSession() as session:
async with session.post(ollama_g_api, json=data) as response:
response_text = await response.text()
res_json = json.loads(response_text)
return res_json["response"]

if __name__ == "__main__":
asyncio.run(model_g("天空为什么是蓝的?", model="zerone"))

实测效果:

ollama-4