致谢:
非常感谢以下的分享,对我受益匪浅:
https://www.modelscope.cn/datasets/Datawhale/DW2024_Complex_reasoning_ability_assessment_qwen2-7b-lora
https://zhuanlan.zhihu.com/p/675509396
如何使用LLM解题:
baseline中给予的方法,也是现在最流行的方法,即通过api接口来连接在线开源LLM,并解析api的返回数据包,得出LLM的回复,再从回复中提取答案。
由于本人从未接触过在线模型,基本都是本地调试,故对于代码有些许陌生,但大致结构差不多已经理解。以下记录几段我认为比较重要的代码。
def api_retry(MODEL_NAME, query):
max_retries = 5
retry_delay = 60 # in seconds
attempts = 0
while attempts < max_retries:
try:
return call_qwen_api(MODEL_NAME, 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
由于存在掉包的情况,故设置函数用以确保掉包后再次尝试。
def process_datas(datas,MODEL_NAME):
results = []
with ThreadPoolExecutor(max_workers=16) as executor:
future_data = {}
lasttask = ''
lastmark = 0
lens = 0
for data in tqdm(datas, desc="Submitting tasks", total=len(datas)):
problem = data['problem']
for id,question in enumerate(data['questions']):
prompt = get_prompt(problem,
question['question'],
question['options'],
)
future = executor.submit(api_retry, MODEL_NAME, prompt)
future_data[future] = (data,id)
time.sleep(0.6) # 控制每0.5秒提交一个任务
lens += 1
for future in tqdm(as_completed(future_data), total=lens, desc="Processing tasks"):
# print('data',data)
data = future_data[future][0]
problem_id = future_data[future][1]
try:
res = future.result()
extract_response = extract(res)
# print('res',extract_response)
data['questions'][problem_id]['answer'] = extract_response
results.append(data)
# print('data',data)
except Exception as e:
logger.error(f"Failed to process text: {data}. Error: {e}")
return results
使用线程池提交任务,提高在线推理的速度。
如何上分:
提示词工程:
所谓提示词,即为输入给LLM的prompt。提示词工程就是指通过不断修改输入的提示词,来达成更高效的结论。
baseline01中使用的提示词如下:
prompt = f"""你是一个逻辑推理专家,擅长解决逻辑推理问题。以下是一个逻辑推理的题目,形式为单项选择题。所有的问题都是(close-world assumption)闭世界假设,即未观测事实都为假。请逐步分析问题并在最后一行输出答案,最后一行的格式为"答案是:A"。题目如下:
学习群的群友提出了使用RAG的思想。我大致查阅了资料,RAG类似在大模型前加入一个向量生成机,目的是将知识库中的信息转换为向量库。在用户提出问题后,将问题过向量生成机,再将得出的向量和向量库中的向量进行距离评估,从而得出一个较好的prompt输入给LLM。通过RAG可以有效提升prompt质量。具体流程如下图:
微调:
1 LORA:
将LLM中某层的参数转化为两个低秩矩阵相乘的形式,对低秩矩阵进行微调训练。可以减少训练代价,同时训练结果的acc差不多。
https://arxiv.org/pdf/2106.09685
2 vllm框架:
用于LLM模型高速推理的代码框架,易于使用,与huggingface等开源工具可以无缝衔接。
3 多路voting:
通过多次推理,选择答案出现频率最高的答案作为最终结果。
如果您觉得有意思,可否点赞收藏关注一下本蒟蒻!谢谢!