开源模型应用落地-工具使用篇-Ollama(六)

一、前言

    在AI大模型百花齐放的时代,很多人都对新兴技术充满了热情,都想尝试一下。但是,实际上要入门AI技术的门槛非常高。除了需要高端设备,还需要面临复杂的部署和安装过程,这让很多人望而却步。不过,随着开源技术的不断进步,使得入门AI变得越来越容易。通过使用Ollama,您可以快速体验大语言模型的乐趣,不再需要担心繁琐的设置和安装过程。


二、术语

2.1、Ollama

    是一个强大的框架,用于在 Docker 容器中部署 LLM(大型语言模型)。它的主要功能是在 Docker 容器内部署和管理 LLM 的促进者,使该过程变得简单。它可以帮助用户快速在本地运行大模型,通过简单的安装指令,用户可以执行一条命令就在本地运行开源大型语言模型。

    Ollama 支持 GPU/CPU 混合模式运行,允许用户根据自己的硬件条件(如 GPU、显存、CPU 和内存)选择不同量化版本的大模型。它提供了一种方式,使得即使在没有高性能 GPU 的设备上,也能够运行大型模型。

2.2、Qwen1.5

    Qwen1.5 is the beta version of Qwen2, a transformer-based decoder-only language model pretrained on a large amount of data. In comparison with the previous released Qwen, the improvements include:

  • 6 model sizes, including 0.5B, 1.8B, 4B, 7B, 14B, and 72B;
  • Significant performance improvement in human preference for chat models;
  • Multilingual support of both base and chat models;
  • Stable support of 32K context length for models of all sizes
  • No need of trust_remote_code.

三、前置条件

3.1、Ollama安装

    下载地址:Download Ollama on macOS

   

    支持macOS、Linux以及windows,此处以windows操作系统为例:

    点击OllmaSetup.exe进行安装,当前安装版本为0.1.27

    安装完成后,在C:\Users\用户名\AppData\Local\Ollama目录下,有Ollama的配置及日志文件

    也可以在右下角快速点开

    

    查看版本

    


四、使用方式

4.1、运行Qwen1.5-1.8B-Chat模型

ollama run qwen:1.8b


五、测试

5.1、命令行方式测试

5.2、代码方式测试

   默认Ollama api会监听11434端口,可以使用命令进行查看

    

netstat -ano | findstr 11434

    安装requests库

