File size: 5,731 Bytes
f4b4235 993584d f4b4235 b7adec7 7987763 b7adec7 f4b4235 993584d f4b4235 993584d eda129a 993584d eda129a 993584d f4b4235 993584d fd506d6 993584d f4b4235 993584d fd506d6 993584d f4b4235 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 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 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 163 |
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([[None, None]], 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 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 = """
请你仔细阅读以下提示,然后针对用户的话进行回答。
提示:
```
{}
```
用户最新的话:
```
{}
```
请回答:
"""
bot_msg = g4f.ChatCompletion.create(model=model_name,
provider=provider_dict[provider_name],
messages=[{"role": "user",
"content": prompt.format(system_msg,
history[-1][0])}],
stream=True)
for c in bot_msg:
history[-1][1] += c
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() |