Qwen2.5本地简易部署
关于Qwen2.5的简易本地部署
·
ollama部署千问2
模型部署
-
https://ollama.com/,下载安装
set OLLAMA_NUM_PARALLEL=2 多线程处理 set OLLAMA_MAX_LOADED_MODELS=2 可加载两个模型 ollama serve ollama serve --help 1 OLLAMA_HOST=0.0.0.0 解决外网访问问题 OLLAMA_HOST=0.0.0.0:8080 解决修改默认端口11434端口 2 OLLAMA_MODELS=E:\ollamaimagers 解决模型默认下载C 盘的问题 3 OLLAMA_KEEP_ALIVE=24h 设置模型加载到内存中保持24个小时(默认情况下,模型在卸载之前会在内存中保留 5 分钟) 4.OLLAMA_NUM_PARALLEL=2 设置2个用户并发请求 5.OLLAMA_MAX_LOADED_MODELS=2 设置同时加载多个模型 可以直接在环境变量上固定
-
ollama list
;ollama serve
;ollama run qwen2.5
ollama ps
内网穿透
- 使用frp暴露本地11434端口,在系统环境变量中增加
OLLAMA_HOST=0.0.0.0
api接口
-
https://github.com/ollama/ollama/blob/main/docs/api.md
import json import requests headers = { 'Content-Type': 'application/x-www-form-urlencoded', } data = { "model": "qwen2.5", "prompt": "你知道8+3等于多少嘛", # "format": "json", "stream": False, "keep_alive": '12h', # 控制模型在请求后保持加载到内存中的时间(默认值5m:如10m’, ‘24h’,-1表示永远驻留在显存中,0表示接受一次响应后立即清除模型) 使用 ollama ps 查看时间 } # data = json.dumps(data, ensure_ascii=False, separators=(',', ":")) data = json.dumps(data, ensure_ascii=False, indent=4) url = '你的ollama地址默认为 http://127.0.0.1:11434/' response = requests.post(f'{url}api/generate', headers=headers, data=data) print(response.json()['response']) # print(response.text)
-
使用外部库
from ollama import Client client = Client(host='http://127.0.0.1:11434/') llm = client.chat(model='qwen2.5', messages=[{'role': 'user', 'content': 'Why is the sky blue?'}]) # ========================================================================== from langchain_ollama import ChatOllama # from langchain_community.chat_models import ChatOllama model = ChatOllama( base_url="http://127.0.0.1:11434/", model="qwen2.5", ) response_message = model.invoke( "女追男,隔层纱后面是什么" ) print(response_message.content)
web界面(Open-WebUI)
-
文档:https://docs.openwebui.com/
-
要求必须
python==3.11
-
基本使用
-
pip install open-webui -i https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple
-
启动服务:
open-webui serve # =========================== from open_webui import serve c = serve(host='127.0.0.1', port=8080)
-
打开页面:
http://localhost:8080/
-
设置账号密码 admin admin
-
-
可能会出现的问题
ERROR: can not connect to "http://hf-huggingface.co" is your computer offline?
是外网- 先降级在升级:1、
pip install open-webui==0.2.0
2、open-webui serve
3、pip install open-webui --upgrade
- 直接下载模型到本地
C:\Users\cy\.cache\huggingface\hub
- 用代理
- 先降级在升级:1、
简易原生RAG
import numpy as np
from ollama import Client, Message
class KnowledgeBase: # 创建知识库
def __init__(self):
self.client = Client(host="http://127.0.0.1:11434/")
with open('./documents/知识库.txt', 'r', encoding='utf-8') as fp:
self.contents = fp.read()
self.docs = self.split_content(content=self.contents)
self.embedding = self.embed(self.docs)
@staticmethod
def split_content(content, max_length=150) -> list:
"""
对文本进行拆分,每段最大为50
:return:
"""
chunks = list()
for i in range(0, len(content), max_length):
chunks.append(content[i:i + max_length])
return chunks
def embed(self, contents) -> np.array:
"""
给一堆字符串返回向量(nomic-embed-text:该模型的维度为768; np.zeros(shape=(len(contents), 768)))
:return:
"""
embeds = list()
for content in contents:
res = self.client.embeddings(model='nomic-embed-text', prompt=content)
embeds.append(res["embedding"])
return np.array(embeds)
@staticmethod
def similarity_calculate(vec_a, vec_b):
"""
判计算两个的相似度(向量余弦相似度是一种衡量两个向量方向差异的度量方式,通常用于计算文本之间的相似度)
计算公式 cosine(A,B) = (A·B) / (||A|| * ||B||)
:return:
"""
dot_product = np.dot(vec_a, vec_b) # 计算点积
norm_a = np.linalg.norm(vec_a) # 计算向量a的模
norm_b = np.linalg.norm(vec_b) # 计算向量b的模
return dot_product / (norm_a * norm_b)
def search(self, text: str):
"""
将搜索的内容向量化并进行相似度计算,返回最相似的文本
:param text:
:return:
"""
max_similarity = 0
max_similarity_index = 0
search_embed = self.embed(contents=[text])[0]
for index_, embed in enumerate(self.embedding):
similarity = self.similarity_calculate(search_embed, embed) # 计算相似度
if similarity > max_similarity:
max_similarity = similarity
max_similarity_index = index_
return self.docs[max_similarity_index]
class Chat(KnowledgeBase):
def __init__(self):
super().__init__()
self.prompt_template = """
基于:{context}
回答:{question}
"""
def chat(self):
while True:
text = input("输入问题")
context = self.search(text=text)
prompt = self.prompt_template.format(context=context, question=text)
chat = self.client.chat(model='qwen2.5', messages=[Message(role='system', content=prompt)])
print(chat["message"])
if __name__ == '__main__':
# tt = KnowledgeBase().search('由于程序不会过滤私人短信与验证码短信')
# print(tt)
Chat().chat()
更多推荐
所有评论(0)