简介
大型语言模型 (LLM) 彻底改变了人工智能领域,提供了令人印象深刻的语言理解和生成能力。
本文将指导你构建一个使用本地 LLM(特别是通过 Ollama 库集成的 Meta 的 Llama 3.1 8b 模型)的 Streamlit 聊天应用程序。
先决条件
在深入研究代码之前,请确保已安装以下内容:
设置 Ollama 并下载 Llama 3.1 8b
首先,你需要安装 Ollama 并下载 Llama 3.1 8b 模型。打开命令行界面并执行以下命令:
# Install Ollama
pip install ollama
# Download Llama 3.1 8b model
ollama run llama3.1:8b
创建模型文件
要创建与 Streamlit 应用程序无缝集成的自定义模型,请按照以下步骤操作:
model: llama3.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)
初始化聊天记录
if 'messages' not in st.session_state:
st.session_state.messages = []
流式传输聊天响应的函数
def stream_chat(model, messages):
try:
llm = Ollama(model=model, request_timeout=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: {model}, Messages: {messages}, Response: {response}")
return response
except Exception as e:
logging.error(f"Error during streaming: {str(e)}")
raise e
主要功能
def main():
st.title("Chat with LLMs Models")
logging.info("App started")
model = st.sidebar.selectbox("Choose a model", ["mymodel", "llama3.1 8b", "phi3", "mistral"])
logging.info(f"Model selected: {model}")
if prompt := st.chat_input("Your question"):
st.session_state.messages.append({"role": "user", "content": prompt})
logging.info(f"User input: {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("Generating response")
with st.spinner("Writing..."):
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\nDuration: {duration:.2f} seconds"
st.session_state.messages.append({"role": "assistant", "content": response_message_with_duration})
st.write(f"Duration: {duration:.2f} seconds")
logging.info(f"Response: {response_message}, Duration: {duration:.2f} s")
except Exception as e:
st.session_state.messages.append({"role": "assistant", "content": str(e)})
st.error("An error occurred while generating the response.")
logging.error(f"Error: {str(e)}")
if __name__ == "__main__":
main()
运行 Streamlit 应用程序
要运行 Streamlit 应用程序,请在项目目录下执行以下命令:
streamlit run app.py
确保你的 Ollama 实例在后台运行,以获取任何活动或结果。
使用 Ollama 训练模型
使用 Ollama 在不同数据集上训练模型的步骤相同。下面介绍如何使用 Ollama 管理和训练模型。
Ollama 命令
要使用 Ollama 进行模型管理和培训,你需要熟悉以下命令:
范例: 创建和使用模型
1. 创建模型文件: 在项目目录中创建一个 Modelfile,其中包含自定义模型的说明。
2. Modelfile 的内容:
# Example content for creating a custom model
name: custom_model
base_model: llama3.1
data_path: /path/to/your/dataset
epochs: 10
3. 创建模型: 使用创建命令从 Modelfile 创建模型。
ollama create -f Modelfile
4.运行模型: 创建模型后,你可以使用以下功能运行模型:
ollama run custom_model
与 Streamlit 或其他程序整合:你可以将此自定义模型与你的 Streamlit 应用程序整合,就像你整合预训练模型一样。
按照这些步骤,你可以创建一个 Streamlit 应用程序,使用 Ollama 库与本地 LLM 进行交互。
C:\your\path\location>ollama
Usage:
ollama [flags]
ollama [command]
Available Commands:
serve Start ollama
create Create a model from a Modelfile
show Show information for a model
run Run a model
pull Pull a model from a registry
push Push a model to a registry
list List models
ps List running models
cp Copy a model
rm Remove a model
help Help about any command
Flags:
-h, - help help for ollama
-v, - version Show version information
Use "ollama [command] - help" for more information about a command.
此外,你还可以使用相同的步骤和 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: {model}, Messages: {messages}, Response: {response}")
return jsonify({'response': response})
except Exception as e:
logging.error(f"Error during streaming: {str(e)}")
return jsonify({'error': str(e)}), 500
if __name__ == '__main__':
app.run(debug=True)
运行 Flask 应用程序
将代码保存到一个文件(如 app.py)中,然后运行以下命令:
python app.py
这将启动 Flask 应用程序,你可以使用包含消息和模型的 JSON 数据向 /chat 端点发出 POST 请求,从 Llama 模型获取响应。
将 Flask 与 Ollama 整合
按照与 Streamlit 类似的步骤,你可以将 Ollama 与 Flask 应用程序集成。stream_chat 函数可以重复使用,Flask 路由可以处理与模型的交互,从而轻松创建可扩展的聊天应用程序。
总结
通过本文,你已经使用本地 LLM 成功创建了一个 Streamlit 聊天应用程序。通过这种设置,你可以直接从本地机器与功能强大的语言模型进行交互,获得直观的交互体验。无论你是提出一般性问题,还是深入探讨具体问题,你的应用程序现在都能应对自如。