利用streamlit开发大模型API调用对话网页应用
介绍
Streamlit是一个用于构建数据应用的开源框架,其简单易用的界面使得数据科学家和开发人员能够快速创建交互式应用。而OpenAI API则提供了强大的语言模型,可以生成自然语言响应。将这两者结合起来,可以轻松创建一个与用户进行对话的应用,用于测试大模型API。
整体代码
事前准备,确保已正确安装所需库:
pip install openai==0.28
pip install streamlit==1.35
理论上兼容openai的大模型API都可以使用;
代码:
import streamlit as st
import openai# 设置页面配置
st.set_page_config(page_title="LLM Chat App",page_icon="💬",layout="centered",
)# 应用标题
st.title("LLM Chat App")# 输入API参数
st.sidebar.header("API Configuration")
api_base_url = st.sidebar.text_input("API Base URL", "https://api.deepseek.com/v1")
api_key = st.sidebar.text_input("API Key", type="password")
model_name = st.sidebar.text_input("Model Name", "deepseek-chat")# 设置OpenAI API密钥和base URL
openai.api_key = api_key
openai.api_base = api_base_url# 聊天记录
if "messages" not in st.session_state:st.session_state.messages = []# 显示聊天记录
def display_chat(messages):for i, message in enumerate(messages):role = message["role"]content = message["content"]if role == "user":st.markdown(f"**I:** {content}", unsafe_allow_html=True)else:st.markdown(f"**AI:** {content}", unsafe_allow_html=True)# 发送消息并获取响应
def send_message(user_input):if user_input:st.session_state.messages.append({"role": "user", "content": user_input})# 调用OpenAI APItry:response = openai.ChatCompletion.create(model=model_name,messages=st.session_state.messages,)response_message = response["choices"][0]["message"]["content"]st.session_state.messages.append({"role": "assistant", "content": response_message})# 刷新页面以显示对话结果st.rerun()except openai.error.OpenAIError as e:st.error(f"OpenAI API Error: {e}")# 显示聊天记录
display_chat(st.session_state.messages)# 输入区域
if api_key and api_base_url and model_name:user_input = st.text_input("You:")if st.button("Send"):send_message(user_input)
else:st.warning("Please enter your API Base URL, API Key, and Model Name in the sidebar.")
常用大模型API介绍
大模型API是接入大模型的基础设施,网上各种AI公司都提供这类服务,并且大多在新用户注册的时候都送大量免费tokens,用来测试练习绰绰有余;一些常用的大模型API如下:
服务商 | 网站 |
---|---|
deepseek | https://platform.deepseek.com/ |
质谱AI | https://open.bigmodel.cn/ |
kimi | https://platform.moonshot.cn/ |
使用方法都大同小异,在其开发者平台获取API与API key后,即可实现调用;
代码片段说明
每段代码的详细功能如下,便于修改;
设置页面配置
首先,我们需要设置页面的基本配置:
st.set_page_config(page_title="LLM Chat App",page_icon="💬",layout="centered",
)
这段代码设置了页面的标题、图标和布局。page_title
设置了页面的标题为“LLM Chat App”,page_icon
设置了一个聊天图标,而layout
参数设置页面布局为居中显示。
应用标题
接下来,我们为应用添加一个标题:
st.title("LLM Chat App")
st.title
函数会在页面顶部显示一个大标题。
输入API参数
我们需要在侧边栏中输入API配置参数:
st.sidebar.header("API Configuration")
api_base_url = st.sidebar.text_input("API Base URL", "https://api.deepseek.com/v1")
api_key = st.sidebar.text_input("API Key", type="password")
model_name = st.sidebar.text_input("Model Name", "deepseek-chat")
这里,我们在侧边栏添加了一个标题,并分别为API Base URL、API Key和Model Name创建了输入框。type="password"
参数确保API Key输入框为密码形式,隐藏用户输入的内容。
设置OpenAI API密钥和Base URL
接下来,我们设置OpenAI API的密钥和Base URL:
openai.api_key = api_key
openai.api_base = api_base_url
通过将用户输入的API密钥和Base URL赋值给openai.api_key
和openai.api_base
,我们可以确保后续API调用使用这些参数。
聊天记录
我们需要保存和显示聊天记录:
if "messages" not in st.session_state:st.session_state.messages = []
st.session_state
是Streamlit提供的一个会话状态字典,可以在不同的交互之间保存数据。我们检查st.session_state
中是否存在messages
键,如果不存在,则初始化一个空列表。
显示聊天记录
我们创建一个函数来显示聊天记录:
def display_chat(messages):for i, message in enumerate(messages):role = message["role"]content = message["content"]if role == "user":st.markdown(f"**I:** {content}", unsafe_allow_html=True)else:st.markdown(f"**AI:** {content}", unsafe_allow_html=True)
这个函数遍历消息列表,并根据消息的角色(用户或AI)以不同的格式显示内容。
发送消息并获取响应
我们创建一个函数来处理用户输入并获取AI的响应:
def send_message(user_input):if user_input:st.session_state.messages.append({"role": "user", "content": user_input})# 调用OpenAI APItry:response = openai.ChatCompletion.create(model=model_name,messages=st.session_state.messages,)response_message = response["choices"][0]["message"]["content"]st.session_state.messages.append({"role": "assistant", "content": response_message})# 刷新页面以显示对话结果st.rerun()except openai.error.OpenAIError as e:st.error(f"OpenAI API Error: {e}")
这个函数首先将用户输入添加到聊天记录中,然后调用OpenAI API获取响应,并将AI的响应也添加到聊天记录中。如果调用过程中发生错误,则显示错误信息。
显示聊天记录
在主程序中,我们调用display_chat
函数显示聊天记录:
display_chat(st.session_state.messages)
输入区域
最后,我们创建用户输入区域和发送按钮:
if api_key and api_base_url and model_name:user_input = st.text_input("You:")if st.button("Send"):send_message(user_input)
else:st.warning("Please enter your API Base URL, API Key, and Model Name in the sidebar.")
如果API配置参数全部填入,我们显示一个输入框和发送按钮。用户输入消息后点击“Send”按钮,会调用send_message
函数处理消息。否则,显示一个警告信息,提醒用户输入必要的API参数。