pip install requests -i https://pypi.douban.com/simple
# -*-  coding = utf-8 -*-
import json
import sys
import traceback
import logging#######################日志配置#######################
import requests
from requests.adapters import HTTPAdapterlogging.basicConfig(level=logging.INFO,format='%(asctime)s [%(levelname)s]: %(message)s',  # 指定日志输出格式datefmt='%Y-%m-%d %H:%M:%S'  # 指定日期时间格式
)# 创建一个日志记录器
formatter = logging.Formatter('%(asctime)s [%(levelname)s]: %(message)s')  # 指定日志输出格式
logger = logging.getLogger(__name__)
logger.setLevel(logging.INFO)if sys.platform == "linux":# 创建一个文件处理器,将日志写入到文件中file_handler = logging.FileHandler('/data/logs/app.log')
else:# 创建一个文件处理器,将日志写入到文件中file_handler = logging.FileHandler('E:\\logs\\app.log')file_handler.setFormatter(formatter)
# 创建一个控制台处理器,将日志输出到控制台
# console_handler = logging.StreamHandler()
# console_handler.setFormatter(formatter)# 将处理器添加到日志记录器中
logger.addHandler(file_handler)
# logger.addHandler(console_handler)DEFAULT_MODEL = "qwen:1.8b-chat"
DEFAULT_IP='127.0.0.1'
DEFAULT_PORT=11434
DEFAULT_MAX_TOKENS = 32768
DEFAULT_CONNECT_TIMEOUT=3
DEFAULT_REQUEST_TIMEOUT=60
DEFAULT_MAX_RETRIES=0
DEFAULT_POOLSIZE=100class Model:def __init__(self):self.headers = {"User-Agent": "Test Client"}self.s = requests.Session()self.s.mount('http://', HTTPAdapter(pool_connections=DEFAULT_POOLSIZE, pool_maxsize=DEFAULT_POOLSIZE, max_retries=DEFAULT_MAX_RETRIES))self.s.mount('https://', HTTPAdapter(pool_connections=DEFAULT_POOLSIZE, pool_maxsize=DEFAULT_POOLSIZE, max_retries=DEFAULT_MAX_RETRIES))def chat(self, message, history=None, system=None, config=None, stream=True):if config is None:config = {'temperature': 0.45, 'top_p': 0.9, 'repetition_penalty': 1.2, 'max_tokens': DEFAULT_MAX_TOKENS,'n':1}logger.info(f'config: {config}')messages = []if system is not None:messages.append({"role": "system", "content": system})if history is not None:if len(history) > 0 and len(history) % 2 == 0:for his in history:user,assistant = hisuser_obj = {"role": "user", "content": user}assistant_obj = {"role": "assistant", "content": assistant}messages.append(user_obj)messages.append(assistant_obj)if message is None:raise RuntimeError("prompt不能为空!")else:messages.append({"role": "user", "content": message})logger.info(messages)try:merge_pload = {"model": DEFAULT_MODEL, "messages": messages, **config}logger.info(merge_pload)response = self.s.post(f"http://{DEFAULT_IP}:{DEFAULT_PORT}/api/chat", headers=self.headers,json=merge_pload, stream=stream, timeout=(DEFAULT_CONNECT_TIMEOUT, DEFAULT_REQUEST_TIMEOUT))str = ''for msg in response:# logger.info(msg)if msg and len(msg) > 0:decode_msg = msg.decode('UTF-8')if '\n' in decode_msg :if len(str) == 0:obj = json.loads(decode_msg)if 'message' in obj:content = obj['message']['content']if content is not None:yield contentelse:str = str + decode_msgobj = json.loads(str)if 'message' in obj:content = obj['message']['content']if content is not None:str=''yield contentelse:str = str + decode_msgexcept Exception as e:traceback.print_exc()if __name__ == '__main__':model = Model()message = '我家有什么特产?'system = 'You are a helpful assistant.'history = [('hi,你好','你好!有什么我可以帮助你的吗?'),('我家在广州,很好玩哦','广州是一个美丽的城市,有很多有趣的地方可以去。'),]config = {'temperature': 0.45, 'top_p': 0.9, 'repetition_penalty': 1.2, 'max_tokens': 8192}gen = model.chat(message=message, history=history, system=system, config=config, stream=True)results = []for value in gen:results.append(value)str = ''.join(results)logger.info(str)

  模型参数:

 Ollama Api返回的数据格式以\n结尾,但由于流式返回,可能存在多行输出再返回\n的情况:

测试结果:


六、附带说明

6.1、各操作系统下的安装步骤

    https://github.com/ollama/ollama

6.2、Ollama支持的模型库

    https://ollama.com/library

    

6.3、运行各规格qwen模型的命令

https://registry.ollama.ai/library/qwen/tags

   

6.4、问题

  # 重试几次或者换另外规格的模型

6.5、代码中传递给Ollama Api的模型参数,要和运行的模型一致,即

6.6、Ollama常用命令

# list

# show

# delete

等等,可以查阅:https://github.com/ollama/ollama/blob/main/cmd/cmd.go

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/522857.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

RabbitMQ的web控制端介绍

2.1 web管理界面介绍 connections:无论生产者还是消费者,都需要与RabbitMQ建立连接后才可以完成消息的生产和消费,在这里可以查看连接情况channels:通道,建立连接后,会形成通道,消息的投递、获取…

html--心花怒放

代码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><title>Canvas 绘制一个❤</title><link rel"shortcut icon" href"../../assets/images/icon/favicon.ico" type"ima…

