ngcanh's picture
Update app.py
75e9a80 verified
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: <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()