| import g4f |
| import gradio as gr |
| from g4f.Provider import ( |
| Ails, |
| You, |
| Bing, |
| Yqcloud, |
| Theb, |
| Aichat, |
| Bard, |
| Vercel, |
| Forefront, |
| Lockchat, |
| Liaobots, |
| H2o, |
| ChatgptLogin, |
| DeepAi, |
| GetGpt |
| ) |
| import os |
| import json |
| import pandas as pd |
|
|
| from models_for_langchain.model import CustomLLM |
| from langchain.memory import ConversationBufferWindowMemory, ConversationTokenBufferMemory |
| from langchain import LLMChain, PromptTemplate |
| from langchain.prompts import ( |
| ChatPromptTemplate, |
| PromptTemplate, |
| SystemMessagePromptTemplate, |
| AIMessagePromptTemplate, |
| HumanMessagePromptTemplate, |
| ) |
|
|
| provider_dict = { |
| 'Ails': Ails, |
| 'You': You, |
| 'Bing': Bing, |
| 'Yqcloud': Yqcloud, |
| 'Theb': Theb, |
| 'Aichat': Aichat, |
| 'Bard': Bard, |
| 'Vercel': Vercel, |
| 'Forefront': Forefront, |
| 'Lockchat': Lockchat, |
| 'Liaobots': Liaobots, |
| 'H2o': H2o, |
| 'ChatgptLogin': ChatgptLogin, |
| 'DeepAi': DeepAi, |
| 'GetGpt': GetGpt |
| } |
|
|
| prompt_set_list = {} |
| for prompt_file in os.listdir("prompt_set"): |
| key = prompt_file |
| if '.csv' in key: |
| df = pd.read_csv("prompt_set/" + prompt_file) |
| prompt_dict = dict(zip(df['act'], df['prompt'])) |
| else: |
| with open("prompt_set/" + prompt_file, encoding='utf-8') as f: |
| ds = json.load(f) |
| prompt_dict = {item["act"]: item["prompt"] for item in ds} |
| prompt_set_list[key] = prompt_dict |
|
|
| with gr.Blocks() as demo: |
| llm = CustomLLM() |
|
|
| template = """ |
| Chat with human based on following instructions: |
| ``` |
| {system_instruction} |
| ``` |
| The following is a conversation between a human and an AI. The AI is talkative and provides lots of specific details from its context. If the AI does not know the answer to a question, it truthfully says it does not know. |
| {{chat_history}} |
| Human: {{human_input}} |
| Chatbot:""" |
|
|
| memory = ConversationBufferWindowMemory(k=10, memory_key="chat_history") |
|
|
| chatbot = gr.Chatbot([], label='AI') |
| msg = gr.Textbox(value="", label='请输入:') |
| with gr.Row(): |
| clear = gr.Button("清空对话", scale=2) |
| chat_mode = gr.Checkbox(value=True, label='聊天模式', interactive=True, scale=1) |
| system_msg = gr.Textbox(value="你是一名助手,可以解答问题。", label='系统提示') |
| with gr.Row(): |
| default_prompt_set = "1 中文提示词.json" |
| prompt_set_name = gr.Dropdown(prompt_set_list.keys(), value=default_prompt_set, label='提示词集合') |
| prompt_name = gr.Dropdown(prompt_set_list[default_prompt_set].keys(), label='提示词', min_width=20) |
| with gr.Row(): |
| model_name = gr.Dropdown(['gpt-3.5-turbo', 'gpt-4'], value='gpt-3.5-turbo', label='模型') |
| provider_name = gr.Dropdown(provider_dict.keys(), value='GetGpt', label='提供者', min_width=20) |
|
|
| def change_prompt_set(prompt_set_name): |
| return gr.Dropdown.update(choices=list(prompt_set_list[prompt_set_name].keys())) |
|
|
| def change_prompt(prompt_set_name, prompt_name): |
| return gr.update(value=prompt_set_list[prompt_set_name][prompt_name]) |
|
|
| def user(user_message, history = []): |
| return gr.update(value="", interactive=False), history + [[user_message, None]] |
|
|
| def bot(history, model_name, provider_name, system_msg, chat_mode): |
| history[-1][1] = '' |
| if len(system_msg)>3000: |
| system_msg = system_msg[:2000] + system_msg[-1000:] |
|
|
| if not chat_mode: |
| global template, memory |
| llm.model_name = model_name |
| llm.provider_name = provider_name |
| prompt = PromptTemplate( |
| input_variables=["chat_history", "human_input"], template=template.format(system_instruction=system_msg) |
| ) |
| llm_chain = LLMChain( |
| llm=llm, |
| prompt=prompt, |
| verbose=False, |
| memory=memory, |
| ) |
| bot_msg = llm_chain.run(history[-1][0]) |
| for c in bot_msg: |
| history[-1][1] += c |
| yield history |
| else: |
| prompt = """ |
| 请你仔细阅读以下提示,然后针对用户的话进行回答。 |
| 提示: |
| ``` |
| {} |
| ``` |
| 用户最新的话: |
| ``` |
| {} |
| ``` |
| 请回答: |
| """ |
|
|
| |
| messages = [] |
| for user_message, assistant_message in history[:-1]: |
| messages.append({"role": "user", "content": user_message}) |
| messages.append({"role": "assistant", "content": assistant_message}) |
| messages.append({"role": "user", "content": history[-1][0]}) |
| |
|
|
| bot_msg = g4f.ChatCompletion.create( |
| model=model_name, |
| provider=provider_dict[provider_name], |
| messages=messages, |
| stream=True) |
| for c in bot_msg: |
| history[-1][1] += c |
| print(c, flush=True, end='') |
| yield history |
|
|
| def empty_chat(): |
| global memory |
| memory = ConversationBufferWindowMemory(k=10, memory_key="chat_history") |
| return None |
| response = msg.submit(user, [msg, chatbot], [msg, chatbot], queue=False).then( |
| bot, [chatbot, model_name, provider_name, system_msg, chat_mode], chatbot |
| ) |
| prompt_set_name.select(change_prompt_set, prompt_set_name, prompt_name) |
| prompt_name.select(change_prompt, [prompt_set_name, prompt_name], system_msg) |
|
|
| response.then(lambda: gr.update(interactive=True), None, [msg], queue=False) |
| clear.click(empty_chat, None, [chatbot], queue=False) |
|
|
| demo.title = "AI Chat" |
| demo.queue() |
| demo.launch() |