利用streamlit开发大模型API调用对话网页应用

利用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 API
        try:
            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如下:

服务商网站
deepseekhttps://platform.deepseek.com/
质谱AIhttps://open.bigmodel.cn/
kimihttps://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_keyopenai.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 API
        try:
            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参数。

### 使用 Streamlit 构建与大模型对话的 Web 应用界面 #### 创建基础环境 为了构建一个能够与大型语言模型交互的应用,首先需要安装必要的库。这通常涉及 PythonStreamlit 的安装。 ```bash pip install streamlit ``` #### 初始化应用程序结构 建立一个新的文件夹来保存所有的项目文件,并在此文件夹内创建名为 `app.py` 的启动脚本,在该脚本中编写用于展示页面逻辑以及处理用户输入的核心代码[^3]。 #### 集成 API 调用 对于想要集成特定的大规模预训练模型(如讯飞星火认知大模型),则需按照官方文档说明获取相应的 API 密钥并设置好请求参数以便后续调用[^1]。 #### 设计用户界面布局 Streamlit 提供了一种简单的方式来设计直观易懂的操作面板。下面是一个简单的例子展示了如何布置基本组件: ```python import streamlit as st st.title('智能对话应用') user_input = st.text_area("请输入您的问题:") if st.button('提交'): response = "这里是来自大模型的回答" st.write(response) ``` 这段代码设置了标题、文本区域让用户输入查询内容,并提供了一个按钮触发事件;当点击“提交”后会显示一条模拟的消息作为回应[^2]。 #### 实现实际通信过程 要使上述示例真正工作起来,则应在按下按钮之后的部分加入向远程服务器发送 HTTP 请求的具体实现方式,从而获得真实的回复而不是固定的字符串。这里假设已经完成了对目标 LLM 接口的成功对接: ```python import requests def get_model_response(prompt): url = 'https://api.example.com/v1/models/infer' headers = {'Authorization': 'Bearer YOUR_API_KEY'} data = {"prompt": prompt} res = requests.post(url, json=data, headers=headers).json() return res['response'] # 修改之前的条件判断部分如下: if st.button('提交') and user_input.strip(): with st.spinner('正在思考...'): response = get_model_response(user_input) st.success(f'回答:\n\n{response}') ``` 此版本增加了函数 `get_model_response()` 来封装对外部服务端点发起 POST 请求的动作,并且改进了 UI 反馈机制以更好地反映加载状态和最终结果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

sssugarr

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值