# -*- coding: utf-8 -*- import sys sys.path.append('../') import gradio as gr from langchain.prompts import PromptTemplate from src.llm.chatglm import ChatGLMSerLLM from src.llm.ernie_with_sdk import ChatERNIESerLLM from qianfan import ChatCompletion import os import asyncio from src.pgdb.chat.c_db import UPostgresDB from src.pgdb.knowledge.similarity import VectorStore_FAISS from src.config.consts import ( CHAT_DB_USER, CHAT_DB_HOST, CHAT_DB_PORT, CHAT_DB_DBNAME, CHAT_DB_PASSWORD, EMBEEDING_MODEL_PATH, FAISS_STORE_PATH, INDEX_NAME, VEC_DB_HOST, VEC_DB_PASSWORD, VEC_DB_PORT, VEC_DB_USER, VEC_DB_DBNAME, SIMILARITY_SHOW_NUMBER, GR_PORT, GR_SERVER_NAME, ICON_PATH ) from src.server.qa import QA prompt1 = """''' {context} ''' 请你根据上述已知资料回答下面的问题,问题如下: {question}""" PROMPT1 = PromptTemplate(input_variables=["context", "question"], template=prompt1) def main(): c_db = UPostgresDB(host=CHAT_DB_HOST, database=CHAT_DB_DBNAME, user=CHAT_DB_USER, password=CHAT_DB_PASSWORD, port=CHAT_DB_PORT, ) vecstore_faiss = VectorStore_FAISS( embedding_model_name=EMBEEDING_MODEL_PATH, store_path=FAISS_STORE_PATH, index_name=INDEX_NAME, info={"port": VEC_DB_PORT, "host": VEC_DB_HOST, "dbname": VEC_DB_DBNAME, "username": VEC_DB_USER, "password": VEC_DB_PASSWORD}, show_number=SIMILARITY_SHOW_NUMBER, reset=False) base_llm = ChatERNIESerLLM( chat_completion=ChatCompletion(ak="pT7sV1smp4AeDl0LjyZuHBV9", sk="b3N0ibo1IKTLZlSs7weZc8jdR0oHjyMu")) # base_llm = ChatGLMSerLLM(url='http://192.168.22.106:8088') my_chat = QA(PROMPT1, base_llm, {"temperature": 0.9}, ['context', 'question'], _db=c_db, _faiss_db=vecstore_faiss) def clear(): # 清空输入框 return '' def show_history(): # 显示对话历史 return my_chat.get_history() def stop_btn(): return gr.Button(interactive=False) def restart_btn(): return gr.Button(interactive=True) def get_users(): o_users = my_chat.get_users() users_l = [item[0] for item in o_users] return gr.components.Radio(choices=users_l, label="选择一个用户", value=users_l[0], interactive=True), users_l[ 0] def create_chat(user_account): my_chat.create_chat(user_account) def get_chats(user_account): o_chats = my_chat.get_chats(user_account) if len(o_chats) >= 13: o_chats = o_chats[:13] chats_l = [item[0] + ':' + item[1] for item in o_chats] if my_chat.chat_id: result = [item for item in chats_l if item.split(":")[0].strip() == my_chat.chat_id][0] return gr.components.Radio(choices=chats_l, label="历史对话", value=result, interactive=True, show_label=True) else: return gr.components.Radio(choices=chats_l, label="历史对话", value=chats_l[0], interactive=True, show_label=True) def set_info(question): my_chat.set_info(question) def set_chat_id(chat_id_info): chat_id = chat_id_info.split(':')[0] my_chat.set_chat_id(chat_id) def load(): l_users, t_user = get_users() l_chats = get_chats(t_user) return l_users, l_chats def clear_text(t): if t == "请输入您的问题": return "" else: return t def reset_text(): return "" def blur(t): if t == "": return "请输入您的问题" else: return t def text_his(text, history): history = history + [[text, None]] return history def clear_tip(his): if not his[0][0] and his[0][1] == "我是新晨科技股份有限公司开发的人工智能助手,名叫小晨,如果您有任何问题,欢迎随时向我咨询": return his[1:] else: return his with gr.Blocks(css='index.css', title="低空经济知识问答") as demo: gr.HTML("""<h1 align="center">低空经济知识问答</h1>""", visible=False) with gr.Row(): with gr.Column(scale=2, visible=False): users = gr.components.Radio(choices=[], label="选择一个用户", interactive=True, visible=False, show_label=False) chats = gr.components.Radio(choices=[], label="历史对话", interactive=True, show_label=True, visible=False) new_chat_btn = gr.Button("新建对话", visible=False) with gr.Column(scale=8): chatbot = gr.Chatbot(bubble_full_width=False, avatar_images=(ICON_PATH + '\\user2.png', ICON_PATH + "\\bot2.png"), value=[[None, "我是新晨科技股份有限公司开发的人工智能助手,名叫小晨,如果您有任何问题,欢迎随时向我咨询"]], height=400, show_copy_button=True, show_label=False, line_breaks=True) with gr.Row(): input_text = gr.Textbox(show_label=False, lines=1, label="文本输入", scale=9, container=False, placeholder="请输入您的问题", max_lines=1) sub_btn = gr.Button("提交", scale=1) sub_btn.click( stop_btn, [], sub_btn ).success( clear_tip, [chatbot], [chatbot] ).success( text_his, [input_text, chatbot], [chatbot] ).success( reset_text, [], input_text ).success( my_chat.async_chat2, [chatbot], [chatbot] ).success( restart_btn, [], sub_btn ) # input_text.submit( # stop_btn, [], sub_btn # ).then( # my_chat.async_chat2, [input_text, chatbot], [chatbot] # ).then( # restart_btn, [], sub_btn # ) demo.load(load, [], [users, chats]) # input_text.submit(my_chat.async_chat, [input_text], [chatbot] # ).then( # stop_btn, None, sub_btn # ).then( # set_info, [input_text], [] # ).then( # get_chats, [users], [chats] # ).then( # my_chat.update_history, None, None # ).then( # show_history, None, chatbot # ).then( # clear, None, [input_text] # ).then( # restart_btn, None, sub_btn # ).then( # reset_text, [], input_text # ) # new_chat_btn.click(create_chat, [users], []).then( # get_chats, [users], [chats] # ) # users.change(get_chats, [users], [chats]).then( # set_chat_id, [chats], None # ).then( # show_history, None, chatbot # ) # chats.change(set_chat_id, [chats], None).then( # show_history, None, chatbot # ) # sub_btn.click(my_chat.async_chat, [input_text], [chatbot] # ).then( # stop_btn, None, sub_btn # ).then( # set_info, [input_text], [] # ).then( # get_chats, [users], [chats] # ).then( # my_chat.update_history, None, None # ).then( # show_history, None, chatbot # ).then( # clear, None, [input_text] # ).then( # restart_btn, None, sub_btn # ).then( # reset_text, [], input_text # ) demo.queue().launch(share=False, inbrowser=True, server_name='192.168.22.32', server_port=8888) if __name__ == "__main__": main()