Langchain-Chatchat/webui_pages/dialogue/dialogue.py

115 lines
4.8 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import streamlit as st
from webui_pages.utils import *
from streamlit_chatbox import *
chat_box = ChatBox(
greetings=[
f"欢迎使用 [`Langchain-Chatglm`](https://github.com/chatchat-space/langchain-chatglm) ! 当前使用模型`{LLM_MODEL}`, 您可以开始提问了.",
]
)
def dialogue_page(api: ApiRequest):
with st.sidebar:
def on_mode_change():
mode = st.session_state.dialogue_mode
text = f"已切换到 {mode} 模式。"
if mode == "知识库问答":
cur_kb = st.session_state.get("selected_kb")
if cur_kb:
text = f"{text} 当前知识库: `{cur_kb}`。"
chat_box.ai_say(text, not_render=True)
dialogue_mode = st.radio("请选择对话模式",
["LLM 对话",
"知识库问答",
"Bing 搜索问答",
"Duck 搜索问答",
],
on_change=on_mode_change,
key="dialogue_mode",
)
history_len = st.slider("历史对话轮数:", 1, 10, 1, disabled=True)
# todo: support history len
with st.expander("会话管理", True):
if st.button("清除历史对话内容"):
chat_box.reset_history()
col_input, col_btn = st.columns(2)
new_chat_name = col_input.text_input(
"新会话名称",
placeholder="新会话名称",
label_visibility="collapsed",
key="new_chat_name",
)
def on_btn_new_chat():
new_chat_name = st.session_state.new_chat_name
if new_chat_name:
chat_box.use_chat_name(new_chat_name)
st.session_state.new_chat_name = ""
col_btn.button("新建会话", on_click=on_btn_new_chat)
cols = st.columns(2)
chat_list = chat_box.get_chat_names()
try:
index = chat_list.index(chat_box.cur_chat_name)
except:
index = 0
cur_chat_name = cols[0].selectbox("当前会话:", chat_list, index, label_visibility="collapsed")
chat_box.use_chat_name(cur_chat_name)
if cols[1].button("清除会话"):
chat_box.del_chat_name(cur_chat_name)
def on_kb_change():
chat_box.ai_say(f"已加载知识库: {st.session_state.selected_kb}", not_render=True)
if dialogue_mode == "知识库问答":
with st.expander("知识库配置", True):
kb_list = api.list_knowledge_bases()
selected_kb = st.selectbox(
"请选择知识库:",
kb_list,
on_change=on_kb_change,
key="selected_kb",
)
top_k = st.slider("匹配知识条数:", 1, 20, 3)
score_threshold = st.slider("知识匹配分数阈值:", 0, 1000, 0, disabled=True)
chunk_content = st.checkbox("关联上下文", False, disabled=True)
chunk_size = st.slider("关联长度:", 0, 500, 250, disabled=True)
# Display chat messages from history on app rerun
chat_box.output_messages()
if prompt := st.chat_input("请输入对话内容换行请使用Ctrl+Enter"):
chat_box.user_say(prompt)
if dialogue_mode == "LLM 对话":
chat_box.ai_say("正在思考...")
text = ""
r = api.chat_chat(prompt, no_remote_api=True)
for t in r:
text += t
chat_box.update_msg(text)
chat_box.update_msg(text, streaming=False) # 更新最终的字符串,去除光标
elif dialogue_mode == "知识库问答":
chat_box.ai_say(f"正在查询知识库: `{selected_kb}` ...")
text = ""
for t in api.knowledge_base_chat(prompt, selected_kb, top_k):
text += t
chat_box.update_msg(text)
chat_box.update_msg(text, streaming=False)
elif dialogue_mode == "Bing 搜索问答":
chat_box.ai_say("正在执行Bing搜索...")
text = ""
for t in api.bing_search_chat(prompt):
text += t
chat_box.update_msg(text)
chat_box.update_msg(text, streaming=False)
elif dialogue_mode == "Duck 搜索问答":
chat_box.ai_say("正在执行Duckduck搜索...")
text = ""
for t in api.duckduckgo_search_chat(prompt):
text += t
chat_box.update_msg(text)
chat_box.update_msg(text, streaming=False)