AI知识库

53AI知识库

学习大模型的前沿技术与行业应用场景


【大模型入门】ollama + lobechat打造个人专属大模型助手
发布日期:2024-04-23 06:32:23 浏览次数: 2926 来源:AI与网安


这是一系列教小白怎么使用大模型的文章,不讲原理和公式,就讲小白都听得懂的怎么安装使用。


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 jsonimport sysimport tracebackimport logging #######################日志配置#######################import requestsfrom 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=11434DEFAULT_MAX_TOKENS = 32768DEFAULT_CONNECT_TIMEOUT=3DEFAULT_REQUEST_TIMEOUT=60DEFAULT_MAX_RETRIES=0DEFAULT_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+中大型企业

联系我们

售前咨询
186 6662 7370
预约演示
185 8882 0121

微信扫码

与创始人交个朋友

回到顶部

 
扫码咨询