Spaces:
Sleeping
Sleeping
| import streamlit as st | |
| import pandas as pd | |
| from openai import OpenAI | |
| import os | |
| import json | |
| import ast | |
| import subprocess | |
| TOKEN=os.getenv('HF_TOKEN') | |
| subprocess.run(["huggingface-cli", "login", "--token", TOKEN, "--add-to-git-credential"]) | |
| from langchain_openai import ChatOpenAI | |
| from langchain.prompts import PromptTemplate | |
| from langchain.prompts.few_shot import FewShotPromptTemplate | |
| from langchain.prompts.prompt import PromptTemplate | |
| import re | |
| from docx import Document | |
| from io import StringIO | |
| from langchain.schema.runnable import RunnableSequence | |
| from langchain.schema.output_parser import StrOutputParser | |
| from langchain.prompts import ChatPromptTemplate | |
| import torch | |
| from transformers import AutoTokenizer, AutoModelForCausalLM, pipeline | |
| from langchain.llms import HuggingFacePipeline | |
| OPENAI_API_KEY = os.getenv("OPENAI_API") | |
| # client = OpenAI(api_key=os.getenv("OPENAI_API")) #INSERT KEY INSODE HE QUOTES IN THE BRACKET | |
| st.logo(image="assets/logo.png", size = "small") | |
| def barem_score(file_path, json_name): | |
| # 1. Đọc file | |
| df = pd.read_excel(file_path, sheet_name="Trang tính1") | |
| df_data = df.iloc[2:, [1, 2, 3]].copy() | |
| # 2. Lấy từ dòng thứ 3 trở đi (index = 2 trong pandas) | |
| df_data.columns = ['Tiêu_chí_chính', 'Tiêu_chí_con', 'Nhan_xet'] | |
| # 4. Điền các tiêu chí chính nếu bị merge (NaN) | |
| df_data['Tiêu_chí_chính'] = df_data['Tiêu_chí_chính'].fillna(method='ffill') | |
| # 5. Loại bỏ các dòng trống (không có tiêu chí con) | |
| df_metadata = df_data.dropna(subset=['Tiêu_chí_con'], how='all') | |
| df_metadata['Nhan_xet'] = df_metadata['Nhan_xet'].fillna(method='ffill') | |
| # 6. Đưa cột index ra đầu bảng | |
| df_metadata = df_metadata[['Tiêu_chí_chính', 'Tiêu_chí_con', 'Nhan_xet']] | |
| # 7. Xuất ra xem thử | |
| df_metadata.to_json(f"{json_name}.json") | |
| capy_barem = barem_score("data/capy_feedback.xlsx", "capy") | |
| mqm_barem = barem_score("data/mqm_feedback.xlsx", "mqm") | |
| ta_barem = barem_score("data/ta_feedback.xlsx", "ta") | |
| import json | |
| from pypdf import PdfReader | |
| with open('capy.json', 'r', encoding='utf-8') as f: | |
| capy_barem = str(json.load(f)) | |
| capy_barem = capy_barem.replace("{", '') | |
| capy_barem = capy_barem.replace("}", '') | |
| with open('mqm.json', 'r', encoding='utf-8') as f: | |
| mqm_barem = str(json.load(f)) | |
| mqm_barem = mqm_barem.replace("{", '') | |
| mqm_barem = mqm_barem.replace("}", '') | |
| with open('ta.json', 'r', encoding='utf-8') as f: | |
| ta_barem = str(json.load(f)) | |
| ta_barem = ta_barem.replace("{", '') | |
| ta_barem = ta_barem.replace("}", '') | |
| def read_pdf(pdf_doc): | |
| pdf = PdfReader(pdf_doc) | |
| raw_text = '' | |
| for index,page in enumerate(pdf.pages): | |
| raw_text += page.extract_text() | |
| return raw_text | |
| file_path = "data/mqm_proposal.pdf" | |
| mqm_proposal = read_pdf(file_path) | |
| file_path = "data/ta_proposal.pdf" | |
| ta_proposal = read_pdf(file_path) | |
| file_path = "data/capy_proposal.pdf" | |
| capy_proposal = read_pdf(file_path) | |
| # file_path = "data/mamnon_proposal.pdf" | |
| # input = read_pdf(file_path) | |
| # Function to grade the essay using GPT-4 | |
| def grade_essay(input): | |
| # Sample prompt for grading using GPT-4 | |
| template = f""" | |
| Bạn là một giám khảo chấm và đánh giá proposal marketing và kinh doanh dự trên barem điểm. Hãy đưa ra những phán xét gay gắt và dài. | |
| Chấm bài theo thang điểm: | |
| 1. Research: 25 | |
| 2. Xác định rõ vị trí của nhãn hàng trong chiến dịch: 20 | |
| 3. Phân tích đối tượng truyền thông: 30 | |
| 4. Đề xuất chiến lược tiếp cận: 10 | |
| 5. Ý tưởng lớn: 10 | |
| Tổng: 110 | |
| Trả kết quả theo đúng format JSON bằng tiếng Việt: | |
| I. Research: "score": <0-25> | |
| 1. Phân tích thị trường: <nhận xét chi tiết điểm yếu 3 gạch đầu dòng> | |
| 2. Phân tích nhãn hàng và đối thủ: <nhận xét chi tiết điểm yếu trong 3 gạch đầu dòng>", | |
| II. Xác định rõ vị trí của nhãn hàng trong chiến dịch": "score": <0-20> | |
| 1. Xác định vấn đề truyền thông: <nhận xét chi tiết điểm yếu trong 3 gạch đầu dòng> | |
| 2. Xác định rõ mục tiêu của chiến dịch: <nhận xét chi tiết điểm yếu trong 3 gạch đầu dòng> | |
| 3.Nhìn nhận đúng vai trò của nhãn hàng trong chiến dịch: <nhận xét chi tiết điểm yếu trong 3 gạch đầu dòng>, | |
| III. Phân tích đối tượng truyền thông": "score": <0-30> | |
| 1. Phân tích đối tượng mục tiêu cụ thể, đầy đủ và phù hợp với mục đích truyền thông: <nhận xét chi tiết> | |
| 2.Insight liên quan chặt chẽ và có tính khả thi cao với thương hiệu: <nhận xét chi tiết>, | |
| 3.Insight có tính độc đáo, mới mẻ, có khả năng truyền tải tới đối tượng mục tiêu: <nhận xét chi tiết>", | |
| IV/ Đề xuất chiến lược tiếp cận": "score": <0-10> | |
| 1. Mức độ liên kết chặt chẽ giữa chiến lược mới với các phân tích trước đó: <nhận xét chi tiết> | |
| 2. Mức độ phù hợp của chiến lược đối với Brand và đối tượng mục tiêu: <nhận xét chi tiết> | |
| 3. Mức độ đan xen yếu tố Brand role vào chiến lược tiếp cận: <nhận xét chi tiết> | |
| V/ Ý tưởng lớn": "score": <0-10>. <tóm tắt điểm mạnh và điểm yếu> | |
| "Tổng điểm": <0-110> | |
| """ | |
| examples = [ | |
| { | |
| "bài làm": f"{capy_proposal}", | |
| "nhận xét": f"{capy_barem}" | |
| }, | |
| { | |
| "bài làm": f"{mqm_proposal}", | |
| "nhận xét": f"{mqm_barem}" | |
| }, | |
| { | |
| "bài làm": f"{ta_proposal}", | |
| "nhận xét": f"{ta_barem}" | |
| } | |
| ] | |
| example_prompt = PromptTemplate(input_variables=["bài làm", "nhận xét"], template="{bài làm}\n{nhận xét}") | |
| model = 'gpt' | |
| if model == 'gpt': | |
| template = template + f"""Hãy đánh giá bài sau: | |
| {input}</s> | |
| <|assistant|>""" | |
| elif model == 'vilm': | |
| template = """<|im_start|>system | |
| """ + template + f"""<|im_end|> | |
| <|im_start|>user | |
| Hãy đánh giá bài sau: {input} | |
| <|im_end|> | |
| <|im_start|>assistant""" | |
| prompt = FewShotPromptTemplate( | |
| examples=examples, | |
| example_prompt=example_prompt, | |
| suffix=template, | |
| input_variables=["input"] | |
| ) | |
| llm = ChatOpenAI( | |
| model="gpt-4o-mini", | |
| api_key=OPENAI_API_KEY, | |
| temperature=0.6 | |
| ) | |
| prompt = PromptTemplate(input_variables =['input'], template = template) | |
| # prompt = prompt.format(input=input) | |
| chain = RunnableSequence(prompt| llm) | |
| ans = chain.invoke({'input': input}) | |
| feedback = re.findall("```\w{4}(.*)```", str(ans))[0] | |
| return feedback | |
| def main(): | |
| st.title("Marwuy Proposal feedback") | |
| # State to store results | |
| if 'results' not in st.session_state: | |
| st.session_state.results = [] | |
| pdf_file = st.file_uploader("Upload proposal của bạn dưới dạng pdf", type=["pdf"]) | |
| if pdf_file is not None: | |
| # File uploader for new essays to be graded (DOCX) | |
| new_file = read_pdf(pdf_file) | |
| # Grading button | |
| if st.button("Grade Proposal"): | |
| if new_file: | |
| final_feedback = grade_essay(input = new_file) | |
| # final_feedback = json.loads(ast.literal_eval(f"'''{final_feedback.strip()}'''")) | |
| # df = pd.DataFrame.from_dict(final_feedback) | |
| # df = df.T | |
| # Store results in session state | |
| st.session_state.results.append({ | |
| 'Feedback': final_feedback | |
| }) | |
| st.write("Feedback:") | |
| st.write(final_feedback) | |
| st.success("Hoàn thành chấm điểm.") | |
| else: | |
| st.error("Upload lại dưới định dạng pdf") | |
| if __name__ == "__main__": | |
| main() |