嵌入式学习36-TCP要点及http协议

TCP发送文件的粘包问题 1. 例&#xff1a; 发端 1.flv-------->收端 1.flv csfga 2.解决 1. sleep&#xff08;1&#xff09; 延时发送 2.自…

SHARE 100M PRO:航测领域的多面手

在无人机航测领域&#xff0c;SHARE 100M PRO单镜头航测相机以其1.02亿像素的中画幅传感器和创新技术&#xff0c;正在重塑倾斜摄影的精度和效率。这款相机不仅在城市规划和土地管理中发挥着重要作用&#xff0c;还在环境监测、基础设施建设、农业管理等多个航测领域展现出其卓…

斐讯N1 刷coreelec 笔记

1.下载恩山的镜像 下载好后不需要刷优盘 这个很方便&#xff0c;可以勾选擦除flash &#xff08;如果第一次装&#xff09; 升级可以不用勾选 详细使用参考恩山大佬的描述 2.下载插件 想装openwrt 发现镜像里面 coreelec-addons 挂了&#xff0c;研究了好长时间可以 去githu…

MRI基础--k空间

k空间定义 k空间是表示 MR 图像中空间频率的数字数组。 k空间物理意义 k 空间的单元通常显示在主轴 kx 和 ky 的矩形网格上。 k 空间的 kx 和 ky 轴对应于图像的水平 (x) 和垂直 (y) 轴。然而,k 轴表示 x 和 y 方向上的空间频率而不是位置。 k 空间中的各个点 (kx,ky) 与图像…

R语言 | 复数 相关函数

问题 大家好&#xff0c;我有一个问题&#xff0c;我看到一个函数如下&#xff1a; L2_distance <- function(A, B){rowA <- apply(A*A, 1, sum)matrixA <- matrix(rep(rowA, eachlength(rowA)), nrowlength(rowA), byrowT)rowB <- apply(B*B, 1, sum)matrixB &l…

#QT(智能家居界面上-图片插入)

1.IDE&#xff1a;QTCreator 2.实验 3.记录 (1)添加图片文件&#xff08;图片资源文件&#xff0c;PNG格式为佳&#xff09; &#xff08;2&#xff09;将图片放入工程文件夹 &#xff08;3&#xff09;按如下步骤将图片加入到工程中&#xff08;pic.qrs文件夹&#xff09; &…

【二】【算法分析与设计】编程练习

数字三角形 链接&#xff1a;登录—专业IT笔试面试备考平台_牛客网 来源&#xff1a;牛客网 时间限制&#xff1a;C/C 1秒&#xff0c;其他语言2秒 空间限制&#xff1a;C/C 32768K&#xff0c;其他语言65536K 64bit IO Format: %lld 题目描述 KiKi学习了循环&#xff0c;BoBo…

【C++】vector的迭代器失效问题深浅拷贝

vector的迭代器失效问题&深浅拷贝 一&#xff0c;vector迭代器失效问题1. 什么是迭代器失效2. insert()导致的迭代器失效问题3. 解决办法4. erase() 导致的迭代器失效问题5. 解决办法 二&#xff0c;深浅拷贝问题1. 什么是深浅拷贝问题2.reserve的深度解析3.解决办法 一&am…

绝赞春招拯救计划

huihut/interview: &#x1f4da; C/C 技术面试基础知识总结&#xff0c;包括语言、程序库、数据结构、算法、系统、网络、链接装载库等知识及面试经验、招聘、内推等信息。This repository is a summary of the basic knowledge of recruiting job seekers and beginners in t…

【linuxC语言】dup、dup2函数

文章目录 前言一、dup函数二、dup2函数三、将标准输出重定向到文件总结 前言 在Linux环境下&#xff0c;dup、dup2以及原子操作都是用于文件描述符管理和处理的重要工具。这些功能提供了对文件描述符进行复制和原子操作的能力&#xff0c;使得在多线程或多进程环境中更加安全和…