Spaces:
Sleeping
Sleeping
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 = """ | |
请你仔细阅读以下提示,然后针对用户的话进行回答。 | |
提示: | |
``` | |
{} | |
``` | |
用户最新的话: | |
``` | |
{} | |
``` | |
请回答: | |
""" | |
# print(history) | |
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]}) | |
# print(messages) | |
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() |