通过streamlit实现一个简单的ChatGPT对话界面

之前在某宝上购买的open ai的key一直是中转的。商家提供了一个对话界面,直接在设置中粘贴购买的key就可以实现对话。

但是今天下午购买了直连的key。中转的对话界面就不能使用了。只能通过代码获取回答,自己日常使用很不方便。

因此做了一个简单的streamlit界面用于对话。

主要内容是:调用api获取回答;构建对话界面;将回答传到界面上实现流式输出

界面长这样。

使用到的包。

import sys
import streamlit as st
import os
from langchain.chat_models import ChatOpenAI
from get_response import ask_and_get_answer
from openai import OpenAI

构建对话界面:

 st.subheader('GPT-4o 🤖')
    #  定义侧边栏。在此部分内的所有控件都会被添加到侧边栏。
    with st.sidebar:

        api_key = st.text_input('OpenAI API Key:', type='password')
        #  创建一个文本输入控件,用于输入OpenAI API密钥。输入的内容将被隐藏。
        if api_key:
            os.environ['OPENAI_API_KEY'] = api_key
            #  如果输入了API密钥,则将其设置为环境变量,以供后续使用。
            print("OpenAI API Key set successfully.")

        llm=ChatOpenAI(model='gpt-4o', temperature=1)
        print(f"Selected LLM: {llm}")
        #  创建一个下拉选择框,让用户选择本地大语言模型(LLM)。

        output_type = st.selectbox("选择输出方式", ('流式输出', '普通输出'))
        #  创建一个下拉选择框,让用户选择输出方式(普通输出或流式输出)。


    # 初始化history
    if "messages" not in st.session_state:
        st.session_state.messages = []
    #  如果会话状态中没有消息记录,则初始化一个空列表。

    # 展示对话
    for msg in st.session_state.messages:
        with st.chat_message(msg['role']):
            st.markdown(msg["content"])
    #  遍历会话状态中的所有消息,并在应用中显示它们。

    # React to user input
    if prompt := st.chat_input("Say something"):
        # Display user message in chat message container
        with st.chat_message("user"):
            st.markdown(prompt)
        # Add user message to chat history
        st.session_state.messages.append({"role": "user", "content": prompt})
        print(f"User prompt: {prompt}")
    #  如果用户在聊天输入框中输入了消息,则显示用户消息并将其添加到消息记录中。

普通输出:

# 普通方式输出
    if prompt is not None:
        #     st.warning(body='正在努力加载模型中,稍后再试', icon="⚠️")
        if output_type == "普通输出" :
            response = ""
            response = ask_and_get_answer(prompt)
            print("Using GPT model for response...")
            print(f"Generated response: {response}")
            with st.chat_message("assistant"):
                st.markdown(response)
            st.session_state.messages.append({"role": "assistant", "content": response})

流式输出:

        else:
            # 流式输出
            # 初始化一个空的占位符,用于实现流式输出。
            output_placeholder = st.empty()
            # Add assistant response to chat history
            client = OpenAI()
            stream = client.chat.completions.create(
                model="gpt-4o",
                messages=[{"role": "user", "content": prompt}],
                stream=True,
            )
            collected_messages = ""
            for chunk in stream:
                if chunk.choices[0].delta.content is not None:
                    collected_messages += chunk.choices[0].delta.content
                    print(chunk.choices[0].delta.content, end="")
                    output_placeholder.text(collected_messages)

主要代码如上。这是拿之前一个RAG-LLM对话界面改的。所以里面有一些注释(数据库或者模型之类)是之前的界面内容。影响不大。

  • 9
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值