ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

Rag评测–构建问答集

Rag评测–构建问答集 上篇已经把模型配置文件写好了接下来开始直接开始构建问答集了问答集的构建我写过蛮多种方式的有固定数量且下次运行这个文件问答集不变的、有固定数量下次重新生成与上次生成问答对完全不同的、也有增量生成问答对一直持续增加的。具体需求大家根据实际情况或者个人喜好来编写这里写个最简单的方式直接从es数据库中抽取50个问答对先新建一个build_dataset.py文件import re,j import pandas as pd from db import es,ES_INDEX from models import ask_llm,make_question_prompt def is_clean(content): 清洗文档把没法出题的素材清洗出去 if len(content)100: #正文太短不出题 return False if content.count(![image)2: #正文是图片占位符不适合出题 return False for bad in (保密,涉密,修订,拟制,审核): #页眉页脚 if content.count(bad)2 return False return True上面代码把从es库里随机找的文档把不符合条件的都清洗掉其中包括正文内容太短的图片占位符在正文中的以及页眉页脚记号出现两次以上的不要出现两次以上说明这段大概率是页眉页脚拼盘不是正文也不要。def build_dataset(num50) hitses.search(indexES_INDEX, body{ size:200 #一次性抽个200条 query: {match_all:{}},#选取所有在数据池的素材 _source: [doc_name,doc_contents.nid,doc_contents.content],})[hits][hits]#取书名nid和正文把es数据库中的一篇文档当做一本书doc_contents是个数组装着这本书的所有切片所以需要完成下面两层循环外层遍历书内层遍历书里切片。qa_list[] for hit in hits: for part in hit [_source].get(doc_contents,[]): if len(qa_list)num: break #出够50道题即停 contentstr(part.get(content,)).strip()[:2000] if not is_clean(content): continue #不符合不过关的切片直接continue contextf文档:{hit[_source].get(doc_name, )}\n正文:{content} #过关的把书名和正文拼成context replyask_llm(make_question_prompt(context)) #ask_llm返回的是字符串 try: qajson.loads(reply) #在这里把字符串转换为字典 except Exception: #把json包看能不能扣出json代码块 mre.search(r\{.*\}, reply, re.S) if not m: continue try: qajson.loads(m.group(0)) except Exception: continue#实在扣不出来就跳过 if qa.get(question):#断根检查解析失败或question是空串都算废题跳过继续下一题 qa[nid]part.get(nid, ) qa_list.append(qa) print (f[出题]{len(qa_list)}/{num}{qa[question][:30]}...) dfpd.DataFrame(qa_list) df.insert(0,题号,range (1,len(df)1)) df.to_csv(data/dataset_qa.csv,indexFalse,encodingutf-8-sig) if __name____main__: build_dataset()到此一个简易的query-answer集就写完了运行完后就会保存在dataset_qa.csv文件中大家有合适的es数据池可以试试当然也可以编写更复杂的出问答集的方式接下来就是开始使用被测系统答题了。
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进