You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

86 lines
3.7 KiB
Python

import openai
import re
class GPTScorer:
def __init__(self, api_key):
openai.api_key = api_key
self.eval_mode = "accuracy"
def mode(self, mode):
self.eval_mode = mode
return self
def score_with_chatgpt(self, question, model_result, reference):
prompt = self.generate_scoring_prompt(question, model_result, reference)
try:
# 提交文本以获取ChatGPT评分
response = openai.ChatCompletion.create(
model="gpt-3.5-turbo",
messages=prompt,
)
# 提取评分
chatgpt_response = response.choices[0]['message']['content']
chatgpt_score = self.extract_score(chatgpt_response)
return chatgpt_response, chatgpt_score
except Exception as e:
print("An error occurred while scoring with ChatGPT:", e)
return None, None
def generate_scoring_prompt(self, question, model_result, reference):
# 生成评分提示
base_prompt = []
if self.eval_mode == "accuracy":
base_prompt = [{
"role": "system",
"content": "你是一个汽车领域专家,接下来将向你提供一个问题、一个参考答案和一个大模型生成的结果。"
"请对比参考答案和大模型生成结果从信息准确性的角度评分以下生成的结果以评估其质量。满分为5分。"
"评分标准为信息准确无误——5分。信息大致符合实际信息——4分。"
"信息不全面但明确表达了自身无法回答——3分。信息完全错误——2分。回答无关——1分。"
"可以根据实际情况稍作调整。"
"回复格式为评分为x分。理由xxx。"
}]
prompt = base_prompt + [
{
"role": "user",
"content": f"问题:{question}\n\n生成的结果:{model_result}\n\n参考答案:{reference}"
}
]
return prompt
def extract_score(self, response_text):
# 提取评分
pattern = [
r"^评分为([1-5])分",
]
score_list = []
for p in pattern:
if len(score_list) == 0:
score_list = re.findall(p, response_text)
else:
break
return score_list[0]
# 示例用法
if __name__ == "__main__":
my_api_key = "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"
# 初始化模型评分器
scorer = GPTScorer(my_api_key)
# 要评分的大模型结果
sample_question = "秦Plus-DMi车型的安全气囊有哪些类型"
sample_model_result = ("截止到我最后更新知识的时候关于秦Plus-DMi车型的具体安全气囊类型的信息我并没有。"
"通常来说,汽车的安全气囊系统可能包括驾驶员气囊、副驾驶气囊、侧面气囊、头部气囊等。"
"但具体车型的安全气囊配置可能会因地区、年份和车型的不同而有所差异。"
"建议您直接查询该车型的官方资料或者联系经销商以获取最准确的信息。")
sample_reference = "秦Plus-DMi配备有驾驶员安全气囊、前排乘员安全气囊、侧帘式安全气囊和座椅侧安全气囊。"
# 获取ChatGPT评分
response_text, score = scorer.mode('accuracy').score_with_chatgpt(sample_question, sample_model_result, sample_reference)
if response_text is not None:
print("ChatGPT评分:", score, "\nChatGPT回复:", response_text)
else:
print("无法获取ChatGPT评分。")