baseline增强部分
1.星火Max api 配置
!pip install pandas openpyxl
!pip install --upgrade spark_ai_python
读取中文训练集
使用loc函数获得第二行选项列的内容
# coding~
import pandas as pd
import re
# 读取Excel文件
df = pd.read_excel('训练集-语文.xlsx')
df = df.replace('.', '.', regex=True)
df = df.replace('(', '(', regex=True)
# 读取第二行(即第三行)“选项”列的内容
# 可以使用loc获取某行的数据
second_row_option_content = df.loc[2, '选项']
# 显示第二行“选项”列的内容
print(second_row_option_content)
调用星火Max api
from sparkai.llm.llm import ChatSparkLLM, ChunkPrintHandler
from sparkai.core.messages import ChatMessage
#星火认知大模型Spark Max的URL值,其他版本大模型URL值请前往文档(https://www.xfyun.cn/doc/spark/Web.html)查看
SPARKAI_URL = 'wss://spark-api.xf-yun.com/v3.5/chat'
#星火认知大模型调用秘钥信息,请前往讯飞开放平台控制台(https://console.xfyun.cn/services/bm35)查看
SPARKAI_APP_ID = ''
SPARKAI_API_SECRET = ''
SPARKAI_API_KEY = ''
#星火认知大模型Spark Max的domain值,其他版本大模型domain值请前往文档(https://www.xfyun.cn/doc/spark/Web.html)查看
SPARKAI_DOMAIN = 'generalv3.5'
def call_sparkai(prompt):
spark = ChatSparkLLM(
spark_api_url=SPARKAI_URL,
spark_app_id=SPARKAI_APP_ID,
spark_api_key=SPARKAI_API_KEY,
spark_api_secret=SPARKAI_API_SECRET,
spark_llm_domain=SPARKAI_DOMAIN,
streaming=False,
)
messages = [ChatMessage(
role="user",
content=prompt
)]
handler = ChunkPrintHandler()
a = spark.generate([messages], callbacks=[handler])
return a.generations[0][0].text
2.数据增强
2.1 使用大模型完成答案生成
reading = df.loc[2, '阅读文本']
question = df.loc[2, '选项']
answer = df.loc[2, '答案']
prompt设计
给出主要需求:
你是一个高考英语阅读题出题专家,请阅读材料,需要参考参考内容 按照要求将题目、选项、答案对其补充完整。 【这里我们要给定大模型身份,这是一般书写prompt的第一句。接着向大模型指定任务,按照我们的要求做一些事情,还有一些参考内容。】
接着给出参考材料:
###阅读材料 {reading}
接着给出具体要求:
###要求 1.需要将序号对应的题目与答案做匹配。 2.匹配后格式按照问题、ABCD四个选项顺序、答案的结构组合,按照参考内容格式输出。 3.如果选择题目数量不够四个请根据阅读材料及出题思路再生成题目,总题目达到四个。 4.题目中不能出现任何不合理的词汇、语法错误。 5.如果有简答题目与答案请忽略这部分内容,只处理选择题目。
【这里是需要大模型一步步去完成的任务,每一条都是大模型需要遵守并实现的。再开头我们只是粗劣的告诉大模型干嘛,但是想大模型老老实实听话干活,需要我们将每个任务都拆解清晰逐步明确!】
接着给出参考内容:
{cankao_content}
cankao_content = '''
1. 以下哪个选项是“具身认知”的定义?
A. 认知在功能上的独立性、离身性构成了两种理论的基础。
B. 认知在很大程度上是依赖于身体的。
C. 认知的本质就是计算。
D. 认知和心智根本就不存在。
答案:B
2. 以下哪个实验支持了“具身认知”的假设?
A. 一个关于耳机舒适度的测试。
B. 一个关于眼睛疲劳程度的测试。
C. 一个关于人类感知能力的实验。
D. 一个关于人类记忆力的实验。
答案:A
3. 以下哪个选项是“离身认知”的教育观的特点?
A. 教育仅仅是心智能力的培养和训练,思维、记忆和学习等心智过程同身体无关。
B. 教育观认为身体仅仅是一个“容器”,是一个把心智带到课堂的“载体”。
C. 教育观认为知识经验的获得在很大程度上依赖于我们身体的体验性。
D. 教育观认为知识经验的获得在很大程度上依赖于我们大脑的记忆能力。
答案:A
4. 以下哪个选项是“具身认知”带来的教育理念和学习理念的变化?
A. 更强调全身心投入的主动体验式学习。
B. 更注重操作性的体验课堂,在教学过程中将学生的身体充分调动起来,这在教授抽象的概念知识时尤为重要。
C. 更强调教师的教学方法和学生的学习方法。
D. 更注重教师的教学技巧和学生的学习技巧。
答案:A'''
def get_adddata_prompt_zero(reading, cankao_content, question, answer):
prompt = f'''你是一个高考英语阅读题出题专家,请阅读材料,需要参考参考内容 按照要求将题目、选项、答案对其补充完整。
###阅读材料
{reading}
###要求
1.需要将序号对应的题目与答案做匹配。
2.匹配后格式按照问题、ABCD四个选项顺序、答案的结构组合,按照参考内容格式输出。
3.如果选择题目数量不够四个请根据阅读材料及出题思路再生成题目,总题目达到四个。
4.题目中不能出现任何不合理的词汇、语法错误。
5.如果有简答题目与答案请忽略这部分内容,只处理选择题目。
###参考内容
{cankao_content}
###题目
{question}
###答案
{answer}
'''
return prompt
prompt = f'''你是一个高考英语阅读题出题专家,请阅读材料,需要参考参考内容 按照要求将题目、选项、答案对其补充完整。
###阅读材料
{reading}
###要求
1.需要将序号对应的题目与答案做匹配。
2.匹配后格式按照问题、ABCD四个选项顺序、答案的结构组合,按照参考内容格式输出。
3.如果选择题目数量不够四个请根据阅读材料及出题思路再生成题目,总题目达到四个。
4.题目中不能出现任何不合理的词汇、语法错误。
5.如果有简答题目与答案请忽略这部分内容,只处理选择题目。
###参考内容
{cankao_content}
###题目
{question}
###答案
{answer}
'''
输出中文数据集的prompt样例
print(prompt)
打印get_ans的输出结果,调用星火api
get_ans = call_sparkai(prompt)
print(get_ans)
2.2 大模型完成数据增强
增强思路1.补全四个选项及答案
由于之前生成的数据中我们处理的数据不一定满足四个选项与答案,这里我们需要将答案补全,我们看看如何使用大模型补全。
这里面我们的增强prompt如下,和直接生成的思路很想们这里的不同点是要求,这里的题目与答案是我们baseline1生产的output部分内容。
这里我们主要要求大模型生成四个答案,这是我们的核心目标。
def get_adddata_prompt_rebuild(reading, cankao_content, output):
prompt = f'''你是一个高考英语阅读题出题专家,请阅读材料,需要参考参考内容 按照要求将题目、选项、答案对其补充完整。
###阅读材料
{reading}
###要求
1.如果选择题目不足四个需要根据参考内容出选择题补充。
2.补充内容格式按照问题、ABCD四个选项顺序、答案的结构组合,按照参考内容格式输出。
3.如果选择题目数量不够四个请根据阅读材料及出题思路再生成题目,总题目达到四个,如果够四个则不做多余补充。
4.题目中不能出现任何不合理的词汇、语法错误。
###参考内容
{cankao_content}
###题目与答案
{output}
'''
return prompt
import json
from loguru import logger
import time
import re
def api_retry(query):
# 最大尝试次数
max_retries = 3
# 再次尝试等待时间
retry_delay = 120 # in seconds
attempts = 0
while attempts < max_retries:
try:
return call_sparkai(query)
except Exception as e:
attempts += 1
if attempts < max_retries:
logger.warning(f"Attempt {attempts} failed for text: {query}. Retrying in {retry_delay} seconds...")
time.sleep(retry_delay)
else:
logger.error(f"All {max_retries} attempts failed for text: {query}. Error: {e}")
raise
打开并读取json lines文件
# 打开并读取JSON Lines文件
list_data = []
with open('output.jsonl', 'r') as file:
for line in file:
# 去除行末的换行符
line = line.strip()
# 解析JSON行
data = json.loads(line)
list_data.append(data)
# break
以json lines文件第32行的数据为例子输出示例
data = list_data[32]
# 处理解析后的数据
input = data.get('input')
output = data.get('output')
text = input
# 使用正则表达式匹配阅读文本后的内容
match = re.search(r'### 阅读文本\n(.*)', text, re.DOTALL)
reading = match.group(1)
prompt = get_adddata_prompt_rebuild(reading,cankao_content,output)
rebuild_output = call_sparkai(prompt)
print(output,'\n###########',rebuild_output)
总结
可以使用数据增强对数据集进行处理,生成json lines文件,可以使得baseline效果更好一些,也可以通过该prompt实现一些提高,但是示例是否符合高考难度,还是一个值得思考的问题。