Spaces:
Build error
Build error
| import openai, tiktoken, os | |
| import pandas as pd | |
| from openai.embeddings_utils import get_embedding, cosine_similarity | |
| import gradio as gr | |
| import pickle | |
| from utils import * | |
| openai.api_key = os.getenv("OPENAI_API_KEY") | |
| # Split the text into chunks of 200 Chinese characters | |
| def split_chinese_text_into_chunks(text, chunk_size=200): | |
| chunks = [text[i:i+chunk_size] for i in range(0, len(text), chunk_size)] | |
| return chunks | |
| # Create embeddings | |
| def create_embedding(text1, text2, text3, text4, text5, text6, text7, text8, text9, text10): | |
| # Concatenated texts | |
| concatenated_text = text1 + text2 + text3 + text4 + text5 + text6 + text7 + text8 + text9 + text10 | |
| # Get the chunks | |
| chunks = split_chinese_text_into_chunks(concatenated_text) | |
| # Convert chunks into a Pandas DataFrame | |
| df = pd.DataFrame({"text": chunks}) | |
| # Removing any row with empty text | |
| df = df[df.text.ne('')] | |
| # Counting the number of tokens for each text | |
| df["n_tokens"] = df.text.apply(lambda x: len(encoding.encode(str(x)))) | |
| # filter too long text if any | |
| df = df[df.n_tokens <= max_tokens] | |
| df["embedding"] = df.text.apply(lambda x: get_embedding(x, engine=embedding_model)) | |
| print('Start saving pkl file') | |
| with open('tmp.pkl', 'wb') as f: | |
| pickle.dump(df, f) | |
| print('Finish saving pkl file') | |
| return "文章分析完成囉!請到頁面最上方,切換到 Chatbot 頁面進行問答或是文章生成" | |
| def Bot(prompt): | |
| with open('tmp.pkl', 'rb') as f: | |
| df = pickle.load(f) | |
| prompt_embedding = get_embedding(prompt, engine=embedding_model) | |
| df["similarity"] = df.embedding.apply(lambda x: cosine_similarity(x, prompt_embedding)) | |
| results = (df.sort_values("similarity", ascending=False)) | |
| system = """ | |
| 你是一個萬能文字助手,你擅長從大量的文章中,辨識出相關主題,並整理成重點摘要。 | |
| """ | |
| messages = [{"role": "system", "content": system},] | |
| messages.append({"role": "user", "content": prepare_prompt(prompt, results)}) | |
| return answer(messages) | |
| with gr.Blocks() as demo: | |
| gr.Markdown( | |
| """ | |
| # 文章彙整工具 | |
| 輸入希望快速吸收資訊來源,即可使用問答的方式獲取資訊! | |
| 請輸入 Open AI API key 以使用本服務 | |
| """ | |
| ) | |
| openai_api_key_textbox = gr.Textbox(placeholder="Paste your OpenAI API key (sk-...) and hit Enter", | |
| show_label=False, lines=1, type='password') | |
| openai_api_key_textbox.change(set_openai_api_key, | |
| inputs=[openai_api_key_textbox], | |
| outputs=[]) | |
| openai_api_key_textbox.submit(set_openai_api_key, | |
| inputs=[openai_api_key_textbox], | |
| outputs=[]) | |
| with gr.Tab("Articles"): | |
| gr.Markdown("請在下列文字匡中輸入待彙整的文章") | |
| input1 = gr.Textbox(label="Articles 1") | |
| input2 = gr.Textbox(label="Articles 2") | |
| input3 = gr.Textbox(label="Articles 3") | |
| input4 = gr.Textbox(label="Articles 4") | |
| input5 = gr.Textbox(label="Articles 5") | |
| input6 = gr.Textbox(label="Articles 6") | |
| input7 = gr.Textbox(label="Articles 7") | |
| input8 = gr.Textbox(label="Articles 8") | |
| input9 = gr.Textbox(label="Articles 9") | |
| input10 = gr.Textbox(label="Articles 10") | |
| output_text = gr.Textbox(label="處理進度") | |
| text_button = gr.Button("開始分析") | |
| text_button.click(fn=create_embedding, inputs=[input1, input2, input3, input4, input5, input6, input7, input8, input9, input10], outputs=output_text, api_name="create_embedding") | |
| with gr.Tab("Chatbot"): | |
| def predict(message, history): | |
| bot_message = Bot(prompt = message) | |
| partial_message = "" | |
| for chunk in bot_message: | |
| if len(chunk['choices'][0]['delta']) != 0: | |
| partial_message = partial_message + chunk['choices'][0]['delta']['content'] | |
| yield partial_message | |
| gr.ChatInterface(predict) | |
| demo.queue().launch() | |