微信扫码
与创始人交个朋友
我要投稿
这是一系列教小白怎么使用大模型的文章,不讲原理和公式,就讲小白都听得懂的怎么安装使用。
01
—
简介
昨天介绍了在本地运行大模型的工具LM studio,他上手简单,但想要远程调用或者在手机上使用就不是很方便,今天介绍一下ollama,他可以提供一个服务,然后就可以远程使用了。当然ollama还可以提供AIP让我们的程序去调用,这样大模型就可以赋能我们正在开发的应用了,例如可以通过构建智能体来实现自动漏洞复现,自动写POC。
02
—
安装ollama
ollama的安装很简单,先上官网下载安装包
https://ollama.com/
然后选择适合自己操作系统的安装包即可,下载完了直接双击运行就行了。等待安装完成,打开cmd界面,输入ollama -h
说明ollama已经安装完成
03
—
模型下载
上官网查看大模型
然后选择一个自己喜欢的模型打开,右侧能看到运行命令,复制到本地cmd命令行进行粘贴,ollama会自动帮我们下载并运行模型
然后就等待漫长的下载,下载完成就可以使用了
04
—
ollama目前官网提供的模型中支持中文的只有一个llama2微调的大模型,那怎么使用国产的中文大模型呢?
首先去哪里找这些大模型,最全的肯定是huggingface,注意一定要下载gguf文件,别的文件格式使用不了。
https://huggingface.co/
也可以上国内的大模型社区找自己喜欢的模型
https://modelscope.cn/home
首先找到昨天下载的大模型gguf文件的目录,在这个目录下面新建一个文件Modelfile.txt,在文件中写入
FROM D:\LargeModel\GGUF-LIST\TheBloke\Qwen-1_7B-Chat-q5-GGUF\qwen1_5-7b-chat-q5_k_m.gguf
后面这个路径就是gguf文件的全路径
然后在cmd命令行运行命令创建模型,命令中 qwen1-7b 是模型的名称,-f指定上面创建的Modelfile.txt文件,这个文件的作用是告诉ollama去哪里找大模型的gguf文件
ollama create qwen1-7b -f D:\LargeModel\GGUF-LIST\TheBloke\Qwen-1_7B-Chat-q5-GGUF\Modelfile.txt
模型创建完成
使用ollama list命令查看本地模型
ollama list
运行这个模型来回答问题
ollama run qwen1-7b
05
—
安装lobe-chat
lobe-chat是一个开源的、现代设计的LLM/AI聊天框架,支持多家厂商的大模型,可以一键部署个人专用GPT聊天应用程序。
lobe-chat支持docker安装,简单方便一条命令搞定,其中sk-xxxx是你自己chatGPT账号的key,如果使用本地模型的话可以不管
docker run -d -p 3210:3210 \
-e OPENAI_API_KEY=sk-xxxx \
-e ACCESS_CODE=lobe66 \
--name lobe-chat \
lobehub/lobe-chat
安装完成后IP+3210访问
到此lobechat安装完成
05
—
lobe-chat配置本地大模型
首先启动ollama服务
ollama serve
然后运行大模型
ollama run qwen1-7b
然后找到设置 ->语言模型,修改接口代理地址http://localhost:11434和模型,模型选择qwen1-7b
然后再修改下默认助手中的模型即可
06
—
python调用ollama
运行下面这段程序需要安装python3的环境,做人工智能建议直接安装anaconda,anaconda可以帮我们管理一些包,也可以通过conda管理虚拟环境,使用起来非常方便。通常我喜欢在jupyter中调试代码,anaconda也集成了这个环境。
# -*- coding = utf-8 -*-
import json
import sys
import traceback
import logging
#######################日志配置#######################
import requests
from requests.adapters import HTTPAdapter
logging.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 = "qwen1-7b"
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=100
class 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 = his
user_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 content
else:
str = str + decode_msg
obj = json.loads(str)
if 'message' in obj:
content = obj['message']['content']
if content is not None:
str=''
yield content
else:
str = str + decode_msg
except 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)
运行结果如下
53AI,企业落地应用大模型首选服务商
产品:大模型应用平台+智能体定制开发+落地咨询服务
承诺:先做场景POC验证,看到效果再签署服务协议。零风险落地应用大模型,已交付160+中大型企业
2024-12-26
为什么大多数人不愿意接受AI?
2024-12-26
太逆天了,Cursor让我的开发效率翻10倍,好用到怀疑人生
2024-12-23
基于AutoGen构建个性化AI助理Aura的实践探索
2024-11-22
ChatGPT Mac桌面端重磅更新!与VS Code、终端完美联动!工作效率起飞!
2024-11-22
用AI提升使用电脑幸福感的小例子
2024-11-13
吴恩达:如何在人工智能领域建立你的职业生涯
2024-11-12
AI知识泛滥的年代,“脑图+AI”=“埃迪+毒液”:未来工作流的黄金组合,你掌握了吗?
2024-11-08
在未来,这种人或许会沦为AI的奴隶
2024-07-07
2024-06-24
2024-04-02
2024-04-27
2024-06-06
2024-04-02
2024-05-08
2024-05-04
2024-04-19
2024-05-15