为了账号安全,请及时绑定邮箱和手机立即绑定

使用Streamlit构建本地Llama 3.1 8b聊天应用:一步一步教你用Ollama

供稿
或者
供稿
基于更简洁和与中文标题风格一致的考虑,最终推荐如下:
《介绍》

根据上下文,“# 介绍”可能是最简洁和合适的选择。

大型语言模型(LLMs)已经彻底改变了AI领域的面貌,这些模型具备出色的语言理解和生成能力。

Meta刚刚发布了Llama 3.1,这是他们迄今为止最强大的LLM模型:https://ai.meta.com/blog/meta-llama-3-1/

本文将帮助你构建一个使用本地大语言模型的Streamlit聊天应用,具体来说,我们使用Meta公司开发的Llama 3.1 8b模型,通过Ollama库进行集成。

前提

在开始写代码之前,请确保你已安装了以下项目:

  • Python;
  • Streamlit;
  • Ollama;
安装 Ollama 并下载 Llama 3.1 8 b

首先,你需要安装Ollama并下载Llama 3.1 8b模型,然后在命令行中运行以下命令:

    # 安装 Ollama  
    pip install ollama  

    # 下载 Llama 3.1 8b 模型  
    ollama run llama3.1: 8b
创建一个模型文件

要创建一个可以无缝地集成到你 Streamlit 应用中的自定义模型(Custom Model),请按照以下步骤来操作:

  1. 在你的项目目录下,创建一个名为 Modelfile 的文件(不要添加任何扩展名)。
  2. 使用文本编辑器打开 Modelfile,并在其中添加以下内容:
model: 🦙 3.1: 8b

此文件让Ollama用Llama 3.1 8b模型。

这段代码

导入库文件和配置日志
    import streamlit as st  
    from llama_index.core.llms import ChatMessage  
    import logging  
    import time  
    from llama_index.llms.ollama import Ollama  

    logging.basicConfig(level=logging.INFO)
  • streamlit as st: 这里导入了 Streamlit,一个用于创建交互式网络应用的库。
  • ChatMessageOllama: 这用于处理聊天消息并从 llama_index 库中与 Llama 模型进行交互。
  • logging: 这用于记录信息、警告和错误,有助于调试和跟踪应用行为。
  • time: 这个库用来测量生成响应所花的时间。
初始化聊天历史
    if 'messages' not in st.session_state:  
        st.session_state.messages = []

如果 'messages' 不在 st.session_state 中,那么将 st.session_state.messages 设为空列表。

  • st.session_state:这是 Streamlit 的一个功能,允许你在应用的不同运行中存储变量。在这里,它被用来存储聊天历史记录。
  • if 语句检查 session_state 中是否已经有 'messages' 这个键。如果没有,它将初始化为一个空列表,作为消息的历史记录。
用于流式聊天响应的函数
    def 流式聊天(model, messages):  
        try:  
            llm = Ollama(model=model, 请求超时=120.0)  
            resp = llm.stream_chat(messages)  
            response = ""  
            response_placeholder = st.empty()  
            for r in resp:  
                response += r.delta  
                response_placeholder.write(response)  
            logging.info(f"模型: {model}, 消息列表: {messages}, 响应: {response}")  
            return response  
        except Exception as e:  
            logging.error(f"流式处理中的错误: {str(e)}")  
            raise e
  • stream_chat: 此函数处理与Llama模型的流式聊天。
  • Ollama(model=model, request_timeout=120.0): 初始化Llama模型时使用指定的超时时间。
  • llm.stream_chat(messages): 流式传输聊天响应。
  • response_placeholder = st.empty(): 在Streamlit应用中创建一个占位符来动态更新响应。
  • for 循环将响应的每一部分添加到最终响应字符串,并更新占位符。
  • logging.info 记录模型、消息和响应信息。
  • except 块捕获并在流式传输过程中发生的任何错误。
