本文介绍了如何通过ollama本地部署文本生成模型,分享部分代码。同时介绍接入到QQbot(澪依)上的模型的prompt。
正文 本地部署llama3模型 本教程主要参考的视频如下,视频中介绍得很详细:
参考链接:超详细教程来了!使用Ollama+llama3+LobeHub搭建本地大模型AI对话,真的太绝了!
1. 下载ollama ollama官网:Ollama
在官网下载操作系统相对应的应用,然后安装。由于本人是用Win10系统部署的,故接下来的教程基于win10系统。
安装完成可以在cmd输入以下指令确认是否安装成功:
如果返回版本号则安装成功。
2. 下载模型 ollama Models页面:library (ollama.com)
进入ollama的models页面,可以看到有一系列的模型可以挑选,用户可以按照自己的需要下载相应的模型。下面以llama3为例:
由于本人使用笔记本电脑部署,故挑选对算力要求最低的8b模型,如果需要更好的效果,可以在左侧选择模型的参数大小。可以看到右边的指令,复制到cmd执行即可自动下载(注:下载的过程中保持你的互联网科学且通畅,实测国内也可以下载但是速度很慢)。
在命令行中输入以下指令下载llama3模型:
3. 运行模型 如果你是从第二步下载模型过来的,那你已经运行了模型,run指令在第一次使用时会下载对应模型,之后的使用都是作为模型的开关。
如果平时在本地运行模型,打开命令行,输入以下命令即可(以llama3为例):
等待一段时间(取决于电脑配置),即可看到模型运行成功~
你可以直接在终端输入问题提问,例如:
注:上图中出现的“鲁迅和周 鲁”,“请用中文”是由于命令行退格删除中文汉字的时候清楚不干净导致的。
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 requestsgenerate_api = "http://localhost:11434/api/generate" 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 requestschat_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 aiohttpimport asyncioimport jsonollama_g_api = "http://localhost:11434/api/generate" 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" ))
实测效果: