Upload app.py
Browse files
app.py
CHANGED
|
@@ -1,17 +1,29 @@
|
|
| 1 |
'''
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 2 |
|
| 3 |
'''
|
| 4 |
-
##TODO:
|
| 5 |
|
| 6 |
import time
|
| 7 |
import os
|
| 8 |
import pandas as pd
|
| 9 |
import streamlit as st
|
| 10 |
from code_editor import code_editor
|
|
|
|
|
|
|
| 11 |
# from utils.setup import setup_connexion, setup_session_state
|
| 12 |
# from utils.vanna_calls import (
|
| 13 |
# generate_questions_cached,
|
| 14 |
-
# generate_sql_cached,
|
| 15 |
# run_sql_cached,
|
| 16 |
# generate_plotly_code_cached,
|
| 17 |
# generate_plot_cached,
|
|
@@ -54,133 +66,155 @@ st.title("本地化国产大模型数据库查询演示")
|
|
| 54 |
st.markdown("_声明:内容由人工智能生成,仅供参考。如果您本人使用或对外传播本服务生成的输出,您应当主动核查输出内容的真实性、准确性,避免传播虚假信息。_")
|
| 55 |
|
| 56 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 57 |
### Streamlit Sidebar 左侧工具栏
|
| 58 |
# st.sidebar.write(st.session_state)
|
| 59 |
-
|
| 60 |
-
|
| 61 |
-
|
| 62 |
-
|
| 63 |
-
|
| 64 |
-
|
| 65 |
-
|
| 66 |
-
|
| 67 |
-
|
| 68 |
-
|
| 69 |
-
|
| 70 |
-
|
| 71 |
-
|
| 72 |
-
|
| 73 |
-
|
| 74 |
-
|
| 75 |
-
|
| 76 |
-
|
| 77 |
-
|
| 78 |
-
|
| 79 |
-
|
| 80 |
-
|
| 81 |
-
|
| 82 |
-
|
| 83 |
-
st.
|
| 84 |
-
|
| 85 |
-
|
| 86 |
-
|
| 87 |
-
|
| 88 |
-
|
| 89 |
-
|
| 90 |
-
|
| 91 |
-
|
| 92 |
-
|
| 93 |
-
#
|
| 94 |
-
|
| 95 |
-
|
| 96 |
-
|
| 97 |
-
|
| 98 |
-
|
| 99 |
-
*
|
| 100 |
-
|
| 101 |
-
|
| 102 |
-
|
| 103 |
-
|
| 104 |
-
|
| 105 |
-
*
|
| 106 |
-
|
| 107 |
-
|
| 108 |
-
|
| 109 |
-
|
| 110 |
-
|
| 111 |
-
|
| 112 |
-
|
| 113 |
-
|
| 114 |
-
|
| 115 |
-
|
| 116 |
-
|
| 117 |
-
|
| 118 |
-
|
| 119 |
-
|
| 120 |
-
|
| 121 |
-
|
| 122 |
-
|
| 123 |
-
|
| 124 |
-
|
| 125 |
-
|
| 126 |
-
|
| 127 |
-
|
| 128 |
-
|
| 129 |
-
|
| 130 |
-
|
| 131 |
-
|
| 132 |
-
|
| 133 |
-
|
| 134 |
-
|
| 135 |
-
|
| 136 |
-
|
| 137 |
-
|
| 138 |
-
|
| 139 |
-
|
| 140 |
-
|
| 141 |
-
|
| 142 |
-
|
| 143 |
-
|
| 144 |
-
|
| 145 |
-
|
| 146 |
-
|
| 147 |
-
|
| 148 |
-
|
| 149 |
-
|
| 150 |
-
|
| 151 |
-
|
| 152 |
-
|
| 153 |
-
|
| 154 |
-
|
| 155 |
-
|
| 156 |
-
|
| 157 |
-
|
| 158 |
-
|
| 159 |
-
|
| 160 |
-
|
| 161 |
-
|
| 162 |
-
# st.code(body="帮我写一个车内健康监测全场景落地的项目计划,用表格。", language='plaintext')
|
| 163 |
-
# st.code(
|
| 164 |
-
# body="同时掷两枚质地均匀的骰子,则两枚骰子向上的点数之和为 7 的概率是多少。", language='plaintext')
|
| 165 |
-
# st.code(body="写一篇产品经理的演讲稿,注意使用以下词汇: 赋能,抓手,中台,闭环,落地,漏斗,沉淀,给到,同步,对齐,对标,迭代,拉通,打通,升级,交付,聚焦,倒逼,复盘,梳理,方案,联动,透传,咬合,洞察,渗透,兜底,解耦,耦合,复用,拆解。", language='plaintext')
|
| 166 |
-
|
| 167 |
-
# with st.expander(label="**数据分析模式的专用提示词Prompt示例**", expanded=False):
|
| 168 |
-
# # with st.subheader(body="提示词Prompt"):
|
| 169 |
-
# st.code(body="分析此数据集并绘制一些'有趣的图表'。", language='python')
|
| 170 |
# st.code(
|
| 171 |
-
# body="
|
| 172 |
-
# st.code(body="
|
| 173 |
-
#
|
| 174 |
-
# st.code(body="
|
|
|
|
|
|
|
| 175 |
# st.code(
|
| 176 |
-
# body="
|
| 177 |
-
# st.code(body="
|
| 178 |
-
|
| 179 |
-
|
| 180 |
-
|
| 181 |
-
|
| 182 |
-
|
| 183 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 184 |
|
| 185 |
|
| 186 |
myavatar = "./2D.png"
|
|
|
|
| 1 |
'''
|
| 2 |
+
1. 大模型以Qwen API形式提供。
|
| 3 |
+
1. 重塑了Qwen作为大语言模型做Text2SQL的提示词:
|
| 4 |
+
sys_prompt = """
|
| 5 |
+
1. 你是一个将文字转换成SQL语句的人工智能。
|
| 6 |
+
2. 你需要注意:你只需要用纯文本回复代码的内容,即你不允许回复代码以外的任何信息。
|
| 7 |
+
3. SQL变量默认是中文,而且只能从如下的名称列表中选择,你不可以使用这些名字以外的变量名:"长度","宽度","价格","产品ID","比率","类别","*"
|
| 8 |
+
4. 你不能写IF, THEN的SQL语句,需要使用CASE。
|
| 9 |
+
5. 我需要你转换的文字如下:"""
|
| 10 |
+
|
| 11 |
+
total_prompt = sys_prompt + "在数据表格table01中," + prompt
|
| 12 |
+
|
| 13 |
|
| 14 |
'''
|
| 15 |
+
##TODO: 2. 账号功能。
|
| 16 |
|
| 17 |
import time
|
| 18 |
import os
|
| 19 |
import pandas as pd
|
| 20 |
import streamlit as st
|
| 21 |
from code_editor import code_editor
|
| 22 |
+
import streamlit_authenticator as stauth
|
| 23 |
+
|
| 24 |
# from utils.setup import setup_connexion, setup_session_state
|
| 25 |
# from utils.vanna_calls import (
|
| 26 |
# generate_questions_cached,
|
|
|
|
| 27 |
# run_sql_cached,
|
| 28 |
# generate_plotly_code_cached,
|
| 29 |
# generate_plot_cached,
|
|
|
|
| 66 |
st.markdown("_声明:内容由人工智能生成,仅供参考。如果您本人使用或对外传播本服务生成的输出,您应当主动核查输出内容的真实性、准确性,避免传播虚假信息。_")
|
| 67 |
|
| 68 |
|
| 69 |
+
### authentication with a local yaml file.
|
| 70 |
+
import yaml
|
| 71 |
+
from yaml.loader import SafeLoader
|
| 72 |
+
with open('./config.yaml') as file:
|
| 73 |
+
config = yaml.load(file, Loader=SafeLoader)
|
| 74 |
+
authenticator = stauth.Authenticate(
|
| 75 |
+
config['credentials'],
|
| 76 |
+
config['cookie']['name'],
|
| 77 |
+
config['cookie']['key'],
|
| 78 |
+
config['cookie']['expiry_days'],
|
| 79 |
+
config['preauthorized']
|
| 80 |
+
)
|
| 81 |
+
|
| 82 |
+
user, authentication_status, username = authenticator.login('用户登录', 'main')
|
| 83 |
+
print('登录的用户:', username)
|
| 84 |
+
|
| 85 |
### Streamlit Sidebar 左侧工具栏
|
| 86 |
# st.sidebar.write(st.session_state)
|
| 87 |
+
if authentication_status:
|
| 88 |
+
|
| 89 |
+
with st.sidebar:
|
| 90 |
+
st.markdown(
|
| 91 |
+
"""
|
| 92 |
+
<style>
|
| 93 |
+
[data-testid="stSidebar"][aria-expanded="true"]{
|
| 94 |
+
min-width: 500px;
|
| 95 |
+
max-width: 500px;
|
| 96 |
+
}
|
| 97 |
+
""",
|
| 98 |
+
unsafe_allow_html=True,
|
| 99 |
+
)
|
| 100 |
+
|
| 101 |
+
# st.header(f'**大语言模型专家系统工作设定区**')
|
| 102 |
+
st.header(f'**欢迎 **{username}** 使用本系统** ')
|
| 103 |
+
st.write(f'_Large Language Model Expert System Working Environment_')
|
| 104 |
+
# st.write(f'_Welcome and Hope U Enjoy Staying Here_')
|
| 105 |
+
authenticator.logout('登出', 'sidebar')
|
| 106 |
+
### siderbar的题目。
|
| 107 |
+
### siderbar的题目。
|
| 108 |
+
# st.header(f'**大语言模型专家系统工作设定区**')
|
| 109 |
+
# st.header(f'**欢迎 **{username}** 使用本系统** ') ## 用户登录显示。
|
| 110 |
+
st.sidebar.button("清除记录,重启一轮新对话", on_click=clear_all, use_container_width=True, type='primary')
|
| 111 |
+
# st.sidebar.button("清除记录,重启一轮新对话", on_click=setup_session_state, use_container_width=True, type='primary')
|
| 112 |
+
|
| 113 |
+
### 展示当前数据库
|
| 114 |
+
# st.markdown("#### 当前数据库中的数据:")
|
| 115 |
+
with st.expander("#### 当前数据库中的数据", expanded=True):
|
| 116 |
+
my_db = pd.read_sql_table('table01', 'sqlite:///myexcelDB.db')
|
| 117 |
+
st.dataframe(my_db, width=400)
|
| 118 |
+
|
| 119 |
+
## 在sidebar上的三个分页显示,用st.tabs实现。
|
| 120 |
+
tab_1, tab_2, tab_4 = st.tabs(['使用须知', '模型参数', '角色设定'])
|
| 121 |
+
# tab_1, tab_2, tab_3, tab_4 = st.tabs(['使用须知', '模型参数', '提示词模板', '系统角色设定'])
|
| 122 |
+
|
| 123 |
+
# with st.expander(label='**使用须知**', expanded=False):
|
| 124 |
+
with tab_1:
|
| 125 |
+
# st.markdown("#### 快速上手指南")
|
| 126 |
+
# with st.text(body="说明"):
|
| 127 |
+
# st.markdown("* 重启一轮新对话时,只需要刷新页面(按Ctrl/Command + R)即可。")
|
| 128 |
+
with st.text(body="说明"):
|
| 129 |
+
st.markdown("""* 简介
|
| 130 |
+
|
| 131 |
+
本系统使用大模型技术,将自然语言描述转换为SQL查询语句。用户可以输入自然语言问题,系统会自动生成相应的SQL语句,并返回查询结果。
|
| 132 |
+
|
| 133 |
+
* 使用步骤
|
| 134 |
+
|
| 135 |
+
在文本框中输入您的自然语言问题。
|
| 136 |
+
系统会自动生成相应的SQL语句,并显示在下方。
|
| 137 |
+
点击“满意,请执行语句”选项,可查看查询结果。点击”不满意,需要改正语句“可以手动修改SQL语句。
|
| 138 |
+
|
| 139 |
+
* 注意事项
|
| 140 |
+
|
| 141 |
+
本系统仍在开发中,可能会存在一些错误或不准确的地方。
|
| 142 |
+
自然语言描述越清晰,生成的SQL语句越准确。
|
| 143 |
+
系统支持的SQL语法有限,请尽量使用简单易懂的语法。
|
| 144 |
+
""")
|
| 145 |
+
# with st.text(body="说明"):
|
| 146 |
+
# st.markdown("""在构建大语言模型本地知识库问答系统时,需要注意以下几点:
|
| 147 |
+
|
| 148 |
+
# LLM的选择:LLM的选择应根据系统的应用场景和需求进行。对于需要处理通用问题的系统,可以选择通用LLM;对于需要处理特定领域问题的系统,可以选择针对该领域进行微调的LLM。
|
| 149 |
+
# 本地知识库的构建:本地知识库应包含系统所需的所有知识。知识的组织方式应便于LLM的访问和处理。
|
| 150 |
+
# 系统的评估:系统应进行充分的评估,以确保其能够准确地回答用户问题。
|
| 151 |
+
# 大语言模型本地知识库问答系统具有以下优势:
|
| 152 |
+
|
| 153 |
+
# 准确性:LLM和本地知识库的结合可以提高系统的准确性。
|
| 154 |
+
# 全面性:LLM和本地知识库的结合可以使系统能够回答更广泛的问题。
|
| 155 |
+
# 效率:LLM可以快速生成候选答案,而本地知识库可以快速评估候选答案的准确性。
|
| 156 |
+
# """)
|
| 157 |
+
|
| 158 |
+
|
| 159 |
+
# with st.text(body="说明"):
|
| 160 |
+
# st.markdown(
|
| 161 |
+
# "* “数据分析模式”暂时只支持1000个单元格以内的数据分析,单元格中的内容不支持中文数据(表头也尽量不使用中文)。一般运行时间在1至10分钟左右,期间需要保持网络畅通。")
|
| 162 |
+
# with st.text(body="说明"):
|
| 163 |
+
# st.markdown("* “数据分析模式”推荐上传csv格式的文件,部分Excel文件容易出现数据不兼容的情况。")
|
| 164 |
+
|
| 165 |
+
## 大模型参数
|
| 166 |
+
# with st.expander(label='**大语言模型参数**', expanded=True):
|
| 167 |
+
with tab_2:
|
| 168 |
+
max_tokens = st.slider(label='Max_Token(生成结果时最大字数)', min_value=100, max_value=4096, value=2048, step=100)
|
| 169 |
+
temperature = st.slider(label='Temperature (温度)', min_value=0.0, max_value=1.0, value=0.8, step=0.1)
|
| 170 |
+
top_p = st.slider(label='Top_P (核采样)', min_value=0.0, max_value=1.0, value=0.6, step=0.1)
|
| 171 |
+
frequency_penalty = st.slider(label='Frequency Penalty (重复度惩罚因子)', min_value=-2.0, max_value=2.0, value=1.0, step=0.1)
|
| 172 |
+
presence_penalty = st.slider(label='Presence Penalty (控制主题的重复度)', min_value=-2.0, max_value=2.0, value=1.0, step=0.1)
|
| 173 |
+
|
| 174 |
+
## reset password widget
|
| 175 |
+
# try:
|
| 176 |
+
# if authenticator.reset_password(st.session_state["username"], 'Reset password'):
|
| 177 |
+
# st.success('Password modified successfully')
|
| 178 |
+
# except Exception as e:
|
| 179 |
+
# st.error(e)
|
| 180 |
+
|
| 181 |
+
# with st.header(body="欢迎"):
|
| 182 |
+
# st.markdown("# 欢迎使用大语言模型商业智能中心")
|
| 183 |
+
# with st.expander(label=("**重要的使用注意事项**"), expanded=True):
|
| 184 |
+
# with st.container():
|
| 185 |
+
|
| 186 |
+
##NOTE: 在SQL场景去不需要展示这些提示词。
|
| 187 |
+
# with tab_3:
|
| 188 |
+
# # st.markdown("#### Prompt提示词参考资料")
|
| 189 |
+
# # with st.expander(label="**大语言模型基础提示词Prompt示例**", expanded=False):
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 190 |
# st.code(
|
| 191 |
+
# body="继续用中文写一篇关于 [文章主题] 的文章,以下列句子开头:[文章开头]。", language='plaintext')
|
| 192 |
+
# st.code(body="将以下文字概括为 100 个字,使其易于阅读和理解。避免使用复杂的句子结构或技术术语。",
|
| 193 |
+
# language='plaintext')
|
| 194 |
+
# st.code(body="给我出一个迪奥2023春季发布会活动策划。", language='plaintext')
|
| 195 |
+
# st.code(body="帮我按照正式会议结构写一个会邀:主题是xx手机游戏立项会议。", language='plaintext')
|
| 196 |
+
# st.code(body="帮我写一个车内健康监测全场景落地的项目计划,用表格。", language='plaintext')
|
| 197 |
# st.code(
|
| 198 |
+
# body="同时掷两枚质地均匀的骰子,则两枚骰子向上的点数之和为 7 的概率是多少。", language='plaintext')
|
| 199 |
+
# st.code(body="写一篇产品经理的演讲稿,注意使用以下词汇: 赋能,抓手,中台,闭环,落地,漏斗,沉淀,给到,同步,对齐,对标,迭代,拉通,打通,升级,交付,聚焦,倒逼,复盘,梳理,方案,联动,透传,咬合,洞察,渗透,兜底,解耦,耦合,复用,拆解。", language='plaintext')
|
| 200 |
+
|
| 201 |
+
# with st.expander(label="**数据分析模式的专用提示词Prompt示例**", expanded=False):
|
| 202 |
+
# # with st.subheader(body="提示词Prompt"):
|
| 203 |
+
# st.code(body="分析此数据集并绘制一些'有趣的图表'。", language='python')
|
| 204 |
+
# st.code(
|
| 205 |
+
# body="对于这个文件中的数据,你需要要找出[X,Y]数据之间的寻找'相关性'。", language='python')
|
| 206 |
+
# st.code(body="对于这个文件中的[xxx]数据给我一个'整体的分析'。", language='python')
|
| 207 |
+
# st.code(body="对于[xxx]数据给我一个'直方图',提供图表,并给出分析结果。", language='python')
|
| 208 |
+
# st.code(body="对于[xxx]数据给我一个'小提琴图',并给出分析结果。", language='python')
|
| 209 |
+
# st.code(
|
| 210 |
+
# body="对于[X,Y,Z]数据在一个'分布散点图 (stripplot)',所有的数据在一张图上展现, 并给出分析结果。", language='python')
|
| 211 |
+
# st.code(body="对于[X,Y]数据,进行'T检验',你需要展示图表,并给出分析结果。",
|
| 212 |
+
# language='python')
|
| 213 |
+
# st.code(body="对于[X,Y]数据给我一个3个类别的'聚类分析',并给出分析结果。",
|
| 214 |
+
# language='python')
|
| 215 |
+
|
| 216 |
+
with tab_4:
|
| 217 |
+
st.text_area(label='系统角色设定', value='你是一个人工智能,你需要回答我提出的问题,或者完成我交代的任务。你需要使用我提问的语言(如中文、英文)来回答。', height=200, label_visibility='hidden')
|
| 218 |
|
| 219 |
|
| 220 |
myavatar = "./2D.png"
|