主要用途
    def main():  
        st.title("与大型语言模型聊天")  
        logging.info("应用已启动")  

        model = st.sidebar.selectbox("选择一个模型", ["mymodel", "llama3.1 8b", "phi3", "mistral"])  
        logging.info(f"选择的模型: {model}")  

        if prompt := st.chat_input("您的问题"):  
            st.session_state.messages.append({"role": "user", "content": prompt})  
            logging.info(f"用户输入: {prompt}")  

            for message in st.session_state.messages:  
                with st.chat_message(message["role"]):  
                    st.write(message["content"])  

            if st.session_state.messages[-1]["role"] != "assistant":  
                with st.chat_message("assistant"):  
                    start_time = time.time()  
                    logging.info("生成回答")  

                    with st.spinner("正在撰写..."):  
                        try:  
                            messages = [ChatMessage(role=msg["role"], content=msg["content"]) for msg in st.session_state.messages]  
                            response_message = stream_chat(model, messages)  
                            duration = time.time() - start_time  
                            response_message_with_duration = f"{response_message}\n\n耗时: {duration:.2f} 秒"  
                            st.session_state.messages.append({"role": "assistant", "content": response_message_with_duration})  
                            st.write(f"耗时: {duration:.2f} 秒")  
                            logging.info(f"回答: {response_message}, 耗时: {duration:.2f} 秒")  

                        except Exception as e:  
                            st.session_state.messages.append({"role": "assistant", "content": str(e)})  
                            st.error("在生成回答时发生了错误。")  
                            logging.error(f"错误: {str(e)}")  

    if __name__ == "__main__":  
        main()
  • main: 这是设置和运行Streamlit应用的主要函数。
  • st.title("与大模型聊天"): 设置应用的标题。
  • model = st.sidebar.selectbox("选择一个模型", ["mymodel", "llama3.1 8b", "phi3", "mistral"]): 创建一个下拉菜单以选择模型。
  • if prompt := st.chat_input("你的问题"): 获取用户输入并将其添加到聊天历史中。
  • for 循环显示聊天历史中的每条消息。
  • if 语句检查最后一条消息是否不是来自助手。如果是,则生成模型的回答。
  • with st.spinner("生成中..."): 在生成回答时显示加载中...
  • messages = [ChatMessage(role=msg["role"], content=msg["content"]) for msg in st.session_state.messages]: 准备消息以供Llama模型使用。
  • response_message = stream_chat(model, messages): 调用stream_chat函数以获取模型的回答。
  • duration = time.time() - start_time: 计算生成回答所需的时间。
  • response_message_with_duration = f"{response_message}\n\n耗时: {duration:.2f}秒": 将耗时附加到响应消息中。
  • st.session_state.messages.append({"角色": "助手", "内容": response_message_with_duration}): 将助手的回答添加到聊天历史中。
  • st.write(f"耗时: {duration:.2f}秒"): 显示生成回答的时间。
  • except 块处理生成回答过程中的错误并显示错误信息。
运行Streamlit

要运行你的 Streamlit 应用,请在你的项目目录中执行以下命令即可,

    streamlit run app.py  # 这条命令用于运行 Streamlit 应用程序

请确保你的 Ollama 实例在后台运行,以便能看到任何活动或得到任何结果。

“Llama 3.1 8b 在 Streamlit 应用中生成了对‘什么是大规模语言模型?’这个问题的详细回答时。”

“对话的继续,展示Llama 3.1 8b关于大型语言模型的最后回复部分。”

要使用 Ollama 训练模型

这些相同的步骤可以在不同数据集上使用Ollama训练模型。下面介绍如何使用Ollama来管理和训练模型的步骤。

在Streamlit应用程序中展示Llama 3.1 8b的交互式聊天界面,实现实时生成响应。

Ollama 命令行

要使用Ollama这款工具管理模型和训练模型,你需要熟悉以下命令:

一个例子:创建并使用模型
  1. 创建一个Modelfile文件:在你的项目目录中创建一个 Modelfile,包含你自定义模型的说明和指令。
  2. Modelfile文件的内容
    # 自定义模型创建的示例配置  
    名称: 自定义模型  
    基础模型: llama3.1  
    数据路径: /path/to/your/dataset  
    训练周期: 10

3. 生成模型:使用 create 命令根据 Modelfile 生成模型。

运行以下命令:ollama create -f 文件 (模型文件)

4.运行这个模型:创建好模型后,你可以通过以下方式运行它:

    ollama run 自定义模型

