Shiny介绍
Shiny 最初是一个 R 语言的包,由 RStudio 开发,它的主要作用是允许用户创建交互式的 Web 应用程序而无需深入学习复杂的 Web 开发技术,我相信做R开发的同学基本都知道这个R包。以下是 Shiny 的一些具体作用:
- 简化 Web 开发:Shiny 提供了一种简便的方法来创建 Web 应用程序,这使得数据分析师和研究人员能够专注于他们的数据和分析,而不是 Web 开发的技术细节。
- 数据可视化:用户可以通过 Shiny 创建动态且交互式的图表和其他可视化元素,这些元素可以根据用户的输入实时更新。
- 数据探索:Shiny 可以帮助用户构建数据探索工具,允许用户通过筛选、排序等方式与数据互动,从而更好地理解数据集。
- 报告和展示:Shiny 可以用来制作交互式的报告和展示,使观众能够直接与数据分析的结果进行互动。
- 共享分析结果:通过 Shiny 所创建的应用程序可以部署到网上,这样就可以方便地与同事、客户或者公众分享数据分析的结果。
- 教育用途:教师可以利用 Shiny 制作教学工具,让学生通过实际操作来学习统计概念和方法。
- 商业智能:企业可以使用 Shiny 构建内部工具,以辅助决策过程,如销售预测、客户行为分析等。
- 科研合作:研究者之间可以通过 Shiny 共享数据处理和分析流程,提高科研效率和透明度。
Shiny 是一种强大的工具,它让 用户能够轻松地将他们的分析成果转化为互动性强、易于理解和使用的 Web 应用程序。创建一个 Shiny 应用,开发者需要编写两个主要部分:UI 和 server 函数。UI 部分定义了应用程序的用户界面,包括各种控件和输出区域;而 server 部分则定义了应用程序的行为逻辑,决定了输入如何影响输出。
但我们这里的主题是python,和R 有什么关系呢?没错,经官方的迭代,目前python也有shiny啦,也叫是pyshiny。下面是一个官方的 Shiny 仪表板,带有用于探索餐厅提示的视觉效果。
下例是shiny的代码及界面的展示效果,代码非常简洁:
相信大家经常百度到基于streamlit、Gradio、DASH等的与LLM(大模型语言)的对话框,那么本例是通过shiny开发一个与LLM的聊天对话框,以丰富LLM的对话方式。
基于Shiny的LLM对话框开发
安装相关依赖包
!pip install shiny
!pip install openai
Shiny对话框代码
将下列代码保存在一个chat_app.py文件中
from shiny import App, Inputs, Outputs, Session, render, ui
import os
import openai
app_ui = ui.page_sidebar(
ui.sidebar(
ui.input_select(
"base_url",
"Choose a base_url:",
{
'http://0.0.0.0:11434/v1': "Ollama",
'http://0.0.0.0:4000': "Litellm",
},
),
ui.input_text("model_name","Model_Name" ,value='xxxx'),
ui.input_password("api_key" ,"Api_Key" ,value='xxxx'),
),
ui.chat_ui("chat"),
fillable_mobile=True,
)
#input.base_url()
# Create a welcome message
welcome = ui.markdown(
"""
Hi! This is a simple Shiny `Chat` UI. Enter a message below and I will
simply repeat it back to you. For more examples, see this
[folder of examples](https://github.com/posit-dev/py-shiny/tree/main/examples/chat).
"""
)
openai.default_headers = {"x-foo": "true"}
chat_messages=[]
def server(input, output, session):
chat = ui.Chat(id="chat", messages=[welcome])
# Define a callback to run when the user submits a message
@chat.on_user_submit
async def _():
# Get the llm's config
openai.api_key =input.api_key()
openai.base_url =input.base_url()
model_name =input.model_name()
# Get the user's input
user_answer_smg = chat.user_input()
chat_messages.append({"role": "user", "content": user_answer_smg})
# 使用OpenAI API生成回复
response = openai.chat.completions.create(
model=model_name,
messages=chat_messages,
)
# 获取模型生成的消息
assistant_message = response.choices[0].message.content
#print(response.choices[0].message)
chat_messages.append({"role": "assistant", "content": assistant_message})
# 显示助手的回复
#print(chat_messages)
await chat.append_message(f"Assistant:\n{assistant_message}")
app = App(app_ui, server)
#shiny run chat_app.py
Shiny运行界面
在终端执行Shiny运行命令:shiny run chat_app.py,在浏览器执行http://127.0.0.1:8000,可以看到运行的shiny对话框界面。
左边是Openid的相关信息,国内的qwen、百川或者ollama的本地LLM都可以支持。填写完base_url、api_key、model_name完成后,我们句可以开始对话了。