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
      • 用代理
简易原生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()

Logo

ModelScope旨在打造下一代开源的模型即服务共享平台,为泛AI开发者提供灵活、易用、低成本的一站式模型服务产品,让模型应用更简单!

更多推荐