与Streamlit集成 或其他类似工具:你可以像之前集成预训练模型那样,将这个自定义模型集成到你的Streamlit应用中。

您可以按照这些步骤使用Ollama库创建一个与本地LLM交互的Streamlit应用程序。

    C:\your\path\location>ollama  
    命令用法:  
     ollama [标志]  
     ollama [命令]  
    可用命令:  
     serve 启动 ollama  
     create 从 Modelfile 创建模型  
     show 显示模型信息  
     run 运行模型  
     pull 从仓库中拉取模型  
     push 将模型推送到仓库  
     list 列出所有模型  
     ps 列出运行中的模型  
     cp 复制模型  
     rm 删除模型  
     help 任何命令的帮助信息  
    标志:  
     -h, --help 显示帮助信息  
     -v, --version 显示版本信息  
    使用“ollama [命令] --help”获取更多关于命令的信息。

此外,你可以按照相同的方法,使用Ollama命令在不同的数据集上训练和调整模型。这种方法的灵活性使你能够在一个Streamlit应用程序中使用自定义训练的模型,提供更个性化和互动的用户体验。

为Flask实现

这种方法也可以用来开发基于Flask的聊天应用。以下是如何将Ollama集成到Flask应用中的一个简要说明:

Flask应用设置指南
  1. 安装 Flask
    pip install Flask

在终端中输入以下命令:

2. 创建一个 Flask 应用程序

    from flask import Flask, request, jsonify  
    from llama_index.core.llms import ChatMessage  
    from llama_index.llms.ollama import Ollama  
    import logging  

    app = Flask(__name__)  
    logging.basicConfig(level=logging.INFO)  

    @app.route('/chat', methods=['POST'])  
    def chat():  
        data = request.json  
        messages = data.get('messages', [])  
        model = data.get('model', 'llama3.1 8b')  

        try:  
            llm = Ollama(model=model, request_timeout=120.0)  
            resp = llm.stream_chat(messages)  
            response = ""  
            for r in resp:  
                response += r.delta  
            logging.info(f"模型: {model}, 消息: {messages}, 回复: {response}")  
            return jsonify({'response': response})  
        except Exception as e:  
            logging.error(f"流处理错误: {str(e)}")  
            return jsonify({'error': str(e)}), 500  

    if __name__ == '__main__':  
        app.run(debug=True)
运行 Flask 应用

将代码保存到一个文件中,比如 app.py,并运行下面的命令:

运行Python脚本:

python app.py

这将启动Flask应用程序,你可以向 /chat 端点发送包含消息和模型信息的POST请求,从而获取Llama模型的响应。

Flask与Ollama的集成

通过类似展示给Streamlit的步骤,你可以像集成Streamlit那样,将Ollama集成到一个Flask应用中。stream_chat函数可以重用,用于处理聊天流,而Flask路由可以处理与模型的交互,使得轻松构建可扩展的聊天应用。

结论:

按照本指南,您已成功设置了使用本地LLM的Streamlit聊天应用。这使您可以直接在本地机器上与强大的语言模型互动,提供了一个既美观又互动的体验。无论是一般查询还是深入探讨特定问题,您的应用现在可以应对各种问题了。

“感谢你和我们一起探索大型语言模型的魅力。拜拜!”

Git 仓库地址如下 : 点击这里!!

与你的应用程序互动,并探索LLMs的功能,记得分享你的体验和所做的任何改进。祝你编码开心!

希望这篇文章对你有帮助且信息量大

👋😀

参考文献:
Ollama 利用大型语言模型快速开始玩转ollama.com
[meta-llama/Meta-Llama-3.1-8B-Instruct · Hugging Face

我们希望通过开源和开放科学,让更多人了解并使用人工智能。](https://huggingface.co/meta-llama/Meta-Llama-3.1-8B-Instruct?source=post_page-----749931de216a--------------------------------)

现在,介绍Llama 3.1:迄今为止最强大的模型我们最新的模型延长了上下文长度,支持八种语言,并…ai.meta.com
llama3.1:8bLlama 3.1 是 Meta 最新推出的顶尖模型,提供 8B、70B 和 405B 参数。点击这里查看 Llama 3.1:8B
点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消