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 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: 2. Phân tích nhãn hàng và đối thủ: ", 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: 2. Xác định rõ mục tiêu của chiến dịch: 3.Nhìn nhận đúng vai trò của nhãn hàng trong chiến dịch: , 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: 2.Insight liên quan chặt chẽ và có tính khả thi cao với thương hiệu: , 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: ", 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 đó: 2. Mức độ phù hợp của chiến lược đối với Brand và đối tượng mục tiêu: 3. Mức độ đan xen yếu tố Brand role vào chiến lược tiếp cận: V/ Ý tưởng lớn": "score": <0-10>. "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} <|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.dataframe(df) 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()